killbill-memoizeit

Merge branch 'integration' of github.com:ning/killbill

6/13/2012 6:18:20 PM

Changes

.travis.yml 3(+3 -0)

invoice/pom.xml 7(+4 -3)

Details

.travis.yml 3(+3 -0)

diff --git a/.travis.yml b/.travis.yml
index 3f1b576..c77a8af 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -9,3 +9,6 @@ jdk:
   - openjdk6
   - openjdk7
   - oraclejdk7
+
+env:
+  - MAVEN_OPTS="-Xmx512m -XX:MaxPermSize=192m"
diff --git a/account/src/test/java/com/ning/billing/account/dao/AccountDaoTestBase.java b/account/src/test/java/com/ning/billing/account/dao/AccountDaoTestBase.java
index 71985e0..a97a630 100644
--- a/account/src/test/java/com/ning/billing/account/dao/AccountDaoTestBase.java
+++ b/account/src/test/java/com/ning/billing/account/dao/AccountDaoTestBase.java
@@ -40,14 +40,17 @@ import com.ning.billing.util.callcontext.UserType;
 import com.ning.billing.util.callcontext.DefaultCallContextFactory;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.clock.ClockMock;
+import com.ning.billing.util.tag.api.user.TagEventBuilder;
 
 public abstract class AccountDaoTestBase {
     private final MysqlTestingHelper helper = new MysqlTestingHelper();
 
+    protected final TagEventBuilder tagEventBuilder = new TagEventBuilder();
+
     protected AccountDao accountDao;
     protected AccountEmailDao accountEmailDao;
     protected IDBI dbi;
-
+    protected Bus bus;
     protected CallContext context;
 
     @BeforeClass(alwaysRun = true)
@@ -63,7 +66,7 @@ public abstract class AccountDaoTestBase {
 
             dbi = helper.getDBI();
 
-            Bus bus = new InMemoryBus();
+            bus = new InMemoryBus();
             BusService busService = new DefaultBusService(bus);
             ((DefaultBusService) busService).startBus();
 
diff --git a/account/src/test/java/com/ning/billing/account/dao/TestAccountDao.java b/account/src/test/java/com/ning/billing/account/dao/TestAccountDao.java
index ba1d3f6..5e51ecd 100644
--- a/account/src/test/java/com/ning/billing/account/dao/TestAccountDao.java
+++ b/account/src/test/java/com/ning/billing/account/dao/TestAccountDao.java
@@ -28,6 +28,7 @@ import java.util.UUID;
 
 import com.ning.billing.account.api.AccountEmail;
 import com.ning.billing.account.api.DefaultAccountEmail;
+import com.ning.billing.util.api.TagApiException;
 import com.ning.billing.util.customfield.CustomField;
 import com.ning.billing.util.customfield.StringCustomField;
 import com.ning.billing.util.customfield.dao.AuditedCustomFieldDao;
@@ -146,13 +147,13 @@ public class TestAccountDao extends AccountDaoTestBase {
     }
 
     @Test
-    public void testTags() throws EntityPersistenceException {
+    public void testTags() throws EntityPersistenceException, TagApiException {
         Account account = createTestAccount(1);
         TagDefinition definition = new DefaultTagDefinition("Test Tag", "For testing only", false);
         TagDefinitionSqlDao tagDescriptionDao = dbi.onDemand(TagDefinitionSqlDao.class);
         tagDescriptionDao.create(definition, context);
 
-        TagDao tagDao = new AuditedTagDao(dbi);
+        TagDao tagDao = new AuditedTagDao(dbi, tagEventBuilder, bus);
         tagDao.insertTag(account.getId(), ObjectType.ACCOUNT, definition, context);
 
         Map<String, Tag> tagMap = tagDao.loadEntities(account.getId(), ObjectType.ACCOUNT);
diff --git a/api/src/main/java/com/ning/billing/entitlement/api/billing/BillingEvent.java b/api/src/main/java/com/ning/billing/entitlement/api/billing/BillingEvent.java
index eb8410f..db1761e 100644
--- a/api/src/main/java/com/ning/billing/entitlement/api/billing/BillingEvent.java
+++ b/api/src/main/java/com/ning/billing/entitlement/api/billing/BillingEvent.java
@@ -19,6 +19,7 @@ package com.ning.billing.entitlement.api.billing;
 import java.math.BigDecimal;
 
 import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
 
 import com.ning.billing.account.api.Account;
 import com.ning.billing.catalog.api.BillingPeriod;
@@ -113,4 +114,10 @@ public interface BillingEvent extends Comparable<BillingEvent> {
 	 * @return a unique long indicating the ordering on which events got inserted on disk-- used for sorting only
 	 */
 	public Long getTotalOrdering();
+	
+	/**
+	 * 
+	 * @return The TimeZone of the account
+	 */
+    public DateTimeZone getTimeZone();
  }
diff --git a/api/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java b/api/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java
index 56ee93f..1b8afb3 100644
--- a/api/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java
+++ b/api/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java
@@ -17,6 +17,7 @@
 package com.ning.billing.invoice.api;
 
 import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.util.api.TagApiException;
 import com.ning.billing.util.callcontext.CallContext;
 import org.joda.time.DateTime;
 
@@ -40,9 +41,9 @@ public interface InvoiceUserApi {
     
     public Invoice triggerInvoiceGeneration(UUID accountId, DateTime targetDate, boolean dryRun, CallContext context) throws InvoiceApiException;
 
-    public void tagInvoiceAsWrittenOff(UUID invoiceId, CallContext context);
+    public void tagInvoiceAsWrittenOff(UUID invoiceId, CallContext context) throws TagApiException;
 
-    public void tagInvoiceAsNotWrittenOff(UUID invoiceId, CallContext context) throws InvoiceApiException;
+    public void tagInvoiceAsNotWrittenOff(UUID invoiceId, CallContext context) throws TagApiException;
 
     public InvoiceItem getCreditById(UUID creditId) throws InvoiceApiException;
 
diff --git a/api/src/main/java/com/ning/billing/util/api/TagApiException.java b/api/src/main/java/com/ning/billing/util/api/TagApiException.java
new file mode 100644
index 0000000..7b3c032
--- /dev/null
+++ b/api/src/main/java/com/ning/billing/util/api/TagApiException.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.api;
+
+import com.ning.billing.BillingExceptionBase;
+import com.ning.billing.ErrorCode;
+
+public class TagApiException extends BillingExceptionBase {
+    private static final long serialVersionUID = 1L;
+
+    public TagApiException(final Throwable cause, final int code, final String msg) {
+        super(cause, code, msg);
+    }
+
+    public TagApiException(final Throwable cause, final ErrorCode code, final Object... args) {
+        super(cause, code, args);
+    }
+
+    public TagApiException(final ErrorCode code, final Object... args) {
+        super(code, args);
+    }
+}
diff --git a/api/src/main/java/com/ning/billing/util/api/TagDefinitionApiException.java b/api/src/main/java/com/ning/billing/util/api/TagDefinitionApiException.java
index a67f1ad..1b080d5 100644
--- a/api/src/main/java/com/ning/billing/util/api/TagDefinitionApiException.java
+++ b/api/src/main/java/com/ning/billing/util/api/TagDefinitionApiException.java
@@ -22,15 +22,15 @@ import com.ning.billing.ErrorCode;
 public class TagDefinitionApiException extends BillingExceptionBase {
     private static final long serialVersionUID = 1L;
 
-    public TagDefinitionApiException(Throwable cause, int code, final String msg) {
+    public TagDefinitionApiException(final Throwable cause, final int code, final String msg) {
         super(cause, code, msg);
     }
 
-    public TagDefinitionApiException(Throwable cause, ErrorCode code, final Object... args) {
+    public TagDefinitionApiException(final Throwable cause, final ErrorCode code, final Object... args) {
         super(cause, code, args);
     }
 
-    public TagDefinitionApiException(ErrorCode code, final Object... args) {
+    public TagDefinitionApiException(final ErrorCode code, final Object... args) {
         super(code, args);
     }
-}
\ No newline at end of file
+}
diff --git a/api/src/main/java/com/ning/billing/util/api/TagUserApi.java b/api/src/main/java/com/ning/billing/util/api/TagUserApi.java
index 422221a..331cce4 100644
--- a/api/src/main/java/com/ning/billing/util/api/TagUserApi.java
+++ b/api/src/main/java/com/ning/billing/util/api/TagUserApi.java
@@ -25,52 +25,42 @@ import com.ning.billing.util.dao.ObjectType;
 import com.ning.billing.util.tag.Tag;
 import com.ning.billing.util.tag.TagDefinition;
 
-// TODO: add ability to create, update and remove tags
 public interface TagUserApi {
-    /***
-     *
+    /**
      * @return the list of all available tag definitions
      */
     public List<TagDefinition> getTagDefinitions();
 
-    /***
-     *
+    /**
      * @param definitionName Identifies the definition.
-     * @param description Describes the use of the definition.
-     * @param context The call context, for auditing purposes
+     * @param description    Describes the use of the definition.
+     * @param context        The call context, for auditing purposes
      * @return the newly created tag definition
      * @throws TagDefinitionApiException
      */
     public TagDefinition create(String definitionName, String description, CallContext context) throws TagDefinitionApiException;
 
-    /***
-     *
+    /**
      * @param definitionName Identifies the definition.
-     * @param context The call context, for auditing purposes
+     * @param context        The call context, for auditing purposes
      * @throws TagDefinitionApiException
      */
-    public void deleteAllTagsForDefinition(String definitionName, CallContext context) throws TagDefinitionApiException;
+    public void deleteTagDefinition(String definitionName, CallContext context) throws TagDefinitionApiException;
 
-    /***
-     *
-     * @param definitionName Identifies the definition.
-     * @param context The call context, for auditing purposes
+    /**
+     * @param name
+     * @return the tag with this definition
      * @throws TagDefinitionApiException
      */
-    public void deleteTagDefinition(String definitionName, CallContext context) throws TagDefinitionApiException;
+    public TagDefinition getTagDefinition(String name) throws TagDefinitionApiException;
 
-	/**
-	 *
-	 * @param name
-	 * @return the tag with this definition
-     * @throws TagDefinitionApiException
-	 */
-	public TagDefinition getTagDefinition(String name) throws TagDefinitionApiException;
+    public void addTags(UUID objectId, ObjectType objectType, List<TagDefinition> tagDefinitions, CallContext context) throws TagApiException;
+
+    public void addTag(UUID objectId, ObjectType objectType, TagDefinition tagDefinition, CallContext context) throws TagApiException;
+
+    public void removeTags(UUID objectId, ObjectType objectType, List<TagDefinition> tagDefinitions, CallContext context) throws TagApiException;
 
-    public void addTags(UUID objectId, ObjectType objectType, List<TagDefinition> tagDefinitions, CallContext context);
-    public void addTag(UUID objectId, ObjectType objectType, TagDefinition tagDefinition, CallContext context);
-    public void removeTags(UUID objectId, ObjectType objectType, List<TagDefinition> tagDefinitions, CallContext context);
-    public void removeTag(UUID objectId, ObjectType objectType, TagDefinition tagDefinition, CallContext context);
+    public void removeTag(UUID objectId, ObjectType objectType, TagDefinition tagDefinition, CallContext context) throws TagApiException;
 
     public Map<String, Tag> getTags(UUID objectId, ObjectType objectType);
 }
diff --git a/api/src/main/java/com/ning/billing/util/bus/BusEvent.java b/api/src/main/java/com/ning/billing/util/bus/BusEvent.java
index d969440..cfb8b0b 100644
--- a/api/src/main/java/com/ning/billing/util/bus/BusEvent.java
+++ b/api/src/main/java/com/ning/billing/util/bus/BusEvent.java
@@ -19,19 +19,26 @@ package com.ning.billing.util.bus;
 import java.util.UUID;
 
 public interface BusEvent {
-	
-	public enum BusEventType {
-		ACCOUNT_CREATE,
-		ACCOUNT_CHANGE,
-		SUBSCRIPTION_TRANSITION,
-		BUNDLE_REPAIR,
-		INVOICE_EMPTY,
-		INVOICE_CREATION,
-		PAYMENT_INFO,
-		PAYMENT_ERROR
-	}
+    public enum BusEventType {
+        ACCOUNT_CREATE,
+        ACCOUNT_CHANGE,
+        SUBSCRIPTION_TRANSITION,
+        BUNDLE_REPAIR,
+        INVOICE_EMPTY,
+        INVOICE_CREATION,
+        PAYMENT_INFO,
+        PAYMENT_ERROR,
+        CONTROL_TAG_CREATION,
+        CONTROL_TAG_DELETION,
+        USER_TAG_CREATION,
+        USER_TAG_DELETION,
+        CONTROL_TAGDEFINITION_CREATION,
+        CONTROL_TAGDEFINITION_DELETION,
+        USER_TAGDEFINITION_CREATION,
+        USER_TAGDEFINITION_DELETION
+    }
 
-	public BusEventType getBusEventType();
-	
-	public UUID getUserToken();
+    public BusEventType getBusEventType();
+
+    public UUID getUserToken();
 }
diff --git a/api/src/main/java/com/ning/billing/util/tag/api/ControlTagDefinitionDeletionEvent.java b/api/src/main/java/com/ning/billing/util/tag/api/ControlTagDefinitionDeletionEvent.java
new file mode 100644
index 0000000..7a5f453
--- /dev/null
+++ b/api/src/main/java/com/ning/billing/util/tag/api/ControlTagDefinitionDeletionEvent.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.tag.api;
+
+public interface ControlTagDefinitionDeletionEvent extends TagDefinitionEvent {
+}
diff --git a/api/src/main/java/com/ning/billing/util/tag/api/ControlTagDeletionEvent.java b/api/src/main/java/com/ning/billing/util/tag/api/ControlTagDeletionEvent.java
new file mode 100644
index 0000000..c82ea96
--- /dev/null
+++ b/api/src/main/java/com/ning/billing/util/tag/api/ControlTagDeletionEvent.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.tag.api;
+
+public interface ControlTagDeletionEvent extends TagEvent {
+}
diff --git a/api/src/main/java/com/ning/billing/util/tag/api/TagDefinitionEvent.java b/api/src/main/java/com/ning/billing/util/tag/api/TagDefinitionEvent.java
new file mode 100644
index 0000000..7906c7e
--- /dev/null
+++ b/api/src/main/java/com/ning/billing/util/tag/api/TagDefinitionEvent.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.tag.api;
+
+import java.util.UUID;
+
+import com.ning.billing.util.bus.BusEvent;
+import com.ning.billing.util.tag.TagDefinition;
+
+public interface TagDefinitionEvent extends BusEvent {
+    UUID getTagDefinitionId();
+
+    TagDefinition getTagDefinition();
+}
diff --git a/api/src/main/java/com/ning/billing/util/tag/api/TagEvent.java b/api/src/main/java/com/ning/billing/util/tag/api/TagEvent.java
new file mode 100644
index 0000000..1cd3cfd
--- /dev/null
+++ b/api/src/main/java/com/ning/billing/util/tag/api/TagEvent.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.tag.api;
+
+import java.util.UUID;
+
+import com.ning.billing.util.bus.BusEvent;
+import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.tag.TagDefinition;
+
+public interface TagEvent extends BusEvent {
+    UUID getTagId();
+
+    UUID getObjectId();
+
+    ObjectType getObjectType();
+
+    TagDefinition getTagDefinition();
+}
diff --git a/api/src/main/java/com/ning/billing/util/tag/api/UserTagCreationEvent.java b/api/src/main/java/com/ning/billing/util/tag/api/UserTagCreationEvent.java
new file mode 100644
index 0000000..986845f
--- /dev/null
+++ b/api/src/main/java/com/ning/billing/util/tag/api/UserTagCreationEvent.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.tag.api;
+
+public interface UserTagCreationEvent extends TagEvent {
+}
diff --git a/api/src/main/java/com/ning/billing/util/tag/api/UserTagDefinitionCreationEvent.java b/api/src/main/java/com/ning/billing/util/tag/api/UserTagDefinitionCreationEvent.java
new file mode 100644
index 0000000..06b74a5
--- /dev/null
+++ b/api/src/main/java/com/ning/billing/util/tag/api/UserTagDefinitionCreationEvent.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.tag.api;
+
+public interface UserTagDefinitionCreationEvent extends TagDefinitionEvent {
+}
diff --git a/api/src/main/java/com/ning/billing/util/tag/api/UserTagDefinitionDeletionEvent.java b/api/src/main/java/com/ning/billing/util/tag/api/UserTagDefinitionDeletionEvent.java
new file mode 100644
index 0000000..8922eaf
--- /dev/null
+++ b/api/src/main/java/com/ning/billing/util/tag/api/UserTagDefinitionDeletionEvent.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.tag.api;
+
+public interface UserTagDefinitionDeletionEvent extends TagDefinitionEvent {
+}
diff --git a/api/src/main/java/com/ning/billing/util/tag/api/UserTagDeletionEvent.java b/api/src/main/java/com/ning/billing/util/tag/api/UserTagDeletionEvent.java
new file mode 100644
index 0000000..22ef341
--- /dev/null
+++ b/api/src/main/java/com/ning/billing/util/tag/api/UserTagDeletionEvent.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.tag.api;
+
+public interface UserTagDeletionEvent extends TagEvent {
+}
diff --git a/api/src/main/java/com/ning/billing/util/tag/TagDefinition.java b/api/src/main/java/com/ning/billing/util/tag/TagDefinition.java
index d35e011..88f9f1a 100644
--- a/api/src/main/java/com/ning/billing/util/tag/TagDefinition.java
+++ b/api/src/main/java/com/ning/billing/util/tag/TagDefinition.java
@@ -16,9 +16,11 @@
 
 package com.ning.billing.util.tag;
 
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
 import com.ning.billing.util.entity.Entity;
 
 // TODO: needs to surface created date, created by, isControlTag
+@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "@class")
 public interface TagDefinition extends Entity {
     String getName();
 
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegration.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegration.java
index 943f470..060ea97 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegration.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegration.java
@@ -93,13 +93,71 @@ public class TestIntegration extends TestIntegrationBase {
     }
     
 
+//    // STEPH set to disabled until test written properly and fixed
+//    @Test(groups = "slow", enabled = true)
+//    public void testRepairChangeBPWithAddonIncluded() throws Exception {
+//        
+//        log.info("Starting testRepairChangeBPWithAddonIncluded");
+//        
+//        DateTime initialDate = new DateTime(2012, 4, 25, 0, 3, 42, 0);
+//        clock.setDeltaFromReality(initialDate.getMillis() - clock.getUTCNow().getMillis());
+//        
+//        Account account = createAccountWithPaymentMethod(getAccountData(25));
+//        assertNotNull(account);
+//
+//        SubscriptionBundle bundle = entitlementUserApi.createBundleForAccount(account.getId(), "whatever", context);
+//
+//        String productName = "Shotgun";
+//        BillingPeriod term = BillingPeriod.MONTHLY;
+//        String planSetName = PriceListSet.DEFAULT_PRICELIST_NAME;
+//
+//        busHandler.pushExpectedEvent(NextEvent.CREATE);
+//        busHandler.pushExpectedEvent(NextEvent.INVOICE);
+//        SubscriptionData baseSubscription = subscriptionDataFromSubscription(entitlementUserApi.createSubscription(bundle.getId(),
+//                new PlanPhaseSpecifier(productName, ProductCategory.BASE, term, planSetName, null), null, context));
+//        assertNotNull(baseSubscription);
+//        assertTrue(busHandler.isCompleted(DELAY));
+//   
+//        // MOVE CLOCK A LITTLE BIT-- STILL IN TRIAL
+//        Interval it = new Interval(clock.getUTCNow(), clock.getUTCNow().plusDays(3));
+//        clock.addDeltaFromReality(it.toDurationMillis());
+//
+//        busHandler.pushExpectedEvent(NextEvent.CREATE);
+//        busHandler.pushExpectedEvent(NextEvent.INVOICE);
+//        busHandler.pushExpectedEvent(NextEvent.PAYMENT);
+//        subscriptionDataFromSubscription(entitlementUserApi.createSubscription(bundle.getId(),
+//                new PlanPhaseSpecifier("Telescopic-Scope", ProductCategory.ADD_ON, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null), null, context));
+//        assertTrue(busHandler.isCompleted(DELAY));
+//        
+//        busHandler.pushExpectedEvent(NextEvent.CREATE);
+//        busHandler.pushExpectedEvent(NextEvent.INVOICE);
+//        busHandler.pushExpectedEvent(NextEvent.PAYMENT);
+//        subscriptionDataFromSubscription(entitlementUserApi.createSubscription(bundle.getId(),
+//                new PlanPhaseSpecifier("Laser-Scope", ProductCategory.ADD_ON, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null), null, context)); 
+//        assertTrue(busHandler.isCompleted(DELAY));
+//        
+//
+//        // 26 / 5
+//        int duration = 28;
+//        it = new Interval(clock.getUTCNow(), clock.getUTCNow().plusDays(duration));
+//        busHandler.pushExpectedEvent(NextEvent.PHASE);
+//        busHandler.pushExpectedEvent(NextEvent.PHASE);
+//        busHandler.pushExpectedEvent(NextEvent.PHASE);            
+//        busHandler.pushExpectedEvent(NextEvent.INVOICE);
+//        busHandler.pushExpectedEvent(NextEvent.PAYMENT);
+//        clock.addDeltaFromReality(it.toDurationMillis());
+//        assertTrue(busHandler.isCompleted(DELAY));
+//        
+//        assertListenerStatus();
+//    }
+   
     // STEPH set to disabled until test written properly and fixed
     @Test(groups = "slow", enabled = false)
     public void testRepairChangeBPWithAddonIncluded() throws Exception {
         
         log.info("Starting testRepairChangeBPWithAddonIncluded");
         
-        DateTime initialDate = new DateTime(2012, 4, 25, 0, 3, 42, 0);
+        DateTime initialDate = new DateTime(2012, 4, 25, 0, 13, 42, 0);
         clock.setDeltaFromReality(initialDate.getMillis() - clock.getUTCNow().getMillis());
         
         Account account = createAccountWithPaymentMethod(getAccountData(25));
@@ -117,10 +175,12 @@ public class TestIntegration extends TestIntegrationBase {
                 new PlanPhaseSpecifier(productName, ProductCategory.BASE, term, planSetName, null), null, context));
         assertNotNull(baseSubscription);
         assertTrue(busHandler.isCompleted(DELAY));
+        assertListenerStatus();
    
         // MOVE CLOCK A LITTLE BIT-- STILL IN TRIAL
         Interval it = new Interval(clock.getUTCNow(), clock.getUTCNow().plusDays(3));
-        clock.addDeltaFromReality(it.toDurationMillis());
+        log.info("Moving clock from" + clock.getUTCNow() + " to " + clock.getUTCNow().plusDays(3));
+        clock.addDays(3);
 
         busHandler.pushExpectedEvent(NextEvent.CREATE);
         busHandler.pushExpectedEvent(NextEvent.INVOICE);
@@ -128,6 +188,8 @@ public class TestIntegration extends TestIntegrationBase {
         subscriptionDataFromSubscription(entitlementUserApi.createSubscription(bundle.getId(),
                 new PlanPhaseSpecifier("Telescopic-Scope", ProductCategory.ADD_ON, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null), null, context));
         assertTrue(busHandler.isCompleted(DELAY));
+        assertListenerStatus();
+
         
         busHandler.pushExpectedEvent(NextEvent.CREATE);
         busHandler.pushExpectedEvent(NextEvent.INVOICE);
@@ -135,22 +197,53 @@ public class TestIntegration extends TestIntegrationBase {
         SubscriptionData aoSubscription2 = subscriptionDataFromSubscription(entitlementUserApi.createSubscription(bundle.getId(),
                 new PlanPhaseSpecifier("Laser-Scope", ProductCategory.ADD_ON, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null), null, context)); 
         assertTrue(busHandler.isCompleted(DELAY));
-        
+        assertListenerStatus();
 
         // MOVE CLOCK A LITTLE BIT MORE -- EITHER STAY IN TRIAL OR GET OUT   
-        int duration = 35;
-        it = new Interval(clock.getUTCNow(), clock.getUTCNow().plusDays(duration));
-        busHandler.pushExpectedEvent(NextEvent.PHASE);
         busHandler.pushExpectedEvent(NextEvent.PHASE);
-        busHandler.pushExpectedEvent(NextEvent.PHASE);            
+        busHandler.pushExpectedEvent(NextEvent.PHASE);          
         busHandler.pushExpectedEvent(NextEvent.INVOICE);
         busHandler.pushExpectedEvent(NextEvent.PAYMENT);
-        clock.addDeltaFromReality(it.toDurationMillis());
+        busHandler.pushExpectedEvent(NextEvent.INVOICE);
+        busHandler.pushExpectedEvent(NextEvent.PAYMENT);
+        log.info("Moving clock from" + clock.getUTCNow() + " to " + clock.getUTCNow().plusDays(28));
+        clock.addDays(28);// 26 / 5
         assertTrue(busHandler.isCompleted(DELAY));
+        assertListenerStatus();
         
+        
+        busHandler.pushExpectedEvent(NextEvent.PHASE);       
+        busHandler.pushExpectedEvent(NextEvent.INVOICE);
+        busHandler.pushExpectedEvent(NextEvent.PAYMENT);
+        log.info("Moving clock from" + clock.getUTCNow() + " to " + clock.getUTCNow().plusDays(3));
+        clock.addDays(3);// 29 / 5
+        assertTrue(busHandler.isCompleted(DELAY));
         assertListenerStatus();
+       
+        
+        log.info("Moving clock from" + clock.getUTCNow() + " to " + clock.getUTCNow().plusDays(10));
+        clock.addDays(10);// 8 / 6
+        assertTrue(busHandler.isCompleted(DELAY));
+        assertListenerStatus();
+       
+        
+       
+        busHandler.pushExpectedEvent(NextEvent.INVOICE);
+        busHandler.pushExpectedEvent(NextEvent.PAYMENT);
+        log.info("Moving clock from" + clock.getUTCNow() + " to " + clock.getUTCNow().plusDays(18));
+        clock.addDays(18);// 26 / 6
+        assertTrue(busHandler.isCompleted(DELAY));
+        assertListenerStatus();
+        
+        log.info("Moving clock from" + clock.getUTCNow() + " to " + clock.getUTCNow().plusDays(3));
+        clock.addDays(3);
+        assertTrue(busHandler.isCompleted(DELAY));
+        assertListenerStatus();
+        
+
     }
-   
+    
+    
     @Test(groups = {"slow"})
     public void testRepairForInvoicing() throws Exception {
 
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationBase.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationBase.java
index f63d6d6..99e5287 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationBase.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationBase.java
@@ -41,7 +41,6 @@ import org.testng.annotations.BeforeMethod;
 
 import com.google.inject.Inject;
 import com.ning.billing.account.api.Account;
-import com.ning.billing.account.api.AccountApiException;
 import com.ning.billing.account.api.AccountData;
 import com.ning.billing.account.api.AccountService;
 import com.ning.billing.account.api.AccountUserApi;
@@ -63,9 +62,7 @@ import com.ning.billing.invoice.api.InvoiceUserApi;
 import com.ning.billing.invoice.model.InvoicingConfiguration;
 import com.ning.billing.junction.plumbing.api.BlockingSubscription;
 import com.ning.billing.payment.api.PaymentApi;
-import com.ning.billing.payment.api.PaymentApiException;
 import com.ning.billing.payment.api.PaymentMethodPlugin;
-import com.ning.billing.payment.api.PaymentMethodPlugin.PaymentMethodKVInfo;
 import com.ning.billing.util.bus.BusService;
 import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.callcontext.CallOrigin;
@@ -337,7 +334,7 @@ public class TestIntegrationBase implements TestListenerStatus {
 
             @Override
             public DateTimeZone getTimeZone() {
-                return null;
+                return DateTimeZone.UTC;
             }
 
             @Override
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationWithAutoInvoiceOffTag.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationWithAutoInvoiceOffTag.java
index 3b462f1..08ba27a 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationWithAutoInvoiceOffTag.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationWithAutoInvoiceOffTag.java
@@ -40,6 +40,7 @@ import com.ning.billing.entitlement.api.user.SubscriptionBundle;
 import com.ning.billing.entitlement.api.user.SubscriptionData;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceUserApi;
+import com.ning.billing.util.api.TagApiException;
 import com.ning.billing.util.api.TagDefinitionApiException;
 import com.ning.billing.util.api.TagUserApi;
 import com.ning.billing.util.dao.ObjectType;
@@ -166,7 +167,7 @@ public class TestIntegrationWithAutoInvoiceOffTag extends TestIntegrationBase {
     }
 
 
-    private void addTag(UUID id, ObjectType type) throws TagDefinitionApiException {
+    private void addTag(UUID id, ObjectType type) throws TagDefinitionApiException, TagApiException {
         TagDefinition def = tagApi.getTagDefinition(ControlTagType.AUTO_INVOICING_OFF.name());
         tagApi.addTag(id, type, def, context);
         Map<String,Tag> tags = tagApi.getTags(id, type);

invoice/pom.xml 7(+4 -3)

diff --git a/invoice/pom.xml b/invoice/pom.xml
index d2ee9d0..b3528fe 100644
--- a/invoice/pom.xml
+++ b/invoice/pom.xml
@@ -8,7 +8,8 @@
     OR CONDITIONS OF ANY KIND, either express or implied. See the ~ License for 
     the specific language governing permissions and limitations ~ under the License. -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <parent>
         <groupId>com.ning.billing</groupId>
@@ -33,7 +34,7 @@
             <groupId>com.ning.billing</groupId>
             <artifactId>killbill-util</artifactId>
         </dependency>
-         <dependency>
+        <dependency>
             <groupId>org.jdbi</groupId>
             <artifactId>jdbi</artifactId>
         </dependency>
@@ -67,7 +68,7 @@
             <groupId>org.skife.config</groupId>
             <artifactId>config-magic</artifactId>
         </dependency>
-       <!-- TEST SCOPE -->
+        <!-- TEST SCOPE -->
         <dependency>
             <groupId>com.ning.billing</groupId>
             <artifactId>killbill-util</artifactId>
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/DefaultInvoiceService.java b/invoice/src/main/java/com/ning/billing/invoice/api/DefaultInvoiceService.java
index 9b80d9c..f0c3d0c 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/DefaultInvoiceService.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/DefaultInvoiceService.java
@@ -33,7 +33,7 @@ public class DefaultInvoiceService implements InvoiceService {
     private final Bus eventBus;
 
     @Inject
-    public DefaultInvoiceService(InvoiceListener invoiceListener, Bus eventBus, NextBillingDateNotifier dateNotifier) {
+    public DefaultInvoiceService(final InvoiceListener invoiceListener, final Bus eventBus, final NextBillingDateNotifier dateNotifier) {
         this.invoiceListener = invoiceListener;
         this.eventBus = eventBus;
         this.dateNotifier = dateNotifier;
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/invoice/DefaultInvoicePaymentApi.java b/invoice/src/main/java/com/ning/billing/invoice/api/invoice/DefaultInvoicePaymentApi.java
index 2283a39..fca4789 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/invoice/DefaultInvoicePaymentApi.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/invoice/DefaultInvoicePaymentApi.java
@@ -21,17 +21,17 @@ import java.math.BigDecimal;
 import java.util.List;
 import java.util.UUID;
 
-import com.ning.billing.invoice.api.InvoiceApiException;
-import com.ning.billing.util.callcontext.CallContext;
 import org.joda.time.DateTime;
 
 import com.google.inject.Inject;
 import com.ning.billing.catalog.api.Currency;
 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.dao.InvoiceDao;
 import com.ning.billing.invoice.model.DefaultInvoicePayment;
+import com.ning.billing.util.callcontext.CallContext;
 
 public class DefaultInvoicePaymentApi implements InvoicePaymentApi {
     private final InvoiceDao dao;
@@ -39,81 +39,81 @@ public class DefaultInvoicePaymentApi implements InvoicePaymentApi {
     @Inject
     public DefaultInvoicePaymentApi(final InvoiceDao dao) {
         this.dao = dao;
-     }
+    }
 
     @Override
-    public void notifyOfPaymentAttempt(InvoicePayment invoicePayment, CallContext context) {
+    public void notifyOfPaymentAttempt(final InvoicePayment invoicePayment, final CallContext context) {
         dao.notifyOfPaymentAttempt(invoicePayment, context);
     }
 
-	@Override
-	public List<Invoice> getAllInvoicesByAccount(UUID accountId) {
-		return dao.getAllInvoicesByAccount(accountId);
-	}
- 
+    @Override
+    public List<Invoice> getAllInvoicesByAccount(final UUID accountId) {
+        return dao.getAllInvoicesByAccount(accountId);
+    }
+
     @Override
     public Invoice getInvoice(final UUID invoiceId) {
         return dao.getById(invoiceId);
     }
 
     @Override
-    public Invoice getInvoiceForPaymentAttemptId(UUID paymentAttemptId) {
-        UUID invoiceIdStr = dao.getInvoiceIdByPaymentAttemptId(paymentAttemptId);
+    public Invoice getInvoiceForPaymentAttemptId(final UUID paymentAttemptId) {
+        final UUID invoiceIdStr = dao.getInvoiceIdByPaymentAttemptId(paymentAttemptId);
         return invoiceIdStr == null ? null : dao.getById(invoiceIdStr);
     }
 
     @Override
-    public InvoicePayment getInvoicePayment(UUID paymentAttemptId) {
+    public InvoicePayment getInvoicePayment(final UUID paymentAttemptId) {
         return dao.getInvoicePayment(paymentAttemptId);
     }
 
     @Override
-    public void notifyOfPaymentAttempt(UUID invoiceId, BigDecimal amount, Currency currency, UUID paymentAttemptId, DateTime paymentAttemptDate, CallContext context) {
-        InvoicePayment invoicePayment = new DefaultInvoicePayment(paymentAttemptId, invoiceId, paymentAttemptDate, amount, currency);
+    public void notifyOfPaymentAttempt(final UUID invoiceId, final BigDecimal amount, final Currency currency, final UUID paymentAttemptId, final DateTime paymentAttemptDate, final CallContext context) {
+        final InvoicePayment invoicePayment = new DefaultInvoicePayment(paymentAttemptId, invoiceId, paymentAttemptDate, amount, currency);
         dao.notifyOfPaymentAttempt(invoicePayment, context);
     }
 
     @Override
-    public void notifyOfPaymentAttempt(UUID invoiceId, UUID paymentAttemptId, DateTime paymentAttemptDate, CallContext context) {
-        InvoicePayment invoicePayment = new DefaultInvoicePayment(paymentAttemptId, invoiceId, paymentAttemptDate);
+    public void notifyOfPaymentAttempt(final UUID invoiceId, final UUID paymentAttemptId, final DateTime paymentAttemptDate, final CallContext context) {
+        final InvoicePayment invoicePayment = new DefaultInvoicePayment(paymentAttemptId, invoiceId, paymentAttemptDate);
         dao.notifyOfPaymentAttempt(invoicePayment, context);
     }
 
     @Override
-    public void processChargeback(UUID invoicePaymentId, BigDecimal amount, CallContext context) throws InvoiceApiException {
+    public void processChargeback(final UUID invoicePaymentId, final BigDecimal amount, final CallContext context) throws InvoiceApiException {
         dao.postChargeback(invoicePaymentId, amount, context);
     }
 
     @Override
-    public void processChargeback(UUID invoicePaymentId, CallContext context) throws InvoiceApiException {
+    public void processChargeback(final UUID invoicePaymentId, final CallContext context) throws InvoiceApiException {
         // use the invoicePaymentId to get the amount remaining on the payment
         // (preventing charge backs totalling more than the payment)
-        BigDecimal amount = dao.getRemainingAmountPaid(invoicePaymentId);
+        final BigDecimal amount = dao.getRemainingAmountPaid(invoicePaymentId);
         processChargeback(invoicePaymentId, amount, context);
     }
 
     @Override
-    public BigDecimal getRemainingAmountPaid(UUID invoicePaymentId) {
+    public BigDecimal getRemainingAmountPaid(final UUID invoicePaymentId) {
         return dao.getRemainingAmountPaid(invoicePaymentId);
     }
 
     @Override
-    public List<InvoicePayment> getChargebacksByAccountId(UUID accountId) {
+    public List<InvoicePayment> getChargebacksByAccountId(final UUID accountId) {
         return dao.getChargebacksByAccountId(accountId);
     }
 
     @Override
-    public List<InvoicePayment> getChargebacksByPaymentAttemptId(UUID paymentAttemptId) {
+    public List<InvoicePayment> getChargebacksByPaymentAttemptId(final UUID paymentAttemptId) {
         return dao.getChargebacksByPaymentAttemptId(paymentAttemptId);
     }
 
     @Override
-    public InvoicePayment getChargebackById(UUID chargebackId) throws InvoiceApiException {
+    public InvoicePayment getChargebackById(final UUID chargebackId) throws InvoiceApiException {
         return dao.getChargebackById(chargebackId);
     }
 
     @Override
-    public UUID getAccountIdFromInvoicePaymentId(UUID invoicePaymentId) throws InvoiceApiException {
+    public UUID getAccountIdFromInvoicePaymentId(final UUID invoicePaymentId) throws InvoiceApiException {
         return dao.getAccountIdFromInvoicePaymentId(invoicePaymentId);
     }
-}
\ No newline at end of file
+}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java b/invoice/src/main/java/com/ning/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java
index bea87a7..9e9b95c 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java
@@ -19,10 +19,6 @@ package com.ning.billing.invoice.api.migration;
 import java.math.BigDecimal;
 import java.util.UUID;
 
-import com.ning.billing.util.callcontext.CallContext;
-import com.ning.billing.util.callcontext.CallOrigin;
-import com.ning.billing.util.callcontext.UserType;
-import com.ning.billing.util.callcontext.DefaultCallContextFactory;
 import org.joda.time.DateTime;
 
 import com.google.inject.Inject;
@@ -32,26 +28,30 @@ import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.api.InvoiceMigrationApi;
 import com.ning.billing.invoice.dao.DefaultInvoiceDao;
 import com.ning.billing.invoice.model.MigrationInvoiceItem;
+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.UserType;
 import com.ning.billing.util.clock.Clock;
 
 public class DefaultInvoiceMigrationApi implements InvoiceMigrationApi {
-	
-	private DefaultInvoiceDao dao;
-	private Clock clock;
-
-	@Inject
-	public DefaultInvoiceMigrationApi(DefaultInvoiceDao dao, Clock clock) {
-		this.dao = dao;
-		this.clock = clock;
-	}
-
-	@Override
-	public UUID createMigrationInvoice(UUID accountId, DateTime targetDate, BigDecimal balance, Currency currency) {
-        CallContext context = new DefaultCallContextFactory(clock).createMigrationCallContext("Migration", CallOrigin.INTERNAL, UserType.MIGRATION, clock.getUTCNow(), clock.getUTCNow());
-		Invoice migrationInvoice = new MigrationInvoice(accountId, clock.getUTCNow(), targetDate, currency);
-		InvoiceItem migrationInvoiceItem = new MigrationInvoiceItem(migrationInvoice.getId(), accountId, targetDate, balance, currency );
-		migrationInvoice.addInvoiceItem(migrationInvoiceItem);
-		dao.create(migrationInvoice, context);
-		return migrationInvoice.getId();
-	}
+
+    private final DefaultInvoiceDao dao;
+    private final Clock clock;
+
+    @Inject
+    public DefaultInvoiceMigrationApi(final DefaultInvoiceDao dao, final Clock clock) {
+        this.dao = dao;
+        this.clock = clock;
+    }
+
+    @Override
+    public UUID createMigrationInvoice(final UUID accountId, final DateTime targetDate, final BigDecimal balance, final Currency currency) {
+        final CallContext context = new DefaultCallContextFactory(clock).createMigrationCallContext("Migration", CallOrigin.INTERNAL, UserType.MIGRATION, clock.getUTCNow(), clock.getUTCNow());
+        final Invoice migrationInvoice = new MigrationInvoice(accountId, clock.getUTCNow(), targetDate, currency);
+        final InvoiceItem migrationInvoiceItem = new MigrationInvoiceItem(migrationInvoice.getId(), accountId, targetDate, balance, currency);
+        migrationInvoice.addInvoiceItem(migrationInvoiceItem);
+        dao.create(migrationInvoice, context);
+        return migrationInvoice.getId();
+    }
 }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/migration/MigrationInvoice.java b/invoice/src/main/java/com/ning/billing/invoice/api/migration/MigrationInvoice.java
index 6627982..a23bd01 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/migration/MigrationInvoice.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/migration/MigrationInvoice.java
@@ -16,14 +16,15 @@
 
 package com.ning.billing.invoice.api.migration;
 
-import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.invoice.model.DefaultInvoice;
+import java.util.UUID;
+
 import org.joda.time.DateTime;
 
-import java.util.UUID;
+import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.invoice.model.DefaultInvoice;
 
 public class MigrationInvoice extends DefaultInvoice {
-    public MigrationInvoice(UUID accountId, DateTime invoiceDate, DateTime targetDate, Currency currency) {
+    public MigrationInvoice(final UUID accountId, final DateTime invoiceDate, final DateTime targetDate, final Currency currency) {
         super(UUID.randomUUID(), accountId, null, invoiceDate, targetDate, currency, true);
     }
 }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/test/DefaultInvoiceTestApi.java b/invoice/src/main/java/com/ning/billing/invoice/api/test/DefaultInvoiceTestApi.java
index ec0ca88..5c17e3d 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/test/DefaultInvoiceTestApi.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/test/DefaultInvoiceTestApi.java
@@ -25,7 +25,7 @@ public class DefaultInvoiceTestApi implements InvoiceTestApi {
     private final InvoiceDao invoiceDao;
 
     @Inject
-    public DefaultInvoiceTestApi(InvoiceDao invoiceDao) {
+    public DefaultInvoiceTestApi(final InvoiceDao invoiceDao) {
         this.invoiceDao = invoiceDao;
     }
 
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultEmptyInvoiceEvent.java b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultEmptyInvoiceEvent.java
index 97b32ae..60e9014 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultEmptyInvoiceEvent.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultEmptyInvoiceEvent.java
@@ -18,22 +18,22 @@ package com.ning.billing.invoice.api.user;
 
 import java.util.UUID;
 
+import org.joda.time.DateTime;
+
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
-import org.joda.time.DateTime;
-
 import com.ning.billing.invoice.api.EmptyInvoiceEvent;
 
 public class DefaultEmptyInvoiceEvent implements EmptyInvoiceEvent {
     private final UUID accountId;
     private final DateTime processingDate;
     private final UUID userToken;
-    
+
     @JsonCreator
     public DefaultEmptyInvoiceEvent(@JsonProperty("accountId") final UUID accountId,
-            @JsonProperty("processingDate") final DateTime processingDate,
-            @JsonProperty("userToken") final UUID userToken) {
+                                    @JsonProperty("processingDate") final DateTime processingDate,
+                                    @JsonProperty("userToken") final UUID userToken) {
         super();
         this.accountId = accountId;
         this.processingDate = processingDate;
@@ -73,31 +73,40 @@ public class DefaultEmptyInvoiceEvent implements EmptyInvoiceEvent {
     }
 
     @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
+    public boolean equals(final Object obj) {
+        if (this == obj) {
             return true;
-        if (obj == null)
+        }
+        if (obj == null) {
             return false;
-        if (getClass() != obj.getClass())
+        }
+        if (getClass() != obj.getClass()) {
             return false;
-        DefaultEmptyInvoiceEvent other = (DefaultEmptyInvoiceEvent) obj;
+        }
+        final DefaultEmptyInvoiceEvent other = (DefaultEmptyInvoiceEvent) obj;
         if (accountId == null) {
-            if (other.accountId != null)
+            if (other.accountId != null) {
                 return false;
-        } else if (!accountId.equals(other.accountId))
+            }
+        } else if (!accountId.equals(other.accountId)) {
             return false;
+        }
         if (processingDate == null) {
-            if (other.processingDate != null)
+            if (other.processingDate != null) {
                 return false;
-        } else if (processingDate.compareTo(other.processingDate) != 0)
+            }
+        } else if (processingDate.compareTo(other.processingDate) != 0) {
             return false;
+        }
         if (userToken == null) {
-            if (other.userToken != null)
+            if (other.userToken != null) {
                 return false;
-        } else if (!userToken.equals(other.userToken))
+            }
+        } else if (!userToken.equals(other.userToken)) {
             return false;
+        }
         return true;
     }
-    
-    
+
+
 }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceCreationEvent.java b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceCreationEvent.java
index 7ba10fb..6a3cf86 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceCreationEvent.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceCreationEvent.java
@@ -19,16 +19,16 @@ package com.ning.billing.invoice.api.user;
 import java.math.BigDecimal;
 import java.util.UUID;
 
+import org.joda.time.DateTime;
+
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonProperty;
-import org.joda.time.DateTime;
-
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.api.InvoiceCreationEvent;
 
 public class DefaultInvoiceCreationEvent implements InvoiceCreationEvent {
-	
+
     private final UUID invoiceId;
     private final UUID accountId;
     private final BigDecimal amountOwed;
@@ -37,12 +37,12 @@ public class DefaultInvoiceCreationEvent implements InvoiceCreationEvent {
     private final UUID userToken;
 
     @JsonCreator
-    public DefaultInvoiceCreationEvent(@JsonProperty("invoiceId") UUID invoiceId,
-            @JsonProperty("accountId") UUID accountId,
-            @JsonProperty("amountOwed") BigDecimal amountOwed,
-            @JsonProperty("currency") Currency currency,
-            @JsonProperty("invoiceCreationDate") DateTime invoiceCreationDate,
-            @JsonProperty("userToken") UUID userToken) {
+    public DefaultInvoiceCreationEvent(@JsonProperty("invoiceId") final UUID invoiceId,
+                                       @JsonProperty("accountId") final UUID accountId,
+                                       @JsonProperty("amountOwed") final BigDecimal amountOwed,
+                                       @JsonProperty("currency") final Currency currency,
+                                       @JsonProperty("invoiceCreationDate") final DateTime invoiceCreationDate,
+                                       @JsonProperty("userToken") final UUID userToken) {
         this.invoiceId = invoiceId;
         this.accountId = accountId;
         this.amountOwed = amountOwed;
@@ -52,15 +52,15 @@ public class DefaultInvoiceCreationEvent implements InvoiceCreationEvent {
     }
 
     @JsonIgnore
-	@Override
-	public BusEventType getBusEventType() {
-		return BusEventType.INVOICE_CREATION;
-	}
+    @Override
+    public BusEventType getBusEventType() {
+        return BusEventType.INVOICE_CREATION;
+    }
 
-	@Override
-	public UUID getUserToken() {
-		return userToken;
-	}
+    @Override
+    public UUID getUserToken() {
+        return userToken;
+    }
 
     @Override
     public UUID getInvoiceId() {
@@ -105,7 +105,7 @@ public class DefaultInvoiceCreationEvent implements InvoiceCreationEvent {
         result = prime
                 * result
                 + ((invoiceCreationDate == null) ? 0 : invoiceCreationDate
-                        .hashCode());
+                .hashCode());
         result = prime * result
                 + ((invoiceId == null) ? 0 : invoiceId.hashCode());
         result = prime * result
@@ -114,43 +114,57 @@ public class DefaultInvoiceCreationEvent implements InvoiceCreationEvent {
     }
 
     @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
+    public boolean equals(final Object obj) {
+        if (this == obj) {
             return true;
-        if (obj == null)
+        }
+        if (obj == null) {
             return false;
-        if (getClass() != obj.getClass())
+        }
+        if (getClass() != obj.getClass()) {
             return false;
-        DefaultInvoiceCreationEvent other = (DefaultInvoiceCreationEvent) obj;
+        }
+        final DefaultInvoiceCreationEvent other = (DefaultInvoiceCreationEvent) obj;
         if (accountId == null) {
-            if (other.accountId != null)
+            if (other.accountId != null) {
                 return false;
-        } else if (!accountId.equals(other.accountId))
+            }
+        } else if (!accountId.equals(other.accountId)) {
             return false;
+        }
         if (amountOwed == null) {
-            if (other.amountOwed != null)
+            if (other.amountOwed != null) {
                 return false;
-        } else if (!amountOwed.equals(other.amountOwed))
+            }
+        } else if (!amountOwed.equals(other.amountOwed)) {
             return false;
-        if (currency != other.currency)
+        }
+        if (currency != other.currency) {
             return false;
+        }
         if (invoiceCreationDate == null) {
-            if (other.invoiceCreationDate != null)
+            if (other.invoiceCreationDate != null) {
                 return false;
-        } else if (invoiceCreationDate.compareTo(other.invoiceCreationDate) != 0)
+            }
+        } else if (invoiceCreationDate.compareTo(other.invoiceCreationDate) != 0) {
             return false;
+        }
         if (invoiceId == null) {
-            if (other.invoiceId != null)
+            if (other.invoiceId != null) {
                 return false;
-        } else if (!invoiceId.equals(other.invoiceId))
+            }
+        } else if (!invoiceId.equals(other.invoiceId)) {
             return false;
+        }
         if (userToken == null) {
-            if (other.userToken != null)
+            if (other.userToken != null) {
                 return false;
-        } else if (!userToken.equals(other.userToken))
+            }
+        } else if (!userToken.equals(other.userToken)) {
             return false;
+        }
         return true;
     }
-    
-    
+
+
 }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
index 7f2ced3..e6dc189 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
@@ -20,18 +20,19 @@ import java.math.BigDecimal;
 import java.util.List;
 import java.util.UUID;
 
-import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.invoice.api.InvoiceItem;
-import com.ning.billing.util.callcontext.CallContext;
 import org.joda.time.DateTime;
 
 import com.google.inject.Inject;
+import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.InvoiceDispatcher;
 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.InvoicePayment;
 import com.ning.billing.invoice.api.InvoiceUserApi;
 import com.ning.billing.invoice.dao.InvoiceDao;
+import com.ning.billing.util.api.TagApiException;
+import com.ning.billing.util.callcontext.CallContext;
 
 public class DefaultInvoiceUserApi implements InvoiceUserApi {
     private final InvoiceDao dao;
@@ -54,15 +55,15 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
     }
 
     @Override
-    public void notifyOfPaymentAttempt(InvoicePayment invoicePayment, CallContext context) {
+    public void notifyOfPaymentAttempt(final InvoicePayment invoicePayment, final CallContext context) {
         dao.notifyOfPaymentAttempt(invoicePayment, context);
     }
 
     @Override
-	public BigDecimal getAccountBalance(UUID accountId) {
-		BigDecimal result = dao.getAccountBalance(accountId);
-		return result == null ? BigDecimal.ZERO : result;
-	}
+    public BigDecimal getAccountBalance(final UUID accountId) {
+        final BigDecimal result = dao.getAccountBalance(accountId);
+        return result == null ? BigDecimal.ZERO : result;
+    }
 
     @Override
     public Invoice getInvoice(final UUID invoiceId) {
@@ -74,20 +75,20 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
         return dao.getUnpaidInvoicesByAccountId(accountId, upToDate);
     }
 
-	@Override
-	public Invoice triggerInvoiceGeneration(final UUID accountId,
-			final DateTime targetDate, final boolean dryRun,
-            final CallContext context) throws InvoiceApiException {
-		return dispatcher.processAccount(accountId, targetDate, dryRun, context);
-	}
+    @Override
+    public Invoice triggerInvoiceGeneration(final UUID accountId,
+                                            final DateTime targetDate, final boolean dryRun,
+                                            final CallContext context) throws InvoiceApiException {
+        return dispatcher.processAccount(accountId, targetDate, dryRun, context);
+    }
 
     @Override
-    public void tagInvoiceAsWrittenOff(final UUID invoiceId, final CallContext context) {
+    public void tagInvoiceAsWrittenOff(final UUID invoiceId, final CallContext context) throws TagApiException {
         dao.setWrittenOff(invoiceId, context);
     }
 
     @Override
-    public void tagInvoiceAsNotWrittenOff(final UUID invoiceId, final CallContext context) throws InvoiceApiException {
+    public void tagInvoiceAsNotWrittenOff(final UUID invoiceId, final CallContext context) throws TagApiException {
         dao.removeWrittenOff(invoiceId, context);
     }
 
@@ -98,7 +99,7 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
 
     @Override
     public InvoiceItem insertCredit(final UUID accountId, final BigDecimal amount, final DateTime effectiveDate,
-                             final Currency currency, final CallContext context) throws InvoiceApiException {
+                                    final Currency currency, final CallContext context) throws InvoiceApiException {
         return dao.insertCredit(accountId, amount, effectiveDate, currency, context);
     }
 }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/CreditInvoiceItemSqlDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/CreditInvoiceItemSqlDao.java
index d60e813..7f31b7b 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/CreditInvoiceItemSqlDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/CreditInvoiceItemSqlDao.java
@@ -16,12 +16,17 @@
 
 package com.ning.billing.invoice.dao;
 
-import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.invoice.api.InvoiceItem;
-import com.ning.billing.invoice.model.CreditInvoiceItem;
-import com.ning.billing.util.callcontext.CallContext;
-import com.ning.billing.util.callcontext.CallContextBinder;
-import com.ning.billing.util.entity.dao.EntitySqlDao;
+import java.lang.annotation.Annotation;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.math.BigDecimal;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.List;
+import java.util.UUID;
+
 import org.joda.time.DateTime;
 import org.skife.jdbi.v2.SQLStatement;
 import org.skife.jdbi.v2.StatementContext;
@@ -36,16 +41,12 @@ import org.skife.jdbi.v2.sqlobject.customizers.RegisterMapper;
 import org.skife.jdbi.v2.sqlobject.stringtemplate.ExternalizedSqlViaStringTemplate3;
 import org.skife.jdbi.v2.tweak.ResultSetMapper;
 
-import java.lang.annotation.Annotation;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.math.BigDecimal;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.List;
-import java.util.UUID;
+import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.invoice.api.InvoiceItem;
+import com.ning.billing.invoice.model.CreditInvoiceItem;
+import com.ning.billing.util.callcontext.CallContext;
+import com.ning.billing.util.callcontext.CallContextBinder;
+import com.ning.billing.util.entity.dao.EntitySqlDao;
 
 @ExternalizedSqlViaStringTemplate3
 @RegisterMapper(CreditInvoiceItemSqlDao.CreditInvoiceItemMapper.class)
@@ -66,7 +67,7 @@ public interface CreditInvoiceItemSqlDao extends EntitySqlDao<InvoiceItem> {
     @SqlBatch
     void create(@CreditInvoiceItemBinder final List<InvoiceItem> items, @CallContextBinder final CallContext context);
 
-    @SqlBatch(transactional=false)
+    @SqlBatch(transactional = false)
     void batchCreateFromTransaction(@CreditInvoiceItemBinder final List<InvoiceItem> items, @CallContextBinder final CallContext context);
 
     @BindingAnnotation(CreditInvoiceItemBinder.CreditInvoiceItemBinderFactory.class)
@@ -74,9 +75,9 @@ public interface CreditInvoiceItemSqlDao extends EntitySqlDao<InvoiceItem> {
     @Target({ElementType.PARAMETER})
     public @interface CreditInvoiceItemBinder {
         public static class CreditInvoiceItemBinderFactory implements BinderFactory {
-            public Binder build(Annotation annotation) {
+            public Binder build(final Annotation annotation) {
                 return new Binder<CreditInvoiceItemBinder, CreditInvoiceItem>() {
-                    public void bind(SQLStatement q, CreditInvoiceItemBinder bind, CreditInvoiceItem item) {
+                    public void bind(final SQLStatement q, final CreditInvoiceItemBinder bind, final CreditInvoiceItem item) {
                         q.bind("id", item.getId().toString());
                         q.bind("invoiceId", item.getInvoiceId().toString());
                         q.bind("accountId", item.getAccountId().toString());
@@ -88,15 +89,16 @@ public interface CreditInvoiceItemSqlDao extends EntitySqlDao<InvoiceItem> {
             }
         }
     }
+
     public class CreditInvoiceItemMapper implements ResultSetMapper<InvoiceItem> {
         @Override
-        public InvoiceItem map(int index, ResultSet result, StatementContext ctx) throws SQLException {
-            UUID id = UUID.fromString(result.getString("id"));
-            UUID invoiceId = UUID.fromString(result.getString("invoice_id"));
-            UUID accountId = UUID.fromString(result.getString("account_id"));
-            DateTime creditDate = new DateTime(result.getTimestamp("credit_date"));
-            BigDecimal amount = result.getBigDecimal("amount");
-            Currency currency = Currency.valueOf(result.getString("currency"));
+        public InvoiceItem map(final int index, final ResultSet result, final StatementContext ctx) throws SQLException {
+            final UUID id = UUID.fromString(result.getString("id"));
+            final UUID invoiceId = UUID.fromString(result.getString("invoice_id"));
+            final UUID accountId = UUID.fromString(result.getString("account_id"));
+            final DateTime creditDate = new DateTime(result.getTimestamp("credit_date"));
+            final BigDecimal amount = result.getBigDecimal("amount");
+            final Currency currency = Currency.valueOf(result.getString("currency"));
             return new CreditInvoiceItem(id, invoiceId, accountId, creditDate, amount, currency);
         }
     }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
index c3bd916..22ddb71 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/DefaultInvoiceDao.java
@@ -39,6 +39,7 @@ import com.ning.billing.invoice.model.FixedPriceInvoiceItem;
 import com.ning.billing.invoice.model.RecurringInvoiceItem;
 import com.ning.billing.invoice.notification.NextBillingDatePoster;
 import com.ning.billing.util.ChangeType;
+import com.ning.billing.util.api.TagApiException;
 import com.ning.billing.util.api.TagUserApi;
 import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.dao.EntityAudit;
@@ -51,7 +52,6 @@ public class DefaultInvoiceDao implements InvoiceDao {
     private final InvoicePaymentSqlDao invoicePaymentSqlDao;
     private final CreditInvoiceItemSqlDao creditInvoiceItemSqlDao;
     private final TagUserApi tagUserApi;
-
     private final NextBillingDatePoster nextBillingDatePoster;
 
     @Inject
@@ -139,7 +139,6 @@ public class DefaultInvoiceDao implements InvoiceDao {
 
     @Override
     public void create(final Invoice invoice, final CallContext context) {
-
         invoiceSqlDao.inTransaction(new Transaction<Void, InvoiceSqlDao>() {
             @Override
             public Void inTransaction(final InvoiceSqlDao transactional, final TransactionStatus status) throws Exception {
@@ -260,12 +259,12 @@ public class DefaultInvoiceDao implements InvoiceDao {
     }
 
     @Override
-    public void setWrittenOff(final UUID invoiceId, final CallContext context) {
+    public void setWrittenOff(final UUID invoiceId, final CallContext context) throws TagApiException {
         tagUserApi.addTag(invoiceId, ObjectType.INVOICE, ControlTagType.WRITTEN_OFF.toTagDefinition(), context);
     }
 
     @Override
-    public void removeWrittenOff(final UUID invoiceId, final CallContext context) throws InvoiceApiException {
+    public void removeWrittenOff(final UUID invoiceId, final CallContext context) throws TagApiException {
         tagUserApi.removeTag(invoiceId, ObjectType.INVOICE, ControlTagType.WRITTEN_OFF.toTagDefinition(), context);
     }
 
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/FixedPriceInvoiceItemSqlDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/FixedPriceInvoiceItemSqlDao.java
index d4fa5ee..e191023 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/FixedPriceInvoiceItemSqlDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/FixedPriceInvoiceItemSqlDao.java
@@ -27,7 +27,6 @@ import java.sql.SQLException;
 import java.util.List;
 import java.util.UUID;
 
-import com.ning.billing.util.entity.dao.EntitySqlDao;
 import org.joda.time.DateTime;
 import org.skife.jdbi.v2.SQLStatement;
 import org.skife.jdbi.v2.StatementContext;
@@ -47,6 +46,7 @@ import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.model.FixedPriceInvoiceItem;
 import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.callcontext.CallContextBinder;
+import com.ning.billing.util.entity.dao.EntitySqlDao;
 
 @ExternalizedSqlViaStringTemplate3()
 @RegisterMapper(FixedPriceInvoiceItemSqlDao.FixedPriceInvoiceItemMapper.class)
@@ -70,7 +70,7 @@ public interface FixedPriceInvoiceItemSqlDao extends EntitySqlDao<InvoiceItem> {
     @SqlBatch
     void create(@FixedPriceInvoiceItemBinder final List<InvoiceItem> items, @CallContextBinder final CallContext context);
 
-    @SqlBatch(transactional=false)
+    @SqlBatch(transactional = false)
     void batchCreateFromTransaction(@FixedPriceInvoiceItemBinder final List<InvoiceItem> items, @CallContextBinder final CallContext context);
 
     @BindingAnnotation(FixedPriceInvoiceItemBinder.FixedPriceInvoiceItemBinderFactory.class)
@@ -78,9 +78,9 @@ public interface FixedPriceInvoiceItemSqlDao extends EntitySqlDao<InvoiceItem> {
     @Target({ElementType.PARAMETER})
     public @interface FixedPriceInvoiceItemBinder {
         public static class FixedPriceInvoiceItemBinderFactory implements BinderFactory {
-            public Binder build(Annotation annotation) {
+            public Binder build(final Annotation annotation) {
                 return new Binder<FixedPriceInvoiceItemBinder, FixedPriceInvoiceItem>() {
-                    public void bind(SQLStatement q, FixedPriceInvoiceItemBinder bind, FixedPriceInvoiceItem item) {
+                    public void bind(final SQLStatement q, final FixedPriceInvoiceItemBinder bind, final FixedPriceInvoiceItem item) {
                         q.bind("id", item.getId().toString());
                         q.bind("accountId", item.getAccountId().toString());
                         q.bind("invoiceId", item.getInvoiceId().toString());
@@ -100,21 +100,21 @@ public interface FixedPriceInvoiceItemSqlDao extends EntitySqlDao<InvoiceItem> {
 
     public static class FixedPriceInvoiceItemMapper implements ResultSetMapper<InvoiceItem> {
         @Override
-        public FixedPriceInvoiceItem map(int index, ResultSet result, StatementContext context) throws SQLException {
-            UUID id = UUID.fromString(result.getString("id"));
-            UUID invoiceId = UUID.fromString(result.getString("invoice_id"));
-            UUID accountId = UUID.fromString(result.getString("account_id"));
-            UUID bundleId = result.getString("bundle_id") == null ? null :UUID.fromString(result.getString("bundle_id"));
-            UUID subscriptionId = result.getString("subscription_id") == null ? null : UUID.fromString(result.getString("subscription_id"));
-            String planName = result.getString("plan_name");
-            String phaseName = result.getString("phase_name");
-            DateTime startDate = new DateTime(result.getTimestamp("start_date"));
-            DateTime endDate = new DateTime(result.getTimestamp("end_date"));
-            BigDecimal amount = result.getBigDecimal("amount");
-            Currency currency = Currency.valueOf(result.getString("currency"));
+        public FixedPriceInvoiceItem map(final int index, final ResultSet result, final StatementContext context) throws SQLException {
+            final UUID id = UUID.fromString(result.getString("id"));
+            final UUID invoiceId = UUID.fromString(result.getString("invoice_id"));
+            final UUID accountId = UUID.fromString(result.getString("account_id"));
+            final UUID bundleId = result.getString("bundle_id") == null ? null : UUID.fromString(result.getString("bundle_id"));
+            final UUID subscriptionId = result.getString("subscription_id") == null ? null : UUID.fromString(result.getString("subscription_id"));
+            final String planName = result.getString("plan_name");
+            final String phaseName = result.getString("phase_name");
+            final DateTime startDate = new DateTime(result.getTimestamp("start_date"));
+            final DateTime endDate = new DateTime(result.getTimestamp("end_date"));
+            final BigDecimal amount = result.getBigDecimal("amount");
+            final Currency currency = Currency.valueOf(result.getString("currency"));
 
             return new FixedPriceInvoiceItem(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName,
-                                            startDate, endDate, amount, currency);
+                                             startDate, endDate, amount, currency);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java
index c7e520b..fe82d6c 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java
@@ -16,17 +16,19 @@
 
 package com.ning.billing.invoice.dao;
 
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+
 import com.ning.billing.catalog.api.Currency;
 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.InvoicePayment;
+import com.ning.billing.util.api.TagApiException;
 import com.ning.billing.util.callcontext.CallContext;
-import org.joda.time.DateTime;
-
-import java.math.BigDecimal;
-import java.util.List;
-import java.util.UUID;
 
 public interface InvoiceDao {
     void create(Invoice invoice, CallContext context);
@@ -53,11 +55,11 @@ public interface InvoiceDao {
 
     void test();
 
-	List<Invoice> getAllInvoicesByAccount(final UUID accountId);
+    List<Invoice> getAllInvoicesByAccount(final UUID accountId);
 
-    void setWrittenOff(final UUID invoiceId, final CallContext context);
+    void setWrittenOff(final UUID invoiceId, final CallContext context) throws TagApiException;
 
-    void removeWrittenOff(final UUID invoiceId, final CallContext context) throws InvoiceApiException;
+    void removeWrittenOff(final UUID invoiceId, final CallContext context) throws TagApiException;
 
     void postChargeback(final UUID invoicePaymentId, final BigDecimal amount, final CallContext context) throws InvoiceApiException;
 
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoicePaymentSqlDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoicePaymentSqlDao.java
index 69c4c2a..ebbdbb7 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoicePaymentSqlDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoicePaymentSqlDao.java
@@ -27,15 +27,6 @@ import java.sql.SQLException;
 import java.util.List;
 import java.util.UUID;
 
-import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.invoice.model.DefaultInvoicePayment;
-import com.ning.billing.util.dao.AuditSqlDao;
-import com.ning.billing.util.callcontext.CallContext;
-import com.ning.billing.util.callcontext.CallContextBinder;
-import com.ning.billing.util.dao.BinderBase;
-import com.ning.billing.util.dao.MapperBase;
-import com.ning.billing.util.dao.UuidMapper;
-import com.ning.billing.util.entity.dao.EntitySqlDao;
 import org.joda.time.DateTime;
 import org.skife.jdbi.v2.SQLStatement;
 import org.skife.jdbi.v2.StatementContext;
@@ -52,14 +43,23 @@ import org.skife.jdbi.v2.sqlobject.mixins.Transmogrifier;
 import org.skife.jdbi.v2.sqlobject.stringtemplate.ExternalizedSqlViaStringTemplate3;
 import org.skife.jdbi.v2.tweak.ResultSetMapper;
 
+import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.api.InvoicePayment;
+import com.ning.billing.invoice.model.DefaultInvoicePayment;
+import com.ning.billing.util.callcontext.CallContext;
+import com.ning.billing.util.callcontext.CallContextBinder;
+import com.ning.billing.util.dao.AuditSqlDao;
+import com.ning.billing.util.dao.BinderBase;
+import com.ning.billing.util.dao.MapperBase;
+import com.ning.billing.util.dao.UuidMapper;
+import com.ning.billing.util.entity.dao.EntitySqlDao;
 
 @ExternalizedSqlViaStringTemplate3
 @RegisterMapper(InvoicePaymentSqlDao.InvoicePaymentMapper.class)
 public interface InvoicePaymentSqlDao extends EntitySqlDao<InvoicePayment>, Transactional<InvoicePaymentSqlDao>, AuditSqlDao, Transmogrifier {
     @SqlQuery
     List<Long> getRecordIds(@Bind("invoiceId") final String invoiceId);
-    
+
     @SqlQuery
     public InvoicePayment getByPaymentAttemptId(@Bind("paymentAttempt") final String paymentAttemptId);
 
@@ -70,7 +70,7 @@ public interface InvoicePaymentSqlDao extends EntitySqlDao<InvoicePayment>, Tran
     public void create(@InvoicePaymentBinder final InvoicePayment invoicePayment,
                        @CallContextBinder final CallContext context);
 
-    @SqlBatch(transactional=false)
+    @SqlBatch(transactional = false)
     void batchCreateFromTransaction(@InvoicePaymentBinder final List<InvoicePayment> items,
                                     @CallContextBinder final CallContext context);
 
@@ -99,7 +99,7 @@ public interface InvoicePaymentSqlDao extends EntitySqlDao<InvoicePayment>, Tran
 
     public static class InvoicePaymentMapper extends MapperBase implements ResultSetMapper<InvoicePayment> {
         @Override
-        public InvoicePayment map(int index, ResultSet result, StatementContext context) throws SQLException {
+        public InvoicePayment map(final int index, final ResultSet result, final StatementContext context) throws SQLException {
             final UUID id = getUUID(result, "id");
             final UUID paymentAttemptId = getUUID(result, "payment_attempt_id");
             final UUID invoiceId = getUUID(result, "invoice_id");
@@ -110,7 +110,7 @@ public interface InvoicePaymentSqlDao extends EntitySqlDao<InvoicePayment>, Tran
             final UUID reversedInvoicePaymentId = getUUID(result, "reversed_invoice_Payment_id");
 
             return new DefaultInvoicePayment(id, paymentAttemptId, invoiceId, paymentAttemptDate,
-                    amount, currency, reversedInvoicePaymentId);
+                                             amount, currency, reversedInvoicePaymentId);
         }
     }
 
@@ -120,16 +120,16 @@ public interface InvoicePaymentSqlDao extends EntitySqlDao<InvoicePayment>, Tran
     public @interface InvoicePaymentBinder {
         public static class InvoicePaymentBinderFactory extends BinderBase implements BinderFactory {
             @Override
-            public Binder build(Annotation annotation) {
+            public Binder build(final Annotation annotation) {
                 return new Binder<InvoicePaymentBinder, InvoicePayment>() {
                     @Override
-                    public void bind(SQLStatement q, InvoicePaymentBinder bind, InvoicePayment payment) {
+                    public void bind(final SQLStatement q, final InvoicePaymentBinder bind, final InvoicePayment payment) {
                         q.bind("id", payment.getId().toString());
                         q.bind("invoiceId", payment.getInvoiceId().toString());
                         q.bind("paymentAttemptId", uuidToString(payment.getPaymentAttemptId()));
                         q.bind("paymentAttemptDate", payment.getPaymentAttemptDate().toDate());
                         q.bind("amount", payment.getAmount());
-                        Currency currency = payment.getCurrency();
+                        final Currency currency = payment.getCurrency();
                         q.bind("currency", (currency == null) ? null : currency.toString());
                         q.bind("reversedInvoicePaymentId", uuidToString(payment.getReversedInvoicePaymentId()));
                     }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceSqlDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceSqlDao.java
index 04b3fce..21fe8d5 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceSqlDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceSqlDao.java
@@ -16,14 +16,18 @@
 
 package com.ning.billing.invoice.dao;
 
-import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.invoice.api.Invoice;
-import com.ning.billing.invoice.model.DefaultInvoice;
-import com.ning.billing.util.callcontext.CallContext;
-import com.ning.billing.util.dao.AuditSqlDao;
-import com.ning.billing.util.dao.UuidMapper;
-import com.ning.billing.util.callcontext.CallContextBinder;
-import com.ning.billing.util.entity.dao.EntitySqlDao;
+import java.lang.annotation.Annotation;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.math.BigDecimal;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
 import org.joda.time.DateTime;
 import org.skife.jdbi.v2.SQLStatement;
 import org.skife.jdbi.v2.StatementContext;
@@ -40,17 +44,14 @@ import org.skife.jdbi.v2.sqlobject.mixins.Transmogrifier;
 import org.skife.jdbi.v2.sqlobject.stringtemplate.ExternalizedSqlViaStringTemplate3;
 import org.skife.jdbi.v2.tweak.ResultSetMapper;
 
-import java.lang.annotation.Annotation;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.math.BigDecimal;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Date;
-import java.util.List;
-import java.util.UUID;
+import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.invoice.api.Invoice;
+import com.ning.billing.invoice.model.DefaultInvoice;
+import com.ning.billing.util.callcontext.CallContext;
+import com.ning.billing.util.callcontext.CallContextBinder;
+import com.ning.billing.util.dao.AuditSqlDao;
+import com.ning.billing.util.dao.UuidMapper;
+import com.ning.billing.util.entity.dao.EntitySqlDao;
 
 @ExternalizedSqlViaStringTemplate3()
 @RegisterMapper(InvoiceSqlDao.InvoiceMapper.class)
@@ -61,7 +62,7 @@ public interface InvoiceSqlDao extends EntitySqlDao<Invoice>, AuditSqlDao, Trans
 
     @SqlQuery
     List<Invoice> getInvoicesByAccount(@Bind("accountId") final String accountId);
-    
+
     @SqlQuery
     List<Invoice> getAllInvoicesByAccount(@Bind("accountId") final String string);
 
@@ -90,10 +91,10 @@ public interface InvoiceSqlDao extends EntitySqlDao<Invoice>, AuditSqlDao, Trans
     public @interface InvoiceBinder {
         public static class InvoiceBinderFactory implements BinderFactory {
             @Override
-            public Binder<InvoiceBinder, Invoice> build(Annotation annotation) {
+            public Binder<InvoiceBinder, Invoice> build(final Annotation annotation) {
                 return new Binder<InvoiceBinder, Invoice>() {
                     @Override
-                    public void bind(@SuppressWarnings("rawtypes") SQLStatement q, InvoiceBinder bind, Invoice invoice) {
+                    public void bind(@SuppressWarnings("rawtypes") final SQLStatement q, final InvoiceBinder bind, final Invoice invoice) {
                         q.bind("id", invoice.getId().toString());
                         q.bind("accountId", invoice.getAccountId().toString());
                         q.bind("invoiceDate", invoice.getInvoiceDate().toDate());
@@ -108,14 +109,14 @@ public interface InvoiceSqlDao extends EntitySqlDao<Invoice>, AuditSqlDao, Trans
 
     public static class InvoiceMapper implements ResultSetMapper<Invoice> {
         @Override
-        public Invoice map(int index, ResultSet result, StatementContext context) throws SQLException {
-            UUID id = UUID.fromString(result.getString("id"));
-            UUID accountId = UUID.fromString(result.getString("account_id"));
-            int invoiceNumber = result.getInt("invoice_number");
-            DateTime invoiceDate = new DateTime(result.getTimestamp("invoice_date"));
-            DateTime targetDate = new DateTime(result.getTimestamp("target_date"));
-            Currency currency = Currency.valueOf(result.getString("currency"));
-            boolean isMigrationInvoice = result.getBoolean("migrated");
+        public Invoice map(final int index, final ResultSet result, final StatementContext context) throws SQLException {
+            final UUID id = UUID.fromString(result.getString("id"));
+            final UUID accountId = UUID.fromString(result.getString("account_id"));
+            final int invoiceNumber = result.getInt("invoice_number");
+            final DateTime invoiceDate = new DateTime(result.getTimestamp("invoice_date"));
+            final DateTime targetDate = new DateTime(result.getTimestamp("target_date"));
+            final Currency currency = Currency.valueOf(result.getString("currency"));
+            final boolean isMigrationInvoice = result.getBoolean("migrated");
 
             return new DefaultInvoice(id, accountId, invoiceNumber, invoiceDate, targetDate, currency, isMigrationInvoice);
         }
@@ -138,8 +139,5 @@ public interface InvoiceSqlDao extends EntitySqlDao<Invoice>, AuditSqlDao, Trans
             return amountInvoiced.subtract(amountPaid);
         }
     }
-
-
-
 }
 
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/RecurringInvoiceItemSqlDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/RecurringInvoiceItemSqlDao.java
index 4daa560..029b29d 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/RecurringInvoiceItemSqlDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/RecurringInvoiceItemSqlDao.java
@@ -27,7 +27,6 @@ import java.sql.SQLException;
 import java.util.List;
 import java.util.UUID;
 
-import com.ning.billing.util.dao.MapperBase;
 import org.joda.time.DateTime;
 import org.skife.jdbi.v2.SQLStatement;
 import org.skife.jdbi.v2.StatementContext;
@@ -47,6 +46,7 @@ import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.model.RecurringInvoiceItem;
 import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.callcontext.CallContextBinder;
+import com.ning.billing.util.dao.MapperBase;
 import com.ning.billing.util.entity.dao.EntitySqlDao;
 
 @ExternalizedSqlViaStringTemplate3()
@@ -77,10 +77,10 @@ public interface RecurringInvoiceItemSqlDao extends EntitySqlDao<InvoiceItem> {
     public @interface RecurringInvoiceItemBinder {
         public static class InvoiceItemBinderFactory implements BinderFactory {
             @Override
-            public Binder build(Annotation annotation) {
+            public Binder build(final Annotation annotation) {
                 return new Binder<RecurringInvoiceItemBinder, RecurringInvoiceItem>() {
                     @Override
-                    public void bind(SQLStatement q, RecurringInvoiceItemBinder bind, RecurringInvoiceItem item) {
+                    public void bind(final SQLStatement q, final RecurringInvoiceItemBinder bind, final RecurringInvoiceItem item) {
                         q.bind("id", item.getId().toString());
                         q.bind("invoiceId", item.getInvoiceId().toString());
                         q.bind("accountId", item.getAccountId().toString());
@@ -102,23 +102,23 @@ public interface RecurringInvoiceItemSqlDao extends EntitySqlDao<InvoiceItem> {
 
     public static class RecurringInvoiceItemMapper extends MapperBase implements ResultSetMapper<InvoiceItem> {
         @Override
-        public InvoiceItem map(int index, ResultSet result, StatementContext context) throws SQLException {
-            UUID id = getUUID(result, "id");
-            UUID invoiceId = getUUID(result, "invoice_id");
-            UUID accountId = getUUID(result, "account_id");
-            UUID subscriptionId = getUUID(result, "subscription_id");
-            UUID bundleId = getUUID(result, "bundle_id");
-            String planName = result.getString("plan_name");
-            String phaseName = result.getString("phase_name");
-            DateTime startDate = getDate(result, "start_date");
-            DateTime endDate = getDate(result, "end_date");
-            BigDecimal amount = result.getBigDecimal("amount");
-            BigDecimal rate = result.getBigDecimal("rate");
-            Currency currency = Currency.valueOf(result.getString("currency"));
-            UUID reversedItemId = getUUID(result, "reversed_item_id");
+        public InvoiceItem map(final int index, final ResultSet result, final StatementContext context) throws SQLException {
+            final UUID id = getUUID(result, "id");
+            final UUID invoiceId = getUUID(result, "invoice_id");
+            final UUID accountId = getUUID(result, "account_id");
+            final UUID subscriptionId = getUUID(result, "subscription_id");
+            final UUID bundleId = getUUID(result, "bundle_id");
+            final String planName = result.getString("plan_name");
+            final String phaseName = result.getString("phase_name");
+            final DateTime startDate = getDate(result, "start_date");
+            final DateTime endDate = getDate(result, "end_date");
+            final BigDecimal amount = result.getBigDecimal("amount");
+            final BigDecimal rate = result.getBigDecimal("rate");
+            final Currency currency = Currency.valueOf(result.getString("currency"));
+            final UUID reversedItemId = getUUID(result, "reversed_item_id");
 
             return new RecurringInvoiceItem(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate,
-                    amount, rate, currency, reversedItemId);
+                                            amount, rate, currency, reversedItemId);
 
         }
     }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/glue/DefaultInvoiceModule.java b/invoice/src/main/java/com/ning/billing/invoice/glue/DefaultInvoiceModule.java
index f440071..b0fa991 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/glue/DefaultInvoiceModule.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/glue/DefaultInvoiceModule.java
@@ -58,10 +58,10 @@ public class DefaultInvoiceModule extends AbstractModule implements InvoiceModul
     public void installInvoiceUserApi() {
         bind(InvoiceUserApi.class).to(DefaultInvoiceUserApi.class).asEagerSingleton();
     }
-    
+
     /* (non-Javadoc)
-     * @see com.ning.billing.invoice.glue.InvoiceModule#installInvoiceUserApi()
-     */
+    * @see com.ning.billing.invoice.glue.InvoiceModule#installInvoiceUserApi()
+    */
     @Override
     public void installInvoiceTestApi() {
         bind(InvoiceTestApi.class).to(DefaultInvoiceTestApi.class).asEagerSingleton();
@@ -83,19 +83,19 @@ public class DefaultInvoiceModule extends AbstractModule implements InvoiceModul
     protected void installInvoiceService() {
         bind(InvoiceService.class).to(DefaultInvoiceService.class).asEagerSingleton();
     }
-    
+
     /* (non-Javadoc)
-     * @see com.ning.billing.invoice.glue.InvoiceModule#installInvoiceMigrationApi()
-     */
+    * @see com.ning.billing.invoice.glue.InvoiceModule#installInvoiceMigrationApi()
+    */
     @Override
     public void installInvoiceMigrationApi() {
-    	bind(InvoiceMigrationApi.class).to(DefaultInvoiceMigrationApi.class).asEagerSingleton();
-	}
+        bind(InvoiceMigrationApi.class).to(DefaultInvoiceMigrationApi.class).asEagerSingleton();
+    }
 
     protected void installNotifiers() {
         bind(NextBillingDateNotifier.class).to(DefaultNextBillingDateNotifier.class).asEagerSingleton();
         bind(NextBillingDatePoster.class).to(DefaultNextBillingDatePoster.class).asEagerSingleton();
-        TranslatorConfig config = new ConfigurationObjectFactory(System.getProperties()).build(TranslatorConfig.class);
+        final TranslatorConfig config = new ConfigurationObjectFactory(System.getProperties()).build(TranslatorConfig.class);
         bind(TranslatorConfig.class).toInstance(config);
         bind(InvoiceFormatterFactory.class).to(DefaultInvoiceFormatterFactory.class).asEagerSingleton();
         bind(InvoiceNotifier.class).to(NullInvoiceNotifier.class).asEagerSingleton();
diff --git a/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java b/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
index b982a3f..af6dad1 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
@@ -60,8 +60,8 @@ import com.ning.billing.util.globallocker.GlobalLocker.LockerService;
 import com.ning.billing.util.globallocker.LockFailedException;
 
 public class InvoiceDispatcher {
-    private final static Logger log = LoggerFactory.getLogger(InvoiceDispatcher.class);
-    private final static int NB_LOCK_TRY = 5;
+    private static final Logger log = LoggerFactory.getLogger(InvoiceDispatcher.class);
+    private static final int NB_LOCK_TRY = 5;
 
     private final InvoiceGenerator generator;
     private final BillingApi billingApi;
@@ -76,12 +76,12 @@ public class InvoiceDispatcher {
 
     @Inject
     public InvoiceDispatcher(final InvoiceGenerator generator, final AccountUserApi accountUserApi,
-            final BillingApi billingApi,
-            final InvoiceDao invoiceDao,
-            final InvoiceNotifier invoiceNotifier,
-            final GlobalLocker locker,
-            final Bus eventBus,
-            final Clock clock) {
+                             final BillingApi billingApi,
+                             final InvoiceDao invoiceDao,
+                             final InvoiceNotifier invoiceNotifier,
+                             final GlobalLocker locker,
+                             final Bus eventBus,
+                             final Clock clock) {
         this.generator = generator;
         this.billingApi = billingApi;
         this.accountUserApi = accountUserApi;
@@ -91,37 +91,36 @@ public class InvoiceDispatcher {
         this.eventBus = eventBus;
         this.clock = clock;
 
-        String verboseOutputValue = System.getProperty("VERBOSE_OUTPUT");
+        final String verboseOutputValue = System.getProperty("VERBOSE_OUTPUT");
         VERBOSE_OUTPUT = (verboseOutputValue != null) && Boolean.parseBoolean(verboseOutputValue);
     }
 
     public void processSubscription(final SubscriptionEvent transition,
-            final CallContext context) throws InvoiceApiException {
-        UUID subscriptionId = transition.getSubscriptionId();
-        DateTime targetDate = transition.getEffectiveTransitionTime();
+                                    final CallContext context) throws InvoiceApiException {
+        final UUID subscriptionId = transition.getSubscriptionId();
+        final DateTime targetDate = transition.getEffectiveTransitionTime();
         log.info("Got subscription transition from InvoiceListener. id: " + subscriptionId.toString() + "; targetDate: " + targetDate.toString());
         log.info("Transition type: " + transition.getTransitionType().toString());
         processSubscription(subscriptionId, targetDate, context);
     }
 
     public void processSubscription(final UUID subscriptionId, final DateTime targetDate,
-            final CallContext context) throws InvoiceApiException {
+                                    final CallContext context) throws InvoiceApiException {
         try {
             if (subscriptionId == null) {
                 log.error("Failed handling entitlement change.", new InvoiceApiException(ErrorCode.INVOICE_INVALID_TRANSITION));
                 return;
             }
-            UUID accountId = billingApi.getAccountIdFromSubscriptionId(subscriptionId);
+            final UUID accountId = billingApi.getAccountIdFromSubscriptionId(subscriptionId);
             processAccount(accountId, targetDate, false, context);
         } catch (EntitlementBillingApiException e) {
             log.error("Failed handling entitlement change.",
-                    new InvoiceApiException(ErrorCode.INVOICE_NO_ACCOUNT_ID_FOR_SUBSCRIPTION_ID, subscriptionId.toString()));
+                      new InvoiceApiException(ErrorCode.INVOICE_NO_ACCOUNT_ID_FOR_SUBSCRIPTION_ID, subscriptionId.toString()));
         }
-        return;
     }
 
     public Invoice processAccount(final UUID accountId, final DateTime targetDate,
-            final boolean dryRun, final CallContext context) throws InvoiceApiException {
+                                  final boolean dryRun, final CallContext context) throws InvoiceApiException {
         GlobalLock lock = null;
         try {
             lock = locker.lockWithNumberOfTries(LockerService.INVOICE, accountId.toString(), NB_LOCK_TRY);
@@ -131,7 +130,7 @@ public class InvoiceDispatcher {
         } catch (LockFailedException e) {
             // Not good!
             log.error(String.format("Failed to process invoice for account %s, targetDate %s",
-                    accountId.toString(), targetDate), e);
+                                    accountId.toString(), targetDate), e);
         } finally {
             if (lock != null) {
                 lock.release();
@@ -140,35 +139,35 @@ public class InvoiceDispatcher {
         return null;
     }
 
-   
+
     private Invoice processAccountWithLock(final UUID accountId, final DateTime targetDate,
-            final boolean dryRun, final CallContext context) throws InvoiceApiException {
+                                           final boolean dryRun, final CallContext context) throws InvoiceApiException {
         try {
-            Account account = accountUserApi.getAccountById(accountId);
-            BillingEventSet billingEvents = billingApi.getBillingEventsForAccountAndUpdateAccountBCD(accountId);
-            
+            final Account account = accountUserApi.getAccountById(accountId);
+            final BillingEventSet billingEvents = billingApi.getBillingEventsForAccountAndUpdateAccountBCD(accountId);
+
             List<Invoice> invoices = new ArrayList<Invoice>();
             if (!billingEvents.isAccountAutoInvoiceOff()) {
                 invoices = invoiceDao.getInvoicesByAccount(accountId); //no need to fetch, invoicing is off on this account
-            } 
+            }
 
-            Currency targetCurrency = account.getCurrency();
+            final Currency targetCurrency = account.getCurrency();
 
-            
-            Invoice invoice = generator.generateInvoice(accountId, billingEvents, invoices, targetDate, targetCurrency);
+
+            final Invoice invoice = generator.generateInvoice(accountId, billingEvents, invoices, targetDate, targetCurrency);
 
             if (invoice == null) {
                 log.info("Generated null invoice.");
                 outputDebugData(billingEvents, invoices);
                 if (!dryRun) {
-                    BusEvent event = new DefaultEmptyInvoiceEvent(accountId, clock.getUTCNow(), context.getUserToken());
+                    final BusEvent event = new DefaultEmptyInvoiceEvent(accountId, clock.getUTCNow(), context.getUserToken());
                     postEvent(event, accountId);
                 }
             } else {
                 log.info("Generated invoice {} with {} items.", invoice.getId().toString(), invoice.getNumberOfItems());
                 if (VERBOSE_OUTPUT) {
                     log.info("New items");
-                    for (InvoiceItem item : invoice.getInvoiceItems()) {
+                    for (final InvoiceItem item : invoice.getInvoiceItems()) {
                         log.info(item.toString());
                     }
                 }
@@ -176,14 +175,14 @@ public class InvoiceDispatcher {
                 if (!dryRun) {
                     invoiceDao.create(invoice, context);
 
-                    List<InvoiceItem> fixedPriceInvoiceItems = invoice.getInvoiceItems(FixedPriceInvoiceItem.class);
-                    List<InvoiceItem> recurringInvoiceItems = invoice.getInvoiceItems(RecurringInvoiceItem.class);
+                    final List<InvoiceItem> fixedPriceInvoiceItems = invoice.getInvoiceItems(FixedPriceInvoiceItem.class);
+                    final List<InvoiceItem> recurringInvoiceItems = invoice.getInvoiceItems(RecurringInvoiceItem.class);
                     setChargedThroughDates(fixedPriceInvoiceItems, recurringInvoiceItems, context);
 
                     final InvoiceCreationEvent event = new DefaultInvoiceCreationEvent(invoice.getId(), invoice.getAccountId(),
-                            invoice.getBalance(), invoice.getCurrency(),
-                            invoice.getInvoiceDate(),
-                            context.getUserToken());
+                                                                                       invoice.getBalance(), invoice.getCurrency(),
+                                                                                       invoice.getInvoiceDate(),
+                                                                                       context.getUserToken());
 
                     postEvent(event, accountId);
                 }
@@ -194,41 +193,41 @@ public class InvoiceDispatcher {
             }
 
             return invoice;
-        } catch(AccountApiException e) {
-            log.error("Failed handling entitlement change.",e);
-            return null;    
+        } catch (AccountApiException e) {
+            log.error("Failed handling entitlement change.", e);
+            return null;
         }
     }
 
     private void setChargedThroughDates(final Collection<InvoiceItem> fixedPriceItems,
-            final Collection<InvoiceItem> recurringItems, CallContext context) {
+                                        final Collection<InvoiceItem> recurringItems, final CallContext context) {
 
-        Map<UUID, DateTime> chargeThroughDates = new HashMap<UUID, DateTime>();
+        final Map<UUID, DateTime> chargeThroughDates = new HashMap<UUID, DateTime>();
         addInvoiceItemsToChargeThroughDates(chargeThroughDates, fixedPriceItems);
         addInvoiceItemsToChargeThroughDates(chargeThroughDates, recurringItems);
 
-        for (UUID subscriptionId : chargeThroughDates.keySet()) {
-            if(subscriptionId != null) {
-                DateTime chargeThroughDate = chargeThroughDates.get(subscriptionId);
+        for (final UUID subscriptionId : chargeThroughDates.keySet()) {
+            if (subscriptionId != null) {
+                final DateTime chargeThroughDate = chargeThroughDates.get(subscriptionId);
                 log.info("Setting CTD for subscription {} to {}", subscriptionId.toString(), chargeThroughDate.toString());
                 billingApi.setChargedThroughDate(subscriptionId, chargeThroughDate, context);
             }
         }
     }
-    
+
     private void postEvent(final BusEvent event, final UUID accountId) {
         try {
             eventBus.post(event);
-        } catch (EventBusException e){
-            log.error(String.format("Failed to post event {} for account {} ", event.getBusEventType(), accountId), e);
+        } catch (EventBusException e) {
+            log.error(String.format("Failed to post event %s for account %s", event.getBusEventType(), accountId), e);
         }
     }
 
 
-    private void addInvoiceItemsToChargeThroughDates(Map<UUID, DateTime> chargeThroughDates, Collection<InvoiceItem> items) {
-        for (InvoiceItem item : items) {
-            UUID subscriptionId = item.getSubscriptionId();
-            DateTime endDate = item.getEndDate();
+    private void addInvoiceItemsToChargeThroughDates(final Map<UUID, DateTime> chargeThroughDates, final Collection<InvoiceItem> items) {
+        for (final InvoiceItem item : items) {
+            final UUID subscriptionId = item.getSubscriptionId();
+            final DateTime endDate = item.getEndDate();
 
             if (chargeThroughDates.containsKey(subscriptionId)) {
                 if (chargeThroughDates.get(subscriptionId).isBefore(endDate)) {
@@ -241,16 +240,16 @@ public class InvoiceDispatcher {
     }
 
 
-    private void outputDebugData(Collection<BillingEvent> events, Collection<Invoice> invoices) {
+    private void outputDebugData(final Collection<BillingEvent> events, final Collection<Invoice> invoices) {
         if (VERBOSE_OUTPUT) {
             log.info("Events");
-            for (BillingEvent event : events) {
+            for (final BillingEvent event : events) {
                 log.info(event.toString());
             }
 
             log.info("Existing items");
-            for (Invoice invoice : invoices) {
-                for (InvoiceItem item : invoice.getInvoiceItems()) {
+            for (final Invoice invoice : invoices) {
+                for (final InvoiceItem item : invoice.getInvoiceItems()) {
                     log.info(item.toString());
                 }
             }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java b/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
index 66f423e..5793dec 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
@@ -18,10 +18,6 @@ package com.ning.billing.invoice;
 
 import java.util.UUID;
 
-import com.ning.billing.util.callcontext.CallContext;
-import com.ning.billing.util.callcontext.CallOrigin;
-import com.ning.billing.util.callcontext.UserType;
-import com.ning.billing.util.callcontext.CallContextFactory;
 import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -32,14 +28,18 @@ import com.ning.billing.entitlement.api.SubscriptionTransitionType;
 import com.ning.billing.entitlement.api.timeline.RepairEntitlementEvent;
 import com.ning.billing.entitlement.api.user.SubscriptionEvent;
 import com.ning.billing.invoice.api.InvoiceApiException;
+import com.ning.billing.util.callcontext.CallContext;
+import com.ning.billing.util.callcontext.CallContextFactory;
+import com.ning.billing.util.callcontext.CallOrigin;
+import com.ning.billing.util.callcontext.UserType;
 
 public class InvoiceListener {
-    private final static Logger log = LoggerFactory.getLogger(InvoiceListener.class);
-	private final InvoiceDispatcher dispatcher;
+    private static final Logger log = LoggerFactory.getLogger(InvoiceListener.class);
+    private final InvoiceDispatcher dispatcher;
     private final CallContextFactory factory;
 
     @Inject
-    public InvoiceListener(CallContextFactory factory, InvoiceDispatcher dispatcher) {
+    public InvoiceListener(final CallContextFactory factory, final InvoiceDispatcher dispatcher) {
         this.dispatcher = dispatcher;
         this.factory = factory;
     }
@@ -47,25 +47,25 @@ public class InvoiceListener {
     @Subscribe
     public void handleRepairEntitlementEvent(final RepairEntitlementEvent repairEvent) {
         try {
-            CallContext context = factory.createCallContext("RepairBundle", CallOrigin.INTERNAL, UserType.SYSTEM, repairEvent.getUserToken());
+            final CallContext context = factory.createCallContext("RepairBundle", CallOrigin.INTERNAL, UserType.SYSTEM, repairEvent.getUserToken());
             dispatcher.processAccount(repairEvent.getAccountId(), repairEvent.getEffectiveDate(), false, context);
         } catch (InvoiceApiException e) {
             log.error(e.getMessage());
         }
     }
-    
+
     @Subscribe
     public void handleSubscriptionTransition(final SubscriptionEvent transition) {
         try {
             //  Skip future uncancel event
             //  Skip events which are marked as not being the last one
-            if (transition.getTransitionType() == SubscriptionTransitionType.UNCANCEL 
+            if (transition.getTransitionType() == SubscriptionTransitionType.UNCANCEL
                     || transition.getRemainingEventsForUserOperation() > 0) {
                 return;
             }
 
-            CallContext context = factory.createCallContext("Transition", CallOrigin.INTERNAL, UserType.SYSTEM, transition.getUserToken());
-        	dispatcher.processSubscription(transition, context);
+            final CallContext context = factory.createCallContext("Transition", CallOrigin.INTERNAL, UserType.SYSTEM, transition.getUserToken());
+            dispatcher.processSubscription(transition, context);
         } catch (InvoiceApiException e) {
             log.error(e.getMessage());
         }
@@ -73,8 +73,8 @@ public class InvoiceListener {
 
     public void handleNextBillingDateEvent(final UUID subscriptionId, final DateTime eventDateTime) {
         try {
-            CallContext context = factory.createCallContext("Next Billing Date", CallOrigin.INTERNAL, UserType.SYSTEM);
-        	dispatcher.processSubscription(subscriptionId, eventDateTime, context);
+            final CallContext context = factory.createCallContext("Next Billing Date", CallOrigin.INTERNAL, UserType.SYSTEM);
+            dispatcher.processSubscription(subscriptionId, eventDateTime, context);
         } catch (InvoiceApiException e) {
             log.error(e.getMessage());
         }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/BillingMode.java b/invoice/src/main/java/com/ning/billing/invoice/model/BillingMode.java
index 4920b88..7006cf6 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/BillingMode.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/BillingMode.java
@@ -16,12 +16,14 @@
 
 package com.ning.billing.invoice.model;
 
-import com.ning.billing.catalog.api.BillingPeriod;
+import java.util.List;
+
 import org.joda.time.DateTime;
 
-import java.util.List;
+import com.ning.billing.catalog.api.BillingPeriod;
 
 public interface BillingMode {
     List<RecurringInvoiceItemData> calculateInvoiceItemData(DateTime startDate, DateTime endDate, DateTime targetDate, int billingCycleDay, BillingPeriod billingPeriod) throws InvalidDateSequenceException;
+
     List<RecurringInvoiceItemData> calculateInvoiceItemData(DateTime startDate, DateTime targetDate, int billingCycleDay, BillingPeriod billingPeriod) throws InvalidDateSequenceException;
-}
\ No newline at end of file
+}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/BillingModeBase.java b/invoice/src/main/java/com/ning/billing/invoice/model/BillingModeBase.java
index 55c646c..adc4e3f 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/BillingModeBase.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/BillingModeBase.java
@@ -16,11 +16,6 @@
 
 package com.ning.billing.invoice.model;
 
-import com.ning.billing.catalog.api.BillingPeriod;
-import org.joda.time.DateTime;
-
-import java.math.BigDecimal;
-
 public abstract class BillingModeBase {
 //    public BigDecimal calculateNumberOfBillingCycles(final DateTime startDate, final DateTime endDate, final DateTime targetDate, final int billingCycleDay, final BillingPeriod billingPeriod) throws InvalidDateSequenceException {
 //        if (endDate.isBefore(startDate)) {throw new InvalidDateSequenceException();}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/CreditInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/CreditInvoiceItem.java
index 651a717..d271561 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/CreditInvoiceItem.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/CreditInvoiceItem.java
@@ -16,20 +16,21 @@
 
 package com.ning.billing.invoice.model;
 
+import java.math.BigDecimal;
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.api.InvoiceItemType;
-import org.joda.time.DateTime;
-
-import java.math.BigDecimal;
-import java.util.UUID;
 
 public class CreditInvoiceItem extends InvoiceItemBase {
-    public CreditInvoiceItem(UUID invoiceId, UUID accountId, DateTime date, BigDecimal amount, Currency currency) {
+    public CreditInvoiceItem(final UUID invoiceId, final UUID accountId, final DateTime date, final BigDecimal amount, final Currency currency) {
         this(UUID.randomUUID(), invoiceId, accountId, date, amount, currency);
     }
 
-    public CreditInvoiceItem(UUID id, UUID invoiceId, UUID accountId, DateTime date, BigDecimal amount, Currency currency) {
+    public CreditInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final DateTime date, final BigDecimal amount, final Currency currency) {
         super(id, invoiceId, accountId, null, null, null, null, date, date, amount, currency, InvoiceItemType.CREDIT);
     }
 
@@ -44,17 +45,31 @@ public class CreditInvoiceItem extends InvoiceItemBase {
     }
 
     @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
+    public boolean equals(final Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
 
-        CreditInvoiceItem that = (CreditInvoiceItem) o;
+        final CreditInvoiceItem that = (CreditInvoiceItem) o;
 
-        if (accountId.compareTo(that.accountId) != 0) return false;
-        if (amount.compareTo(that.amount) != 0) return false;
-        if (currency != that.currency) return false;
-        if (startDate.compareTo(that.startDate) != 0) return false;
-        if (endDate.compareTo(that.endDate) != 0) return false;
+        if (accountId.compareTo(that.accountId) != 0) {
+            return false;
+        }
+        if (amount.compareTo(that.amount) != 0) {
+            return false;
+        }
+        if (currency != that.currency) {
+            return false;
+        }
+        if (startDate.compareTo(that.startDate) != 0) {
+            return false;
+        }
+        if (endDate.compareTo(that.endDate) != 0) {
+            return false;
+        }
 
         return true;
     }
@@ -70,12 +85,12 @@ public class CreditInvoiceItem extends InvoiceItemBase {
     }
 
     @Override
-    public int compareTo(InvoiceItem item) {
+    public int compareTo(final InvoiceItem item) {
         if (!(item instanceof CreditInvoiceItem)) {
             return 1;
         }
 
-        CreditInvoiceItem that = (CreditInvoiceItem) item;
+        final CreditInvoiceItem that = (CreditInvoiceItem) item;
         return id.compareTo(that.getId());
     }
 }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/DateRange.java b/invoice/src/main/java/com/ning/billing/invoice/model/DateRange.java
index b1e2fa9..c6eb5bc 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/DateRange.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/DateRange.java
@@ -22,17 +22,16 @@ public class DateRange {
     private final DateTime startDate;
     private final DateTime endDate;
 
-    public DateRange(DateTime startDate, DateTime endDate) {
+    public DateRange(final DateTime startDate, final DateTime endDate) {
         this.startDate = startDate;
         this.endDate = endDate;
     }
 
     /**
-     *
      * @param date the DateTime in question
      * @return whether the DateRange contains (inclusively) the DateTime in question
      */
-    public boolean contains(DateTime date) {
+    public boolean contains(final DateTime date) {
         if (endDate == null) {
             return date.compareTo(startDate) >= 0;
         }
@@ -40,11 +39,11 @@ public class DateRange {
         return !date.isBefore(startDate) && !date.isAfter(endDate);
     }
 
-    public boolean overlaps(DateRange range) {
+    public boolean overlaps(final DateRange range) {
         return (this.contains(range.startDate) || this.contains(range.endDate));
     }
 
-    public DateRange calculateUnionWith(DateRange range) {
+    public DateRange calculateUnionWith(final DateRange range) {
         if (this.contains(range.startDate) && this.contains(range.endDate)) {
             return this;
         }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java
index 952ff60..c636ada 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoice.java
@@ -16,13 +16,12 @@
 
 package com.ning.billing.invoice.model;
 
+import javax.annotation.Nullable;
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
 
-import javax.annotation.Nullable;
-
 import org.joda.time.DateTime;
 
 import com.ning.billing.catalog.api.Currency;
@@ -42,13 +41,13 @@ public class DefaultInvoice extends EntityBase implements Invoice {
     private final boolean migrationInvoice;
 
     // used to create a new invoice
-    public DefaultInvoice(UUID accountId, DateTime invoiceDate, DateTime targetDate, Currency currency) {
+    public DefaultInvoice(final UUID accountId, final DateTime invoiceDate, final DateTime targetDate, final Currency currency) {
         this(UUID.randomUUID(), accountId, null, invoiceDate, targetDate, currency, false);
     }
 
     // used to hydrate invoice from persistence layer
-    public DefaultInvoice(UUID invoiceId, UUID accountId, @Nullable Integer invoiceNumber, DateTime invoiceDate,
-                          DateTime targetDate, Currency currency, boolean isMigrationInvoice) {
+    public DefaultInvoice(final UUID invoiceId, final UUID accountId, @Nullable final Integer invoiceNumber, final DateTime invoiceDate,
+                          final DateTime targetDate, final Currency currency, final boolean isMigrationInvoice) {
         super(invoiceId);
         this.accountId = accountId;
         this.invoiceNumber = invoiceNumber;
@@ -74,10 +73,10 @@ public class DefaultInvoice extends EntityBase implements Invoice {
     }
 
     @Override
-    public <T extends InvoiceItem> List<InvoiceItem> getInvoiceItems(Class<T> clazz) {
-        List<InvoiceItem> results = new ArrayList<InvoiceItem>();
-        for (InvoiceItem item : invoiceItems) {
-            if ( clazz.isInstance(item) ) {
+    public <T extends InvoiceItem> List<InvoiceItem> getInvoiceItems(final Class<T> clazz) {
+        final List<InvoiceItem> results = new ArrayList<InvoiceItem>();
+        for (final InvoiceItem item : invoiceItems) {
+            if (clazz.isInstance(item)) {
                 results.add(item);
             }
         }
@@ -116,6 +115,7 @@ public class DefaultInvoice extends EntityBase implements Invoice {
 
     /**
      * null until retrieved from the database
+     *
      * @return the invoice number
      */
     @Override
@@ -137,18 +137,18 @@ public class DefaultInvoice extends EntityBase implements Invoice {
     public Currency getCurrency() {
         return currency;
     }
-    
+
     @Override
     public boolean isMigrationInvoice() {
-		return migrationInvoice;
-	}
+        return migrationInvoice;
+    }
 
-	@Override
+    @Override
     public DateTime getLastPaymentAttempt() {
         DateTime lastPaymentAttempt = null;
 
         for (final InvoicePayment paymentAttempt : payments) {
-            DateTime paymentAttemptDate = paymentAttempt.getPaymentAttemptDate();
+            final DateTime paymentAttemptDate = paymentAttempt.getPaymentAttemptDate();
             if (lastPaymentAttempt == null) {
                 lastPaymentAttempt = paymentAttemptDate;
             }
@@ -194,7 +194,7 @@ public class DefaultInvoice extends EntityBase implements Invoice {
             return false;
         }
 
-        DateTime lastPaymentAttempt = getLastPaymentAttempt();
+        final DateTime lastPaymentAttempt = getLastPaymentAttempt();
         return (lastPaymentAttempt == null) || lastPaymentAttempt.plusDays(numberOfDays).isAfter(targetDate);
     }
 
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceGenerator.java b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceGenerator.java
index 08e19c0..486e803 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceGenerator.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceGenerator.java
@@ -16,6 +16,7 @@
 
 package com.ning.billing.invoice.model;
 
+import javax.annotation.Nullable;
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -25,10 +26,10 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
-import javax.annotation.Nullable;
-
 import org.joda.time.DateTime;
 import org.joda.time.Months;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.inject.Inject;
 import com.ning.billing.ErrorCode;
@@ -45,6 +46,7 @@ import com.ning.billing.junction.api.BillingEventSet;
 import com.ning.billing.util.clock.Clock;
 
 public class DefaultInvoiceGenerator implements InvoiceGenerator {
+    private static final Logger log = LoggerFactory.getLogger(DefaultInvoiceGenerator.class);
     private static final int ROUNDING_MODE = InvoicingConfiguration.getRoundingMode();
     private static final int NUMBER_OF_DECIMALS = InvoicingConfiguration.getNumberOfDecimals();
 
@@ -52,19 +54,19 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
     private final InvoiceConfig config;
 
     @Inject
-    public DefaultInvoiceGenerator(Clock clock, InvoiceConfig config) {
+    public DefaultInvoiceGenerator(final Clock clock, final InvoiceConfig config) {
         this.clock = clock;
         this.config = config;
     }
 
-   /*
+    /*
     * adjusts target date to the maximum invoice target date, if future invoices exist
     */
     @Override
     public Invoice generateInvoice(final UUID accountId, @Nullable final BillingEventSet events,
-                                         @Nullable final List<Invoice> existingInvoices,
-                                         DateTime targetDate,
-                                         final Currency targetCurrency) throws InvoiceApiException {
+                                   @Nullable final List<Invoice> existingInvoices,
+                                   DateTime targetDate,
+                                   final Currency targetCurrency) throws InvoiceApiException {
         if ((events == null) || (events.size() == 0) || events.isAccountAutoInvoiceOff()) {
             return null;
         }
@@ -73,13 +75,13 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
         //TODO MDW can use subscription Id - not bundle
         //TODO MDW worry about null sub id
 
-        List<InvoiceItem> existingItems = new ArrayList<InvoiceItem>();
+        final List<InvoiceItem> existingItems = new ArrayList<InvoiceItem>();
         if (existingInvoices != null) {
-            for (Invoice invoice : existingInvoices) {
-                for(InvoiceItem item : invoice.getInvoiceItems()) {
-                    if(item.getSubscriptionId() == null || // Always include migration invoices, credits etc.  
-                      !events.getSubscriptionIdsWithAutoInvoiceOff()
-                            .contains(item.getSubscriptionId())) { //don't add items with auto_invoice_off tag 
+            for (final Invoice invoice : existingInvoices) {
+                for (final InvoiceItem item : invoice.getInvoiceItems()) {
+                    if (item.getSubscriptionId() == null || // Always include migration invoices, credits etc.
+                            !events.getSubscriptionIdsWithAutoInvoiceOff()
+                                   .contains(item.getSubscriptionId())) { //don't add items with auto_invoice_off tag
                         existingItems.add(item);
                     }
                 }
@@ -90,9 +92,9 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
 
         targetDate = adjustTargetDate(existingInvoices, targetDate);
 
-        Invoice invoice = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, targetCurrency);
-        UUID invoiceId = invoice.getId();
-        List<InvoiceItem> proposedItems = generateInvoiceItems(invoiceId, accountId, events, targetDate, targetCurrency);
+        final Invoice invoice = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, targetCurrency);
+        final UUID invoiceId = invoice.getId();
+        final List<InvoiceItem> proposedItems = generateInvoiceItems(invoiceId, accountId, events, targetDate, targetCurrency);
 
         removeCancellingInvoiceItems(existingItems);
         removeDuplicatedInvoiceItems(proposedItems, existingItems);
@@ -110,18 +112,18 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
         }
     }
 
-    private void generateCreditsForPastRepairedInvoices(UUID accountId, List<Invoice> existingInvoices, List<InvoiceItem> proposedItems, Currency currency) {
+    private void generateCreditsForPastRepairedInvoices(final UUID accountId, final List<Invoice> existingInvoices, final List<InvoiceItem> proposedItems, final Currency currency) {
         // determine most accurate invoice balances up to this point
-        Map<UUID, BigDecimal> amountOwedByInvoice = new HashMap<UUID, BigDecimal>();
+        final Map<UUID, BigDecimal> amountOwedByInvoice = new HashMap<UUID, BigDecimal>();
 
         if (existingInvoices != null) {
-            for (Invoice invoice : existingInvoices) {
+            for (final Invoice invoice : existingInvoices) {
                 amountOwedByInvoice.put(invoice.getId(), invoice.getBalance());
             }
         }
 
-        for (InvoiceItem item : proposedItems) {
-            UUID invoiceId = item.getInvoiceId();
+        for (final InvoiceItem item : proposedItems) {
+            final UUID invoiceId = item.getInvoiceId();
             if (amountOwedByInvoice.containsKey(invoiceId)) {
                 amountOwedByInvoice.put(invoiceId, amountOwedByInvoice.get(invoiceId).add(item.getAmount()));
             } else {
@@ -129,35 +131,35 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
             }
         }
 
-        for (UUID invoiceId : amountOwedByInvoice.keySet()) {
-            BigDecimal invoiceBalance = amountOwedByInvoice.get(invoiceId);
+        for (final UUID invoiceId : amountOwedByInvoice.keySet()) {
+            final BigDecimal invoiceBalance = amountOwedByInvoice.get(invoiceId);
             if (invoiceBalance.compareTo(BigDecimal.ZERO) < 0) {
                 proposedItems.add(new CreditInvoiceItem(invoiceId, accountId, clock.getUTCNow(), invoiceBalance.negate(), currency));
             }
         }
     }
 
-    private void addReversingItems(List<InvoiceItem> existingItems, List<InvoiceItem> proposedItems) {
-        for (InvoiceItem existingItem : existingItems) {
+    private void addReversingItems(final List<InvoiceItem> existingItems, final List<InvoiceItem> proposedItems) {
+        for (final InvoiceItem existingItem : existingItems) {
             if (existingItem instanceof RecurringInvoiceItem) {
-                RecurringInvoiceItem recurringItem = (RecurringInvoiceItem) existingItem;
+                final RecurringInvoiceItem recurringItem = (RecurringInvoiceItem) existingItem;
                 proposedItems.add(recurringItem.asReversingItem());
             }
         }
     }
 
-    private void consumeExistingCredit(UUID invoiceId, UUID accountId, List<InvoiceItem> existingItems,
-                                       List<InvoiceItem> proposedItems, Currency targetCurrency) {
+    private void consumeExistingCredit(final UUID invoiceId, final UUID accountId, final List<InvoiceItem> existingItems,
+                                       final List<InvoiceItem> proposedItems, final Currency targetCurrency) {
         BigDecimal totalUnusedCreditAmount = BigDecimal.ZERO;
         BigDecimal totalAmountOwed = BigDecimal.ZERO;
 
-        for (InvoiceItem item : existingItems) {
+        for (final InvoiceItem item : existingItems) {
             if (item instanceof CreditInvoiceItem) {
                 totalUnusedCreditAmount = totalUnusedCreditAmount.add(item.getAmount());
             }
         }
 
-        for (InvoiceItem item : proposedItems) {
+        for (final InvoiceItem item : proposedItems) {
             if (item instanceof CreditInvoiceItem) {
                 totalUnusedCreditAmount = totalUnusedCreditAmount.add(item.getAmount());
             } else {
@@ -181,8 +183,8 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
         }
     }
 
-    private void validateTargetDate(DateTime targetDate) throws InvoiceApiException {
-        int maximumNumberOfMonths = config.getNumberOfMonthsInFuture();
+    private void validateTargetDate(final DateTime targetDate) throws InvoiceApiException {
+        final int maximumNumberOfMonths = config.getNumberOfMonthsInFuture();
 
         if (Months.monthsBetween(clock.getUTCNow(), targetDate).getMonths() > maximumNumberOfMonths) {
             throw new InvoiceApiException(ErrorCode.INVOICE_TARGET_DATE_TOO_FAR_IN_THE_FUTURE, targetDate.toString());
@@ -190,11 +192,13 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
     }
 
     private DateTime adjustTargetDate(final List<Invoice> existingInvoices, final DateTime targetDate) {
-        if (existingInvoices == null) {return targetDate;}
+        if (existingInvoices == null) {
+            return targetDate;
+        }
 
         DateTime maxDate = targetDate;
 
-        for (Invoice invoice : existingInvoices) {
+        for (final Invoice invoice : existingInvoices) {
             if (invoice.getTargetDate().isAfter(maxDate)) {
                 maxDate = invoice.getTargetDate();
             }
@@ -208,13 +212,13 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
     */
     private void removeDuplicatedInvoiceItems(final List<InvoiceItem> proposedItems,
                                               final List<InvoiceItem> existingInvoiceItems) {
-        Iterator<InvoiceItem> proposedItemIterator = proposedItems.iterator();
+        final Iterator<InvoiceItem> proposedItemIterator = proposedItems.iterator();
         while (proposedItemIterator.hasNext()) {
-            InvoiceItem proposedItem = proposedItemIterator.next();
+            final InvoiceItem proposedItem = proposedItemIterator.next();
 
-            Iterator<InvoiceItem> existingItemIterator = existingInvoiceItems.iterator();
+            final Iterator<InvoiceItem> existingItemIterator = existingInvoiceItems.iterator();
             while (existingItemIterator.hasNext()) {
-                InvoiceItem existingItem = existingItemIterator.next();
+                final InvoiceItem existingItem = existingItemIterator.next();
                 if (existingItem.equals(proposedItem)) {
                     existingItemIterator.remove();
                     proposedItemIterator.remove();
@@ -224,11 +228,11 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
     }
 
     private void removeCancellingInvoiceItems(final List<InvoiceItem> items) {
-        List<UUID> itemsToRemove = new ArrayList<UUID>();
+        final List<UUID> itemsToRemove = new ArrayList<UUID>();
 
-        for (InvoiceItem item1 : items) {
+        for (final InvoiceItem item1 : items) {
             if (item1 instanceof RecurringInvoiceItem) {
-                RecurringInvoiceItem recurringInvoiceItem = (RecurringInvoiceItem) item1;
+                final RecurringInvoiceItem recurringInvoiceItem = (RecurringInvoiceItem) item1;
                 if (recurringInvoiceItem.reversesItem()) {
                     itemsToRemove.add(recurringInvoiceItem.getId());
                     itemsToRemove.add(recurringInvoiceItem.getReversedItemId());
@@ -236,9 +240,9 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
             }
         }
 
-        Iterator<InvoiceItem> iterator = items.iterator();
+        final Iterator<InvoiceItem> iterator = items.iterator();
         while (iterator.hasNext()) {
-            InvoiceItem item = iterator.next();
+            final InvoiceItem item = iterator.next();
             if (itemsToRemove.contains(item.getId())) {
                 iterator.remove();
             }
@@ -247,26 +251,26 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
 
     private List<InvoiceItem> generateInvoiceItems(final UUID invoiceId, final UUID accountId, final BillingEventSet events,
                                                    final DateTime targetDate, final Currency currency) throws InvoiceApiException {
-        List<InvoiceItem> items = new ArrayList<InvoiceItem>();
-        
-        if(events.size() == 0) {
+        final List<InvoiceItem> items = new ArrayList<InvoiceItem>();
+
+        if (events.size() == 0) {
             return items;
         }
 
-        Iterator<BillingEvent> eventIt = events.iterator();
+        final Iterator<BillingEvent> eventIt = events.iterator();
 
         BillingEvent nextEvent = eventIt.next();
-        while(eventIt.hasNext()) {
-            BillingEvent thisEvent = nextEvent;
+        while (eventIt.hasNext()) {
+            final BillingEvent thisEvent = nextEvent;
             nextEvent = eventIt.next();
-            if(!events.getSubscriptionIdsWithAutoInvoiceOff().
+            if (!events.getSubscriptionIdsWithAutoInvoiceOff().
                     contains(thisEvent.getSubscription().getId())) { // don't consider events for subscriptions that have auto_invoice_off
-                BillingEvent adjustedNextEvent = (thisEvent.getSubscription().getId() == nextEvent.getSubscription().getId()) ? nextEvent : null;
+                final BillingEvent adjustedNextEvent = (thisEvent.getSubscription().getId() == nextEvent.getSubscription().getId()) ? nextEvent : null;
                 items.addAll(processEvents(invoiceId, accountId, thisEvent, adjustedNextEvent, targetDate, currency));
             }
         }
         items.addAll(processEvents(invoiceId, accountId, nextEvent, null, targetDate, currency));
-        
+
 // The above should reproduce the semantics of the code below using iterator instead of list.
 //
 //        for (int i = 0; i < events.size(); i++) {
@@ -282,43 +286,47 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
         return items;
     }
 
-    private List<InvoiceItem> processEvents(final UUID invoiceId, final UUID accountId, final BillingEvent thisEvent, final BillingEvent nextEvent,
+    private List<InvoiceItem> processEvents(final UUID invoiceId, final UUID accountId, final BillingEvent thisEvent, @Nullable final BillingEvent nextEvent,
                                             final DateTime targetDate, final Currency currency) throws InvoiceApiException {
-        List<InvoiceItem> items = new ArrayList<InvoiceItem>();
-        InvoiceItem fixedPriceInvoiceItem = generateFixedPriceItem(invoiceId, accountId, thisEvent, targetDate, currency);
+        final List<InvoiceItem> items = new ArrayList<InvoiceItem>();
+        final InvoiceItem fixedPriceInvoiceItem = generateFixedPriceItem(invoiceId, accountId, thisEvent, targetDate, currency);
         if (fixedPriceInvoiceItem != null) {
             items.add(fixedPriceInvoiceItem);
         }
 
-        BillingPeriod billingPeriod = thisEvent.getBillingPeriod();
+        final BillingPeriod billingPeriod = thisEvent.getBillingPeriod();
         if (billingPeriod != BillingPeriod.NO_BILLING_PERIOD) {
-            BillingMode billingMode = instantiateBillingMode(thisEvent.getBillingMode());
-            DateTime startDate = thisEvent.getEffectiveDate();
-            if (!startDate.isAfter(targetDate)) {
-                DateTime endDate = (nextEvent == null) ? null : nextEvent.getEffectiveDate();
-                int billCycleDay = thisEvent.getBillCycleDay();
 
-                List<RecurringInvoiceItemData> itemData;
+            final BillingMode billingMode = instantiateBillingMode(thisEvent.getBillingMode());
+            final DateTime startDate = thisEvent.getEffectiveDate();
+            final DateTime tzAdjustedStartDate = startDate.toDateTime(thisEvent.getTimeZone());
+            final DateTime roundedStartDate = new DateTime(tzAdjustedStartDate.getYear(), tzAdjustedStartDate.getMonthOfYear(), tzAdjustedStartDate.getDayOfMonth(), 0, 0);
+            log.info(String.format("start = %s, rounded = %s, target = %s, in = %s", startDate, roundedStartDate, targetDate, (!roundedStartDate.isAfter(targetDate)) ? "in" : "out"));
+            if (!roundedStartDate.isAfter(targetDate)) {
+                final DateTime endDate = (nextEvent == null) ? null : nextEvent.getEffectiveDate();
+                final int billCycleDay = thisEvent.getBillCycleDay();
+
+                final List<RecurringInvoiceItemData> itemData;
                 try {
                     itemData = billingMode.calculateInvoiceItemData(startDate, endDate, targetDate, billCycleDay, billingPeriod);
                 } catch (InvalidDateSequenceException e) {
                     throw new InvoiceApiException(ErrorCode.INVOICE_INVALID_DATE_SEQUENCE, startDate, endDate, targetDate);
                 }
 
-                for (RecurringInvoiceItemData itemDatum : itemData) {
-                    BigDecimal rate = thisEvent.getRecurringPrice();
+                for (final RecurringInvoiceItemData itemDatum : itemData) {
+                    final BigDecimal rate = thisEvent.getRecurringPrice();
 
                     if (rate != null) {
-                        BigDecimal amount = itemDatum.getNumberOfCycles().multiply(rate).setScale(NUMBER_OF_DECIMALS, ROUNDING_MODE);
-
-                        RecurringInvoiceItem recurringItem = new RecurringInvoiceItem(invoiceId, 
-                                accountId,
-                                thisEvent.getSubscription().getBundleId(), 
-                                thisEvent.getSubscription().getId(),
-                                thisEvent.getPlan().getName(),
-                                thisEvent.getPlanPhase().getName(),
-                                itemDatum.getStartDate(), itemDatum.getEndDate(),
-                                amount, rate, currency);
+                        final BigDecimal amount = itemDatum.getNumberOfCycles().multiply(rate).setScale(NUMBER_OF_DECIMALS, ROUNDING_MODE);
+
+                        final RecurringInvoiceItem recurringItem = new RecurringInvoiceItem(invoiceId,
+                                                                                            accountId,
+                                                                                            thisEvent.getSubscription().getBundleId(),
+                                                                                            thisEvent.getSubscription().getId(),
+                                                                                            thisEvent.getPlan().getName(),
+                                                                                            thisEvent.getPlanPhase().getName(),
+                                                                                            itemDatum.getStartDate(), itemDatum.getEndDate(),
+                                                                                            amount, rate, currency);
                         items.add(recurringItem);
                     }
                 }
@@ -328,7 +336,7 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
         return items;
     }
 
-    private BillingMode instantiateBillingMode(BillingModeType billingMode) {
+    private BillingMode instantiateBillingMode(final BillingModeType billingMode) {
         switch (billingMode) {
             case IN_ADVANCE:
                 return new InAdvanceBillingMode();
@@ -338,15 +346,15 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
     }
 
     private InvoiceItem generateFixedPriceItem(final UUID invoiceId, final UUID accountId, final BillingEvent thisEvent,
-                                               final DateTime targetDate, final Currency currency) throws InvoiceApiException {
+                                               final DateTime targetDate, final Currency currency) {
         if (thisEvent.getEffectiveDate().isAfter(targetDate)) {
             return null;
         } else {
-            BigDecimal fixedPrice = thisEvent.getFixedPrice();
+            final BigDecimal fixedPrice = thisEvent.getFixedPrice();
 
             if (fixedPrice != null) {
-                Duration duration = thisEvent.getPlanPhase().getDuration();
-                DateTime endDate = duration.addToDateTime(thisEvent.getEffectiveDate());
+                final Duration duration = thisEvent.getPlanPhase().getDuration();
+                final DateTime endDate = duration.addToDateTime(thisEvent.getEffectiveDate());
 
                 return new FixedPriceInvoiceItem(invoiceId, accountId, thisEvent.getSubscription().getBundleId(),
                                                  thisEvent.getSubscription().getId(),
@@ -357,4 +365,4 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoicePayment.java b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoicePayment.java
index 1be9662..db80be0 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoicePayment.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoicePayment.java
@@ -16,16 +16,17 @@
 
 package com.ning.billing.invoice.model;
 
+import javax.annotation.Nullable;
+import java.math.BigDecimal;
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+
 import com.ning.billing.ErrorCode;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.api.InvoicePayment;
 import com.ning.billing.util.entity.EntityBase;
-import org.joda.time.DateTime;
-
-import javax.annotation.Nullable;
-import java.math.BigDecimal;
-import java.util.UUID;
 
 public class DefaultInvoicePayment extends EntityBase implements InvoicePayment {
     private final UUID paymentAttemptId;
@@ -87,7 +88,7 @@ public class DefaultInvoicePayment extends EntityBase implements InvoicePayment 
     }
 
     @Override
-    public InvoicePayment asChargeBack(BigDecimal chargeBackAmount, DateTime chargeBackDate) throws InvoiceApiException {
+    public InvoicePayment asChargeBack(final BigDecimal chargeBackAmount, final DateTime chargeBackDate) throws InvoiceApiException {
         if (chargeBackAmount.compareTo(amount) > 0) {
             throw new InvoiceApiException(ErrorCode.CHARGE_BACK_AMOUNT_TOO_HIGH, chargeBackAmount, amount);
         }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/FixedPriceInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/FixedPriceInvoiceItem.java
index 60a39a6..9176230 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/FixedPriceInvoiceItem.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/FixedPriceInvoiceItem.java
@@ -16,24 +16,25 @@
 
 package com.ning.billing.invoice.model;
 
+import javax.annotation.Nullable;
 import java.math.BigDecimal;
 import java.util.UUID;
 
-import com.ning.billing.invoice.api.InvoiceItemType;
 import org.joda.time.DateTime;
 
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.api.InvoiceItem;
+import com.ning.billing.invoice.api.InvoiceItemType;
 
 public class FixedPriceInvoiceItem extends InvoiceItemBase {
 
-    public FixedPriceInvoiceItem(UUID invoiceId, UUID accountId, UUID bundleId, UUID subscriptionId, String planName, String phaseName,
-                                 DateTime startDate, DateTime endDate, BigDecimal amount, Currency currency) {
+    public FixedPriceInvoiceItem(final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId, @Nullable final UUID subscriptionId, final String planName, final String phaseName,
+                                 final DateTime startDate, final DateTime endDate, final BigDecimal amount, final Currency currency) {
         super(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, currency, InvoiceItemType.FIXED);
     }
 
-    public FixedPriceInvoiceItem(UUID id, UUID invoiceId, UUID accountId, UUID bundleId, UUID subscriptionId, String planName, String phaseName,
-                                 DateTime startDate, DateTime endDate, BigDecimal amount, Currency currency) {
+    public FixedPriceInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId, final String planName, final String phaseName,
+                                 final DateTime startDate, final DateTime endDate, final BigDecimal amount, final Currency currency) {
         super(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, currency, InvoiceItemType.FIXED);
     }
 
@@ -62,17 +63,17 @@ public class FixedPriceInvoiceItem extends InvoiceItemBase {
     }
 
     @Override
-    public int compareTo(InvoiceItem item) {
+    public int compareTo(final InvoiceItem item) {
         if (!(item instanceof FixedPriceInvoiceItem)) {
             return 1;
         }
 
-        FixedPriceInvoiceItem that = (FixedPriceInvoiceItem) item;
-        int compareAccounts = getAccountId().compareTo(that.getAccountId());
+        final FixedPriceInvoiceItem that = (FixedPriceInvoiceItem) item;
+        final int compareAccounts = getAccountId().compareTo(that.getAccountId());
         if (compareAccounts == 0 && bundleId != null) {
-            int compareBundles = getBundleId().compareTo(that.getBundleId());
+            final int compareBundles = getBundleId().compareTo(that.getBundleId());
             if (compareBundles == 0 && subscriptionId != null) {
-                int compareSubscriptions = getSubscriptionId().compareTo(that.getSubscriptionId());
+                final int compareSubscriptions = getSubscriptionId().compareTo(that.getSubscriptionId());
                 if (compareSubscriptions == 0) {
                     return getStartDate().compareTo(that.getStartDate());
                 } else {
@@ -88,7 +89,7 @@ public class FixedPriceInvoiceItem extends InvoiceItemBase {
 
     @Override
     public String toString() {
-        StringBuilder sb = new StringBuilder();
+        final StringBuilder sb = new StringBuilder();
         sb.append("InvoiceItem = {").append("id = ").append(id.toString()).append(", ");
         sb.append("invoiceId = ").append(invoiceId.toString()).append(", ");
         sb.append("accountId = ").append(accountId.toString()).append(", ");
@@ -111,22 +112,42 @@ public class FixedPriceInvoiceItem extends InvoiceItemBase {
     }
 
     @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
+    public boolean equals(final Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
 
-        FixedPriceInvoiceItem that = (FixedPriceInvoiceItem) o;
-        if (accountId.compareTo(that.accountId) != 0) return false;
-        if (subscriptionId != null ? !subscriptionId.equals(that.subscriptionId) : that.subscriptionId != null)
+        final FixedPriceInvoiceItem that = (FixedPriceInvoiceItem) o;
+        if (accountId.compareTo(that.accountId) != 0) {
             return false;
-        if (bundleId != null ? !bundleId.equals(that.bundleId) : that.bundleId != null)
+        }
+        if (subscriptionId != null ? !subscriptionId.equals(that.subscriptionId) : that.subscriptionId != null) {
             return false;
-        if (amount != null ? amount.compareTo(that.amount) != 0 : that.amount != null) return false;
-        if (currency != that.currency) return false;
-        if (startDate != null ? startDate.compareTo(that.startDate) != 0 : that.startDate != null) return false;
-        if (endDate != null ? endDate.compareTo(that.endDate) != 0 : that.endDate != null) return false;
-        if (phaseName != null ? !phaseName.equals(that.phaseName) : that.phaseName != null) return false;
-        if (planName != null ? !planName.equals(that.planName) : that.planName != null) return false;
+        }
+        if (bundleId != null ? !bundleId.equals(that.bundleId) : that.bundleId != null) {
+            return false;
+        }
+        if (amount != null ? amount.compareTo(that.amount) != 0 : that.amount != null) {
+            return false;
+        }
+        if (currency != that.currency) {
+            return false;
+        }
+        if (startDate != null ? startDate.compareTo(that.startDate) != 0 : that.startDate != null) {
+            return false;
+        }
+        if (endDate != null ? endDate.compareTo(that.endDate) != 0 : that.endDate != null) {
+            return false;
+        }
+        if (phaseName != null ? !phaseName.equals(that.phaseName) : that.phaseName != null) {
+            return false;
+        }
+        if (planName != null ? !planName.equals(that.planName) : that.planName != null) {
+            return false;
+        }
 
         return true;
     }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/InAdvanceBillingMode.java b/invoice/src/main/java/com/ning/billing/invoice/model/InAdvanceBillingMode.java
index 916d514..3fcff90 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/InAdvanceBillingMode.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/InAdvanceBillingMode.java
@@ -16,15 +16,16 @@
 
 package com.ning.billing.invoice.model;
 
-import com.ning.billing.catalog.api.BillingPeriod;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
 import org.joda.time.DateTime;
 import org.joda.time.Days;
 import org.joda.time.Months;
 import org.joda.time.MutableDateTime;
 
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
+import com.ning.billing.catalog.api.BillingPeriod;
 
 public class InAdvanceBillingMode implements BillingMode {
     private static final int ROUNDING_METHOD = InvoicingConfiguration.getRoundingMode();
@@ -38,27 +39,31 @@ public class InAdvanceBillingMode implements BillingMode {
             return calculateInvoiceItemData(startDate, targetDate, billingCycleDay, billingPeriod);
         }
 
-        if (endDate.isBefore(startDate)) {throw new InvalidDateSequenceException();}
-        if (targetDate.isBefore(startDate)) {throw new InvalidDateSequenceException();}
+        if (endDate.isBefore(startDate)) {
+            throw new InvalidDateSequenceException();
+        }
+        if (targetDate.isBefore(startDate)) {
+            throw new InvalidDateSequenceException();
+        }
 
-        List<RecurringInvoiceItemData> results = new ArrayList<RecurringInvoiceItemData>();
+        final List<RecurringInvoiceItemData> results = new ArrayList<RecurringInvoiceItemData>();
 
         // beginning from the start date, find the first billing date
-        DateTime firstBillingCycleDate = calculateBillingCycleDateOnOrAfter(startDate, billingCycleDay);
+        final DateTime firstBillingCycleDate = calculateBillingCycleDateOnOrAfter(startDate, billingCycleDay);
 
         // add pro-ration item if needed
         if (firstBillingCycleDate.isAfter(startDate)) {
-            BigDecimal leadingProRationPeriods = calculateProRationBeforeFirstBillingPeriod(startDate, firstBillingCycleDate, billingPeriod);
+            final BigDecimal leadingProRationPeriods = calculateProRationBeforeFirstBillingPeriod(startDate, firstBillingCycleDate, billingPeriod);
             if (leadingProRationPeriods != null && leadingProRationPeriods.compareTo(BigDecimal.ZERO) > 0) {
                 results.add(new RecurringInvoiceItemData(startDate, firstBillingCycleDate, leadingProRationPeriods));
             }
         }
 
         // add one item per billing period
-        DateTime effectiveEndDate = calculateEffectiveEndDate(firstBillingCycleDate, targetDate, endDate, billingPeriod);
-        DateTime lastBillingCycleDate = calculateLastBillingCycleDateBefore(effectiveEndDate, firstBillingCycleDate, billingCycleDay, billingPeriod);
-        int numberOfWholeBillingPeriods =  calculateNumberOfWholeBillingPeriods(firstBillingCycleDate, lastBillingCycleDate, billingPeriod);
-        int numberOfMonthsPerBillingPeriod = billingPeriod.getNumberOfMonths();
+        final DateTime effectiveEndDate = calculateEffectiveEndDate(firstBillingCycleDate, targetDate, endDate, billingPeriod);
+        final DateTime lastBillingCycleDate = calculateLastBillingCycleDateBefore(effectiveEndDate, firstBillingCycleDate, billingCycleDay, billingPeriod);
+        final int numberOfWholeBillingPeriods = calculateNumberOfWholeBillingPeriods(firstBillingCycleDate, lastBillingCycleDate, billingPeriod);
+        final int numberOfMonthsPerBillingPeriod = billingPeriod.getNumberOfMonths();
 
         for (int i = 0; i < numberOfWholeBillingPeriods; i++) {
             results.add(new RecurringInvoiceItemData(firstBillingCycleDate.plusMonths(i * numberOfMonthsPerBillingPeriod),
@@ -67,7 +72,7 @@ public class InAdvanceBillingMode implements BillingMode {
 
         // check to see if a trailing pro-ration amount is needed
         if (effectiveEndDate.isAfter(lastBillingCycleDate)) {
-            BigDecimal trailingProRationPeriods = calculateProRationAfterLastBillingCycleDate(effectiveEndDate, lastBillingCycleDate, billingPeriod);
+            final BigDecimal trailingProRationPeriods = calculateProRationAfterLastBillingCycleDate(effectiveEndDate, lastBillingCycleDate, billingPeriod);
             if (trailingProRationPeriods.compareTo(BigDecimal.ZERO) > 0) {
                 results.add(new RecurringInvoiceItemData(lastBillingCycleDate, effectiveEndDate, trailingProRationPeriods));
             }
@@ -80,7 +85,7 @@ public class InAdvanceBillingMode implements BillingMode {
     public List<RecurringInvoiceItemData> calculateInvoiceItemData(final DateTime startDate,
                                                                    final DateTime targetDate, final int billingCycleDay,
                                                                    final BillingPeriod billingPeriod) throws InvalidDateSequenceException {
-        List<RecurringInvoiceItemData> results = new ArrayList<RecurringInvoiceItemData>();
+        final List<RecurringInvoiceItemData> results = new ArrayList<RecurringInvoiceItemData>();
 
         if (targetDate.isBefore(startDate)) {
             // since the target date is before the start date of the event, this should result in no items being generated
@@ -88,21 +93,21 @@ public class InAdvanceBillingMode implements BillingMode {
         }
 
         // beginning from the start date, find the first billing date
-        DateTime firstBillingCycleDate = calculateBillingCycleDateOnOrAfter(startDate, billingCycleDay);
+        final DateTime firstBillingCycleDate = calculateBillingCycleDateOnOrAfter(startDate, billingCycleDay);
 
         // add pro-ration item if needed
         if (firstBillingCycleDate.isAfter(startDate)) {
-            BigDecimal leadingProRationPeriods = calculateProRationBeforeFirstBillingPeriod(startDate, firstBillingCycleDate, billingPeriod);
+            final BigDecimal leadingProRationPeriods = calculateProRationBeforeFirstBillingPeriod(startDate, firstBillingCycleDate, billingPeriod);
             if (leadingProRationPeriods != null && leadingProRationPeriods.compareTo(BigDecimal.ZERO) > 0) {
                 results.add(new RecurringInvoiceItemData(startDate, firstBillingCycleDate, leadingProRationPeriods));
             }
         }
 
         // add one item per billing period
-        DateTime effectiveEndDate = calculateEffectiveEndDate(firstBillingCycleDate, targetDate, billingPeriod);
-        DateTime lastBillingCycleDate = calculateLastBillingCycleDateBefore(effectiveEndDate, firstBillingCycleDate, billingCycleDay, billingPeriod);
-        int numberOfWholeBillingPeriods =  calculateNumberOfWholeBillingPeriods(firstBillingCycleDate, lastBillingCycleDate, billingPeriod);
-        int numberOfMonthsPerBillingPeriod = billingPeriod.getNumberOfMonths();
+        final DateTime effectiveEndDate = calculateEffectiveEndDate(firstBillingCycleDate, targetDate, billingPeriod);
+        final DateTime lastBillingCycleDate = calculateLastBillingCycleDateBefore(effectiveEndDate, firstBillingCycleDate, billingCycleDay, billingPeriod);
+        final int numberOfWholeBillingPeriods = calculateNumberOfWholeBillingPeriods(firstBillingCycleDate, lastBillingCycleDate, billingPeriod);
+        final int numberOfMonthsPerBillingPeriod = billingPeriod.getNumberOfMonths();
 
         for (int i = 0; i < numberOfWholeBillingPeriods; i++) {
             results.add(new RecurringInvoiceItemData(firstBillingCycleDate.plusMonths(i * numberOfMonthsPerBillingPeriod),
@@ -111,7 +116,7 @@ public class InAdvanceBillingMode implements BillingMode {
 
         // check to see if a trailing pro-ration amount is needed
         if (effectiveEndDate.isAfter(lastBillingCycleDate)) {
-            BigDecimal trailingProRationPeriods = calculateProRationAfterLastBillingCycleDate(effectiveEndDate, lastBillingCycleDate, billingPeriod);
+            final BigDecimal trailingProRationPeriods = calculateProRationAfterLastBillingCycleDate(effectiveEndDate, lastBillingCycleDate, billingPeriod);
             if (trailingProRationPeriods.compareTo(BigDecimal.ZERO) > 0) {
                 results.add(new RecurringInvoiceItemData(lastBillingCycleDate, effectiveEndDate, trailingProRationPeriods));
             }
@@ -121,9 +126,9 @@ public class InAdvanceBillingMode implements BillingMode {
     }
 
     private DateTime calculateBillingCycleDateOnOrAfter(final DateTime date, final int billingCycleDay) {
-        int lastDayOfMonth = date.dayOfMonth().getMaximumValue();
+        final int lastDayOfMonth = date.dayOfMonth().getMaximumValue();
 
-        MutableDateTime tmp = date.toMutableDateTime();
+        final MutableDateTime tmp = date.toMutableDateTime();
         if (billingCycleDay > lastDayOfMonth) {
             tmp.setDayOfMonth(lastDayOfMonth);
         } else {
@@ -138,33 +143,33 @@ public class InAdvanceBillingMode implements BillingMode {
         return proposedDate;
     }
 
-    private BigDecimal calculateProRationBeforeFirstBillingPeriod(final DateTime startDate, DateTime nextBillingCycleDate, final BillingPeriod billingPeriod) {
-        DateTime previousBillingCycleDate = nextBillingCycleDate.plusMonths(-billingPeriod.getNumberOfMonths());
+    private BigDecimal calculateProRationBeforeFirstBillingPeriod(final DateTime startDate, final DateTime nextBillingCycleDate, final BillingPeriod billingPeriod) {
+        final DateTime previousBillingCycleDate = nextBillingCycleDate.plusMonths(-billingPeriod.getNumberOfMonths());
 
-        int daysBetween = Days.daysBetween(previousBillingCycleDate, nextBillingCycleDate).getDays();
+        final int daysBetween = Days.daysBetween(previousBillingCycleDate, nextBillingCycleDate).getDays();
         if (daysBetween <= 0) {
             return BigDecimal.ZERO;
         }
 
-        BigDecimal daysInPeriod = new BigDecimal(daysBetween);
-        BigDecimal days = new BigDecimal(Days.daysBetween(startDate, nextBillingCycleDate).getDays());
+        final BigDecimal daysInPeriod = new BigDecimal(daysBetween);
+        final BigDecimal days = new BigDecimal(Days.daysBetween(startDate, nextBillingCycleDate).getDays());
 
         return days.divide(daysInPeriod, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
     }
 
     private int calculateNumberOfWholeBillingPeriods(final DateTime startDate, final DateTime endDate, final BillingPeriod billingPeriod) {
-        int numberOfMonths = Months.monthsBetween(startDate, endDate).getMonths();
-        int numberOfMonthsInPeriod = billingPeriod.getNumberOfMonths();
+        final int numberOfMonths = Months.monthsBetween(startDate, endDate).getMonths();
+        final int numberOfMonthsInPeriod = billingPeriod.getNumberOfMonths();
         return numberOfMonths / numberOfMonthsInPeriod;
     }
 
-    private DateTime calculateEffectiveEndDate(DateTime billCycleDate, DateTime targetDate, DateTime endDate, BillingPeriod billingPeriod) {
+    private DateTime calculateEffectiveEndDate(final DateTime billCycleDate, final DateTime targetDate, final DateTime endDate, final BillingPeriod billingPeriod) {
         if (targetDate.isBefore(endDate)) {
             if (targetDate.isBefore(billCycleDate)) {
                 return billCycleDate;
             }
 
-            int numberOfMonthsInPeriod = billingPeriod.getNumberOfMonths();
+            final int numberOfMonthsInPeriod = billingPeriod.getNumberOfMonths();
             int numberOfPeriods = 0;
             DateTime proposedDate = billCycleDate;
 
@@ -185,12 +190,12 @@ public class InAdvanceBillingMode implements BillingMode {
         }
     }
 
-    private DateTime calculateEffectiveEndDate(DateTime billCycleDate, DateTime targetDate, BillingPeriod billingPeriod) {
+    private DateTime calculateEffectiveEndDate(final DateTime billCycleDate, final DateTime targetDate, final BillingPeriod billingPeriod) {
         if (targetDate.isBefore(billCycleDate)) {
             return billCycleDate;
         }
 
-        int numberOfMonthsInPeriod = billingPeriod.getNumberOfMonths();
+        final int numberOfMonthsInPeriod = billingPeriod.getNumberOfMonths();
         int numberOfPeriods = 0;
         DateTime proposedDate = billCycleDate;
 
@@ -214,7 +219,7 @@ public class InAdvanceBillingMode implements BillingMode {
         proposedDate = proposedDate.plusMonths(-billingPeriod.getNumberOfMonths());
 
         if (proposedDate.dayOfMonth().get() < billingCycleDay) {
-            int lastDayOfTheMonth = proposedDate.dayOfMonth().getMaximumValue();
+            final int lastDayOfTheMonth = proposedDate.dayOfMonth().getMaximumValue();
             if (lastDayOfTheMonth < billingCycleDay) {
                 return new MutableDateTime(proposedDate).dayOfMonth().set(lastDayOfTheMonth).toDateTime();
             } else {
@@ -227,11 +232,11 @@ public class InAdvanceBillingMode implements BillingMode {
 
     private BigDecimal calculateProRationAfterLastBillingCycleDate(final DateTime endDate, final DateTime previousBillThroughDate, final BillingPeriod billingPeriod) {
         // note: assumption is that previousBillThroughDate is correctly aligned with the billing cycle day
-        DateTime nextBillThroughDate = previousBillThroughDate.plusMonths(billingPeriod.getNumberOfMonths());
-        BigDecimal daysInPeriod = new BigDecimal(Days.daysBetween(previousBillThroughDate, nextBillThroughDate).getDays());
+        final DateTime nextBillThroughDate = previousBillThroughDate.plusMonths(billingPeriod.getNumberOfMonths());
+        final BigDecimal daysInPeriod = new BigDecimal(Days.daysBetween(previousBillThroughDate, nextBillThroughDate).getDays());
 
-        BigDecimal days = new BigDecimal(Days.daysBetween(previousBillThroughDate, endDate).getDays());
+        final BigDecimal days = new BigDecimal(Days.daysBetween(previousBillThroughDate, endDate).getDays());
 
         return days.divide(daysInPeriod, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
     }
-}
\ No newline at end of file
+}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceGenerator.java b/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceGenerator.java
index 0b47099..ec28df0 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceGenerator.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceGenerator.java
@@ -16,11 +16,10 @@
 
 package com.ning.billing.invoice.model;
 
+import javax.annotation.Nullable;
 import java.util.List;
 import java.util.UUID;
 
-import javax.annotation.Nullable;
-
 import org.joda.time.DateTime;
 
 import com.ning.billing.catalog.api.Currency;
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemBase.java b/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemBase.java
index 016184d..89bd1a3 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemBase.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemBase.java
@@ -16,15 +16,16 @@
 
 package com.ning.billing.invoice.model;
 
+import javax.annotation.Nullable;
+import java.math.BigDecimal;
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.api.InvoiceItemType;
 import com.ning.billing.util.entity.EntityBase;
-import org.joda.time.DateTime;
-
-import javax.annotation.Nullable;
-import java.math.BigDecimal;
-import java.util.UUID;
 
 public abstract class InvoiceItemBase extends EntityBase implements InvoiceItem {
     protected final UUID invoiceId;
@@ -37,18 +38,18 @@ public abstract class InvoiceItemBase extends EntityBase implements InvoiceItem 
     protected final DateTime endDate;
     protected final BigDecimal amount;
     protected final Currency currency;
-    protected InvoiceItemType invoiceItemType;
+    protected final InvoiceItemType invoiceItemType;
 
-    public InvoiceItemBase(UUID invoiceId, UUID accountId, UUID bundleId, UUID subscriptionId, String planName, String phaseName,
-            DateTime startDate, DateTime endDate, BigDecimal amount, Currency currency, InvoiceItemType invoiceItemType) {
+    public InvoiceItemBase(final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId, final String planName, final String phaseName,
+                           final DateTime startDate, final DateTime endDate, final BigDecimal amount, final Currency currency, final InvoiceItemType invoiceItemType) {
         this(UUID.randomUUID(), invoiceId, accountId, bundleId, subscriptionId, planName, phaseName,
-                startDate, endDate, amount, currency, invoiceItemType);
+             startDate, endDate, amount, currency, invoiceItemType);
     }
 
-    public InvoiceItemBase(UUID id, UUID invoiceId, UUID accountId, @Nullable UUID bundleId,
-                           @Nullable UUID subscriptionId, String planName, String phaseName,
-                           DateTime startDate, DateTime endDate, BigDecimal amount, Currency currency,
-                           InvoiceItemType invoiceItemType) {
+    public InvoiceItemBase(final UUID id, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId,
+                           @Nullable final UUID subscriptionId, @Nullable final String planName, @Nullable final String phaseName,
+                           final DateTime startDate, final DateTime endDate, final BigDecimal amount, final Currency currency,
+                           final InvoiceItemType invoiceItemType) {
         super(id);
         this.invoiceId = invoiceId;
         this.accountId = accountId;
@@ -72,7 +73,7 @@ public abstract class InvoiceItemBase extends EntityBase implements InvoiceItem 
     public UUID getBundleId() {
         return bundleId;
     }
-    
+
     public UUID getAccountId() {
         return accountId;
     }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemList.java b/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemList.java
index 357c7a8..265f518 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemList.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/InvoiceItemList.java
@@ -19,6 +19,7 @@ package com.ning.billing.invoice.model;
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.List;
+
 import com.ning.billing.invoice.api.InvoiceItem;
 
 public class InvoiceItemList extends ArrayList<InvoiceItem> {
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/InvoicingConfiguration.java b/invoice/src/main/java/com/ning/billing/invoice/model/InvoicingConfiguration.java
index 7741f00..1651c13 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/InvoicingConfiguration.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/InvoicingConfiguration.java
@@ -19,8 +19,8 @@ package com.ning.billing.invoice.model;
 import java.math.BigDecimal;
 
 public class InvoicingConfiguration {
-    private final static int roundingMethod = BigDecimal.ROUND_HALF_UP;
-    private final static int numberOfDecimals = 2;
+    private static final int roundingMethod = BigDecimal.ROUND_HALF_UP;
+    private static final int numberOfDecimals = 2;
 
     public static int getRoundingMode() {
         return roundingMethod;
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/MigrationInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/MigrationInvoiceItem.java
index ec0962b..32de55b 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/MigrationInvoiceItem.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/MigrationInvoiceItem.java
@@ -26,8 +26,8 @@ import com.ning.billing.catalog.api.MigrationPlan;
 
 public class MigrationInvoiceItem extends FixedPriceInvoiceItem {
 
-	public MigrationInvoiceItem(UUID invoiceId, UUID accountId, DateTime startDate, BigDecimal amount, Currency currency) {
-		super(invoiceId, accountId, null, null, MigrationPlan.MIGRATION_PLAN_NAME, MigrationPlan.MIGRATION_PLAN_PHASE_NAME,
+    public MigrationInvoiceItem(final UUID invoiceId, final UUID accountId, final DateTime startDate, final BigDecimal amount, final Currency currency) {
+        super(invoiceId, accountId, null, null, MigrationPlan.MIGRATION_PLAN_NAME, MigrationPlan.MIGRATION_PLAN_PHASE_NAME,
               startDate, startDate, amount, currency);
-	}
-}
\ No newline at end of file
+    }
+}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/RecurringInvoiceItem.java b/invoice/src/main/java/com/ning/billing/invoice/model/RecurringInvoiceItem.java
index 9dbbae0..cfd2659 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/RecurringInvoiceItem.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/RecurringInvoiceItem.java
@@ -16,52 +16,53 @@
 
 package com.ning.billing.invoice.model;
 
+import java.math.BigDecimal;
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.api.InvoiceItemType;
-import org.joda.time.DateTime;
-
-import java.math.BigDecimal;
-import java.util.UUID;
 
 public class RecurringInvoiceItem extends InvoiceItemBase {
     private final BigDecimal rate;
     private final UUID reversedItemId;
 
-    public RecurringInvoiceItem(UUID invoiceId, UUID accountId, UUID bundleId, UUID subscriptionId, String planName, String phaseName,
-                                DateTime startDate, DateTime endDate,
-                                BigDecimal amount, BigDecimal rate,
-                                Currency currency) {
+    public RecurringInvoiceItem(final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId, final String planName, final String phaseName,
+                                final DateTime startDate, final DateTime endDate,
+                                final BigDecimal amount, final BigDecimal rate,
+                                final Currency currency) {
         super(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, currency, InvoiceItemType.RECURRING);
         this.rate = rate;
         this.reversedItemId = null;
     }
 
-    public RecurringInvoiceItem(UUID invoiceId, UUID accountId, UUID bundleId, UUID subscriptionId, String planName, String phaseName,
-                                DateTime startDate, DateTime endDate,
-                                BigDecimal amount, BigDecimal rate,
-                                Currency currency, UUID reversedItemId) {
+    public RecurringInvoiceItem(final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId, final String planName, final String phaseName,
+                                final DateTime startDate, final DateTime endDate,
+                                final BigDecimal amount, final BigDecimal rate,
+                                final Currency currency, final UUID reversedItemId) {
         super(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate,
-                amount, currency, InvoiceItemType.REVERSAL);
+              amount, currency, InvoiceItemType.REVERSAL);
         this.rate = rate;
         this.reversedItemId = reversedItemId;
     }
 
-    public RecurringInvoiceItem(UUID id, UUID invoiceId, UUID accountId, UUID bundleId, UUID subscriptionId,
-                                String planName, String phaseName,
-                                DateTime startDate, DateTime endDate,
-                                BigDecimal amount, BigDecimal rate,
-                                Currency currency) {
+    public RecurringInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId,
+                                final String planName, final String phaseName,
+                                final DateTime startDate, final DateTime endDate,
+                                final BigDecimal amount, final BigDecimal rate,
+                                final Currency currency) {
         super(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, currency, InvoiceItemType.RECURRING);
         this.rate = rate;
         this.reversedItemId = null;
     }
 
-    public RecurringInvoiceItem(UUID id, UUID invoiceId, UUID accountId, UUID bundleId, UUID subscriptionId,
-                                String planName, String phaseName,
-                                DateTime startDate, DateTime endDate,
-                                BigDecimal amount, BigDecimal rate,
-                                Currency currency, UUID reversedItemId) {
+    public RecurringInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, final UUID bundleId, final UUID subscriptionId,
+                                final String planName, final String phaseName,
+                                final DateTime startDate, final DateTime endDate,
+                                final BigDecimal amount, final BigDecimal rate,
+                                final Currency currency, final UUID reversedItemId) {
         super(id, invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate, amount, currency, InvoiceItemType.REVERSAL);
         this.rate = rate;
         this.reversedItemId = reversedItemId;
@@ -69,10 +70,10 @@ public class RecurringInvoiceItem extends InvoiceItemBase {
 
     @Override
     public InvoiceItem asReversingItem() {
-        BigDecimal amountNegated = amount == null ? null : amount.negate();
+        final BigDecimal amountNegated = amount == null ? null : amount.negate();
 
         return new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, planName, phaseName, startDate, endDate,
-                amountNegated, rate, currency, id);
+                                        amountNegated, rate, currency, id);
     }
 
     @Override
@@ -93,7 +94,7 @@ public class RecurringInvoiceItem extends InvoiceItemBase {
     }
 
     @Override
-    public int compareTo(InvoiceItem item) {
+    public int compareTo(final InvoiceItem item) {
         if (item == null) {
             return -1;
         }
@@ -101,15 +102,15 @@ public class RecurringInvoiceItem extends InvoiceItemBase {
             return -1;
         }
 
-        RecurringInvoiceItem that = (RecurringInvoiceItem) item;
-        int compareAccounts = getAccountId().compareTo(that.getAccountId());
+        final RecurringInvoiceItem that = (RecurringInvoiceItem) item;
+        final int compareAccounts = getAccountId().compareTo(that.getAccountId());
         if (compareAccounts == 0 && bundleId != null) {
-            int compareBundles = getBundleId().compareTo(that.getBundleId());
+            final int compareBundles = getBundleId().compareTo(that.getBundleId());
             if (compareBundles == 0 && subscriptionId != null) {
 
-                int compareSubscriptions = getSubscriptionId().compareTo(that.getSubscriptionId());
+                final int compareSubscriptions = getSubscriptionId().compareTo(that.getSubscriptionId());
                 if (compareSubscriptions == 0) {
-                    int compareStartDates = getStartDate().compareTo(that.getStartDate());
+                    final int compareStartDates = getStartDate().compareTo(that.getStartDate());
                     if (compareStartDates == 0) {
                         return getEndDate().compareTo(that.getEndDate());
                     } else {
@@ -127,27 +128,50 @@ public class RecurringInvoiceItem extends InvoiceItemBase {
     }
 
     @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
+    public boolean equals(final Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
 
-        RecurringInvoiceItem that = (RecurringInvoiceItem) o;
+        final RecurringInvoiceItem that = (RecurringInvoiceItem) o;
 
         // do not include invoice item type, since a reversing item can be equal to the original item
-        if (accountId.compareTo(that.accountId) != 0) return false;
-        if (amount.compareTo(that.amount) != 0) return false;
-        if (currency != that.currency) return false;
-        if (startDate.compareTo(that.startDate) != 0) return false;
-        if (endDate.compareTo(that.endDate) != 0) return false;
-        if (!phaseName.equals(that.phaseName)) return false;
-        if (!planName.equals(that.planName)) return false;
-        if (rate.compareTo(that.rate) != 0) return false;
-        if (reversedItemId != null ? !reversedItemId.equals(that.reversedItemId) : that.reversedItemId != null)
+        if (accountId.compareTo(that.accountId) != 0) {
             return false;
-        if (subscriptionId != null ? !subscriptionId.equals(that.subscriptionId) : that.subscriptionId != null)
+        }
+        if (amount.compareTo(that.amount) != 0) {
+            return false;
+        }
+        if (currency != that.currency) {
             return false;
-        if (bundleId != null ? !bundleId.equals(that.bundleId) : that.bundleId != null)
+        }
+        if (startDate.compareTo(that.startDate) != 0) {
             return false;
+        }
+        if (endDate.compareTo(that.endDate) != 0) {
+            return false;
+        }
+        if (!phaseName.equals(that.phaseName)) {
+            return false;
+        }
+        if (!planName.equals(that.planName)) {
+            return false;
+        }
+        if (rate.compareTo(that.rate) != 0) {
+            return false;
+        }
+        if (reversedItemId != null ? !reversedItemId.equals(that.reversedItemId) : that.reversedItemId != null) {
+            return false;
+        }
+        if (subscriptionId != null ? !subscriptionId.equals(that.subscriptionId) : that.subscriptionId != null) {
+            return false;
+        }
+        if (bundleId != null ? !bundleId.equals(that.bundleId) : that.bundleId != null) {
+            return false;
+        }
 
         return true;
     }
@@ -171,7 +195,7 @@ public class RecurringInvoiceItem extends InvoiceItemBase {
 
     @Override
     public String toString() {
-        StringBuilder sb = new StringBuilder();
+        final StringBuilder sb = new StringBuilder();
 
         sb.append(phaseName).append(", ");
         sb.append(startDate.toString()).append(", ");
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/RecurringInvoiceItemData.java b/invoice/src/main/java/com/ning/billing/invoice/model/RecurringInvoiceItemData.java
index d42c533..3d4a2d8 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/RecurringInvoiceItemData.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/RecurringInvoiceItemData.java
@@ -16,16 +16,16 @@
 
 package com.ning.billing.invoice.model;
 
-import org.joda.time.DateTime;
-
 import java.math.BigDecimal;
 
+import org.joda.time.DateTime;
+
 public class RecurringInvoiceItemData {
     private final DateTime startDate;
     private final DateTime endDate;
     private final BigDecimal numberOfCycles;
 
-    public RecurringInvoiceItemData(DateTime startDate, DateTime endDate, BigDecimal numberOfCycles) {
+    public RecurringInvoiceItemData(final DateTime startDate, final DateTime endDate, final BigDecimal numberOfCycles) {
         this.startDate = startDate;
         this.endDate = endDate;
         this.numberOfCycles = numberOfCycles;
diff --git a/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDateNotifier.java b/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDateNotifier.java
index 4418dd9..534ee0f 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDateNotifier.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDateNotifier.java
@@ -36,9 +36,9 @@ import com.ning.billing.util.notificationq.NotificationQueueService.NoSuchNotifi
 import com.ning.billing.util.notificationq.NotificationQueueService.NotificationQueueAlreadyExists;
 import com.ning.billing.util.notificationq.NotificationQueueService.NotificationQueueHandler;
 
-public class DefaultNextBillingDateNotifier implements  NextBillingDateNotifier {
+public class DefaultNextBillingDateNotifier implements NextBillingDateNotifier {
 
-    private final static Logger log = LoggerFactory.getLogger(DefaultNextBillingDateNotifier.class);
+    private static final Logger log = LoggerFactory.getLogger(DefaultNextBillingDateNotifier.class);
 
     public static final String NEXT_BILLING_DATE_NOTIFIER_QUEUE = "next-billing-date-queue";
 
@@ -51,8 +51,8 @@ public class DefaultNextBillingDateNotifier implements  NextBillingDateNotifier 
     private final InvoiceListener listener;
 
     @Inject
-    public DefaultNextBillingDateNotifier(NotificationQueueService notificationQueueService,
-            InvoiceConfig config, EntitlementUserApi entitlementUserApi, InvoiceListener listener){
+    public DefaultNextBillingDateNotifier(final NotificationQueueService notificationQueueService,
+                                          final InvoiceConfig config, final EntitlementUserApi entitlementUserApi, final InvoiceListener listener) {
         this.notificationQueueService = notificationQueueService;
         this.config = config;
         this.entitlementUserApi = entitlementUserApi;
@@ -62,41 +62,41 @@ public class DefaultNextBillingDateNotifier implements  NextBillingDateNotifier 
     @Override
     public void initialize() throws NotificationQueueAlreadyExists {
         nextBillingQueue = notificationQueueService.createNotificationQueue(DefaultInvoiceService.INVOICE_SERVICE_NAME,
-                NEXT_BILLING_DATE_NOTIFIER_QUEUE,
-                new NotificationQueueHandler() {
-            @Override
-            public void handleReadyNotification(String notificationKey, DateTime eventDate) {
-                try {
-                    UUID key = UUID.fromString(notificationKey);
-                    try {
-                        Subscription subscription = entitlementUserApi.getSubscriptionFromId(key);
-                        if (subscription == null) {
-                            log.warn("Next Billing Date Notification Queue handled spurious notification (key: " + key + ")" );
-                        } else {
-                            processEvent(key , eventDate);
-                        }
-                    } catch (EntitlementUserApiException e) {
-                        log.warn("Next Billing Date Notification Queue handled spurious notification (key: " + key + ")", e );
-                    }
-                } catch (IllegalArgumentException e) {
-                    log.error("The key returned from the NextBillingNotificationQueue is not a valid UUID", e);
-                    return;
-                }
-
-            }
-        },
-        new NotificationConfig() {
-
-            @Override
-            public long getSleepTimeMs() {
-                return config.getSleepTimeMs();
-            }
-
-            @Override
-            public boolean isNotificationProcessingOff() {
-                return config.isNotificationProcessingOff();
-            }
-        });
+                                                                            NEXT_BILLING_DATE_NOTIFIER_QUEUE,
+                                                                            new NotificationQueueHandler() {
+                                                                                @Override
+                                                                                public void handleReadyNotification(final String notificationKey, final DateTime eventDate) {
+                                                                                    try {
+                                                                                        final UUID key = UUID.fromString(notificationKey);
+                                                                                        try {
+                                                                                            final Subscription subscription = entitlementUserApi.getSubscriptionFromId(key);
+                                                                                            if (subscription == null) {
+                                                                                                log.warn("Next Billing Date Notification Queue handled spurious notification (key: " + key + ")");
+                                                                                            } else {
+                                                                                                processEvent(key, eventDate);
+                                                                                            }
+                                                                                        } catch (EntitlementUserApiException e) {
+                                                                                            log.warn("Next Billing Date Notification Queue handled spurious notification (key: " + key + ")", e);
+                                                                                        }
+                                                                                    } catch (IllegalArgumentException e) {
+                                                                                        log.error("The key returned from the NextBillingNotificationQueue is not a valid UUID", e);
+                                                                                    }
+
+                                                                                }
+                                                                            },
+                                                                            new NotificationConfig() {
+
+                                                                                @Override
+                                                                                public long getSleepTimeMs() {
+                                                                                    return config.getSleepTimeMs();
+                                                                                }
+
+                                                                                @Override
+                                                                                public boolean isNotificationProcessingOff() {
+                                                                                    return config.isNotificationProcessingOff();
+                                                                                }
+                                                                            }
+                                                                           );
 
     }
 
@@ -113,7 +113,7 @@ public class DefaultNextBillingDateNotifier implements  NextBillingDateNotifier 
         }
     }
 
-    private void processEvent(UUID subscriptionId, DateTime eventDateTime) {
+    private void processEvent(final UUID subscriptionId, final DateTime eventDateTime) {
         listener.handleNextBillingDateEvent(subscriptionId, eventDateTime);
     }
 
diff --git a/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDatePoster.java b/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDatePoster.java
index 4aad036..ffc08a3 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDatePoster.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDatePoster.java
@@ -31,34 +31,34 @@ import com.ning.billing.util.notificationq.NotificationQueueService;
 import com.ning.billing.util.notificationq.NotificationQueueService.NoSuchNotificationQueue;
 
 public class DefaultNextBillingDatePoster implements NextBillingDatePoster {
-    
-    private final static Logger log = LoggerFactory.getLogger(DefaultNextBillingDatePoster.class);
 
-	private final NotificationQueueService notificationQueueService;
+    private static final Logger log = LoggerFactory.getLogger(DefaultNextBillingDatePoster.class);
 
-	@Inject
+    private final NotificationQueueService notificationQueueService;
+
+    @Inject
     public DefaultNextBillingDatePoster(
-			NotificationQueueService notificationQueueService) {
-		super();
-		this.notificationQueueService = notificationQueueService;
-	}
+            final NotificationQueueService notificationQueueService) {
+        super();
+        this.notificationQueueService = notificationQueueService;
+    }
 
-	@Override
-	public void insertNextBillingNotification(final Transmogrifier transactionalDao, final UUID subscriptionId, final DateTime futureNotificationTime) {
-    	NotificationQueue nextBillingQueue;
-		try {
-			nextBillingQueue = notificationQueueService.getNotificationQueue(DefaultInvoiceService.INVOICE_SERVICE_NAME,
-					DefaultNextBillingDateNotifier.NEXT_BILLING_DATE_NOTIFIER_QUEUE);
-			 log.info("Queuing next billing date notification. id: {}, timestamp: {}", subscriptionId.toString(), futureNotificationTime.toString());
+    @Override
+    public void insertNextBillingNotification(final Transmogrifier transactionalDao, final UUID subscriptionId, final DateTime futureNotificationTime) {
+        final NotificationQueue nextBillingQueue;
+        try {
+            nextBillingQueue = notificationQueueService.getNotificationQueue(DefaultInvoiceService.INVOICE_SERVICE_NAME,
+                                                                             DefaultNextBillingDateNotifier.NEXT_BILLING_DATE_NOTIFIER_QUEUE);
+            log.info("Queuing next billing date notification. id: {}, timestamp: {}", subscriptionId.toString(), futureNotificationTime.toString());
 
-	            nextBillingQueue.recordFutureNotificationFromTransaction(transactionalDao, futureNotificationTime, new NotificationKey(){
-	                @Override
-	                public String toString() {
-	                    return subscriptionId.toString();
-	                }
-	    	    });
-		} catch (NoSuchNotificationQueue e) {
-			log.error("Attempting to put items on a non-existent queue (NextBillingDateNotifier).", e);
-		}
+            nextBillingQueue.recordFutureNotificationFromTransaction(transactionalDao, futureNotificationTime, new NotificationKey() {
+                @Override
+                public String toString() {
+                    return subscriptionId.toString();
+                }
+            });
+        } catch (NoSuchNotificationQueue e) {
+            log.error("Attempting to put items on a non-existent queue (NextBillingDateNotifier).", e);
+        }
     }
 }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/notification/EmailInvoiceNotifier.java b/invoice/src/main/java/com/ning/billing/invoice/notification/EmailInvoiceNotifier.java
index 58026b2..22926e0 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/notification/EmailInvoiceNotifier.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/notification/EmailInvoiceNotifier.java
@@ -16,6 +16,10 @@
 
 package com.ning.billing.invoice.notification;
 
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
 import com.google.inject.Inject;
 import com.ning.billing.ErrorCode;
 import com.ning.billing.account.api.Account;
@@ -30,34 +34,30 @@ import com.ning.billing.util.email.EmailApiException;
 import com.ning.billing.util.email.EmailConfig;
 import com.ning.billing.util.email.EmailSender;
 
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
 public class EmailInvoiceNotifier implements InvoiceNotifier {
     private final AccountUserApi accountUserApi;
     private final HtmlInvoiceGenerator generator;
     private final EmailConfig config;
 
     @Inject
-    public EmailInvoiceNotifier(AccountUserApi accountUserApi, HtmlInvoiceGenerator generator, EmailConfig config) {
+    public EmailInvoiceNotifier(final AccountUserApi accountUserApi, final HtmlInvoiceGenerator generator, final EmailConfig config) {
         this.accountUserApi = accountUserApi;
         this.generator = generator;
         this.config = config;
     }
 
     @Override
-    public void notify(Account account, Invoice invoice) throws InvoiceApiException {
-        List<String> to = new ArrayList<String>();
+    public void notify(final Account account, final Invoice invoice) throws InvoiceApiException {
+        final List<String> to = new ArrayList<String>();
         to.add(account.getEmail());
 
-        List<AccountEmail> accountEmailList = accountUserApi.getEmails(account.getId());
-        List<String> cc = new ArrayList<String>();
-        for (AccountEmail email : accountEmailList) {
+        final List<AccountEmail> accountEmailList = accountUserApi.getEmails(account.getId());
+        final List<String> cc = new ArrayList<String>();
+        for (final AccountEmail email : accountEmailList) {
             cc.add(email.getEmail());
         }
 
-        String htmlBody = null;
+        final String htmlBody;
         try {
             htmlBody = generator.generateInvoice(account, invoice, "HtmlInvoiceTemplate");
         } catch (IOException e) {
@@ -65,9 +65,9 @@ public class EmailInvoiceNotifier implements InvoiceNotifier {
         }
 
         // TODO: get subject
-        String subject = "";
+        final String subject = "";
 
-        EmailSender sender = new DefaultEmailSender(config);
+        final EmailSender sender = new DefaultEmailSender(config);
         try {
             sender.sendSecureEmail(to, cc, subject, htmlBody);
         } catch (EmailApiException e) {
diff --git a/invoice/src/main/java/com/ning/billing/invoice/notification/NextBillingDatePoster.java b/invoice/src/main/java/com/ning/billing/invoice/notification/NextBillingDatePoster.java
index 67598d1..279c61a 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/notification/NextBillingDatePoster.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/notification/NextBillingDatePoster.java
@@ -23,7 +23,7 @@ import org.skife.jdbi.v2.sqlobject.mixins.Transmogrifier;
 
 public interface NextBillingDatePoster {
 
-	void insertNextBillingNotification(Transmogrifier transactionalDao,
-			UUID subscriptionId, DateTime futureNotificationTime);
+    void insertNextBillingNotification(Transmogrifier transactionalDao,
+                                       UUID subscriptionId, DateTime futureNotificationTime);
 
-}
\ No newline at end of file
+}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/notification/NullInvoiceNotifier.java b/invoice/src/main/java/com/ning/billing/invoice/notification/NullInvoiceNotifier.java
index 460e779..e0e44f7 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/notification/NullInvoiceNotifier.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/notification/NullInvoiceNotifier.java
@@ -22,7 +22,7 @@ import com.ning.billing.invoice.api.InvoiceNotifier;
 
 public class NullInvoiceNotifier implements InvoiceNotifier {
     @Override
-    public void notify(Account account, Invoice invoice) {
+    public void notify(final Account account, final Invoice invoice) {
         // deliberate no-op
     }
-}
\ No newline at end of file
+}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java b/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java
index 1ca7824..098bde8 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatter.java
@@ -31,21 +31,22 @@
  */
 package com.ning.billing.invoice.template.formatters;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+import org.joda.time.format.DateTimeFormat;
+import org.joda.time.format.DateTimeFormatter;
+
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.api.InvoicePayment;
 import com.ning.billing.invoice.api.formatters.InvoiceFormatter;
 import com.ning.billing.util.template.translation.TranslatorConfig;
-import org.joda.time.DateTime;
-import org.joda.time.format.DateTimeFormat;
-import org.joda.time.format.DateTimeFormatter;
-
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-import java.util.UUID;
 
 public class DefaultInvoiceFormatter implements InvoiceFormatter {
     private final TranslatorConfig config;
@@ -53,7 +54,7 @@ public class DefaultInvoiceFormatter implements InvoiceFormatter {
     private final DateTimeFormatter dateFormatter;
     private final Locale locale;
 
-    public DefaultInvoiceFormatter(TranslatorConfig config, Invoice invoice, Locale locale) {
+    public DefaultInvoiceFormatter(final TranslatorConfig config, final Invoice invoice, final Locale locale) {
         this.config = config;
         this.invoice = invoice;
         dateFormatter = DateTimeFormat.mediumDate().withLocale(locale);
@@ -67,25 +68,25 @@ public class DefaultInvoiceFormatter implements InvoiceFormatter {
 
     @Override
     public List<InvoiceItem> getInvoiceItems() {
-        List<InvoiceItem> formatters = new ArrayList<InvoiceItem>();
-        for (InvoiceItem item : invoice.getInvoiceItems()) {
+        final List<InvoiceItem> formatters = new ArrayList<InvoiceItem>();
+        for (final InvoiceItem item : invoice.getInvoiceItems()) {
             formatters.add(new DefaultInvoiceItemFormatter(config, item, dateFormatter, locale));
         }
         return formatters;
     }
 
     @Override
-    public boolean addInvoiceItem(InvoiceItem item) {
+    public boolean addInvoiceItem(final InvoiceItem item) {
         return invoice.addInvoiceItem(item);
     }
 
     @Override
-    public boolean addInvoiceItems(List<InvoiceItem> items) {
+    public boolean addInvoiceItems(final List<InvoiceItem> items) {
         return invoice.addInvoiceItems(items);
     }
 
     @Override
-    public <T extends InvoiceItem> List<InvoiceItem> getInvoiceItems(Class<T> clazz) {
+    public <T extends InvoiceItem> List<InvoiceItem> getInvoiceItems(final Class<T> clazz) {
         return invoice.getInvoiceItems(clazz);
     }
 
@@ -95,12 +96,12 @@ public class DefaultInvoiceFormatter implements InvoiceFormatter {
     }
 
     @Override
-    public boolean addPayment(InvoicePayment payment) {
+    public boolean addPayment(final InvoicePayment payment) {
         return invoice.addPayment(payment);
     }
 
     @Override
-    public boolean addPayments(List<InvoicePayment> payments) {
+    public boolean addPayments(final List<InvoicePayment> payments) {
         return invoice.addPayments(payments);
     }
 
@@ -135,7 +136,7 @@ public class DefaultInvoiceFormatter implements InvoiceFormatter {
     }
 
     @Override
-    public boolean isDueForPayment(DateTime targetDate, int numberOfDays) {
+    public boolean isDueForPayment(final DateTime targetDate, final int numberOfDays) {
         return invoice.isDueForPayment(targetDate, numberOfDays);
     }
 
diff --git a/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatterFactory.java b/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatterFactory.java
index 83c0619..99e62e9 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatterFactory.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceFormatterFactory.java
@@ -16,16 +16,16 @@
 
 package com.ning.billing.invoice.template.formatters;
 
+import java.util.Locale;
+
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.formatters.InvoiceFormatter;
 import com.ning.billing.invoice.api.formatters.InvoiceFormatterFactory;
 import com.ning.billing.util.template.translation.TranslatorConfig;
 
-import java.util.Locale;
-
 public class DefaultInvoiceFormatterFactory implements InvoiceFormatterFactory {
     @Override
-    public InvoiceFormatter createInvoiceFormatter(TranslatorConfig config, Invoice invoice, Locale locale) {
+    public InvoiceFormatter createInvoiceFormatter(final TranslatorConfig config, final Invoice invoice, final Locale locale) {
         return new DefaultInvoiceFormatter(config, invoice, locale);
     }
 }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceItemFormatter.java b/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceItemFormatter.java
index 9f49eb5..2dc8168 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceItemFormatter.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/template/formatters/DefaultInvoiceItemFormatter.java
@@ -16,6 +16,13 @@
 
 package com.ning.billing.invoice.template.formatters;
 
+import java.math.BigDecimal;
+import java.util.Locale;
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+import org.joda.time.format.DateTimeFormatter;
+
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.api.InvoiceItemType;
@@ -23,12 +30,6 @@ import com.ning.billing.invoice.api.formatters.InvoiceItemFormatter;
 import com.ning.billing.util.template.translation.DefaultCatalogTranslator;
 import com.ning.billing.util.template.translation.Translator;
 import com.ning.billing.util.template.translation.TranslatorConfig;
-import org.joda.time.DateTime;
-import org.joda.time.format.DateTimeFormatter;
-
-import java.math.BigDecimal;
-import java.util.Locale;
-import java.util.UUID;
 
 public class DefaultInvoiceItemFormatter implements InvoiceItemFormatter {
     private final Translator translator;
@@ -37,7 +38,7 @@ public class DefaultInvoiceItemFormatter implements InvoiceItemFormatter {
     private final DateTimeFormatter dateFormatter;
     private final Locale locale;
 
-    public DefaultInvoiceItemFormatter(TranslatorConfig config, InvoiceItem item, DateTimeFormatter dateFormatter, Locale locale) {
+    public DefaultInvoiceItemFormatter(final TranslatorConfig config, final InvoiceItem item, final DateTimeFormatter dateFormatter, final Locale locale) {
         this.item = item;
         this.dateFormatter = dateFormatter;
         this.locale = locale;
@@ -121,7 +122,7 @@ public class DefaultInvoiceItemFormatter implements InvoiceItemFormatter {
     }
 
     @Override
-    public int compareTo(InvoiceItem invoiceItem) {
+    public int compareTo(final InvoiceItem invoiceItem) {
         return item.compareTo(invoiceItem);
     }
 
@@ -129,4 +130,4 @@ public class DefaultInvoiceItemFormatter implements InvoiceItemFormatter {
     public UUID getId() {
         return item.getId();
     }
-}
\ No newline at end of file
+}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/template/HtmlInvoiceGenerator.java b/invoice/src/main/java/com/ning/billing/invoice/template/HtmlInvoiceGenerator.java
index 2a006d8..ddfe39a 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/template/HtmlInvoiceGenerator.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/template/HtmlInvoiceGenerator.java
@@ -16,6 +16,11 @@
 
 package com.ning.billing.invoice.template;
 
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+
 import com.google.inject.Inject;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.invoice.api.Invoice;
@@ -25,35 +30,29 @@ import com.ning.billing.invoice.template.translator.DefaultInvoiceTranslator;
 import com.ning.billing.util.email.templates.TemplateEngine;
 import com.ning.billing.util.template.translation.TranslatorConfig;
 
-import java.io.IOException;
-import java.lang.String;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-
 public class HtmlInvoiceGenerator {
     private final InvoiceFormatterFactory factory;
     private final TemplateEngine templateEngine;
     private final TranslatorConfig config;
 
     @Inject
-    public HtmlInvoiceGenerator(InvoiceFormatterFactory factory, TemplateEngine templateEngine, TranslatorConfig config) {
+    public HtmlInvoiceGenerator(final InvoiceFormatterFactory factory, final TemplateEngine templateEngine, final TranslatorConfig config) {
         this.factory = factory;
         this.templateEngine = templateEngine;
         this.config = config;
     }
 
-    public String generateInvoice(Account account, Invoice invoice, String templateName) throws IOException {
-        Map<String, Object> data = new HashMap<String, Object>();
-        DefaultInvoiceTranslator invoiceTranslator = new DefaultInvoiceTranslator(config);
-        Locale locale = new Locale(account.getLocale());
+    public String generateInvoice(final Account account, final Invoice invoice, final String templateName) throws IOException {
+        final Map<String, Object> data = new HashMap<String, Object>();
+        final DefaultInvoiceTranslator invoiceTranslator = new DefaultInvoiceTranslator(config);
+        final Locale locale = new Locale(account.getLocale());
         invoiceTranslator.setLocale(locale);
         data.put("text", invoiceTranslator);
         data.put("account", account);
 
-        InvoiceFormatter formattedInvoice = factory.createInvoiceFormatter(config, invoice, locale);
+        final InvoiceFormatter formattedInvoice = factory.createInvoiceFormatter(config, invoice, locale);
         data.put("invoice", formattedInvoice);
 
         return templateEngine.executeTemplate(templateName, data);
     }
-}
\ No newline at end of file
+}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/template/translator/DefaultInvoiceTranslator.java b/invoice/src/main/java/com/ning/billing/invoice/template/translator/DefaultInvoiceTranslator.java
index f238ea7..9f46012 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/template/translator/DefaultInvoiceTranslator.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/template/translator/DefaultInvoiceTranslator.java
@@ -16,21 +16,21 @@
 
 package com.ning.billing.invoice.template.translator;
 
+import java.util.Locale;
+
 import com.google.inject.Inject;
 import com.ning.billing.util.template.translation.DefaultTranslatorBase;
 import com.ning.billing.util.template.translation.TranslatorConfig;
 
-import java.util.Locale;
-
 public class DefaultInvoiceTranslator extends DefaultTranslatorBase implements InvoiceStrings {
     private Locale locale;
 
     @Inject
-    public DefaultInvoiceTranslator(TranslatorConfig config) {
+    public DefaultInvoiceTranslator(final TranslatorConfig config) {
         super(config);
     }
 
-    public void setLocale(Locale locale) {
+    public void setLocale(final Locale locale) {
         this.locale = locale;
     }
 
diff --git a/invoice/src/main/java/com/ning/billing/invoice/template/translator/InvoiceStrings.java b/invoice/src/main/java/com/ning/billing/invoice/template/translator/InvoiceStrings.java
index cc19d5f..b76322b 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/template/translator/InvoiceStrings.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/template/translator/InvoiceStrings.java
@@ -18,25 +18,39 @@ package com.ning.billing.invoice.template.translator;
 
 public interface InvoiceStrings {
     String getInvoiceTitle();
+
     String getInvoiceDate();
+
     String getInvoiceNumber();
+
     String getAccountOwnerName();
+
     String getAccountOwnerEmail();
+
     String getAccountOwnerPhone();
 
     // company name and address
     String getCompanyName();
+
     String getCompanyAddress();
+
     String getCompanyCityProvincePostalCode();
+
     String getCompanyCountry();
+
     String getCompanyUrl();
 
     String getInvoiceItemBundleName();
+
     String getInvoiceItemDescription();
+
     String getInvoiceItemServicePeriod();
+
     String getInvoiceItemAmount();
 
     String getInvoiceAmount();
+
     String getInvoiceAmountPaid();
+
     String getInvoiceBalance();
 }
diff --git a/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceSqlDao.sql.stg b/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceSqlDao.sql.stg
index fe942a8..8c8a3a2 100644
--- a/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceSqlDao.sql.stg
+++ b/invoice/src/main/resources/com/ning/billing/invoice/dao/InvoiceSqlDao.sql.stg
@@ -43,6 +43,14 @@ getInvoicesBySubscription() ::= <<
   FROM invoices i
   LEFT JOIN recurring_invoice_items rii ON i.id = rii.invoice_id
   WHERE rii.subscription_id = :subscriptionId AND migrated = 'FALSE'
+  GROUP BY i.record_id, <invoiceFields("i.")>
+
+  UNION ALL
+
+  SELECT i.record_id as invoice_number, <invoiceFields("i.")>
+  FROM invoices i
+  LEFT JOIN fixed_invoice_items fii ON i.id = fii.invoice_id
+  WHERE fii.subscription_id = :subscriptionId AND migrated = 'FALSE'
   GROUP BY i.record_id, <invoiceFields("i.")>;
 >>
 
@@ -112,4 +120,4 @@ test() ::= <<
   SELECT 1
   FROM invoices;
 >>
-;
\ No newline at end of file
+;
diff --git a/invoice/src/test/java/com/ning/billing/invoice/api/migration/MockModuleNoEntitlement.java b/invoice/src/test/java/com/ning/billing/invoice/api/migration/MockModuleNoEntitlement.java
index fe5d886..0bc2d9f 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/api/migration/MockModuleNoEntitlement.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/api/migration/MockModuleNoEntitlement.java
@@ -39,24 +39,24 @@ public class MockModuleNoEntitlement extends MockModule {
 //        ((ZombieControl)cta).addResult("setChargedThroughDateFromTransaction", BrainDeadProxyFactory.ZOMBIE_VOID);
 //	}
 
-	@Override
-	protected void installInvoiceModule() {
-		install(new DefaultInvoiceModule(){
-
-			@Override
-			protected void installNotifiers() {
-				 bind(NextBillingDateNotifier.class).toInstance(BrainDeadProxyFactory.createBrainDeadProxyFor(NextBillingDateNotifier.class));
-				 NextBillingDatePoster poster = BrainDeadProxyFactory.createBrainDeadProxyFor(NextBillingDatePoster.class);
-				 ((ZombieControl)poster).addResult("insertNextBillingNotification",BrainDeadProxyFactory.ZOMBIE_VOID);
-			     bind(NextBillingDatePoster.class).toInstance(poster);
+    @Override
+    protected void installInvoiceModule() {
+        install(new DefaultInvoiceModule() {
+
+            @Override
+            protected void installNotifiers() {
+                bind(NextBillingDateNotifier.class).toInstance(BrainDeadProxyFactory.createBrainDeadProxyFor(NextBillingDateNotifier.class));
+                final NextBillingDatePoster poster = BrainDeadProxyFactory.createBrainDeadProxyFor(NextBillingDatePoster.class);
+                ((ZombieControl) poster).addResult("insertNextBillingNotification", BrainDeadProxyFactory.ZOMBIE_VOID);
+                bind(NextBillingDatePoster.class).toInstance(poster);
                 bind(InvoiceNotifier.class).to(NullInvoiceNotifier.class).asEagerSingleton();
-			}
-			
-			
-		});
+            }
+
+
+        });
         install(new TemplateModule());
 
-		
-	}
+
+    }
 
 }
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 05f7179..a1e17e1 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
@@ -72,192 +72,191 @@ import com.ning.billing.util.globallocker.GlobalLocker;
 
 @Guice(modules = {MockModuleNoEntitlement.class})
 public class TestDefaultInvoiceMigrationApi extends InvoicingTestBase {
-	Logger log = LoggerFactory.getLogger(TestDefaultInvoiceMigrationApi.class);
+    final Logger log = LoggerFactory.getLogger(TestDefaultInvoiceMigrationApi.class);
 
-	@Inject
-	InvoiceUserApi invoiceUserApi;
+    @Inject
+    InvoiceUserApi invoiceUserApi;
 
-	@Inject
-	InvoicePaymentApi invoicePaymentApi;
+    @Inject
+    InvoicePaymentApi invoicePaymentApi;
 
-	@Inject
-	private InvoiceGenerator generator;
-	@Inject
-	private InvoiceDao invoiceDao;
-	@Inject
-	private GlobalLocker locker;
+    @Inject
+    private InvoiceGenerator generator;
+    @Inject
+    private InvoiceDao invoiceDao;
+    @Inject
+    private GlobalLocker locker;
 
-	@Inject
-	private MysqlTestingHelper helper;
+    @Inject
+    private MysqlTestingHelper helper;
 
-	@Inject
-	private BusService busService;
+    @Inject
+    private BusService busService;
 
-	@Inject
-	private InvoiceMigrationApi migrationApi;
-	
-	@Inject
-	private BillingApi billingApi;
+    @Inject
+    private InvoiceMigrationApi migrationApi;
 
-	private UUID accountId ;
-	private UUID subscriptionId ;
-	private DateTime date_migrated;
-	private DateTime date_regular;
+    @Inject
+    private BillingApi billingApi;
 
-	private UUID migrationInvoiceId;
-	private UUID regularInvoiceId;
+    private UUID accountId;
+    private UUID subscriptionId;
+    private DateTime date_migrated;
+    private DateTime date_regular;
 
-	private static final BigDecimal MIGRATION_INVOICE_AMOUNT =  new BigDecimal("100.00");
-	private static final Currency MIGRATION_INVOICE_CURRENCY =  Currency.USD;
+    private UUID migrationInvoiceId;
+    private UUID regularInvoiceId;
+
+    private static final BigDecimal MIGRATION_INVOICE_AMOUNT = new BigDecimal("100.00");
+    private static final Currency MIGRATION_INVOICE_CURRENCY = Currency.USD;
 
     private final Clock clock = new ClockMock();
 
-	@BeforeClass(groups={"slow"})
-	public void setup() throws Exception
-	{
-		log.info("Starting set up");
-		accountId = UUID.randomUUID();
-		subscriptionId = UUID.randomUUID();
-		date_migrated = clock.getUTCNow().minusYears(1);
-		date_regular = clock.getUTCNow();
-
-		final String invoiceDdl = IOUtils.toString(TestInvoiceDispatcher.class.getResourceAsStream("/com/ning/billing/invoice/ddl.sql"));
-		final String utilDdl = IOUtils.toString(TestInvoiceDispatcher.class.getResourceAsStream("/com/ning/billing/util/ddl.sql"));
-
-		helper.startMysql();
-
-		helper.initDb(invoiceDdl);
-		helper.initDb(utilDdl);
-
-		busService.getBus().start();
-
-        ((ZombieControl)billingApi).addResult("setChargedThroughDate", BrainDeadProxyFactory.ZOMBIE_VOID);
-		migrationInvoiceId = createAndCheckMigrationInvoice();
-		regularInvoiceId = generateRegularInvoice();
-
-	}
-
-	@AfterClass(groups={"slow"})
-	public void tearDown() {
-		try {
-			((DefaultBusService) busService).stopBus();
-			helper.stopMysql();
-		} catch (Exception e) {
-			log.warn("Failed to tearDown test properly ", e);
-		}
-	}
-
-	private UUID createAndCheckMigrationInvoice(){
-		UUID migrationInvoiceId = migrationApi.createMigrationInvoice(accountId, date_migrated, MIGRATION_INVOICE_AMOUNT, MIGRATION_INVOICE_CURRENCY);
-		Assert.assertNotNull(migrationInvoiceId);
-		//Double check it was created and values are correct
-
-		Invoice invoice = invoiceDao.getById(migrationInvoiceId);
-		Assert.assertNotNull(invoice);
-
-		Assert.assertEquals(invoice.getAccountId(), accountId);
-		Assert.assertEquals(invoice.getTargetDate().compareTo(date_migrated), 0); //temp to avoid tz test artifact
-		//		Assert.assertEquals(invoice.getTargetDate(),now);
-		Assert.assertEquals(invoice.getNumberOfItems(), 1);
-		Assert.assertEquals(invoice.getInvoiceItems().get(0).getAmount().compareTo(MIGRATION_INVOICE_AMOUNT), 0 );
-		Assert.assertEquals(invoice.getBalance().compareTo(MIGRATION_INVOICE_AMOUNT),0);
-		Assert.assertEquals(invoice.getCurrency(), MIGRATION_INVOICE_CURRENCY);
-		Assert.assertTrue(invoice.isMigrationInvoice());
-
-		return migrationInvoiceId;
-	}
-
-	private UUID generateRegularInvoice()  throws Exception {
-		AccountUserApi accountUserApi = BrainDeadProxyFactory.createBrainDeadProxyFor(AccountUserApi.class);
-		Account account = BrainDeadProxyFactory.createBrainDeadProxyFor(Account.class);
-		((ZombieControl)accountUserApi).addResult("getAccountById", account);
-		((ZombieControl)account).addResult("getCurrency", Currency.USD);
-		((ZombieControl)account).addResult("getId", accountId);
-        ((ZombieControl)account).addResult("isNotifiedForInvoices", true);
-
-		Subscription subscription =  BrainDeadProxyFactory.createBrainDeadProxyFor(Subscription.class);
-        ((ZombieControl)subscription).addResult("getId", subscriptionId);
-        ((ZombieControl)subscription).addResult("getBundleId", new UUID(0L,0L));
-		BillingEventSet events = new MockBillingEventSet();
-		Plan plan = MockPlan.createBicycleNoTrialEvergreen1USD();
-		PlanPhase planPhase = MockPlanPhase.create1USDMonthlyEvergreen();
-		DateTime effectiveDate = new DateTime().minusDays(1);
-		Currency currency = Currency.USD;
-		BigDecimal fixedPrice = null;
-		events.add(createMockBillingEvent(account, subscription, effectiveDate, plan, planPhase,
-                fixedPrice, BigDecimal.ONE, currency, BillingPeriod.MONTHLY, 1,
-                BillingModeType.IN_ADVANCE, "", 1L, SubscriptionTransitionType.CREATE));
-
-		((ZombieControl)billingApi).addResult("getBillingEventsForAccountAndUpdateAccountBCD", events);
-
-        InvoiceNotifier invoiceNotifier = new NullInvoiceNotifier();
-		InvoiceDispatcher dispatcher = new InvoiceDispatcher(generator, accountUserApi, billingApi,
-                                                             invoiceDao, invoiceNotifier, locker, busService.getBus(), clock);
-
-        CallContext context = new DefaultCallContextFactory(clock).createCallContext("Migration test", CallOrigin.TEST, UserType.TEST);
-		Invoice invoice = dispatcher.processAccount(accountId, date_regular, true, context);
-		Assert.assertNotNull(invoice);
-
-		List<Invoice> invoices = invoiceDao.getInvoicesByAccount(accountId);
-		Assert.assertEquals(invoices.size(),0);
-
-		invoice = dispatcher.processAccount(accountId, date_regular, false, context);
-		Assert.assertNotNull(invoice);
-
-		invoices = invoiceDao.getInvoicesByAccount(accountId);
-		Assert.assertEquals(invoices.size(),1);
-
-		return invoice.getId();
-	}
-
-	// Check migration invoice is NOT returned for all user api invoice calls
-	@Test(groups={"slow"}, enabled=true)
-	public void testUserApiAccess(){
-		List<Invoice> byAccount = invoiceUserApi.getInvoicesByAccount(accountId);
-		Assert.assertEquals(byAccount.size(),1);
-		Assert.assertEquals(byAccount.get(0).getId(), regularInvoiceId);
-
-		List<Invoice> byAccountAndDate = invoiceUserApi.getInvoicesByAccount(accountId, date_migrated.minusDays(1));
-		Assert.assertEquals(byAccountAndDate.size(),1);
-		Assert.assertEquals(byAccountAndDate.get(0).getId(), regularInvoiceId);
-
-		Collection<Invoice> unpaid = invoiceUserApi.getUnpaidInvoicesByAccountId(accountId, date_regular.plusDays(1));
-		Assert.assertEquals(unpaid.size(), 1);
-		Assert.assertEquals(regularInvoiceId, unpaid.iterator().next().getId());
-
-	}
-
-
-	// Check migration invoice IS returned for payment api calls
-	@Test(groups={"slow"},enabled=true)
-	public void testPaymentApi(){
-		List<Invoice> allByAccount = invoicePaymentApi.getAllInvoicesByAccount(accountId);
-		Assert.assertEquals(allByAccount.size(),2);
-		Assert.assertTrue(checkContains(allByAccount, regularInvoiceId));
-		Assert.assertTrue(checkContains(allByAccount, migrationInvoiceId));
-	}
-
-
-	// ACCOUNT balance should reflect total of migration and non-migration invoices
-	@Test(groups={"slow"},enabled=true)
-	public void testBalance(){
-		Invoice migrationInvoice = invoiceDao.getById(migrationInvoiceId);
-		Invoice regularInvoice = invoiceDao.getById(regularInvoiceId);
-		BigDecimal balanceOfAllInvoices = migrationInvoice.getBalance().add(regularInvoice.getBalance());
-
-		BigDecimal accountBalance = invoiceUserApi.getAccountBalance(accountId);
-		System.out.println("ACCOUNT balance: " + accountBalance + " should equal the Balance Of All Invoices: " + balanceOfAllInvoices);
-		Assert.assertEquals(accountBalance.compareTo(balanceOfAllInvoices), 0);
-
-
-	}
-
-	private boolean checkContains(List<Invoice> invoices, UUID invoiceId) {
-		for(Invoice invoice : invoices) {
-			if(invoice.getId().equals(invoiceId)) {
-				return true;
-			}
-		}
-		return false;		
-	}
+    @BeforeClass(groups = {"slow"})
+    public void setup() throws Exception {
+        log.info("Starting set up");
+        accountId = UUID.randomUUID();
+        subscriptionId = UUID.randomUUID();
+        date_migrated = clock.getUTCNow().minusYears(1);
+        date_regular = clock.getUTCNow();
+
+        final String invoiceDdl = IOUtils.toString(TestInvoiceDispatcher.class.getResourceAsStream("/com/ning/billing/invoice/ddl.sql"));
+        final String utilDdl = IOUtils.toString(TestInvoiceDispatcher.class.getResourceAsStream("/com/ning/billing/util/ddl.sql"));
+
+        helper.startMysql();
+
+        helper.initDb(invoiceDdl);
+        helper.initDb(utilDdl);
+
+        busService.getBus().start();
+
+        ((ZombieControl) billingApi).addResult("setChargedThroughDate", BrainDeadProxyFactory.ZOMBIE_VOID);
+        migrationInvoiceId = createAndCheckMigrationInvoice();
+        regularInvoiceId = generateRegularInvoice();
+
+    }
+
+    @AfterClass(groups = {"slow"})
+    public void tearDown() {
+        try {
+            ((DefaultBusService) busService).stopBus();
+            helper.stopMysql();
+        } catch (Exception e) {
+            log.warn("Failed to tearDown test properly ", e);
+        }
+    }
+
+    private UUID createAndCheckMigrationInvoice() {
+        final UUID migrationInvoiceId = migrationApi.createMigrationInvoice(accountId, date_migrated, MIGRATION_INVOICE_AMOUNT, MIGRATION_INVOICE_CURRENCY);
+        Assert.assertNotNull(migrationInvoiceId);
+        //Double check it was created and values are correct
+
+        final Invoice invoice = invoiceDao.getById(migrationInvoiceId);
+        Assert.assertNotNull(invoice);
+
+        Assert.assertEquals(invoice.getAccountId(), accountId);
+        Assert.assertEquals(invoice.getTargetDate().compareTo(date_migrated), 0); //temp to avoid tz test artifact
+        //		Assert.assertEquals(invoice.getTargetDate(),now);
+        Assert.assertEquals(invoice.getNumberOfItems(), 1);
+        Assert.assertEquals(invoice.getInvoiceItems().get(0).getAmount().compareTo(MIGRATION_INVOICE_AMOUNT), 0);
+        Assert.assertEquals(invoice.getBalance().compareTo(MIGRATION_INVOICE_AMOUNT), 0);
+        Assert.assertEquals(invoice.getCurrency(), MIGRATION_INVOICE_CURRENCY);
+        Assert.assertTrue(invoice.isMigrationInvoice());
+
+        return migrationInvoiceId;
+    }
+
+    private UUID generateRegularInvoice() throws Exception {
+        final AccountUserApi accountUserApi = BrainDeadProxyFactory.createBrainDeadProxyFor(AccountUserApi.class);
+        final Account account = BrainDeadProxyFactory.createBrainDeadProxyFor(Account.class);
+        ((ZombieControl) accountUserApi).addResult("getAccountById", account);
+        ((ZombieControl) account).addResult("getCurrency", Currency.USD);
+        ((ZombieControl) account).addResult("getId", accountId);
+        ((ZombieControl) account).addResult("isNotifiedForInvoices", true);
+
+        final Subscription subscription = BrainDeadProxyFactory.createBrainDeadProxyFor(Subscription.class);
+        ((ZombieControl) subscription).addResult("getId", subscriptionId);
+        ((ZombieControl) subscription).addResult("getBundleId", 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));
+
+        ((ZombieControl) billingApi).addResult("getBillingEventsForAccountAndUpdateAccountBCD", events);
+
+        final InvoiceNotifier invoiceNotifier = new NullInvoiceNotifier();
+        final InvoiceDispatcher dispatcher = new InvoiceDispatcher(generator, accountUserApi, billingApi,
+                                                                   invoiceDao, invoiceNotifier, locker, busService.getBus(), clock);
+
+        final CallContext context = new DefaultCallContextFactory(clock).createCallContext("Migration test", CallOrigin.TEST, UserType.TEST);
+        Invoice invoice = dispatcher.processAccount(accountId, date_regular, true, context);
+        Assert.assertNotNull(invoice);
+
+        List<Invoice> invoices = invoiceDao.getInvoicesByAccount(accountId);
+        Assert.assertEquals(invoices.size(), 0);
+
+        invoice = dispatcher.processAccount(accountId, date_regular, false, context);
+        Assert.assertNotNull(invoice);
+
+        invoices = invoiceDao.getInvoicesByAccount(accountId);
+        Assert.assertEquals(invoices.size(), 1);
+
+        return invoice.getId();
+    }
+
+    // Check migration invoice is NOT returned for all user api invoice calls
+    @Test(groups = {"slow"}, enabled = true)
+    public void testUserApiAccess() {
+        final List<Invoice> byAccount = invoiceUserApi.getInvoicesByAccount(accountId);
+        Assert.assertEquals(byAccount.size(), 1);
+        Assert.assertEquals(byAccount.get(0).getId(), regularInvoiceId);
+
+        final List<Invoice> byAccountAndDate = invoiceUserApi.getInvoicesByAccount(accountId, date_migrated.minusDays(1));
+        Assert.assertEquals(byAccountAndDate.size(), 1);
+        Assert.assertEquals(byAccountAndDate.get(0).getId(), regularInvoiceId);
+
+        final Collection<Invoice> unpaid = invoiceUserApi.getUnpaidInvoicesByAccountId(accountId, date_regular.plusDays(1));
+        Assert.assertEquals(unpaid.size(), 1);
+        Assert.assertEquals(regularInvoiceId, unpaid.iterator().next().getId());
+
+    }
+
+
+    // Check migration invoice IS returned for payment api calls
+    @Test(groups = {"slow"}, enabled = true)
+    public void testPaymentApi() {
+        final List<Invoice> allByAccount = invoicePaymentApi.getAllInvoicesByAccount(accountId);
+        Assert.assertEquals(allByAccount.size(), 2);
+        Assert.assertTrue(checkContains(allByAccount, regularInvoiceId));
+        Assert.assertTrue(checkContains(allByAccount, migrationInvoiceId));
+    }
+
+
+    // ACCOUNT balance should reflect total of migration and non-migration invoices
+    @Test(groups = {"slow"}, enabled = true)
+    public void testBalance() {
+        final Invoice migrationInvoice = invoiceDao.getById(migrationInvoiceId);
+        final Invoice regularInvoice = invoiceDao.getById(regularInvoiceId);
+        final BigDecimal balanceOfAllInvoices = migrationInvoice.getBalance().add(regularInvoice.getBalance());
+
+        final BigDecimal accountBalance = invoiceUserApi.getAccountBalance(accountId);
+        System.out.println("ACCOUNT balance: " + accountBalance + " should equal the Balance Of All Invoices: " + balanceOfAllInvoices);
+        Assert.assertEquals(accountBalance.compareTo(balanceOfAllInvoices), 0);
+
+
+    }
+
+    private boolean checkContains(final List<Invoice> invoices, final UUID invoiceId) {
+        for (final Invoice invoice : invoices) {
+            if (invoice.getId().equals(invoiceId)) {
+                return true;
+            }
+        }
+        return false;
+    }
 }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/api/MockInvoicePaymentApi.java b/invoice/src/test/java/com/ning/billing/invoice/api/MockInvoicePaymentApi.java
index 1bde0c6..e6349c9 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/api/MockInvoicePaymentApi.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/api/MockInvoicePaymentApi.java
@@ -23,24 +23,23 @@ import java.util.UUID;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
 
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.model.DefaultInvoicePayment;
 import com.ning.billing.util.callcontext.CallContext;
-import org.joda.time.DateTimeZone;
 
-public class MockInvoicePaymentApi implements InvoicePaymentApi
-{
+public class MockInvoicePaymentApi implements InvoicePaymentApi {
     private final CopyOnWriteArrayList<Invoice> invoices = new CopyOnWriteArrayList<Invoice>();
     private final CopyOnWriteArrayList<InvoicePayment> invoicePayments = new CopyOnWriteArrayList<InvoicePayment>();
 
-    public void add(Invoice invoice) {
+    public void add(final Invoice invoice) {
         invoices.add(invoice);
     }
 
     @Override
-    public void notifyOfPaymentAttempt(InvoicePayment invoicePayment, CallContext context) {
-        for (InvoicePayment existingInvoicePayment : invoicePayments) {
+    public void notifyOfPaymentAttempt(final InvoicePayment invoicePayment, final CallContext context) {
+        for (final InvoicePayment existingInvoicePayment : invoicePayments) {
             if (existingInvoicePayment.getInvoiceId().equals(invoicePayment.getInvoiceId()) && existingInvoicePayment.getPaymentAttemptId().equals(invoicePayment.getPaymentAttemptId())) {
                 invoicePayments.remove(existingInvoicePayment);
             }
@@ -49,10 +48,10 @@ public class MockInvoicePaymentApi implements InvoicePaymentApi
     }
 
     @Override
-    public List<Invoice> getAllInvoicesByAccount(UUID accountId) {
-        ArrayList<Invoice> result = new ArrayList<Invoice>();
+    public List<Invoice> getAllInvoicesByAccount(final UUID accountId) {
+        final ArrayList<Invoice> result = new ArrayList<Invoice>();
 
-        for (Invoice invoice : invoices) {
+        for (final Invoice invoice : invoices) {
             if (accountId.equals(invoice.getAccountId())) {
                 result.add(invoice);
             }
@@ -61,8 +60,8 @@ public class MockInvoicePaymentApi implements InvoicePaymentApi
     }
 
     @Override
-    public Invoice getInvoice(UUID invoiceId) {
-        for (Invoice invoice : invoices) {
+    public Invoice getInvoice(final UUID invoiceId) {
+        for (final Invoice invoice : invoices) {
             if (invoiceId.equals(invoice.getId())) {
                 return invoice;
             }
@@ -71,8 +70,8 @@ public class MockInvoicePaymentApi implements InvoicePaymentApi
     }
 
     @Override
-    public Invoice getInvoiceForPaymentAttemptId(UUID paymentAttemptId) {
-        for (InvoicePayment invoicePayment : invoicePayments) {
+    public Invoice getInvoiceForPaymentAttemptId(final UUID paymentAttemptId) {
+        for (final InvoicePayment invoicePayment : invoicePayments) {
             if (invoicePayment.getPaymentAttemptId().equals(paymentAttemptId)) {
                 return getInvoice(invoicePayment.getInvoiceId());
             }
@@ -81,8 +80,8 @@ public class MockInvoicePaymentApi implements InvoicePaymentApi
     }
 
     @Override
-    public InvoicePayment getInvoicePayment(UUID paymentAttemptId) {
-        for (InvoicePayment invoicePayment : invoicePayments) {
+    public InvoicePayment getInvoicePayment(final UUID paymentAttemptId) {
+        for (final InvoicePayment invoicePayment : invoicePayments) {
             if (paymentAttemptId.equals(invoicePayment.getPaymentAttemptId())) {
                 return invoicePayment;
             }
@@ -91,22 +90,22 @@ public class MockInvoicePaymentApi implements InvoicePaymentApi
     }
 
     @Override
-    public void notifyOfPaymentAttempt(UUID invoiceId, BigDecimal amountOutstanding, Currency currency, UUID paymentAttemptId, DateTime paymentAttemptDate, CallContext context) {
-        InvoicePayment invoicePayment = new DefaultInvoicePayment(paymentAttemptId, invoiceId, paymentAttemptDate, amountOutstanding, currency);
+    public void notifyOfPaymentAttempt(final UUID invoiceId, final BigDecimal amountOutstanding, final Currency currency, final UUID paymentAttemptId, final DateTime paymentAttemptDate, final CallContext context) {
+        final InvoicePayment invoicePayment = new DefaultInvoicePayment(paymentAttemptId, invoiceId, paymentAttemptDate, amountOutstanding, currency);
         notifyOfPaymentAttempt(invoicePayment, context);
     }
 
     @Override
-    public void notifyOfPaymentAttempt(UUID invoiceId, UUID paymentAttemptId, DateTime paymentAttemptDate, CallContext context) {
-        InvoicePayment invoicePayment = new DefaultInvoicePayment(paymentAttemptId, invoiceId, paymentAttemptDate);
+    public void notifyOfPaymentAttempt(final UUID invoiceId, final UUID paymentAttemptId, final DateTime paymentAttemptDate, final CallContext context) {
+        final InvoicePayment invoicePayment = new DefaultInvoicePayment(paymentAttemptId, invoiceId, paymentAttemptDate);
         notifyOfPaymentAttempt(invoicePayment, context);
     }
 
     @Override
-    public void processChargeback(UUID invoicePaymentId, BigDecimal amount, CallContext context) throws InvoiceApiException {
+    public void processChargeback(final UUID invoicePaymentId, final BigDecimal amount, final CallContext context) throws InvoiceApiException {
         InvoicePayment existingPayment = null;
-        for (InvoicePayment payment : invoicePayments) {
-            if (payment.getId()  == invoicePaymentId) {
+        for (final InvoicePayment payment : invoicePayments) {
+            if (payment.getId() == invoicePaymentId) {
                 existingPayment = payment;
             }
         }
@@ -117,10 +116,10 @@ public class MockInvoicePaymentApi implements InvoicePaymentApi
     }
 
     @Override
-    public void processChargeback(UUID invoicePaymentId, CallContext context) throws InvoiceApiException {
+    public void processChargeback(final UUID invoicePaymentId, final CallContext context) throws InvoiceApiException {
         InvoicePayment existingPayment = null;
-        for (InvoicePayment payment : invoicePayments) {
-            if (payment.getId()  == invoicePaymentId) {
+        for (final InvoicePayment payment : invoicePayments) {
+            if (payment.getId() == invoicePaymentId) {
                 existingPayment = payment;
             }
         }
@@ -131,9 +130,9 @@ public class MockInvoicePaymentApi implements InvoicePaymentApi
     }
 
     @Override
-    public BigDecimal getRemainingAmountPaid(UUID invoicePaymentId) {
+    public BigDecimal getRemainingAmountPaid(final UUID invoicePaymentId) {
         BigDecimal amount = BigDecimal.ZERO;
-        for (InvoicePayment payment : invoicePayments) {
+        for (final InvoicePayment payment : invoicePayments) {
             if (payment.getId().equals(invoicePaymentId)) {
                 amount = amount.add(payment.getAmount());
             }
@@ -147,22 +146,22 @@ public class MockInvoicePaymentApi implements InvoicePaymentApi
     }
 
     @Override
-    public List<InvoicePayment> getChargebacksByAccountId(UUID accountId) {
+    public List<InvoicePayment> getChargebacksByAccountId(final UUID accountId) {
         throw new UnsupportedOperationException();
     }
 
     @Override
-    public UUID getAccountIdFromInvoicePaymentId(UUID uuid) throws InvoiceApiException {
+    public UUID getAccountIdFromInvoicePaymentId(final UUID uuid) throws InvoiceApiException {
         throw new UnsupportedOperationException();
     }
 
     @Override
-    public List<InvoicePayment> getChargebacksByPaymentAttemptId(UUID paymentAttemptId) {
+    public List<InvoicePayment> getChargebacksByPaymentAttemptId(final UUID paymentAttemptId) {
         throw new UnsupportedOperationException();
     }
 
     @Override
-    public InvoicePayment getChargebackById(UUID chargebackId) {
+    public InvoicePayment getChargebackById(final UUID chargebackId) {
         throw new UnsupportedOperationException();
     }
 }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/api/user/TestEventJson.java b/invoice/src/test/java/com/ning/billing/invoice/api/user/TestEventJson.java
index f2d9282..404255b 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/api/user/TestEventJson.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/api/user/TestEventJson.java
@@ -18,7 +18,6 @@ package com.ning.billing.invoice.api.user;
 import java.math.BigDecimal;
 import java.util.UUID;
 
-import com.ning.billing.util.jackson.ObjectMapper;
 import org.joda.time.DateTime;
 import org.testng.Assert;
 import org.testng.annotations.Test;
@@ -26,31 +25,32 @@ import org.testng.annotations.Test;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.api.EmptyInvoiceEvent;
 import com.ning.billing.invoice.api.InvoiceCreationEvent;
+import com.ning.billing.util.jackson.ObjectMapper;
 
 public class TestEventJson {
     private final ObjectMapper mapper = new ObjectMapper();
 
-    @Test(groups= {"fast"})
+    @Test(groups = {"fast"})
     public void testInvoiceCreationEvent() throws Exception {
 
-        InvoiceCreationEvent e = new DefaultInvoiceCreationEvent(UUID.randomUUID(), UUID.randomUUID(), new BigDecimal(12.0), Currency.USD, new DateTime(), UUID.randomUUID());
+        final InvoiceCreationEvent e = new DefaultInvoiceCreationEvent(UUID.randomUUID(), UUID.randomUUID(), new BigDecimal(12.0), Currency.USD, new DateTime(), UUID.randomUUID());
 
-        String json = mapper.writeValueAsString(e);
+        final String json = mapper.writeValueAsString(e);
 
-        Class<?> claz = Class.forName(DefaultInvoiceCreationEvent.class.getName());
-        Object obj =  mapper.readValue(json, claz);
+        final Class<?> claz = Class.forName(DefaultInvoiceCreationEvent.class.getName());
+        final Object obj = mapper.readValue(json, claz);
         Assert.assertTrue(obj.equals(e));
     }
 
-    @Test(groups= {"fast"})
+    @Test(groups = {"fast"})
     public void testEmptyInvoiceEvent() throws Exception {
 
-        EmptyInvoiceEvent e = new DefaultEmptyInvoiceEvent(UUID.randomUUID(), new DateTime(), UUID.randomUUID());
+        final EmptyInvoiceEvent e = new DefaultEmptyInvoiceEvent(UUID.randomUUID(), new DateTime(), UUID.randomUUID());
 
-        String json = mapper.writeValueAsString(e);
+        final String json = mapper.writeValueAsString(e);
 
-        Class<?> claz = Class.forName(DefaultEmptyInvoiceEvent.class.getName());
-        Object obj =  mapper.readValue(json, claz);
+        final Class<?> claz = Class.forName(DefaultEmptyInvoiceEvent.class.getName());
+        final Object obj = mapper.readValue(json, claz);
         Assert.assertTrue(obj.equals(e));
     }
 }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTestBase.java b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTestBase.java
index 70ca921..b0718db 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTestBase.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTestBase.java
@@ -16,21 +16,8 @@
 
 package com.ning.billing.invoice.dao;
 
-import static org.testng.Assert.assertTrue;
-
 import java.io.IOException;
 
-import com.ning.billing.dbi.MysqlTestingHelper;
-import com.ning.billing.invoice.notification.MockNextBillingDatePoster;
-import com.ning.billing.invoice.notification.NextBillingDatePoster;
-import com.ning.billing.util.api.TagUserApi;
-import com.ning.billing.util.callcontext.TestCallContext;
-import com.ning.billing.util.clock.ClockMock;
-import com.ning.billing.util.tag.api.DefaultTagUserApi;
-import com.ning.billing.util.tag.dao.AuditedTagDao;
-import com.ning.billing.util.tag.dao.MockTagDao;
-import com.ning.billing.util.tag.dao.MockTagDefinitionDao;
-import com.ning.billing.util.tag.dao.TagDao;
 import org.apache.commons.io.IOUtils;
 import org.skife.jdbi.v2.Handle;
 import org.skife.jdbi.v2.IDBI;
@@ -41,14 +28,31 @@ import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
 
 import com.ning.billing.config.InvoiceConfig;
+import com.ning.billing.dbi.MysqlTestingHelper;
 import com.ning.billing.invoice.model.DefaultInvoiceGenerator;
 import com.ning.billing.invoice.model.InvoiceGenerator;
+import com.ning.billing.invoice.notification.MockNextBillingDatePoster;
+import com.ning.billing.invoice.notification.NextBillingDatePoster;
 import com.ning.billing.invoice.tests.InvoicingTestBase;
+import com.ning.billing.util.api.TagUserApi;
+import com.ning.billing.util.bus.Bus;
+import com.ning.billing.util.bus.InMemoryBus;
 import com.ning.billing.util.callcontext.CallContext;
+import com.ning.billing.util.callcontext.TestCallContext;
 import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.clock.ClockMock;
+import com.ning.billing.util.tag.api.DefaultTagUserApi;
+import com.ning.billing.util.tag.api.user.TagEventBuilder;
+import com.ning.billing.util.tag.dao.AuditedTagDao;
+import com.ning.billing.util.tag.dao.MockTagDefinitionDao;
+import com.ning.billing.util.tag.dao.TagDao;
 import com.ning.billing.util.tag.dao.TagDefinitionDao;
 
+import static org.testng.Assert.assertTrue;
+
 public abstract class InvoiceDaoTestBase extends InvoicingTestBase {
+    protected final TagEventBuilder tagEventBuilder = new TagEventBuilder();
+
     protected IDBI dbi;
     private MysqlTestingHelper mysqlTestingHelper;
     protected InvoiceDao invoiceDao;
@@ -59,14 +63,23 @@ public abstract class InvoiceDaoTestBase extends InvoicingTestBase {
     protected Clock clock;
     protected CallContext context;
     protected InvoiceGenerator generator;
+    protected Bus bus;
 
     private final InvoiceConfig invoiceConfig = new InvoiceConfig() {
         @Override
-        public long getSleepTimeMs() {throw new UnsupportedOperationException();}
+        public long getSleepTimeMs() {
+            throw new UnsupportedOperationException();
+        }
+
         @Override
-        public boolean isNotificationProcessingOff() {throw new UnsupportedOperationException();}
+        public boolean isNotificationProcessingOff() {
+            throw new UnsupportedOperationException();
+        }
+
         @Override
-        public int getNumberOfMonthsInFuture() {return 36;}
+        public int getNumberOfMonthsInFuture() {
+            return 36;
+        }
     };
 
     @BeforeClass(alwaysRun = true)
@@ -81,9 +94,9 @@ public abstract class InvoiceDaoTestBase extends InvoicingTestBase {
         mysqlTestingHelper.initDb(invoiceDdl);
         mysqlTestingHelper.initDb(utilDdl);
 
-        NextBillingDatePoster nextBillingDatePoster = new MockNextBillingDatePoster();
+        final NextBillingDatePoster nextBillingDatePoster = new MockNextBillingDatePoster();
         final TagDefinitionDao tagDefinitionDao = new MockTagDefinitionDao();
-        final TagDao tagDao = new AuditedTagDao(dbi);
+        final TagDao tagDao = new AuditedTagDao(dbi, tagEventBuilder, bus);
         final TagUserApi tagUserApi = new DefaultTagUserApi(tagDefinitionDao, tagDao);
         invoiceDao = new DefaultInvoiceDao(dbi, nextBillingDatePoster, tagUserApi);
         invoiceDao.test();
@@ -96,6 +109,8 @@ public abstract class InvoiceDaoTestBase extends InvoicingTestBase {
         clock = new ClockMock();
         context = new TestCallContext("Invoice Dao Tests");
         generator = new DefaultInvoiceGenerator(clock, invoiceConfig);
+        bus = new InMemoryBus();
+        bus.start();
 
         assertTrue(true);
     }
@@ -104,7 +119,7 @@ public abstract class InvoiceDaoTestBase extends InvoicingTestBase {
     public void cleanupData() {
         dbi.inTransaction(new TransactionCallback<Void>() {
             @Override
-            public Void inTransaction(Handle h, TransactionStatus status)
+            public Void inTransaction(final Handle h, final TransactionStatus status)
                     throws Exception {
                 h.execute("truncate table invoices");
                 h.execute("truncate table fixed_invoice_items");
@@ -119,6 +134,7 @@ public abstract class InvoiceDaoTestBase extends InvoicingTestBase {
 
     @AfterClass(alwaysRun = true)
     protected void tearDown() {
+        bus.stop();
         mysqlTestingHelper.stopMysql();
         assertTrue(true);
     }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java
index 97d7532..8911661 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java
@@ -16,11 +16,6 @@
 
 package com.ning.billing.invoice.dao;
 
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertNull;
-import static org.testng.Assert.assertTrue;
-
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -52,30 +47,37 @@ import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.api.InvoicePayment;
 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.junction.api.BillingEventSet;
 import com.ning.billing.mock.BrainDeadProxyFactory;
 import com.ning.billing.mock.BrainDeadProxyFactory.ZombieControl;
+import com.ning.billing.util.api.TagApiException;
 import com.ning.billing.util.dao.ObjectType;
 import com.ning.billing.util.tag.ControlTagType;
 import com.ning.billing.util.tag.Tag;
 import com.ning.billing.util.tag.dao.AuditedTagDao;
 import com.ning.billing.util.tag.dao.TagDao;
 
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
 @Test(groups = {"slow", "invoicing", "invoicing-invoiceDao"})
 public class InvoiceDaoTests extends InvoiceDaoTestBase {
     @Test
     public void testCreationAndRetrievalByAccount() {
-        UUID accountId = UUID.randomUUID();
-        Invoice invoice = new DefaultInvoice(accountId, clock.getUTCNow(), clock.getUTCNow(), Currency.USD);
-        DateTime invoiceDate = invoice.getInvoiceDate();
+        final UUID accountId = UUID.randomUUID();
+        final Invoice invoice = new DefaultInvoice(accountId, clock.getUTCNow(), clock.getUTCNow(), Currency.USD);
+        final DateTime invoiceDate = invoice.getInvoiceDate();
 
         invoiceDao.create(invoice, context);
 
-        List<Invoice> invoices = invoiceDao.getInvoicesByAccount(accountId);
+        final List<Invoice> invoices = invoiceDao.getInvoicesByAccount(accountId);
         assertNotNull(invoices);
         assertEquals(invoices.size(), 1);
-        Invoice thisInvoice = invoices.get(0);
+        final Invoice thisInvoice = invoices.get(0);
         assertEquals(invoice.getAccountId(), accountId);
         assertTrue(thisInvoice.getInvoiceDate().compareTo(invoiceDate) == 0);
         assertEquals(thisInvoice.getCurrency(), Currency.USD);
@@ -85,32 +87,32 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
 
     @Test
     public void testInvoicePayment() {
-        UUID accountId = UUID.randomUUID();
-        Invoice invoice = new DefaultInvoice(accountId, clock.getUTCNow(), clock.getUTCNow(), Currency.USD);
-        UUID invoiceId = invoice.getId();
-        UUID subscriptionId = UUID.randomUUID();
-        UUID bundleId = UUID.randomUUID();
-        DateTime startDate = new DateTime(2010, 1, 1, 0, 0, 0, 0);
-        DateTime endDate = new DateTime(2010, 4, 1, 0, 0, 0, 0);
-        InvoiceItem invoiceItem = new RecurringInvoiceItem(invoiceId, accountId, bundleId,subscriptionId, "test plan", "test phase", startDate, endDate,
-                new BigDecimal("21.00"), new BigDecimal("7.00"), Currency.USD);
+        final UUID accountId = UUID.randomUUID();
+        final Invoice invoice = new DefaultInvoice(accountId, clock.getUTCNow(), clock.getUTCNow(), Currency.USD);
+        final UUID invoiceId = invoice.getId();
+        final UUID subscriptionId = UUID.randomUUID();
+        final UUID bundleId = UUID.randomUUID();
+        final DateTime startDate = new DateTime(2010, 1, 1, 0, 0, 0, 0);
+        final DateTime endDate = new DateTime(2010, 4, 1, 0, 0, 0, 0);
+        final InvoiceItem invoiceItem = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, "test plan", "test phase", startDate, endDate,
+                                                                 new BigDecimal("21.00"), new BigDecimal("7.00"), Currency.USD);
 
         invoice.addInvoiceItem(invoiceItem);
         invoiceDao.create(invoice, context);
 
-        Invoice savedInvoice = invoiceDao.getById(invoiceId);
+        final Invoice savedInvoice = invoiceDao.getById(invoiceId);
         assertNotNull(savedInvoice);
         assertEquals(savedInvoice.getBalance().compareTo(new BigDecimal("21.00")), 0);
         assertEquals(savedInvoice.getBalance().compareTo(new BigDecimal("21.00")), 0);
         assertEquals(savedInvoice.getAmountPaid(), BigDecimal.ZERO);
         assertEquals(savedInvoice.getInvoiceItems().size(), 1);
 
-        BigDecimal paymentAmount = new BigDecimal("11.00");
-        UUID paymentAttemptId = UUID.randomUUID();
+        final BigDecimal paymentAmount = new BigDecimal("11.00");
+        final UUID paymentAttemptId = UUID.randomUUID();
 
         invoiceDao.notifyOfPaymentAttempt(new DefaultInvoicePayment(paymentAttemptId, invoiceId, clock.getUTCNow().plusDays(12), paymentAmount, Currency.USD), context);
 
-        Invoice retrievedInvoice = invoiceDao.getById(invoiceId);
+        final Invoice retrievedInvoice = invoiceDao.getById(invoiceId);
         assertNotNull(retrievedInvoice);
         assertEquals(retrievedInvoice.getInvoiceItems().size(), 1);
         assertEquals(retrievedInvoice.getAmountCharged().compareTo(new BigDecimal("21.00")), 0);
@@ -120,19 +122,19 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
 
     @Test
     public void testRetrievalForNonExistentInvoiceId() {
-        Invoice invoice = invoiceDao.getById(UUID.randomUUID());
+        final Invoice invoice = invoiceDao.getById(UUID.randomUUID());
         assertNull(invoice);
     }
 
     @Test
     public void testAddPayment() {
-        UUID accountId = UUID.randomUUID();
-        DateTime targetDate = new DateTime(2011, 10, 6, 0, 0, 0, 0);
+        final UUID accountId = UUID.randomUUID();
+        final DateTime targetDate = new DateTime(2011, 10, 6, 0, 0, 0, 0);
         Invoice invoice = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
 
-        UUID paymentAttemptId = UUID.randomUUID();
-        DateTime paymentAttemptDate = new DateTime(2011, 6, 24, 12, 14, 36, 0);
-        BigDecimal paymentAmount = new BigDecimal("14.0");
+        final UUID paymentAttemptId = UUID.randomUUID();
+        final DateTime paymentAttemptDate = new DateTime(2011, 6, 24, 12, 14, 36, 0);
+        final BigDecimal paymentAmount = new BigDecimal("14.0");
 
         invoiceDao.create(invoice, context);
         invoiceDao.notifyOfPaymentAttempt(new DefaultInvoicePayment(paymentAttemptId, invoice.getId(), paymentAttemptDate, paymentAmount, Currency.USD), context);
@@ -145,11 +147,11 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
 
     @Test
     public void testAddPaymentAttempt() {
-        UUID accountId = UUID.randomUUID();
-        DateTime targetDate = new DateTime(2011, 10, 6, 0, 0, 0, 0);
+        final UUID accountId = UUID.randomUUID();
+        final DateTime targetDate = new DateTime(2011, 10, 6, 0, 0, 0, 0);
         Invoice invoice = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
 
-        DateTime paymentAttemptDate = new DateTime(2011, 6, 24, 12, 14, 36, 0);
+        final DateTime paymentAttemptDate = new DateTime(2011, 6, 24, 12, 14, 36, 0);
 
         invoiceDao.create(invoice, context);
         invoiceDao.notifyOfPaymentAttempt(new DefaultInvoicePayment(UUID.randomUUID(), invoice.getId(), paymentAttemptDate), context);
@@ -159,93 +161,269 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
     }
 
     @Test
-    public void testGetInvoicesBySubscription() {
-        UUID accountId = UUID.randomUUID();
-        UUID bundleId = UUID.randomUUID();
-
-        UUID subscriptionId1 = UUID.randomUUID();
-        BigDecimal rate1 = new BigDecimal("17.0");
-        UUID subscriptionId2 = UUID.randomUUID();
-        BigDecimal rate2 = new BigDecimal("42.0");
-        UUID subscriptionId3 = UUID.randomUUID();
-        BigDecimal rate3 = new BigDecimal("3.0");
-        UUID subscriptionId4 = UUID.randomUUID();
-        BigDecimal rate4 = new BigDecimal("12.0");
-
-        DateTime targetDate = new DateTime(2011, 5, 23, 0, 0, 0, 0);
-
-
-        // create invoice 1 (subscriptions 1-4)
-        Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
+    public void testGetInvoicesBySubscriptionForRecurringItems() {
+        final UUID accountId = UUID.randomUUID();
+        final UUID bundleId = UUID.randomUUID();
+
+        final UUID subscriptionId1 = UUID.randomUUID();
+        final BigDecimal rate1 = new BigDecimal("17.0");
+        final UUID subscriptionId2 = UUID.randomUUID();
+        final BigDecimal rate2 = new BigDecimal("42.0");
+        final UUID subscriptionId3 = UUID.randomUUID();
+        final BigDecimal rate3 = new BigDecimal("3.0");
+        final UUID subscriptionId4 = UUID.randomUUID();
+        final BigDecimal rate4 = new BigDecimal("12.0");
+
+        final DateTime targetDate = new DateTime(2011, 5, 23, 0, 0, 0, 0);
+
+        // Create invoice 1 (subscriptions 1-4)
+        final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
         invoiceDao.create(invoice1, context);
 
-        UUID invoiceId1 = invoice1.getId();
+        final UUID invoiceId1 = invoice1.getId();
 
         DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
         DateTime endDate = startDate.plusMonths(1);
 
-
-        RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId,subscriptionId1, "test plan", "test A", startDate, endDate,
-                rate1, rate1, Currency.USD);
+        final RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId1, "test plan", "test A", startDate, endDate,
+                                                                    rate1, rate1, Currency.USD);
         recurringInvoiceItemDao.create(item1, context);
 
-        RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId,subscriptionId2, "test plan", "test B", startDate, endDate,
-                rate2, rate2, Currency.USD);
+        final RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId2, "test plan", "test B", startDate, endDate,
+                                                                    rate2, rate2, Currency.USD);
         recurringInvoiceItemDao.create(item2, context);
 
-        RecurringInvoiceItem item3 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId,subscriptionId3, "test plan", "test C", startDate, endDate,
-                rate3, rate3, Currency.USD);
+        final RecurringInvoiceItem item3 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId3, "test plan", "test C", startDate, endDate,
+                                                                    rate3, rate3, Currency.USD);
         recurringInvoiceItemDao.create(item3, context);
 
-        RecurringInvoiceItem item4 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId,subscriptionId4, "test plan", "test D", startDate, endDate,
-                rate4, rate4, Currency.USD);
+        final RecurringInvoiceItem item4 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId4, "test plan", "test D", startDate, endDate,
+                                                                    rate4, rate4, Currency.USD);
         recurringInvoiceItemDao.create(item4, context);
 
-        // create invoice 2 (subscriptions 1-3)
-        DefaultInvoice invoice2 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
+        // Create invoice 2 (subscriptions 1-3)
+        final DefaultInvoice invoice2 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
         invoiceDao.create(invoice2, context);
 
-        UUID invoiceId2 = invoice2.getId();
+        final UUID invoiceId2 = invoice2.getId();
 
         startDate = endDate;
         endDate = startDate.plusMonths(1);
 
-
-        RecurringInvoiceItem item5 = new RecurringInvoiceItem(invoiceId2, accountId, bundleId,subscriptionId1, "test plan", "test phase A", startDate, endDate,
-                rate1, rate1, Currency.USD);
+        final RecurringInvoiceItem item5 = new RecurringInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId1, "test plan", "test phase A", startDate, endDate,
+                                                                    rate1, rate1, Currency.USD);
         recurringInvoiceItemDao.create(item5, context);
 
-        RecurringInvoiceItem item6 = new RecurringInvoiceItem(invoiceId2, accountId, bundleId,subscriptionId2, "test plan", "test phase B", startDate, endDate,
-                rate2, rate2, Currency.USD);
+        final RecurringInvoiceItem item6 = new RecurringInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId2, "test plan", "test phase B", startDate, endDate,
+                                                                    rate2, rate2, Currency.USD);
         recurringInvoiceItemDao.create(item6, context);
 
-        RecurringInvoiceItem item7 = new RecurringInvoiceItem(invoiceId2, accountId, bundleId,subscriptionId3, "test plan", "test phase C", startDate, endDate,
-                rate3, rate3, Currency.USD);
+        final RecurringInvoiceItem item7 = new RecurringInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId3, "test plan", "test phase C", startDate, endDate,
+                                                                    rate3, rate3, Currency.USD);
         recurringInvoiceItemDao.create(item7, context);
 
+        // Check that each subscription returns the correct number of invoices
+        final List<Invoice> items1 = invoiceDao.getInvoicesBySubscription(subscriptionId1);
+        assertEquals(items1.size(), 2);
+
+        final List<Invoice> items2 = invoiceDao.getInvoicesBySubscription(subscriptionId2);
+        assertEquals(items2.size(), 2);
+
+        final List<Invoice> items3 = invoiceDao.getInvoicesBySubscription(subscriptionId3);
+        assertEquals(items3.size(), 2);
+
+        final List<Invoice> items4 = invoiceDao.getInvoicesBySubscription(subscriptionId4);
+        assertEquals(items4.size(), 1);
+    }
+
+    @Test
+    public void testGetInvoicesBySubscriptionForFixedItems() {
+        final UUID accountId = UUID.randomUUID();
+        final UUID bundleId = UUID.randomUUID();
+
+        final UUID subscriptionId1 = UUID.randomUUID();
+        final BigDecimal rate1 = new BigDecimal("17.0");
+        final UUID subscriptionId2 = UUID.randomUUID();
+        final BigDecimal rate2 = new BigDecimal("42.0");
+        final UUID subscriptionId3 = UUID.randomUUID();
+        final BigDecimal rate3 = new BigDecimal("3.0");
+        final UUID subscriptionId4 = UUID.randomUUID();
+        final BigDecimal rate4 = new BigDecimal("12.0");
+
+        final DateTime targetDate = new DateTime(2011, 5, 23, 0, 0, 0, 0);
+
+        // Create invoice 1 (subscriptions 1-4)
+        final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
+        invoiceDao.create(invoice1, context);
+
+        final UUID invoiceId1 = invoice1.getId();
+
+        DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
+        DateTime endDate = startDate.plusMonths(1);
+
+        final FixedPriceInvoiceItem item1 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId1, "test plan", "test A", startDate, endDate,
+                                                                      rate1, Currency.USD);
+        fixedPriceInvoiceItemSqlDao.create(item1, context);
+
+        final FixedPriceInvoiceItem item2 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId2, "test plan", "test B", startDate, endDate,
+                                                                      rate2, Currency.USD);
+        fixedPriceInvoiceItemSqlDao.create(item2, context);
+
+        final FixedPriceInvoiceItem item3 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId3, "test plan", "test C", startDate, endDate,
+                                                                      rate3, Currency.USD);
+        fixedPriceInvoiceItemSqlDao.create(item3, context);
+
+        final FixedPriceInvoiceItem item4 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId4, "test plan", "test D", startDate, endDate,
+                                                                      rate4, Currency.USD);
+        fixedPriceInvoiceItemSqlDao.create(item4, context);
+
+        // create invoice 2 (subscriptions 1-3)
+        final DefaultInvoice invoice2 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
+        invoiceDao.create(invoice2, context);
+
+        final UUID invoiceId2 = invoice2.getId();
+
+        startDate = endDate;
+        endDate = startDate.plusMonths(1);
+
+        final FixedPriceInvoiceItem item5 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId1, "test plan", "test phase A", startDate, endDate,
+                                                                      rate1, Currency.USD);
+        fixedPriceInvoiceItemSqlDao.create(item5, context);
+
+        final FixedPriceInvoiceItem item6 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId2, "test plan", "test phase B", startDate, endDate,
+                                                                      rate2, Currency.USD);
+        fixedPriceInvoiceItemSqlDao.create(item6, context);
+
+        final FixedPriceInvoiceItem item7 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId3, "test plan", "test phase C", startDate, endDate,
+                                                                      rate3, Currency.USD);
+        fixedPriceInvoiceItemSqlDao.create(item7, context);
+
         // check that each subscription returns the correct number of invoices
-        List<Invoice> items1 = invoiceDao.getInvoicesBySubscription(subscriptionId1);
+        final List<Invoice> items1 = invoiceDao.getInvoicesBySubscription(subscriptionId1);
         assertEquals(items1.size(), 2);
 
-        List<Invoice> items2 = invoiceDao.getInvoicesBySubscription(subscriptionId2);
+        final List<Invoice> items2 = invoiceDao.getInvoicesBySubscription(subscriptionId2);
         assertEquals(items2.size(), 2);
 
-        List<Invoice> items3 = invoiceDao.getInvoicesBySubscription(subscriptionId3);
+        final List<Invoice> items3 = invoiceDao.getInvoicesBySubscription(subscriptionId3);
         assertEquals(items3.size(), 2);
 
-        List<Invoice> items4 = invoiceDao.getInvoicesBySubscription(subscriptionId4);
+        final List<Invoice> items4 = invoiceDao.getInvoicesBySubscription(subscriptionId4);
         assertEquals(items4.size(), 1);
     }
 
     @Test
+    public void testGetInvoicesBySubscriptionForRecurringAndFixedItems() {
+        final UUID accountId = UUID.randomUUID();
+        final UUID bundleId = UUID.randomUUID();
+
+        final UUID subscriptionId1 = UUID.randomUUID();
+        final BigDecimal rate1 = new BigDecimal("17.0");
+        final UUID subscriptionId2 = UUID.randomUUID();
+        final BigDecimal rate2 = new BigDecimal("42.0");
+        final UUID subscriptionId3 = UUID.randomUUID();
+        final BigDecimal rate3 = new BigDecimal("3.0");
+        final UUID subscriptionId4 = UUID.randomUUID();
+        final BigDecimal rate4 = new BigDecimal("12.0");
+
+        final DateTime targetDate = new DateTime(2011, 5, 23, 0, 0, 0, 0);
+
+        // Create invoice 1 (subscriptions 1-4)
+        final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
+        invoiceDao.create(invoice1, context);
+
+        final UUID invoiceId1 = invoice1.getId();
+
+        DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
+        DateTime endDate = startDate.plusMonths(1);
+
+        final RecurringInvoiceItem recurringItem1 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId1, "test plan", "test A", startDate, endDate,
+                                                                             rate1, rate1, Currency.USD);
+        recurringInvoiceItemDao.create(recurringItem1, context);
+
+        final RecurringInvoiceItem recurringItem2 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId2, "test plan", "test B", startDate, endDate,
+                                                                             rate2, rate2, Currency.USD);
+        recurringInvoiceItemDao.create(recurringItem2, context);
+
+        final RecurringInvoiceItem recurringItem3 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId3, "test plan", "test C", startDate, endDate,
+                                                                             rate3, rate3, Currency.USD);
+        recurringInvoiceItemDao.create(recurringItem3, context);
+
+        final RecurringInvoiceItem recurringItem4 = new RecurringInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId4, "test plan", "test D", startDate, endDate,
+                                                                             rate4, rate4, Currency.USD);
+        recurringInvoiceItemDao.create(recurringItem4, context);
+
+        final FixedPriceInvoiceItem fixedItem1 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId1, "test plan", "test A", startDate, endDate,
+                                                                           rate1, Currency.USD);
+        fixedPriceInvoiceItemSqlDao.create(fixedItem1, context);
+
+        final FixedPriceInvoiceItem fixedItem2 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId2, "test plan", "test B", startDate, endDate,
+                                                                           rate2, Currency.USD);
+        fixedPriceInvoiceItemSqlDao.create(fixedItem2, context);
+
+        final FixedPriceInvoiceItem fixedItem3 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId3, "test plan", "test C", startDate, endDate,
+                                                                           rate3, Currency.USD);
+        fixedPriceInvoiceItemSqlDao.create(fixedItem3, context);
+
+        final FixedPriceInvoiceItem fixedItem4 = new FixedPriceInvoiceItem(invoiceId1, accountId, bundleId, subscriptionId4, "test plan", "test D", startDate, endDate,
+                                                                           rate4, Currency.USD);
+        fixedPriceInvoiceItemSqlDao.create(fixedItem4, context);
+
+        // create invoice 2 (subscriptions 1-3)
+        final DefaultInvoice invoice2 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
+        invoiceDao.create(invoice2, context);
+
+        final UUID invoiceId2 = invoice2.getId();
+
+        startDate = endDate;
+        endDate = startDate.plusMonths(1);
+
+        final RecurringInvoiceItem recurringItem5 = new RecurringInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId1, "test plan", "test phase A", startDate, endDate,
+                                                                             rate1, rate1, Currency.USD);
+        recurringInvoiceItemDao.create(recurringItem5, context);
+
+        final RecurringInvoiceItem recurringItem6 = new RecurringInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId2, "test plan", "test phase B", startDate, endDate,
+                                                                             rate2, rate2, Currency.USD);
+        recurringInvoiceItemDao.create(recurringItem6, context);
+
+        final RecurringInvoiceItem recurringItem7 = new RecurringInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId3, "test plan", "test phase C", startDate, endDate,
+                                                                             rate3, rate3, Currency.USD);
+        recurringInvoiceItemDao.create(recurringItem7, context);
+        final FixedPriceInvoiceItem fixedItem5 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId1, "test plan", "test phase A", startDate, endDate,
+                                                                           rate1, Currency.USD);
+        fixedPriceInvoiceItemSqlDao.create(fixedItem5, context);
+
+        final FixedPriceInvoiceItem fixedItem6 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId2, "test plan", "test phase B", startDate, endDate,
+                                                                           rate2, Currency.USD);
+        fixedPriceInvoiceItemSqlDao.create(fixedItem6, context);
+
+        final FixedPriceInvoiceItem fixedItem7 = new FixedPriceInvoiceItem(invoiceId2, accountId, bundleId, subscriptionId3, "test plan", "test phase C", startDate, endDate,
+                                                                           rate3, Currency.USD);
+        fixedPriceInvoiceItemSqlDao.create(fixedItem7, context);
+
+        // check that each subscription returns the correct number of invoices
+        final List<Invoice> items1 = invoiceDao.getInvoicesBySubscription(subscriptionId1);
+        assertEquals(items1.size(), 4);
+
+        final List<Invoice> items2 = invoiceDao.getInvoicesBySubscription(subscriptionId2);
+        assertEquals(items2.size(), 4);
+
+        final List<Invoice> items3 = invoiceDao.getInvoicesBySubscription(subscriptionId3);
+        assertEquals(items3.size(), 4);
+
+        final List<Invoice> items4 = invoiceDao.getInvoicesBySubscription(subscriptionId4);
+        assertEquals(items4.size(), 2);
+    }
+
+    @Test
     public void testGetInvoicesForAccountAfterDate() {
-        UUID accountId = UUID.randomUUID();
-        DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
-        Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1, Currency.USD);
+        final UUID accountId = UUID.randomUUID();
+        final DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
+        final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1, Currency.USD);
         invoiceDao.create(invoice1, context);
 
-        DateTime targetDate2 = new DateTime(2011, 12, 6, 0, 0, 0, 0);
-        Invoice invoice2 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate2, Currency.USD);
+        final DateTime targetDate2 = new DateTime(2011, 12, 6, 0, 0, 0, 0);
+        final Invoice invoice2 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate2, Currency.USD);
         invoiceDao.create(invoice2, context);
 
 
@@ -268,96 +446,96 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
 
     @Test
     public void testAccountBalance() {
-        UUID accountId = UUID.randomUUID();
-        UUID bundleId = UUID.randomUUID();
-        DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
-        Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1, Currency.USD);
+        final UUID accountId = UUID.randomUUID();
+        final UUID bundleId = UUID.randomUUID();
+        final DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
+        final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1, Currency.USD);
         invoiceDao.create(invoice1, context);
 
-        DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
-        DateTime endDate = startDate.plusMonths(1);
+        final DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
+        final DateTime endDate = startDate.plusMonths(1);
 
-        BigDecimal rate1 = new BigDecimal("17.0");
-        BigDecimal rate2 = new BigDecimal("42.0");
+        final BigDecimal rate1 = new BigDecimal("17.0");
+        final BigDecimal rate2 = new BigDecimal("42.0");
 
-        RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId,UUID.randomUUID(), "test plan", "test phase A", startDate,
-                endDate, rate1, rate1, Currency.USD);
+        final RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase A", startDate,
+                                                                    endDate, rate1, rate1, Currency.USD);
         recurringInvoiceItemDao.create(item1, context);
 
-        RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId,UUID.randomUUID(), "test plan", "test phase B", startDate,
-                endDate, rate2, rate2, Currency.USD);
+        final RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase B", startDate,
+                                                                    endDate, rate2, rate2, Currency.USD);
         recurringInvoiceItemDao.create(item2, context);
 
-        BigDecimal payment1 = new BigDecimal("48.0");
-        InvoicePayment payment = new DefaultInvoicePayment(UUID.randomUUID(), invoice1.getId(), new DateTime(), payment1, Currency.USD);
+        final BigDecimal payment1 = new BigDecimal("48.0");
+        final InvoicePayment payment = new DefaultInvoicePayment(UUID.randomUUID(), invoice1.getId(), new DateTime(), payment1, Currency.USD);
         invoicePaymentDao.create(payment, context);
 
-        BigDecimal balance = invoiceDao.getAccountBalance(accountId);
+        final BigDecimal balance = invoiceDao.getAccountBalance(accountId);
         assertEquals(balance.compareTo(rate1.add(rate2).subtract(payment1)), 0);
     }
 
     @Test
     public void testAccountBalanceWithNoPayments() {
-        UUID accountId = UUID.randomUUID();
-        UUID bundleId = UUID.randomUUID();
-        DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
-        Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1, Currency.USD);
+        final UUID accountId = UUID.randomUUID();
+        final UUID bundleId = UUID.randomUUID();
+        final DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
+        final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1, Currency.USD);
         invoiceDao.create(invoice1, context);
 
-        DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
-        DateTime endDate = startDate.plusMonths(1);
+        final DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
+        final DateTime endDate = startDate.plusMonths(1);
 
-        BigDecimal rate1 = new BigDecimal("17.0");
-        BigDecimal rate2 = new BigDecimal("42.0");
+        final BigDecimal rate1 = new BigDecimal("17.0");
+        final BigDecimal rate2 = new BigDecimal("42.0");
 
-        RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase A", startDate, endDate,
-                rate1, rate1, Currency.USD);
+        final RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase A", startDate, endDate,
+                                                                    rate1, rate1, Currency.USD);
         recurringInvoiceItemDao.create(item1, context);
 
-        RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase B", startDate, endDate,
-                rate2, rate2, Currency.USD);
+        final RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase B", startDate, endDate,
+                                                                    rate2, rate2, Currency.USD);
         recurringInvoiceItemDao.create(item2, context);
 
-        BigDecimal balance = invoiceDao.getAccountBalance(accountId);
+        final BigDecimal balance = invoiceDao.getAccountBalance(accountId);
         assertEquals(balance.compareTo(rate1.add(rate2)), 0);
     }
 
     @Test
     public void testAccountBalanceWithNoInvoiceItems() {
-        UUID accountId = UUID.randomUUID();
-        DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
-        Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1, Currency.USD);
+        final UUID accountId = UUID.randomUUID();
+        final DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
+        final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1, Currency.USD);
         invoiceDao.create(invoice1, context);
 
-        BigDecimal payment1 = new BigDecimal("48.0");
-        InvoicePayment payment = new DefaultInvoicePayment(UUID.randomUUID(), invoice1.getId(), new DateTime(), payment1, Currency.USD);
+        final BigDecimal payment1 = new BigDecimal("48.0");
+        final InvoicePayment payment = new DefaultInvoicePayment(UUID.randomUUID(), invoice1.getId(), new DateTime(), payment1, Currency.USD);
         invoicePaymentDao.create(payment, context);
 
-        BigDecimal balance = invoiceDao.getAccountBalance(accountId);
+        final BigDecimal balance = invoiceDao.getAccountBalance(accountId);
         assertEquals(balance.compareTo(BigDecimal.ZERO.subtract(payment1)), 0);
     }
 
     @Test
     public void testGetUnpaidInvoicesByAccountId() {
-        UUID accountId = UUID.randomUUID();
-        UUID bundleId = UUID.randomUUID();
-        DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
-        Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1, Currency.USD);
+        final UUID accountId = UUID.randomUUID();
+        final UUID bundleId = UUID.randomUUID();
+        final DateTime targetDate1 = new DateTime(2011, 10, 6, 0, 0, 0, 0);
+        final Invoice invoice1 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate1, Currency.USD);
         invoiceDao.create(invoice1, context);
 
-        DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
-        DateTime endDate = startDate.plusMonths(1);
+        final DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
+        final DateTime endDate = startDate.plusMonths(1);
 
-        BigDecimal rate1 = new BigDecimal("17.0");
-        BigDecimal rate2 = new BigDecimal("42.0");
+        final BigDecimal rate1 = new BigDecimal("17.0");
+        final BigDecimal rate2 = new BigDecimal("42.0");
 
 
-        RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase A", startDate, endDate,
-                rate1, rate1, Currency.USD);
+        final RecurringInvoiceItem item1 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase A", startDate, endDate,
+                                                                    rate1, rate1, Currency.USD);
         recurringInvoiceItemDao.create(item1, context);
 
-        RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase B", startDate, endDate,
-                rate2, rate2, Currency.USD);
+        final RecurringInvoiceItem item2 = new RecurringInvoiceItem(invoice1.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase B", startDate, endDate,
+                                                                    rate2, rate2, Currency.USD);
         recurringInvoiceItemDao.create(item2, context);
 
         DateTime upToDate;
@@ -371,17 +549,17 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
         invoices = invoiceDao.getUnpaidInvoicesByAccountId(accountId, upToDate);
         assertEquals(invoices.size(), 1);
 
-        DateTime targetDate2 = new DateTime(2011, 7, 1, 0, 0, 0, 0);
-        Invoice invoice2 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate2, Currency.USD);
+        final DateTime targetDate2 = new DateTime(2011, 7, 1, 0, 0, 0, 0);
+        final Invoice invoice2 = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate2, Currency.USD);
         invoiceDao.create(invoice2, context);
 
-        DateTime startDate2 = new DateTime(2011, 6, 1, 0, 0, 0, 0);
-        DateTime endDate2 = startDate2.plusMonths(3);
+        final DateTime startDate2 = new DateTime(2011, 6, 1, 0, 0, 0, 0);
+        final DateTime endDate2 = startDate2.plusMonths(3);
 
-        BigDecimal rate3 = new BigDecimal("21.0");
+        final BigDecimal rate3 = new BigDecimal("21.0");
 
-        RecurringInvoiceItem item3 = new RecurringInvoiceItem(invoice2.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase C", startDate2, endDate2,
-                rate3, rate3, Currency.USD);
+        final RecurringInvoiceItem item3 = new RecurringInvoiceItem(invoice2.getId(), accountId, bundleId, UUID.randomUUID(), "test plan", "test phase C", startDate2, endDate2,
+                                                                    rate3, rate3, Currency.USD);
         recurringInvoiceItemDao.create(item3, context);
 
         upToDate = new DateTime(2011, 1, 1, 0, 0, 0, 0);
@@ -400,78 +578,78 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
      */
     @Test
     public void testInvoiceGenerationForImmediateChanges() throws InvoiceApiException, CatalogApiException {
-        UUID accountId = UUID.randomUUID();
-        List<Invoice> invoiceList = new ArrayList<Invoice>();
-        DateTime targetDate = new DateTime(2011, 2, 16, 0, 0, 0, 0);
-        Currency currency = Currency.USD;
+        final UUID accountId = UUID.randomUUID();
+        final List<Invoice> invoiceList = new ArrayList<Invoice>();
+        final DateTime targetDate = new DateTime(2011, 2, 16, 0, 0, 0, 0);
+        final Currency currency = Currency.USD;
 
         // generate first invoice
-        DefaultPrice price1 = new DefaultPrice(TEN, Currency.USD);
-        MockInternationalPrice recurringPrice = new MockInternationalPrice(price1);
-        MockPlanPhase phase1 = new MockPlanPhase(recurringPrice, null, BillingPeriod.MONTHLY, PhaseType.TRIAL);
-        MockPlan plan1 = new MockPlan(phase1);
+        final DefaultPrice price1 = new DefaultPrice(TEN, Currency.USD);
+        final MockInternationalPrice recurringPrice = new MockInternationalPrice(price1);
+        final MockPlanPhase phase1 = new MockPlanPhase(recurringPrice, null, BillingPeriod.MONTHLY, PhaseType.TRIAL);
+        final MockPlan plan1 = new MockPlan(phase1);
 
-        Subscription subscription = getZombieSubscription();
+        final Subscription subscription = getZombieSubscription();
 
-        DateTime effectiveDate1 = new DateTime(2011, 2, 1, 0, 0, 0, 0);
-        BillingEvent event1 = createMockBillingEvent(null, subscription, effectiveDate1, plan1, phase1, null,
-                recurringPrice.getPrice(currency), currency, BillingPeriod.MONTHLY, 1, BillingModeType.IN_ADVANCE,
-                "testEvent1", 1L, SubscriptionTransitionType.CREATE);
+        final DateTime effectiveDate1 = new DateTime(2011, 2, 1, 0, 0, 0, 0);
+        final BillingEvent event1 = createMockBillingEvent(null, subscription, effectiveDate1, plan1, phase1, null,
+                                                           recurringPrice.getPrice(currency), currency, BillingPeriod.MONTHLY, 1, BillingModeType.IN_ADVANCE,
+                                                           "testEvent1", 1L, SubscriptionTransitionType.CREATE);
 
-        BillingEventSet events = new MockBillingEventSet();
+        final BillingEventSet events = new MockBillingEventSet();
         events.add(event1);
 
-        Invoice invoice1 = generator.generateInvoice(accountId, events, invoiceList, targetDate, Currency.USD);
+        final Invoice invoice1 = generator.generateInvoice(accountId, events, invoiceList, targetDate, Currency.USD);
         assertEquals(invoice1.getBalance(), TEN);
         invoiceList.add(invoice1);
 
         // generate second invoice
-        DefaultPrice price2 = new DefaultPrice(TWENTY, Currency.USD);
-        MockInternationalPrice recurringPrice2 = new MockInternationalPrice(price2);
-        MockPlanPhase phase2 = new MockPlanPhase(recurringPrice, null, BillingPeriod.MONTHLY, PhaseType.TRIAL);
-        MockPlan plan2 = new MockPlan(phase2);
-
-        DateTime effectiveDate2 = new DateTime(2011, 2, 15, 0, 0, 0, 0);
-        BillingEvent event2 = createMockBillingEvent(null, subscription, effectiveDate2, plan2, phase2, null,
-                recurringPrice2.getPrice(currency), currency, BillingPeriod.MONTHLY, 1, BillingModeType.IN_ADVANCE,
-                "testEvent2", 2L, SubscriptionTransitionType.CREATE);
+        final DefaultPrice price2 = new DefaultPrice(TWENTY, Currency.USD);
+        final MockInternationalPrice recurringPrice2 = new MockInternationalPrice(price2);
+        final MockPlanPhase phase2 = new MockPlanPhase(recurringPrice, null, BillingPeriod.MONTHLY, PhaseType.TRIAL);
+        final MockPlan plan2 = new MockPlan(phase2);
+
+        final DateTime effectiveDate2 = new DateTime(2011, 2, 15, 0, 0, 0, 0);
+        final BillingEvent event2 = createMockBillingEvent(null, subscription, effectiveDate2, plan2, phase2, null,
+                                                           recurringPrice2.getPrice(currency), currency, BillingPeriod.MONTHLY, 1, BillingModeType.IN_ADVANCE,
+                                                           "testEvent2", 2L, SubscriptionTransitionType.CREATE);
         events.add(event2);
 
         // second invoice should be for one half (14/28 days) the difference between the rate plans
         // this is a temporary state, since it actually contains an adjusting item that properly belong to invoice 1
-        Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, targetDate, Currency.USD);
+        final Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, targetDate, Currency.USD);
         assertEquals(invoice2.getBalance(), FIVE);
         invoiceList.add(invoice2);
 
         invoiceDao.create(invoice1, context);
         invoiceDao.create(invoice2, context);
 
-        Invoice savedInvoice1 = invoiceDao.getById(invoice1.getId());
+        final Invoice savedInvoice1 = invoiceDao.getById(invoice1.getId());
         assertEquals(savedInvoice1.getBalance(), ZERO);
 
-        Invoice savedInvoice2 = invoiceDao.getById(invoice2.getId());
+        final Invoice savedInvoice2 = invoiceDao.getById(invoice2.getId());
         assertEquals(savedInvoice2.getBalance(), FIFTEEN);
     }
 
     @Test
     public void testInvoiceForFreeTrial() throws InvoiceApiException, CatalogApiException {
-        Currency currency = Currency.USD;
-        DefaultPrice price = new DefaultPrice(BigDecimal.ZERO, Currency.USD);
-        MockInternationalPrice recurringPrice = new MockInternationalPrice(price);
-        MockPlanPhase phase = new MockPlanPhase(recurringPrice, null);
-        MockPlan plan = new MockPlan(phase);
-
-        Subscription subscription = getZombieSubscription();
-        DateTime effectiveDate = buildDateTime(2011, 1, 1);
-
-        BillingEvent event = createMockBillingEvent(null, subscription, effectiveDate, plan, phase, null,
-                recurringPrice.getPrice(currency), currency, BillingPeriod.MONTHLY, 15, BillingModeType.IN_ADVANCE,
-                "testEvent", 1L, SubscriptionTransitionType.CREATE);
-        BillingEventSet events = new MockBillingEventSet();
+        final Currency currency = Currency.USD;
+        final DefaultPrice price = new DefaultPrice(BigDecimal.ZERO, Currency.USD);
+        final MockInternationalPrice recurringPrice = new MockInternationalPrice(price);
+        final MockPlanPhase phase = new MockPlanPhase(recurringPrice, null);
+        final MockPlan plan = new MockPlan(phase);
+
+        final Subscription subscription = getZombieSubscription();
+        final DateTime effectiveDate = buildDateTime(2011, 1, 1);
+
+        final BillingEvent event = 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);
 
-        DateTime targetDate = buildDateTime(2011, 1, 15);
-        Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, targetDate, Currency.USD);
+        final DateTime targetDate = buildDateTime(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
         assertEquals(invoice.getNumberOfItems(), 2);
@@ -479,7 +657,7 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
     }
 
     private Subscription getZombieSubscription() {
-        Subscription subscription = BrainDeadProxyFactory.createBrainDeadProxyFor(Subscription.class);
+        final Subscription subscription = BrainDeadProxyFactory.createBrainDeadProxyFor(Subscription.class);
         ((ZombieControl) subscription).addResult("getId", UUID.randomUUID());
         ((ZombieControl) subscription).addResult("getBundleId", UUID.randomUUID());
         return subscription;
@@ -487,52 +665,52 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
 
     @Test
     public void testInvoiceForFreeTrialWithRecurringDiscount() throws InvoiceApiException, CatalogApiException {
-        Currency currency = Currency.USD;
+        final Currency currency = Currency.USD;
 
-        DefaultPrice zeroPrice = new DefaultPrice(BigDecimal.ZERO, Currency.USD);
-        MockInternationalPrice fixedPrice = new MockInternationalPrice(zeroPrice);
-        MockPlanPhase phase1 = new MockPlanPhase(null, fixedPrice);
+        final DefaultPrice zeroPrice = new DefaultPrice(BigDecimal.ZERO, Currency.USD);
+        final MockInternationalPrice fixedPrice = new MockInternationalPrice(zeroPrice);
+        final MockPlanPhase phase1 = new MockPlanPhase(null, fixedPrice);
 
-        BigDecimal cheapAmount = new BigDecimal("24.95");
-        DefaultPrice cheapPrice = new DefaultPrice(cheapAmount, Currency.USD);
-        MockInternationalPrice recurringPrice = new MockInternationalPrice(cheapPrice);
-        MockPlanPhase phase2 = new MockPlanPhase(recurringPrice, null);
+        final BigDecimal cheapAmount = new BigDecimal("24.95");
+        final DefaultPrice cheapPrice = new DefaultPrice(cheapAmount, Currency.USD);
+        final MockInternationalPrice recurringPrice = new MockInternationalPrice(cheapPrice);
+        final MockPlanPhase phase2 = new MockPlanPhase(recurringPrice, null);
 
-        MockPlan plan = new MockPlan();
+        final MockPlan plan = new MockPlan();
 
-        Subscription subscription = getZombieSubscription();
-        DateTime effectiveDate1 = buildDateTime(2011, 1, 1);
+        final Subscription subscription = getZombieSubscription();
+        final DateTime effectiveDate1 = buildDateTime(2011, 1, 1);
 
-        BillingEvent event1 = createMockBillingEvent(null, subscription, effectiveDate1, plan, phase1, fixedPrice.getPrice(currency),
-                null, currency, BillingPeriod.MONTHLY, 1, BillingModeType.IN_ADVANCE,
-                "testEvent1", 1L, SubscriptionTransitionType.CREATE);
-        BillingEventSet events = new MockBillingEventSet();
+        final BillingEvent event1 = 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();
         events.add(event1);
 
-        UUID accountId = UUID.randomUUID();
-        Invoice invoice1 = generator.generateInvoice(accountId, events, null, effectiveDate1, Currency.USD);
+        final UUID accountId = UUID.randomUUID();
+        final Invoice invoice1 = generator.generateInvoice(accountId, events, null, effectiveDate1, Currency.USD);
         assertNotNull(invoice1);
         assertEquals(invoice1.getNumberOfItems(), 1);
         assertEquals(invoice1.getBalance().compareTo(ZERO), 0);
 
-        List<Invoice> invoiceList = new ArrayList<Invoice>();
+        final List<Invoice> invoiceList = new ArrayList<Invoice>();
         invoiceList.add(invoice1);
 
-        DateTime effectiveDate2 = effectiveDate1.plusDays(30);
-        BillingEvent event2 = createMockBillingEvent(null, subscription, effectiveDate2, plan, phase2, null,
-                recurringPrice.getPrice(currency), currency, BillingPeriod.MONTHLY, 31, BillingModeType.IN_ADVANCE,
-                "testEvent2", 2L, SubscriptionTransitionType.CHANGE);
+        final DateTime effectiveDate2 = effectiveDate1.plusDays(30);
+        final BillingEvent event2 = createMockBillingEvent(null, subscription, effectiveDate2, plan, phase2, null,
+                                                           recurringPrice.getPrice(currency), currency, BillingPeriod.MONTHLY, 31, BillingModeType.IN_ADVANCE,
+                                                           "testEvent2", 2L, SubscriptionTransitionType.CHANGE);
         events.add(event2);
 
-        Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, effectiveDate2, Currency.USD);
+        final Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, effectiveDate2, Currency.USD);
         assertNotNull(invoice2);
         assertEquals(invoice2.getNumberOfItems(), 1);
         assertEquals(invoice2.getBalance().compareTo(cheapAmount), 0);
 
         invoiceList.add(invoice2);
 
-        DateTime effectiveDate3 = effectiveDate2.plusMonths(1);
-        Invoice invoice3 = generator.generateInvoice(accountId, events, invoiceList, effectiveDate3, Currency.USD);
+        final DateTime effectiveDate3 = effectiveDate2.plusMonths(1);
+        final Invoice invoice3 = generator.generateInvoice(accountId, events, invoiceList, effectiveDate3, Currency.USD);
         assertNotNull(invoice3);
         assertEquals(invoice3.getNumberOfItems(), 1);
         assertEquals(invoice3.getBalance().compareTo(cheapAmount), 0);
@@ -540,48 +718,48 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
 
     @Test
     public void testInvoiceForEmptyEventSet() throws InvoiceApiException {
-        BillingEventSet events = new MockBillingEventSet();
-        Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, new DateTime(), Currency.USD);
+        final BillingEventSet events = new MockBillingEventSet();
+        final Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, new DateTime(), Currency.USD);
         assertNull(invoice);
     }
 
     @Test
     public void testMixedModeInvoicePersistence() throws InvoiceApiException, CatalogApiException {
-        Currency currency = Currency.USD;
-        DefaultPrice zeroPrice = new DefaultPrice(BigDecimal.ZERO, Currency.USD);
-        MockInternationalPrice fixedPrice = new MockInternationalPrice(zeroPrice);
-        MockPlanPhase phase1 = new MockPlanPhase(null, fixedPrice);
-
-        BigDecimal cheapAmount = new BigDecimal("24.95");
-        DefaultPrice cheapPrice = new DefaultPrice(cheapAmount, Currency.USD);
-        MockInternationalPrice recurringPrice = new MockInternationalPrice(cheapPrice);
-        MockPlanPhase phase2 = new MockPlanPhase(recurringPrice, null);
-
-        MockPlan plan = new MockPlan();
-
-        Subscription subscription = getZombieSubscription();
-        DateTime effectiveDate1 = buildDateTime(2011, 1, 1);
-
-        BillingEvent event1 = createMockBillingEvent(null, subscription, effectiveDate1, plan, phase1,
-                fixedPrice.getPrice(currency), null, currency,
-                BillingPeriod.MONTHLY, 1, BillingModeType.IN_ADVANCE,
-                "testEvent1", 1L, SubscriptionTransitionType.CREATE);
-        BillingEventSet events = new MockBillingEventSet();
+        final Currency currency = Currency.USD;
+        final DefaultPrice zeroPrice = new DefaultPrice(BigDecimal.ZERO, Currency.USD);
+        final MockInternationalPrice fixedPrice = new MockInternationalPrice(zeroPrice);
+        final MockPlanPhase phase1 = new MockPlanPhase(null, fixedPrice);
+
+        final BigDecimal cheapAmount = new BigDecimal("24.95");
+        final DefaultPrice cheapPrice = new DefaultPrice(cheapAmount, Currency.USD);
+        final MockInternationalPrice recurringPrice = new MockInternationalPrice(cheapPrice);
+        final MockPlanPhase phase2 = new MockPlanPhase(recurringPrice, null);
+
+        final MockPlan plan = new MockPlan();
+
+        final Subscription subscription = getZombieSubscription();
+        final DateTime effectiveDate1 = buildDateTime(2011, 1, 1);
+
+        final BillingEvent event1 = 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();
         events.add(event1);
 
-        DateTime effectiveDate2 = effectiveDate1.plusDays(30);
-        BillingEvent event2 = createMockBillingEvent(null, subscription, effectiveDate2, plan, phase2, null,
-                recurringPrice.getPrice(currency), currency, BillingPeriod.MONTHLY, 31, BillingModeType.IN_ADVANCE,
-                "testEvent2", 2L, SubscriptionTransitionType.CHANGE);
+        final DateTime effectiveDate2 = effectiveDate1.plusDays(30);
+        final BillingEvent event2 = createMockBillingEvent(null, subscription, effectiveDate2, plan, phase2, null,
+                                                           recurringPrice.getPrice(currency), currency, BillingPeriod.MONTHLY, 31, BillingModeType.IN_ADVANCE,
+                                                           "testEvent2", 2L, SubscriptionTransitionType.CHANGE);
         events.add(event2);
 
-        Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, effectiveDate2, Currency.USD);
+        final Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, effectiveDate2, Currency.USD);
         assertNotNull(invoice);
         assertEquals(invoice.getNumberOfItems(), 2);
         assertEquals(invoice.getBalance().compareTo(cheapAmount), 0);
 
         invoiceDao.create(invoice, context);
-        Invoice savedInvoice = invoiceDao.getById(invoice.getId());
+        final Invoice savedInvoice = invoiceDao.getById(invoice.getId());
 
         assertNotNull(savedInvoice);
         assertEquals(savedInvoice.getNumberOfItems(), 2);
@@ -590,28 +768,28 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
 
     @Test
     public void testInvoiceNumber() throws InvoiceApiException {
-        Currency currency = Currency.USD;
-        DateTime targetDate1 = DateTime.now().plusMonths(1);
-        DateTime targetDate2 = DateTime.now().plusMonths(2);
+        final Currency currency = Currency.USD;
+        final DateTime targetDate1 = DateTime.now().plusMonths(1);
+        final DateTime targetDate2 = DateTime.now().plusMonths(2);
 
-        Subscription subscription = getZombieSubscription();
+        final Subscription subscription = getZombieSubscription();
 
-        Plan plan = BrainDeadProxyFactory.createBrainDeadProxyFor(Plan.class);
+        final Plan plan = BrainDeadProxyFactory.createBrainDeadProxyFor(Plan.class);
         ((ZombieControl) plan).addResult("getName", "plan");
 
-        PlanPhase phase1 = BrainDeadProxyFactory.createBrainDeadProxyFor(PlanPhase.class);
+        final PlanPhase phase1 = BrainDeadProxyFactory.createBrainDeadProxyFor(PlanPhase.class);
         ((ZombieControl) phase1).addResult("getName", "plan-phase1");
 
-        PlanPhase phase2 = BrainDeadProxyFactory.createBrainDeadProxyFor(PlanPhase.class);
+        final PlanPhase phase2 = BrainDeadProxyFactory.createBrainDeadProxyFor(PlanPhase.class);
         ((ZombieControl) phase2).addResult("getName", "plan-phase2");
 
-        BillingEventSet events = new MockBillingEventSet();
-        List<Invoice> invoices = new ArrayList<Invoice>();
+        final BillingEventSet events = new MockBillingEventSet();
+        final List<Invoice> invoices = new ArrayList<Invoice>();
 
-        BillingEvent event1 = createMockBillingEvent(null, subscription, targetDate1, plan, phase1, null,
-                TEN, currency,
-                BillingPeriod.MONTHLY, 31, BillingModeType.IN_ADVANCE,
-                "testEvent1", 1L, SubscriptionTransitionType.CHANGE);
+        final BillingEvent event1 = createMockBillingEvent(null, subscription, targetDate1, plan, phase1, null,
+                                                           TEN, currency,
+                                                           BillingPeriod.MONTHLY, 31, BillingModeType.IN_ADVANCE,
+                                                           "testEvent1", 1L, SubscriptionTransitionType.CHANGE);
         events.add(event1);
 
         Invoice invoice1 = generator.generateInvoice(UUID.randomUUID(), events, invoices, targetDate1, Currency.USD);
@@ -620,10 +798,10 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
         invoice1 = invoiceDao.getById(invoice1.getId());
         assertNotNull(invoice1.getInvoiceNumber());
 
-        BillingEvent event2 = createMockBillingEvent(null, subscription, targetDate1, plan, phase2, null,
-                TWENTY, currency,
-                BillingPeriod.MONTHLY, 31, BillingModeType.IN_ADVANCE,
-                "testEvent2", 2L, SubscriptionTransitionType.CHANGE);
+        final BillingEvent event2 = 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, targetDate2, Currency.USD);
         invoiceDao.create(invoice2, context);
@@ -632,62 +810,62 @@ public class InvoiceDaoTests extends InvoiceDaoTestBase {
     }
 
     @Test
-    public void testAddingWrittenOffTag() throws InvoiceApiException {
-        Subscription subscription = getZombieSubscription();
+    public void testAddingWrittenOffTag() throws InvoiceApiException, TagApiException {
+        final Subscription subscription = getZombieSubscription();
 
-        Plan plan = BrainDeadProxyFactory.createBrainDeadProxyFor(Plan.class);
+        final Plan plan = BrainDeadProxyFactory.createBrainDeadProxyFor(Plan.class);
         ((ZombieControl) plan).addResult("getName", "plan");
 
-        PlanPhase phase1 = BrainDeadProxyFactory.createBrainDeadProxyFor(PlanPhase.class);
+        final PlanPhase phase1 = BrainDeadProxyFactory.createBrainDeadProxyFor(PlanPhase.class);
         ((ZombieControl) phase1).addResult("getName", "plan-phase1");
 
-        DateTime targetDate1 = clock.getUTCNow();
-        Currency currency = Currency.USD;
+        final DateTime targetDate1 = clock.getUTCNow();
+        final Currency currency = Currency.USD;
 
         // create pseudo-random invoice
-        BillingEvent event1 = createMockBillingEvent(null, subscription, targetDate1, plan, phase1, null,
-                TEN, currency,
-                BillingPeriod.MONTHLY, 31, BillingModeType.IN_ADVANCE,
-                "testEvent1", 1L, SubscriptionTransitionType.CHANGE);
-        BillingEventSet events = new MockBillingEventSet();
+        final BillingEvent event1 = createMockBillingEvent(null, subscription, targetDate1, plan, phase1, null,
+                                                           TEN, currency,
+                                                           BillingPeriod.MONTHLY, 31, BillingModeType.IN_ADVANCE,
+                                                           "testEvent1", 1L, SubscriptionTransitionType.CHANGE);
+        final BillingEventSet events = new MockBillingEventSet();
         events.add(event1);
 
-        Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, targetDate1, Currency.USD);
+        final Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, targetDate1, Currency.USD);
         invoiceDao.create(invoice, context);
         invoiceDao.setWrittenOff(invoice.getId(), context);
 
-        TagDao tagDao = new AuditedTagDao(dbi);
-        Map<String, Tag> tags = tagDao.loadEntities(invoice.getId(), ObjectType.INVOICE);
+        final TagDao tagDao = new AuditedTagDao(dbi, tagEventBuilder, bus);
+        final Map<String, Tag> tags = tagDao.loadEntities(invoice.getId(), ObjectType.INVOICE);
         assertEquals(tags.size(), 1);
         assertTrue(tags.containsKey(ControlTagType.WRITTEN_OFF.toString()));
     }
 
     @Test
-    public void testRemoveWrittenOffTag() throws InvoiceApiException {
-        Subscription subscription = getZombieSubscription();
+    public void testRemoveWrittenOffTag() throws InvoiceApiException, TagApiException {
+        final Subscription subscription = getZombieSubscription();
 
-        Plan plan = BrainDeadProxyFactory.createBrainDeadProxyFor(Plan.class);
+        final Plan plan = BrainDeadProxyFactory.createBrainDeadProxyFor(Plan.class);
         ((ZombieControl) plan).addResult("getName", "plan");
 
-        PlanPhase phase1 = BrainDeadProxyFactory.createBrainDeadProxyFor(PlanPhase.class);
+        final PlanPhase phase1 = BrainDeadProxyFactory.createBrainDeadProxyFor(PlanPhase.class);
         ((ZombieControl) phase1).addResult("getName", "plan-phase1");
 
-        DateTime targetDate1 = clock.getUTCNow();
-        Currency currency = Currency.USD;
+        final DateTime targetDate1 = clock.getUTCNow();
+        final Currency currency = Currency.USD;
 
         // create pseudo-random invoice
-        BillingEvent event1 = createMockBillingEvent(null, subscription, targetDate1, plan, phase1, null,
-                TEN, currency,
-                BillingPeriod.MONTHLY, 31, BillingModeType.IN_ADVANCE,
-                "testEvent1", 1L, SubscriptionTransitionType.CHANGE);
-        BillingEventSet events = new MockBillingEventSet();
+        final BillingEvent event1 = createMockBillingEvent(null, subscription, targetDate1, plan, phase1, null,
+                                                           TEN, currency,
+                                                           BillingPeriod.MONTHLY, 31, BillingModeType.IN_ADVANCE,
+                                                           "testEvent1", 1L, SubscriptionTransitionType.CHANGE);
+        final BillingEventSet events = new MockBillingEventSet();
         events.add(event1);
 
-        Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, targetDate1, Currency.USD);
+        final Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, targetDate1, Currency.USD);
         invoiceDao.create(invoice, context);
         invoiceDao.setWrittenOff(invoice.getId(), context);
 
-        TagDao tagDao = new AuditedTagDao(dbi);
+        final TagDao tagDao = new AuditedTagDao(dbi, tagEventBuilder, bus);
         Map<String, Tag> tags = tagDao.loadEntities(invoice.getId(), ObjectType.INVOICE);
         assertEquals(tags.size(), 1);
         assertTrue(tags.containsKey(ControlTagType.WRITTEN_OFF.toString()));
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceItemDaoTests.java b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceItemDaoTests.java
index c97e775..ad14b3e 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceItemDaoTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceItemDaoTests.java
@@ -16,42 +16,41 @@
 
 package com.ning.billing.invoice.dao;
 
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertTrue;
-import static org.testng.Assert.fail;
-
 import java.math.BigDecimal;
 import java.util.List;
 import java.util.UUID;
 
-import com.ning.billing.invoice.model.CreditInvoiceItem;
-import com.ning.billing.invoice.model.FixedPriceInvoiceItem;
 import org.joda.time.DateTime;
 import org.testng.annotations.Test;
 
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.api.InvoiceItem;
+import com.ning.billing.invoice.model.CreditInvoiceItem;
 import com.ning.billing.invoice.model.DefaultInvoice;
+import com.ning.billing.invoice.model.FixedPriceInvoiceItem;
 import com.ning.billing.invoice.model.RecurringInvoiceItem;
 
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
 @Test(groups = {"slow", "invoicing", "invoicing-invoiceDao"})
 public class InvoiceItemDaoTests extends InvoiceDaoTestBase {
     @Test
     public void testInvoiceItemCreation() {
-        UUID accountId = UUID.randomUUID();
-        UUID invoiceId = UUID.randomUUID();
-        UUID bundleId = UUID.randomUUID();
-        UUID subscriptionId = UUID.randomUUID();
-        DateTime startDate = new DateTime(2011, 10, 1, 0, 0, 0, 0);
-        DateTime endDate = new DateTime(2011, 11, 1, 0, 0, 0, 0);
-        BigDecimal rate = new BigDecimal("20.00");
-
-        RecurringInvoiceItem item = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, "test plan", "test phase", startDate, endDate,
-                rate, rate, Currency.USD);
+        final UUID accountId = UUID.randomUUID();
+        final UUID invoiceId = UUID.randomUUID();
+        final UUID bundleId = UUID.randomUUID();
+        final UUID subscriptionId = UUID.randomUUID();
+        final DateTime startDate = new DateTime(2011, 10, 1, 0, 0, 0, 0);
+        final DateTime endDate = new DateTime(2011, 11, 1, 0, 0, 0, 0);
+        final BigDecimal rate = new BigDecimal("20.00");
+
+        final RecurringInvoiceItem item = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId, "test plan", "test phase", startDate, endDate,
+                                                                   rate, rate, Currency.USD);
         recurringInvoiceItemDao.create(item, context);
 
-        RecurringInvoiceItem thisItem = (RecurringInvoiceItem) recurringInvoiceItemDao.getById(item.getId().toString());
+        final RecurringInvoiceItem thisItem = (RecurringInvoiceItem) recurringInvoiceItemDao.getById(item.getId().toString());
         assertNotNull(thisItem);
         assertEquals(thisItem.getId(), item.getId());
         assertEquals(thisItem.getInvoiceId(), item.getInvoiceId());
@@ -67,95 +66,95 @@ public class InvoiceItemDaoTests extends InvoiceDaoTestBase {
 
     @Test
     public void testGetInvoiceItemsBySubscriptionId() {
-        UUID accountId = UUID.randomUUID();
-        UUID subscriptionId = UUID.randomUUID();
-        UUID bundleId = UUID.randomUUID();
-        DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
-        BigDecimal rate = new BigDecimal("20.00");
+        final UUID accountId = UUID.randomUUID();
+        final UUID subscriptionId = UUID.randomUUID();
+        final UUID bundleId = UUID.randomUUID();
+        final DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
+        final BigDecimal rate = new BigDecimal("20.00");
 
         for (int i = 0; i < 3; i++) {
-            UUID invoiceId = UUID.randomUUID();
+            final UUID invoiceId = UUID.randomUUID();
 
-            RecurringInvoiceItem item = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId,
-                    "test plan", "test phase", startDate.plusMonths(i), startDate.plusMonths(i + 1),
-                    rate, rate, Currency.USD);
+            final RecurringInvoiceItem item = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId,
+                                                                       "test plan", "test phase", startDate.plusMonths(i), startDate.plusMonths(i + 1),
+                                                                       rate, rate, Currency.USD);
             recurringInvoiceItemDao.create(item, context);
         }
 
-        List<InvoiceItem> items = recurringInvoiceItemDao.getInvoiceItemsBySubscription(subscriptionId.toString());
+        final List<InvoiceItem> items = recurringInvoiceItemDao.getInvoiceItemsBySubscription(subscriptionId.toString());
         assertEquals(items.size(), 3);
     }
 
     @Test
     public void testGetInvoiceItemsByInvoiceId() {
-        UUID accountId = UUID.randomUUID();
-        UUID invoiceId = UUID.randomUUID();
-        UUID bundleId = UUID.randomUUID();
-        DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
-        BigDecimal rate = new BigDecimal("20.00");
+        final UUID accountId = UUID.randomUUID();
+        final UUID invoiceId = UUID.randomUUID();
+        final UUID bundleId = UUID.randomUUID();
+        final DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
+        final BigDecimal rate = new BigDecimal("20.00");
 
         for (int i = 0; i < 5; i++) {
-            UUID subscriptionId = UUID.randomUUID();
-            BigDecimal amount = rate.multiply(new BigDecimal(i + 1));
+            final UUID subscriptionId = UUID.randomUUID();
+            final BigDecimal amount = rate.multiply(new BigDecimal(i + 1));
 
-            RecurringInvoiceItem item = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId,
-                    "test plan", "test phase", startDate, startDate.plusMonths(1),
-                    amount, amount, Currency.USD);
+            final RecurringInvoiceItem item = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId,
+                                                                       "test plan", "test phase", startDate, startDate.plusMonths(1),
+                                                                       amount, amount, Currency.USD);
             recurringInvoiceItemDao.create(item, context);
         }
 
-        List<InvoiceItem> items = recurringInvoiceItemDao.getInvoiceItemsByInvoice(invoiceId.toString());
+        final List<InvoiceItem> items = recurringInvoiceItemDao.getInvoiceItemsByInvoice(invoiceId.toString());
         assertEquals(items.size(), 5);
     }
 
     @Test
     public void testGetInvoiceItemsByAccountId() {
-        UUID accountId = UUID.randomUUID();
-        UUID bundleId = UUID.randomUUID();
-        DateTime targetDate = new DateTime(2011, 5, 23, 0, 0, 0, 0);
-        DefaultInvoice invoice = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
+        final UUID accountId = UUID.randomUUID();
+        final UUID bundleId = UUID.randomUUID();
+        final DateTime targetDate = new DateTime(2011, 5, 23, 0, 0, 0, 0);
+        final DefaultInvoice invoice = new DefaultInvoice(accountId, clock.getUTCNow(), targetDate, Currency.USD);
 
         invoiceDao.create(invoice, context);
 
-        UUID invoiceId = invoice.getId();
-        DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
-        BigDecimal rate = new BigDecimal("20.00");
+        final UUID invoiceId = invoice.getId();
+        final DateTime startDate = new DateTime(2011, 3, 1, 0, 0, 0, 0);
+        final BigDecimal rate = new BigDecimal("20.00");
 
-        UUID subscriptionId = UUID.randomUUID();
+        final UUID subscriptionId = UUID.randomUUID();
 
-        RecurringInvoiceItem item = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId,
-                "test plan", "test phase", startDate, startDate.plusMonths(1),
-                rate, rate, Currency.USD);
+        final RecurringInvoiceItem item = new RecurringInvoiceItem(invoiceId, accountId, bundleId, subscriptionId,
+                                                                   "test plan", "test phase", startDate, startDate.plusMonths(1),
+                                                                   rate, rate, Currency.USD);
         recurringInvoiceItemDao.create(item, context);
 
-        List<InvoiceItem> items = recurringInvoiceItemDao.getInvoiceItemsByAccount(accountId.toString());
+        final List<InvoiceItem> items = recurringInvoiceItemDao.getInvoiceItemsByAccount(accountId.toString());
         assertEquals(items.size(), 1);
     }
 
     @Test
     public void testCreditInvoiceSqlDao() {
-        UUID invoiceId = UUID.randomUUID();
-        UUID accountId = UUID.randomUUID();
-        DateTime creditDate = new DateTime(2012, 4, 1, 0, 10, 22, 0);
+        final UUID invoiceId = UUID.randomUUID();
+        final UUID accountId = UUID.randomUUID();
+        final DateTime creditDate = new DateTime(2012, 4, 1, 0, 10, 22, 0);
 
-        InvoiceItem creditInvoiceItem = new CreditInvoiceItem(invoiceId, accountId, creditDate, TEN, Currency.USD);
+        final InvoiceItem creditInvoiceItem = new CreditInvoiceItem(invoiceId, accountId, creditDate, TEN, Currency.USD);
         creditInvoiceItemSqlDao.create(creditInvoiceItem, context);
 
-        InvoiceItem savedItem = creditInvoiceItemSqlDao.getById(creditInvoiceItem.getId().toString());
+        final InvoiceItem savedItem = creditInvoiceItemSqlDao.getById(creditInvoiceItem.getId().toString());
         assertEquals(savedItem, creditInvoiceItem);
     }
 
     @Test
     public void testFixedPriceInvoiceSqlDao() {
-        UUID invoiceId = UUID.randomUUID();
-        UUID accountId = UUID.randomUUID();
-        DateTime startDate = new DateTime(2012, 4, 1, 0, 10, 22, 0);
+        final UUID invoiceId = UUID.randomUUID();
+        final UUID accountId = UUID.randomUUID();
+        final DateTime startDate = new DateTime(2012, 4, 1, 0, 10, 22, 0);
 
-        InvoiceItem fixedPriceInvoiceItem = new FixedPriceInvoiceItem(invoiceId, accountId, UUID.randomUUID(),
-                UUID.randomUUID(), "test plan", "test phase", startDate, startDate.plusMonths(1), TEN, Currency.USD);
+        final InvoiceItem fixedPriceInvoiceItem = new FixedPriceInvoiceItem(invoiceId, accountId, UUID.randomUUID(),
+                                                                            UUID.randomUUID(), "test plan", "test phase", startDate, startDate.plusMonths(1), TEN, Currency.USD);
         fixedPriceInvoiceItemSqlDao.create(fixedPriceInvoiceItem, context);
 
-        InvoiceItem savedItem = fixedPriceInvoiceItemSqlDao.getById(fixedPriceInvoiceItem.getId().toString());
+        final InvoiceItem savedItem = fixedPriceInvoiceItemSqlDao.getById(fixedPriceInvoiceItem.getId().toString());
         assertEquals(savedItem, fixedPriceInvoiceItem);
     }
 }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java b/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java
index e24effb..68987f8 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/MockInvoiceDao.java
@@ -23,12 +23,12 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
-import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.invoice.api.InvoiceApiException;
 import org.joda.time.DateTime;
 
 import com.google.inject.Inject;
+import com.ning.billing.catalog.api.Currency;
 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.InvoicePayment;
 import com.ning.billing.invoice.api.user.DefaultInvoiceCreationEvent;
@@ -41,7 +41,7 @@ public class MockInvoiceDao implements InvoiceDao {
     private final Map<UUID, Invoice> invoices = new LinkedHashMap<UUID, Invoice>();
 
     @Inject
-    public MockInvoiceDao(Bus eventBus) {
+    public MockInvoiceDao(final Bus eventBus) {
         this.eventBus = eventBus;
     }
 
@@ -52,16 +52,15 @@ public class MockInvoiceDao implements InvoiceDao {
         }
         try {
             eventBus.post(new DefaultInvoiceCreationEvent(invoice.getId(), invoice.getAccountId(),
-                                                                 invoice.getBalance(), invoice.getCurrency(),
-                                                                 invoice.getInvoiceDate(), null));
-        }
-        catch (Bus.EventBusException ex) {
+                                                          invoice.getBalance(), invoice.getCurrency(),
+                                                          invoice.getInvoiceDate(), null));
+        } catch (Bus.EventBusException ex) {
             throw new RuntimeException(ex);
         }
     }
 
     @Override
-    public Invoice getById(UUID id) {
+    public Invoice getById(final UUID id) {
         synchronized (monitor) {
             return invoices.get(id);
         }
@@ -75,11 +74,11 @@ public class MockInvoiceDao implements InvoiceDao {
     }
 
     @Override
-    public List<Invoice> getInvoicesByAccount(UUID accountId) {
-        List<Invoice> result = new ArrayList<Invoice>();
+    public List<Invoice> getInvoicesByAccount(final UUID accountId) {
+        final List<Invoice> result = new ArrayList<Invoice>();
 
         synchronized (monitor) {
-            for (Invoice invoice : invoices.values()) {
+            for (final Invoice invoice : invoices.values()) {
                 if (accountId.equals(invoice.getAccountId()) && !invoice.isMigrationInvoice()) {
                     result.add(invoice);
                 }
@@ -89,11 +88,11 @@ public class MockInvoiceDao implements InvoiceDao {
     }
 
     @Override
-    public List<Invoice> getInvoicesByAccount(UUID accountId, DateTime fromDate) {
-        List<Invoice> invoicesForAccount = new ArrayList<Invoice>();
+    public List<Invoice> getInvoicesByAccount(final UUID accountId, final DateTime fromDate) {
+        final List<Invoice> invoicesForAccount = new ArrayList<Invoice>();
 
         synchronized (monitor) {
-            for (Invoice invoice : get()) {
+            for (final Invoice invoice : get()) {
                 if (accountId.equals(invoice.getAccountId()) && !invoice.getTargetDate().isBefore(fromDate) && !invoice.isMigrationInvoice()) {
                     invoicesForAccount.add(invoice);
                 }
@@ -104,12 +103,12 @@ public class MockInvoiceDao implements InvoiceDao {
     }
 
     @Override
-    public List<Invoice> getInvoicesBySubscription(UUID subscriptionId) {
-        List<Invoice> result = new ArrayList<Invoice>();
+    public List<Invoice> getInvoicesBySubscription(final UUID subscriptionId) {
+        final List<Invoice> result = new ArrayList<Invoice>();
 
         synchronized (monitor) {
-            for (Invoice invoice : invoices.values()) {
-                for (InvoiceItem item : invoice.getInvoiceItems()) {
+            for (final Invoice invoice : invoices.values()) {
+                for (final InvoiceItem item : invoice.getInvoiceItems()) {
                     if (subscriptionId.equals(item.getSubscriptionId()) && !invoice.isMigrationInvoice()) {
                         result.add(invoice);
                         break;
@@ -125,10 +124,10 @@ public class MockInvoiceDao implements InvoiceDao {
     }
 
     @Override
-    public UUID getInvoiceIdByPaymentAttemptId(UUID paymentAttemptId) {
-        synchronized(monitor) {
-            for (Invoice invoice : invoices.values()) {
-                for (InvoicePayment payment : invoice.getPayments()) {
+    public UUID getInvoiceIdByPaymentAttemptId(final UUID paymentAttemptId) {
+        synchronized (monitor) {
+            for (final Invoice invoice : invoices.values()) {
+                for (final InvoicePayment payment : invoice.getPayments()) {
                     if (paymentAttemptId.equals(payment.getPaymentAttemptId())) {
                         return invoice.getId();
                     }
@@ -139,10 +138,10 @@ public class MockInvoiceDao implements InvoiceDao {
     }
 
     @Override
-    public InvoicePayment getInvoicePayment(UUID paymentAttemptId) {
-        synchronized(monitor) {
-            for (Invoice invoice : invoices.values()) {
-                for (InvoicePayment payment : invoice.getPayments()) {
+    public InvoicePayment getInvoicePayment(final UUID paymentAttemptId) {
+        synchronized (monitor) {
+            for (final Invoice invoice : invoices.values()) {
+                for (final InvoicePayment payment : invoice.getPayments()) {
                     if (paymentAttemptId.equals(payment.getPaymentAttemptId())) {
                         return payment;
                     }
@@ -154,9 +153,9 @@ public class MockInvoiceDao implements InvoiceDao {
     }
 
     @Override
-    public void notifyOfPaymentAttempt(InvoicePayment invoicePayment, CallContext context) {
+    public void notifyOfPaymentAttempt(final InvoicePayment invoicePayment, final CallContext context) {
         synchronized (monitor) {
-            Invoice invoice = invoices.get(invoicePayment.getInvoiceId());
+            final Invoice invoice = invoices.get(invoicePayment.getInvoiceId());
             if (invoice != null) {
                 invoice.addPayment(invoicePayment);
             }
@@ -164,10 +163,10 @@ public class MockInvoiceDao implements InvoiceDao {
     }
 
     @Override
-    public BigDecimal getAccountBalance(UUID accountId) {
+    public BigDecimal getAccountBalance(final UUID accountId) {
         BigDecimal balance = BigDecimal.ZERO;
 
-        for (Invoice invoice : get()) {
+        for (final Invoice invoice : get()) {
             if (accountId.equals(invoice.getAccountId())) {
                 balance = balance.add(invoice.getBalance());
             }
@@ -177,10 +176,10 @@ public class MockInvoiceDao implements InvoiceDao {
     }
 
     @Override
-    public List<Invoice> getUnpaidInvoicesByAccountId(UUID accountId, DateTime upToDate) {
-        List<Invoice> unpaidInvoices = new ArrayList<Invoice>();
+    public List<Invoice> getUnpaidInvoicesByAccountId(final UUID accountId, final DateTime upToDate) {
+        final List<Invoice> unpaidInvoices = new ArrayList<Invoice>();
 
-        for (Invoice invoice : get()) {
+        for (final Invoice invoice : get()) {
             if (accountId.equals(invoice.getAccountId()) && (invoice.getBalance().compareTo(BigDecimal.ZERO) > 0) && !invoice.isMigrationInvoice()) {
                 unpaidInvoices.add(invoice);
             }
@@ -189,67 +188,67 @@ public class MockInvoiceDao implements InvoiceDao {
         return unpaidInvoices;
     }
 
-	@Override
-	public List<Invoice> getAllInvoicesByAccount(UUID accountId) {
-		  List<Invoice> result = new ArrayList<Invoice>();
+    @Override
+    public List<Invoice> getAllInvoicesByAccount(final UUID accountId) {
+        final List<Invoice> result = new ArrayList<Invoice>();
 
-	        synchronized (monitor) {
-	            for (Invoice invoice : invoices.values()) {
-	                if (accountId.equals(invoice.getAccountId())) {
-	                    result.add(invoice);
-	                }
-	            }
-	        }
-	        return result;
-	}
+        synchronized (monitor) {
+            for (final Invoice invoice : invoices.values()) {
+                if (accountId.equals(invoice.getAccountId())) {
+                    result.add(invoice);
+                }
+            }
+        }
+        return result;
+    }
 
     @Override
-    public void setWrittenOff(UUID objectId, CallContext context) {
+    public void setWrittenOff(final UUID objectId, final CallContext context) {
         throw new UnsupportedOperationException();
     }
 
     @Override
-    public void removeWrittenOff(UUID objectId, CallContext context) {
+    public void removeWrittenOff(final UUID objectId, final CallContext context) {
         throw new UnsupportedOperationException();
     }
 
     @Override
-    public void postChargeback(UUID invoicePaymentId, BigDecimal amount, CallContext context) throws InvoiceApiException {
+    public void postChargeback(final UUID invoicePaymentId, final BigDecimal amount, final CallContext context) throws InvoiceApiException {
         throw new UnsupportedOperationException();
     }
 
     @Override
-    public BigDecimal getRemainingAmountPaid(UUID invoicePaymentId) {
+    public BigDecimal getRemainingAmountPaid(final UUID invoicePaymentId) {
         throw new UnsupportedOperationException();
     }
 
     @Override
-    public UUID getAccountIdFromInvoicePaymentId(UUID invoicePaymentId) throws InvoiceApiException {
+    public UUID getAccountIdFromInvoicePaymentId(final UUID invoicePaymentId) throws InvoiceApiException {
         throw new UnsupportedOperationException();
     }
 
     @Override
-    public List<InvoicePayment> getChargebacksByAccountId(UUID accountId) {
+    public List<InvoicePayment> getChargebacksByAccountId(final UUID accountId) {
         throw new UnsupportedOperationException();
     }
 
     @Override
-    public List<InvoicePayment> getChargebacksByPaymentAttemptId(UUID paymentAttemptId) {
+    public List<InvoicePayment> getChargebacksByPaymentAttemptId(final UUID paymentAttemptId) {
         throw new UnsupportedOperationException();
     }
 
     @Override
-    public InvoicePayment getChargebackById(UUID chargebackId) throws InvoiceApiException {
+    public InvoicePayment getChargebackById(final UUID chargebackId) throws InvoiceApiException {
         throw new UnsupportedOperationException();
     }
 
     @Override
-    public InvoiceItem getCreditById(UUID creditId) throws InvoiceApiException {
+    public InvoiceItem getCreditById(final UUID creditId) throws InvoiceApiException {
         throw new UnsupportedOperationException();
     }
 
     @Override
-    public InvoiceItem insertCredit(UUID accountId, BigDecimal amount, DateTime effectiveDate, Currency currency, CallContext context) {
+    public InvoiceItem insertCredit(final UUID accountId, final BigDecimal amount, final DateTime effectiveDate, final Currency currency, final CallContext context) {
         throw new UnsupportedOperationException();
     }
 }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/glue/InvoiceModuleWithEmbeddedDb.java b/invoice/src/test/java/com/ning/billing/invoice/glue/InvoiceModuleWithEmbeddedDb.java
index 33feebe..6017a5a 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/glue/InvoiceModuleWithEmbeddedDb.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/glue/InvoiceModuleWithEmbeddedDb.java
@@ -16,8 +16,6 @@
 
 package com.ning.billing.invoice.glue;
 
-import static org.testng.Assert.assertNotNull;
-
 import java.io.IOException;
 import java.net.URL;
 
@@ -52,6 +50,8 @@ import com.ning.billing.util.glue.TagStoreModule;
 import com.ning.billing.util.notificationq.MockNotificationQueueService;
 import com.ning.billing.util.notificationq.NotificationQueueService;
 
+import static org.testng.Assert.assertNotNull;
+
 public class InvoiceModuleWithEmbeddedDb extends DefaultInvoiceModule {
     private final MysqlTestingHelper helper = new MysqlTestingHelper();
     private IDBI dbi;
@@ -107,7 +107,7 @@ public class InvoiceModuleWithEmbeddedDb extends DefaultInvoiceModule {
 //      install(new AccountModule());
         bind(AccountUserApi.class).toInstance(BrainDeadProxyFactory.createBrainDeadProxyFor(AccountUserApi.class));
 
-        BillingApi billingApi = BrainDeadProxyFactory.createBrainDeadProxyFor(BillingApi.class);
+        final BillingApi billingApi = BrainDeadProxyFactory.createBrainDeadProxyFor(BillingApi.class);
         ((ZombieControl) billingApi).addResult("setChargedThroughDateFromTransaction", BrainDeadProxyFactory.ZOMBIE_VOID);
         bind(BillingApi.class).toInstance(billingApi);
 
@@ -127,7 +127,7 @@ public class InvoiceModuleWithEmbeddedDb extends DefaultInvoiceModule {
         final URL url = InvoiceModuleWithEmbeddedDb.class.getResource(resource);
         assertNotNull(url);
         try {
-            System.getProperties().load( url.openStream() );
+            System.getProperties().load(url.openStream());
         } catch (IOException e) {
             throw new RuntimeException(e);
         }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/glue/InvoiceModuleWithMocks.java b/invoice/src/test/java/com/ning/billing/invoice/glue/InvoiceModuleWithMocks.java
index 49a90bc..5e4a2c3 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/glue/InvoiceModuleWithMocks.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/glue/InvoiceModuleWithMocks.java
@@ -25,7 +25,7 @@ import com.ning.billing.util.globallocker.MockGlobalLocker;
 
 
 public class InvoiceModuleWithMocks extends DefaultInvoiceModule {
-    @Override 
+    @Override
     protected void installInvoiceDao() {
         bind(MockInvoiceDao.class).asEagerSingleton();
         bind(InvoiceDao.class).to(MockInvoiceDao.class);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/HtmlInvoiceGeneratorTest.java b/invoice/src/test/java/com/ning/billing/invoice/HtmlInvoiceGeneratorTest.java
index 144fb13..c9ca94b 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/HtmlInvoiceGeneratorTest.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/HtmlInvoiceGeneratorTest.java
@@ -16,6 +16,16 @@
 
 package com.ning.billing.invoice;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+
+import org.joda.time.DateTime;
+import org.skife.config.ConfigurationObjectFactory;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
 import com.ning.billing.account.api.Account;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.api.Invoice;
@@ -28,41 +38,32 @@ import com.ning.billing.mock.BrainDeadProxyFactory.ZombieControl;
 import com.ning.billing.util.email.templates.MustacheTemplateEngine;
 import com.ning.billing.util.email.templates.TemplateEngine;
 import com.ning.billing.util.template.translation.TranslatorConfig;
-import org.joda.time.DateTime;
-import org.skife.config.ConfigurationObjectFactory;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
 
 import static org.testng.Assert.assertNotNull;
 
 @Test(groups = {"fast", "email"})
 public class HtmlInvoiceGeneratorTest {
     private HtmlInvoiceGenerator g;
-    private final static String TEST_TEMPLATE_NAME = "HtmlInvoiceTemplate";
+    private static final String TEST_TEMPLATE_NAME = "HtmlInvoiceTemplate";
 
     @BeforeClass
     public void setup() {
-        TranslatorConfig config = new ConfigurationObjectFactory(System.getProperties()).build(TranslatorConfig.class);
-        TemplateEngine templateEngine = new MustacheTemplateEngine();
-        InvoiceFormatterFactory factory = new DefaultInvoiceFormatterFactory();
+        final TranslatorConfig config = new ConfigurationObjectFactory(System.getProperties()).build(TranslatorConfig.class);
+        final TemplateEngine templateEngine = new MustacheTemplateEngine();
+        final InvoiceFormatterFactory factory = new DefaultInvoiceFormatterFactory();
         g = new HtmlInvoiceGenerator(factory, templateEngine, config);
     }
 
     @Test
     public void testGenerateInvoice() throws Exception {
-        String output = g.generateInvoice(createAccount(), createInvoice(), TEST_TEMPLATE_NAME);
+        final String output = g.generateInvoice(createAccount(), createInvoice(), TEST_TEMPLATE_NAME);
         assertNotNull(output);
         System.out.print(output);
     }
 
     private Account createAccount() {
-        Account account = BrainDeadProxyFactory.createBrainDeadProxyFor(Account.class);
-        ZombieControl zombieControl = (ZombieControl) account;
+        final Account account = BrainDeadProxyFactory.createBrainDeadProxyFor(Account.class);
+        final ZombieControl zombieControl = (ZombieControl) account;
         zombieControl.addResult("getExternalKey", "1234abcd");
         zombieControl.addResult("getName", "Jim Smith");
         zombieControl.addResult("getFirstNameLength", 3);
@@ -80,13 +81,13 @@ public class HtmlInvoiceGeneratorTest {
     }
 
     private Invoice createInvoice() {
-        DateTime startDate = new DateTime().minusMonths(1);
-        DateTime endDate = new DateTime();
+        final DateTime startDate = new DateTime().minusMonths(1);
+        final DateTime endDate = new DateTime();
 
-        BigDecimal price1 = new BigDecimal("29.95");
-        BigDecimal price2 = new BigDecimal("59.95");
-        Invoice dummyInvoice = BrainDeadProxyFactory.createBrainDeadProxyFor(Invoice.class);
-        ZombieControl zombie = (ZombieControl) dummyInvoice;
+        final BigDecimal price1 = new BigDecimal("29.95");
+        final BigDecimal price2 = new BigDecimal("59.95");
+        final Invoice dummyInvoice = BrainDeadProxyFactory.createBrainDeadProxyFor(Invoice.class);
+        final ZombieControl zombie = (ZombieControl) dummyInvoice;
         zombie.addResult("getInvoiceDate", startDate);
         zombie.addResult("getInvoiceNumber", 42);
         zombie.addResult("getCurrency", Currency.USD);
@@ -94,7 +95,7 @@ public class HtmlInvoiceGeneratorTest {
         zombie.addResult("getAmountPaid", BigDecimal.ZERO);
         zombie.addResult("getBalance", price1.add(price2));
 
-        List<InvoiceItem> items = new ArrayList<InvoiceItem>();
+        final List<InvoiceItem> items = new ArrayList<InvoiceItem>();
         items.add(createInvoiceItem(price1, "Domain 1", startDate, endDate, "ning-plus"));
         items.add(createInvoiceItem(price2, "Domain 2", startDate, endDate, "ning-pro"));
         zombie.addResult("getInvoiceItems", items);
@@ -102,9 +103,9 @@ public class HtmlInvoiceGeneratorTest {
         return dummyInvoice;
     }
 
-    private InvoiceItem createInvoiceItem(BigDecimal amount, String networkName, DateTime startDate, DateTime endDate, String planName) {
-        InvoiceItem item = BrainDeadProxyFactory.createBrainDeadProxyFor(InvoiceItem.class);
-        ZombieControl zombie = (ZombieControl) item;
+    private InvoiceItem createInvoiceItem(final BigDecimal amount, final String networkName, final DateTime startDate, final DateTime endDate, final String planName) {
+        final InvoiceItem item = BrainDeadProxyFactory.createBrainDeadProxyFor(InvoiceItem.class);
+        final ZombieControl zombie = (ZombieControl) item;
         zombie.addResult("getAmount", amount);
         zombie.addResult("getStartDate", startDate);
         zombie.addResult("getEndDate", endDate);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/MockBillingEventSet.java b/invoice/src/test/java/com/ning/billing/invoice/MockBillingEventSet.java
index e8002f0..c8ecf34 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/MockBillingEventSet.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/MockBillingEventSet.java
@@ -31,14 +31,14 @@ public class MockBillingEventSet extends TreeSet<BillingEvent> implements Billin
     private boolean isAccountInvoiceOff;
     private List<UUID> subscriptionIdsWithAutoInvoiceOff = new ArrayList<UUID>();
 
-    public void addSubscriptionWithAutoInvoiceOff(UUID subscriptionId) {
+    public void addSubscriptionWithAutoInvoiceOff(final UUID subscriptionId) {
         subscriptionIdsWithAutoInvoiceOff.add(subscriptionId);
     }
 
     @Override
-    public boolean isLast(BillingEvent event) {
+    public boolean isLast(final BillingEvent event) {
         return event == last();
-     }
+    }
 
     @Override
     public boolean isAccountAutoInvoiceOff() {
@@ -50,11 +50,11 @@ public class MockBillingEventSet extends TreeSet<BillingEvent> implements Billin
         return subscriptionIdsWithAutoInvoiceOff;
     }
 
-    public void setAccountInvoiceOff(boolean isAccountInvoiceOff) {
+    public void setAccountInvoiceOff(final boolean isAccountInvoiceOff) {
         this.isAccountInvoiceOff = isAccountInvoiceOff;
     }
 
-    public void setSubscriptionIdsWithAutoInvoiceOff(List<UUID> subscriptionIdsWithAutoInvoiceOff) {
+    public void setSubscriptionIdsWithAutoInvoiceOff(final List<UUID> subscriptionIdsWithAutoInvoiceOff) {
         this.subscriptionIdsWithAutoInvoiceOff = subscriptionIdsWithAutoInvoiceOff;
     }
 
diff --git a/invoice/src/test/java/com/ning/billing/invoice/MockModule.java b/invoice/src/test/java/com/ning/billing/invoice/MockModule.java
index 816cd42..120ab0e 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/MockModule.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/MockModule.java
@@ -56,7 +56,7 @@ public class MockModule extends AbstractModule {
             final DbiConfig config = new ConfigurationObjectFactory(System.getProperties()).build(DbiConfig.class);
             bind(DbiConfig.class).toInstance(config);
         } else {
-            final IDBI dbi = helper.getDBI(); 
+            final IDBI dbi = helper.getDBI();
             bind(IDBI.class).toInstance(dbi);
         }
 
@@ -74,6 +74,6 @@ public class MockModule extends AbstractModule {
     }
 
     protected void installInvoiceModule() {
-    	install(new DefaultInvoiceModule());
+        install(new DefaultInvoiceModule());
     }
 }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/notification/MockNextBillingDatePoster.java b/invoice/src/test/java/com/ning/billing/invoice/notification/MockNextBillingDatePoster.java
index 88ff62a..1079a2f 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/notification/MockNextBillingDatePoster.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/notification/MockNextBillingDatePoster.java
@@ -23,7 +23,7 @@ import org.skife.jdbi.v2.sqlobject.mixins.Transmogrifier;
 
 public class MockNextBillingDatePoster implements NextBillingDatePoster {
     @Override
-    public void insertNextBillingNotification(Transmogrifier transactionalDao, UUID subscriptionId, DateTime futureNotificationTime) {
+    public void insertNextBillingNotification(final Transmogrifier transactionalDao, final UUID subscriptionId, final DateTime futureNotificationTime) {
         // do nothing
     }
 }
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 0164fb6..e56006f 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,9 +16,6 @@
 
 package com.ning.billing.invoice.notification;
 
-import static com.jayway.awaitility.Awaitility.await;
-import static java.util.concurrent.TimeUnit.MINUTES;
-
 import java.io.IOException;
 import java.sql.SQLException;
 import java.util.UUID;
@@ -67,51 +64,54 @@ import com.ning.billing.util.notificationq.DummySqlTest;
 import com.ning.billing.util.notificationq.NotificationQueueService;
 import com.ning.billing.util.notificationq.dao.NotificationSqlDao;
 
+import static com.jayway.awaitility.Awaitility.await;
+import static java.util.concurrent.TimeUnit.MINUTES;
+
 public class TestNextBillingDateNotifier {
-	private Clock clock;
-	private DefaultNextBillingDateNotifier notifier;
-	private DummySqlTest dao;
-	private Bus eventBus;
-	private MysqlTestingHelper helper;
-	private InvoiceListenerMock listener;
-	private NotificationQueueService notificationQueueService;
-
-	
-	private static final class InvoiceListenerMock extends InvoiceListener {
-		int eventCount = 0;
-		UUID latestSubscriptionId = null;
-
-		public InvoiceListenerMock(CallContextFactory factory, InvoiceDispatcher dispatcher) {
-			super(factory, dispatcher);
-		}
-
-		@Override
-		public void handleNextBillingDateEvent(UUID subscriptionId,
-				DateTime eventDateTime) {
-			eventCount++;
-			latestSubscriptionId=subscriptionId;
-		}
-
-		public int getEventCount() {
-			return eventCount;
-		}
-
-		public UUID getLatestSubscriptionId(){
-			return latestSubscriptionId;
-		}
-
-	}
-
-	@BeforeMethod(groups={"slow"})
+    private Clock clock;
+    private DefaultNextBillingDateNotifier notifier;
+    private DummySqlTest dao;
+    private Bus eventBus;
+    private MysqlTestingHelper helper;
+    private InvoiceListenerMock listener;
+    private NotificationQueueService notificationQueueService;
+
+
+    private static final class InvoiceListenerMock extends InvoiceListener {
+        int eventCount = 0;
+        UUID latestSubscriptionId = null;
+
+        public InvoiceListenerMock(final CallContextFactory factory, final InvoiceDispatcher dispatcher) {
+            super(factory, dispatcher);
+        }
+
+        @Override
+        public void handleNextBillingDateEvent(final UUID subscriptionId,
+                                               final DateTime eventDateTime) {
+            eventCount++;
+            latestSubscriptionId = subscriptionId;
+        }
+
+        public int getEventCount() {
+            return eventCount;
+        }
+
+        public UUID getLatestSubscriptionId() {
+            return latestSubscriptionId;
+        }
+
+    }
+
+    @BeforeMethod(groups = {"slow"})
     public void cleanDb() {
-	    helper.cleanupAllTables();
-	}
-
-	@BeforeClass(groups={"slow"})
-	public void setup() throws KillbillService.ServiceException, IOException, ClassNotFoundException, SQLException {
-		//TestApiBase.loadSystemPropertiesFromClasspath("/entitlement.properties");
-        final Injector g = Guice.createInjector(Stage.PRODUCTION,  new AbstractModule() {
-			
+        helper.cleanupAllTables();
+    }
+
+    @BeforeClass(groups = {"slow"})
+    public void setup() throws KillbillService.ServiceException, IOException, ClassNotFoundException, SQLException {
+        //TestApiBase.loadSystemPropertiesFromClasspath("/entitlement.properties");
+        final Injector g = Guice.createInjector(Stage.PRODUCTION, new AbstractModule() {
+
             protected void configure() {
                 install(new MockClockModule());
                 install(new BusModule(BusType.MEMORY));
@@ -119,7 +119,7 @@ public class TestNextBillingDateNotifier {
                 install(new MockJunctionModule());
                 install(new MockCatalogModule());
                 install(new NotificationQueueModule());
-                
+
                 final MysqlTestingHelper helper = new MysqlTestingHelper();
                 bind(MysqlTestingHelper.class).toInstance(helper);
                 if (helper.isUsingLocalInstance()) {
@@ -130,80 +130,80 @@ public class TestNextBillingDateNotifier {
                     final IDBI dbi = helper.getDBI();
                     bind(IDBI.class).toInstance(dbi);
                 }
-                
-            
+
+
             }
         });
 
         clock = g.getInstance(Clock.class);
-        IDBI dbi = g.getInstance(IDBI.class);
+        final IDBI dbi = g.getInstance(IDBI.class);
         dao = dbi.onDemand(DummySqlTest.class);
         eventBus = g.getInstance(Bus.class);
         helper = g.getInstance(MysqlTestingHelper.class);
         notificationQueueService = g.getInstance(NotificationQueueService.class);
-        InvoiceDispatcher dispatcher = g.getInstance(InvoiceDispatcher.class);
+        final InvoiceDispatcher dispatcher = g.getInstance(InvoiceDispatcher.class);
 
-        Subscription subscription = BrainDeadProxyFactory.createBrainDeadProxyFor(Subscription.class);
-        EntitlementUserApi entitlementUserApi = BrainDeadProxyFactory.createBrainDeadProxyFor(EntitlementUserApi.class);
+        final Subscription subscription = BrainDeadProxyFactory.createBrainDeadProxyFor(Subscription.class);
+        final EntitlementUserApi entitlementUserApi = BrainDeadProxyFactory.createBrainDeadProxyFor(EntitlementUserApi.class);
         ((ZombieControl) entitlementUserApi).addResult("getSubscriptionFromId", subscription);
 
-        CallContextFactory factory = new DefaultCallContextFactory(clock);
+        final CallContextFactory factory = new DefaultCallContextFactory(clock);
         listener = new InvoiceListenerMock(factory, dispatcher);
-        notifier = new DefaultNextBillingDateNotifier(notificationQueueService,g.getInstance(InvoiceConfig.class), entitlementUserApi, listener);
+        notifier = new DefaultNextBillingDateNotifier(notificationQueueService, g.getInstance(InvoiceConfig.class), entitlementUserApi, listener);
         startMysql();
-	}
+    }
 
-	private void startMysql() throws IOException, ClassNotFoundException, SQLException {
-		final String ddl = IOUtils.toString(NotificationSqlDao.class.getResourceAsStream("/com/ning/billing/util/ddl.sql"));
-		final String testDdl = IOUtils.toString(NotificationSqlDao.class.getResourceAsStream("/com/ning/billing/util/ddl_test.sql"));
-		helper.startMysql();
-		helper.initDb(ddl);
-		helper.initDb(testDdl);
-	}
+    private void startMysql() throws IOException, ClassNotFoundException, SQLException {
+        final String ddl = IOUtils.toString(NotificationSqlDao.class.getResourceAsStream("/com/ning/billing/util/ddl.sql"));
+        final String testDdl = IOUtils.toString(NotificationSqlDao.class.getResourceAsStream("/com/ning/billing/util/ddl_test.sql"));
+        helper.startMysql();
+        helper.initDb(ddl);
+        helper.initDb(testDdl);
+    }
 
 
-	@Test(enabled=true, groups="slow")
-	public void testInvoiceNotifier() throws Exception {
-		final UUID subscriptionId = new UUID(0L,1L);
-		final DateTime now = new DateTime();
-		final DateTime readyTime = now.plusMillis(2000);
-		final NextBillingDatePoster poster = new DefaultNextBillingDatePoster(notificationQueueService);
+    @Test(enabled = true, groups = "slow")
+    public void testInvoiceNotifier() throws Exception {
+        final UUID subscriptionId = new UUID(0L, 1L);
+        final DateTime now = new DateTime();
+        final DateTime readyTime = now.plusMillis(2000);
+        final NextBillingDatePoster poster = new DefaultNextBillingDatePoster(notificationQueueService);
 
-		eventBus.start();
-		notifier.initialize();
-		notifier.start();
+        eventBus.start();
+        notifier.initialize();
+        notifier.start();
 
 
-		dao.inTransaction(new Transaction<Void, DummySqlTest>() {
-			@Override
-			public Void inTransaction(DummySqlTest transactional,
-					TransactionStatus status) throws Exception {
+        dao.inTransaction(new Transaction<Void, DummySqlTest>() {
+            @Override
+            public Void inTransaction(final DummySqlTest transactional,
+                                      final TransactionStatus status) throws Exception {
 
-				poster.insertNextBillingNotification(transactional, subscriptionId, readyTime);
-				return null;
-			}
-		});
+                poster.insertNextBillingNotification(transactional, subscriptionId, readyTime);
+                return null;
+            }
+        });
 
 
-		// Move time in the future after the notification effectiveDate
-		((ClockMock) clock).setDeltaFromReality(3000);
+        // Move time in the future after the notification effectiveDate
+        ((ClockMock) clock).setDeltaFromReality(3000);
 
 
-	    await().atMost(1, MINUTES).until(new Callable<Boolean>() {
-	            @Override
-	            public Boolean call() throws Exception {
-	                return listener.getEventCount() == 1;
-	            }
-	        });
+        await().atMost(1, MINUTES).until(new Callable<Boolean>() {
+            @Override
+            public Boolean call() throws Exception {
+                return listener.getEventCount() == 1;
+            }
+        });
 
-		Assert.assertEquals(listener.getEventCount(), 1);
-		Assert.assertEquals(listener.getLatestSubscriptionId(), subscriptionId);
-	}
+        Assert.assertEquals(listener.getEventCount(), 1);
+        Assert.assertEquals(listener.getLatestSubscriptionId(), subscriptionId);
+    }
 
-	@AfterClass(groups="slow")
+    @AfterClass(groups = "slow")
     public void tearDown() throws Exception {
-	    notifier.stop();
-    	helper.stopMysql();
+        notifier.stop();
+        helper.stopMysql();
     }
 
 }
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 679049a..f864108 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceDispatcher.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceDispatcher.java
@@ -67,22 +67,22 @@ import com.ning.billing.util.globallocker.GlobalLocker;
 @Test(groups = "slow")
 @Guice(modules = {MockModule.class})
 public class TestInvoiceDispatcher extends InvoicingTestBase {
-	private Logger log = LoggerFactory.getLogger(TestInvoiceDispatcher.class);
+    private final Logger log = LoggerFactory.getLogger(TestInvoiceDispatcher.class);
 
-	@Inject
-	private InvoiceGenerator generator;
+    @Inject
+    private InvoiceGenerator generator;
 
-	@Inject
-	private InvoiceDao invoiceDao;
+    @Inject
+    private InvoiceDao invoiceDao;
 
-	@Inject
-	private GlobalLocker locker;
+    @Inject
+    private GlobalLocker locker;
 
-	@Inject
-	private MysqlTestingHelper helper;
+    @Inject
+    private MysqlTestingHelper helper;
 
-	@Inject
-	private NextBillingDateNotifier notifier;
+    @Inject
+    private NextBillingDateNotifier notifier;
 
     @Inject
     private BusService busService;
@@ -96,91 +96,90 @@ public class TestInvoiceDispatcher extends InvoicingTestBase {
     private CallContext context;
 
     @BeforeSuite(groups = "slow")
-    public void setup() throws Exception
-    {
-		final String invoiceDdl = IOUtils.toString(TestInvoiceDispatcher.class.getResourceAsStream("/com/ning/billing/invoice/ddl.sql"));
-		final String utilDdl = IOUtils.toString(TestInvoiceDispatcher.class.getResourceAsStream("/com/ning/billing/util/ddl.sql"));
+    public void setup() throws Exception {
+        final String invoiceDdl = IOUtils.toString(TestInvoiceDispatcher.class.getResourceAsStream("/com/ning/billing/invoice/ddl.sql"));
+        final String utilDdl = IOUtils.toString(TestInvoiceDispatcher.class.getResourceAsStream("/com/ning/billing/util/ddl.sql"));
 
-		helper.startMysql();
+        helper.startMysql();
 
-		helper.initDb(invoiceDdl);
-		helper.initDb(utilDdl);
-		notifier.initialize();
-		notifier.start();
+        helper.initDb(invoiceDdl);
+        helper.initDb(utilDdl);
+        notifier.initialize();
+        notifier.start();
 
         context = new DefaultCallContextFactory(clock).createCallContext("Miracle Max", CallOrigin.TEST, UserType.TEST);
 
-		busService.getBus().start();
-		((ZombieControl)billingApi).addResult("setChargedThroughDate", BrainDeadProxyFactory.ZOMBIE_VOID);
-	}
-
-	@AfterClass(alwaysRun = true)
-	public void tearDown() {
-		try {
-			((DefaultBusService) busService).stopBus();
-			notifier.stop();
-			helper.stopMysql();
-		} catch (Exception e) {
-			log.warn("Failed to tearDown test properly ", e);
-		}
+        busService.getBus().start();
+        ((ZombieControl) billingApi).addResult("setChargedThroughDate", BrainDeadProxyFactory.ZOMBIE_VOID);
     }
-	    
-    @Test(groups={"slow"}, enabled=true)
+
+    @AfterClass(alwaysRun = true)
+    public void tearDown() {
+        try {
+            ((DefaultBusService) busService).stopBus();
+            notifier.stop();
+            helper.stopMysql();
+        } catch (Exception e) {
+            log.warn("Failed to tearDown test properly ", e);
+        }
+    }
+
+    @Test(groups = {"slow"}, enabled = true)
     public void testDryRunInvoice() throws InvoiceApiException {
-        UUID accountId = UUID.randomUUID();
-        UUID subscriptionId = UUID.randomUUID();
+        final UUID accountId = UUID.randomUUID();
+        final UUID subscriptionId = UUID.randomUUID();
 
-		AccountUserApi accountUserApi = BrainDeadProxyFactory.createBrainDeadProxyFor(AccountUserApi.class);
-		Account account = BrainDeadProxyFactory.createBrainDeadProxyFor(Account.class);
+        final AccountUserApi accountUserApi = BrainDeadProxyFactory.createBrainDeadProxyFor(AccountUserApi.class);
+        final Account account = BrainDeadProxyFactory.createBrainDeadProxyFor(Account.class);
 
-		((ZombieControl)accountUserApi).addResult("getAccountById", account);
-		((ZombieControl)account).addResult("getCurrency", Currency.USD);
-		((ZombieControl)account).addResult("getId", accountId);
-        ((ZombieControl)account).addResult(("isNotifiedForInvoices"), true);
+        ((ZombieControl) accountUserApi).addResult("getAccountById", account);
+        ((ZombieControl) account).addResult("getCurrency", Currency.USD);
+        ((ZombieControl) account).addResult("getId", accountId);
+        ((ZombieControl) account).addResult(("isNotifiedForInvoices"), true);
 
-		Subscription subscription =  BrainDeadProxyFactory.createBrainDeadProxyFor(Subscription.class);
-        ((ZombieControl)subscription).addResult("getId", subscriptionId);
-        ((ZombieControl)subscription).addResult("getBundleId", new UUID(0L,0L));
-        BillingEventSet events = new MockBillingEventSet();
-		Plan plan = MockPlan.createBicycleNoTrialEvergreen1USD();
-		PlanPhase planPhase = MockPlanPhase.create1USDMonthlyEvergreen();
-		DateTime effectiveDate = new DateTime().minusDays(1);
-		Currency currency = Currency.USD;
-		BigDecimal fixedPrice = null;
-		events.add(createMockBillingEvent(account, subscription, effectiveDate, plan, planPhase,
-                fixedPrice, BigDecimal.ONE, currency, BillingPeriod.MONTHLY, 1,
-                BillingModeType.IN_ADVANCE, "", 1L, SubscriptionTransitionType.CREATE));
+        final Subscription subscription = BrainDeadProxyFactory.createBrainDeadProxyFor(Subscription.class);
+        ((ZombieControl) subscription).addResult("getId", subscriptionId);
+        ((ZombieControl) subscription).addResult("getBundleId", 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));
 
-		((ZombieControl) billingApi).addResult("getBillingEventsForAccountAndUpdateAccountBCD", events);
+        ((ZombieControl) billingApi).addResult("getBillingEventsForAccountAndUpdateAccountBCD", events);
 
-		DateTime target = new DateTime();
+        final DateTime target = new DateTime();
 
-        InvoiceNotifier invoiceNotifier = new NullInvoiceNotifier();
-		InvoiceDispatcher dispatcher = new InvoiceDispatcher(generator, accountUserApi, billingApi, invoiceDao,
-                                                             invoiceNotifier, locker, busService.getBus(), clock);
+        final InvoiceNotifier invoiceNotifier = new NullInvoiceNotifier();
+        final InvoiceDispatcher dispatcher = new InvoiceDispatcher(generator, accountUserApi, billingApi, invoiceDao,
+                                                                   invoiceNotifier, locker, busService.getBus(), clock);
 
-		Invoice invoice = dispatcher.processAccount(accountId, target, true, context);
-		Assert.assertNotNull(invoice);
+        Invoice invoice = dispatcher.processAccount(accountId, target, true, context);
+        Assert.assertNotNull(invoice);
 
-		List<Invoice> invoices = invoiceDao.getInvoicesByAccount(accountId);
-		Assert.assertEquals(invoices.size(), 0);
+        List<Invoice> invoices = invoiceDao.getInvoicesByAccount(accountId);
+        Assert.assertEquals(invoices.size(), 0);
 
-		// Try it again to double check
-		invoice = dispatcher.processAccount(accountId, target, true, context);
-		Assert.assertNotNull(invoice);
+        // Try it again to double check
+        invoice = dispatcher.processAccount(accountId, target, true, context);
+        Assert.assertNotNull(invoice);
 
-		invoices = invoiceDao.getInvoicesByAccount(accountId);
-		Assert.assertEquals(invoices.size(), 0);
+        invoices = invoiceDao.getInvoicesByAccount(accountId);
+        Assert.assertEquals(invoices.size(), 0);
 
-		// This time no dry run
-		invoice = dispatcher.processAccount(accountId, target, false, context);
-		Assert.assertNotNull(invoice);
+        // This time no dry run
+        invoice = dispatcher.processAccount(accountId, target, false, context);
+        Assert.assertNotNull(invoice);
 
-		invoices = invoiceDao.getInvoicesByAccount(accountId);
-		Assert.assertEquals(invoices.size(),1);
+        invoices = invoiceDao.getInvoicesByAccount(accountId);
+        Assert.assertEquals(invoices.size(), 1);
+
+    }
 
-	}
-    
     //MDW add a test to cover when the account auto-invoice-off tag is present
 
 }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/ChargeBackTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/ChargeBackTests.java
index 8d5ac43..ce941b9 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/ChargeBackTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/ChargeBackTests.java
@@ -16,6 +16,15 @@
 
 package com.ning.billing.invoice.tests;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+import org.skife.jdbi.v2.IDBI;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.dbi.MysqlTestingHelper;
 import com.ning.billing.invoice.api.Invoice;
@@ -43,43 +52,33 @@ import com.ning.billing.util.tag.dao.MockTagDefinitionDao;
 import com.ning.billing.util.tag.dao.TagDao;
 import com.ning.billing.util.tag.dao.TagDefinitionDao;
 
-import org.skife.jdbi.v2.IDBI;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.UUID;
-
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertTrue;
-import static org.testng.Assert.fail;
 
 @Test(groups = {"slow", "invoicing"})
 public class ChargeBackTests {
-    private final static BigDecimal FIFTEEN = new BigDecimal("15.00");
-    private final static BigDecimal THIRTY = new BigDecimal("30.00");
-    private final static BigDecimal ONE_MILLION = new BigDecimal("1000000.00");
+    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 InvoiceSqlDao invoiceSqlDao;
     private InvoicePaymentApi invoicePaymentApi;
     private CallContext context;
     private final Clock clock = new ClockMock();
-    private final static Currency CURRENCY = Currency.EUR;
+    private static final Currency CURRENCY = Currency.EUR;
 
     @BeforeClass
     public void setup() {
-        MysqlTestingHelper helper = new MysqlTestingHelper();
-        IDBI dbi = helper.getDBI();
+        final MysqlTestingHelper helper = new MysqlTestingHelper();
+        final IDBI dbi = helper.getDBI();
         invoiceSqlDao = dbi.onDemand(InvoiceSqlDao.class);
         invoiceSqlDao.test();
 
-        NextBillingDatePoster nextBillingDatePoster = new MockNextBillingDatePoster();
+        final NextBillingDatePoster nextBillingDatePoster = new MockNextBillingDatePoster();
         final TagDefinitionDao tagDefinitionDao = new MockTagDefinitionDao();
         final TagDao tagDao = new MockTagDao();
         final TagUserApi tagUserApi = new DefaultTagUserApi(tagDefinitionDao, tagDao);
-        InvoiceDao invoiceDao = new DefaultInvoiceDao(dbi, nextBillingDatePoster, tagUserApi);
+        final InvoiceDao invoiceDao = new DefaultInvoiceDao(dbi, nextBillingDatePoster, tagUserApi);
         invoicePaymentApi = new DefaultInvoicePaymentApi(invoiceDao);
 
         context = new TestCallContext("Charge back tests");
@@ -87,34 +86,34 @@ public class ChargeBackTests {
 
     @Test
     public void testCompleteChargeBack() throws InvoiceApiException {
-        Invoice invoice = createAndPersistInvoice(THIRTY);
-        InvoicePayment payment = createAndPersistPayment(invoice.getId(), THIRTY);
+        final Invoice invoice = createAndPersistInvoice(THIRTY);
+        final InvoicePayment payment = createAndPersistPayment(invoice.getId(), THIRTY);
 
         // create a full charge back
         invoicePaymentApi.processChargeback(payment.getId(), THIRTY, context);
 
         // check amount owed
-        BigDecimal amount = invoicePaymentApi.getRemainingAmountPaid(payment.getId());
+        final BigDecimal amount = invoicePaymentApi.getRemainingAmountPaid(payment.getId());
         assertTrue(amount.compareTo(BigDecimal.ZERO) == 0);
     }
 
     @Test
     public void testPartialChargeBack() throws InvoiceApiException {
-        Invoice invoice = createAndPersistInvoice(THIRTY);
-        InvoicePayment payment = createAndPersistPayment(invoice.getId(), THIRTY);
+        final Invoice invoice = createAndPersistInvoice(THIRTY);
+        final InvoicePayment payment = createAndPersistPayment(invoice.getId(), THIRTY);
 
         // create a partial charge back
         invoicePaymentApi.processChargeback(payment.getId(), FIFTEEN, context);
 
         // check amount owed
-        BigDecimal amount = invoicePaymentApi.getRemainingAmountPaid(payment.getId());
+        final BigDecimal amount = invoicePaymentApi.getRemainingAmountPaid(payment.getId());
         assertTrue(amount.compareTo(FIFTEEN) == 0);
     }
 
     @Test(expectedExceptions = InvoiceApiException.class)
     public void testChargeBackLargerThanPaymentAmount() throws InvoiceApiException {
-        Invoice invoice = createAndPersistInvoice(THIRTY);
-        InvoicePayment payment = createAndPersistPayment(invoice.getId(), THIRTY);
+        final Invoice invoice = createAndPersistInvoice(THIRTY);
+        final InvoicePayment payment = createAndPersistPayment(invoice.getId(), THIRTY);
 
         // create a large charge back
         invoicePaymentApi.processChargeback(payment.getId(), ONE_MILLION, context);
@@ -122,8 +121,8 @@ public class ChargeBackTests {
 
     @Test(expectedExceptions = InvoiceApiException.class)
     public void testNegativeChargeBackAmount() throws InvoiceApiException {
-        Invoice invoice = createAndPersistInvoice(THIRTY);
-        InvoicePayment payment = createAndPersistPayment(invoice.getId(), THIRTY);
+        final Invoice invoice = createAndPersistInvoice(THIRTY);
+        final InvoicePayment payment = createAndPersistPayment(invoice.getId(), THIRTY);
 
         // create a partial charge back
         invoicePaymentApi.processChargeback(payment.getId(), BigDecimal.ONE.negate(), context);
@@ -131,9 +130,9 @@ public class ChargeBackTests {
 
     @Test
     public void testGetAccountIdFromPaymentIdHappyPath() throws InvoiceApiException {
-        Invoice invoice = createAndPersistInvoice(THIRTY);
-        InvoicePayment payment = createAndPersistPayment(invoice.getId(), THIRTY);
-        UUID accountId = invoicePaymentApi.getAccountIdFromInvoicePaymentId(payment.getId());
+        final Invoice invoice = createAndPersistInvoice(THIRTY);
+        final InvoicePayment payment = createAndPersistPayment(invoice.getId(), THIRTY);
+        final UUID accountId = invoicePaymentApi.getAccountIdFromInvoicePaymentId(payment.getId());
         assertEquals(accountId, invoice.getAccountId());
     }
 
@@ -144,20 +143,20 @@ public class ChargeBackTests {
 
     @Test
     public void testGetChargeBacksByAccountIdWithEmptyReturnSet() throws InvoiceApiException {
-        List<InvoicePayment> chargebacks = invoicePaymentApi.getChargebacksByAccountId(UUID.randomUUID());
+        final List<InvoicePayment> chargebacks = invoicePaymentApi.getChargebacksByAccountId(UUID.randomUUID());
         assertNotNull(chargebacks);
         assertEquals(chargebacks.size(), 0);
     }
 
     @Test
     public void testGetChargeBacksByAccountIdHappyPath() throws InvoiceApiException {
-        Invoice invoice = createAndPersistInvoice(THIRTY);
-        InvoicePayment payment = createAndPersistPayment(invoice.getId(), THIRTY);
+        final Invoice invoice = createAndPersistInvoice(THIRTY);
+        final InvoicePayment payment = createAndPersistPayment(invoice.getId(), THIRTY);
 
         // create a partial charge back
         invoicePaymentApi.processChargeback(payment.getId(), FIFTEEN, context);
 
-        List<InvoicePayment> chargebacks = invoicePaymentApi.getChargebacksByAccountId(invoice.getAccountId());
+        final List<InvoicePayment> chargebacks = invoicePaymentApi.getChargebacksByAccountId(invoice.getAccountId());
         assertNotNull(chargebacks);
         assertEquals(chargebacks.size(), 1);
         assertEquals(chargebacks.get(0).getReversedInvoicePaymentId(), payment.getId());
@@ -165,30 +164,30 @@ public class ChargeBackTests {
 
     @Test
     public void testGetChargeBacksByPaymentAttemptIdWithEmptyReturnSet() throws InvoiceApiException {
-        List<InvoicePayment> chargebacks = invoicePaymentApi.getChargebacksByPaymentAttemptId(UUID.randomUUID());
+        final List<InvoicePayment> chargebacks = invoicePaymentApi.getChargebacksByPaymentAttemptId(UUID.randomUUID());
         assertNotNull(chargebacks);
         assertEquals(chargebacks.size(), 0);
     }
 
     @Test
     public void testGetChargeBacksByInvoicePaymentIdHappyPath() throws InvoiceApiException {
-        Invoice invoice = createAndPersistInvoice(THIRTY);
-        InvoicePayment payment = createAndPersistPayment(invoice.getId(), THIRTY);
+        final Invoice invoice = createAndPersistInvoice(THIRTY);
+        final InvoicePayment payment = createAndPersistPayment(invoice.getId(), THIRTY);
 
         // create a partial charge back
         invoicePaymentApi.processChargeback(payment.getId(), FIFTEEN, context);
 
-        List<InvoicePayment> chargebacks = invoicePaymentApi.getChargebacksByPaymentAttemptId(payment.getPaymentAttemptId());
+        final List<InvoicePayment> chargebacks = invoicePaymentApi.getChargebacksByPaymentAttemptId(payment.getPaymentAttemptId());
         assertNotNull(chargebacks);
         assertEquals(chargebacks.size(), 1);
         assertEquals(chargebacks.get(0).getReversedInvoicePaymentId(), payment.getId());
     }
 
-    private Invoice createAndPersistInvoice(BigDecimal amount) {
-        Invoice invoice = BrainDeadProxyFactory.createBrainDeadProxyFor(Invoice.class);
-        UUID invoiceId = UUID.randomUUID();
-        UUID accountId = UUID.randomUUID();
-        ZombieControl zombie = (ZombieControl) invoice;
+    private Invoice createAndPersistInvoice(final BigDecimal amount) {
+        final Invoice invoice = BrainDeadProxyFactory.createBrainDeadProxyFor(Invoice.class);
+        final UUID invoiceId = UUID.randomUUID();
+        final UUID accountId = UUID.randomUUID();
+        final ZombieControl zombie = (ZombieControl) invoice;
         zombie.addResult("getId", invoiceId);
         zombie.addResult("getAccountId", accountId);
         zombie.addResult("getInvoiceDate", clock.getUTCNow());
@@ -196,7 +195,7 @@ public class ChargeBackTests {
         zombie.addResult("getCurrency", CURRENCY);
         zombie.addResult("isMigrationInvoice", false);
 
-        List<InvoiceItem> items = new ArrayList<InvoiceItem>();
+        final List<InvoiceItem> items = new ArrayList<InvoiceItem>();
         items.add(createInvoiceItem(invoiceId, accountId, amount));
         zombie.addResult("getInvoiceItems", items);
 
@@ -205,14 +204,14 @@ public class ChargeBackTests {
         return invoice;
     }
 
-    private InvoiceItem createInvoiceItem(UUID invoiceId, UUID accountId, BigDecimal amount) {
+    private InvoiceItem createInvoiceItem(final UUID invoiceId, final UUID accountId, final BigDecimal amount) {
         return new FixedPriceInvoiceItem(invoiceId, accountId, UUID.randomUUID(), UUID.randomUUID(),
-                "charge back test", "charge back phase", clock.getUTCNow(), clock.getUTCNow(), amount, CURRENCY);
+                                         "charge back test", "charge back phase", clock.getUTCNow(), clock.getUTCNow(), amount, CURRENCY);
     }
 
-    private InvoicePayment createAndPersistPayment(UUID invoiceId, BigDecimal amount) {
-        InvoicePayment payment = BrainDeadProxyFactory.createBrainDeadProxyFor(InvoicePayment.class);
-        ZombieControl zombie = (ZombieControl) payment;
+    private InvoicePayment createAndPersistPayment(final UUID invoiceId, final BigDecimal amount) {
+        final InvoicePayment payment = BrainDeadProxyFactory.createBrainDeadProxyFor(InvoicePayment.class);
+        final ZombieControl zombie = (ZombieControl) payment;
         zombie.addResult("getId", UUID.randomUUID());
         zombie.addResult("getInvoiceId", invoiceId);
         zombie.addResult("getPaymentAttemptId", UUID.randomUUID());
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java
index 8f381bc..7441173 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java
@@ -16,11 +16,7 @@
 
 package com.ning.billing.invoice.tests;
 
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertNull;
-import static org.testng.Assert.assertTrue;
-
+import javax.annotation.Nullable;
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -29,8 +25,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
-import javax.annotation.Nullable;
-
 import org.joda.time.DateTime;
 import org.testng.annotations.Test;
 
@@ -54,8 +48,8 @@ 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.model.CreditInvoiceItem;
-import com.ning.billing.invoice.model.DefaultInvoiceGenerator;
 import com.ning.billing.invoice.model.DefaultInvoice;
+import com.ning.billing.invoice.model.DefaultInvoiceGenerator;
 import com.ning.billing.invoice.model.DefaultInvoicePayment;
 import com.ning.billing.invoice.model.FixedPriceInvoiceItem;
 import com.ning.billing.invoice.model.InvoiceGenerator;
@@ -66,6 +60,11 @@ import com.ning.billing.mock.BrainDeadProxyFactory.ZombieControl;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.clock.DefaultClock;
 
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
 @Test(groups = {"fast", "invoicing", "invoiceGenerator"})
 public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
     private final InvoiceGenerator generator;
@@ -73,8 +72,8 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
     public DefaultInvoiceGeneratorTests() {
         super();
 
-        Clock clock = new DefaultClock();
-        InvoiceConfig invoiceConfig = new InvoiceConfig() {
+        final Clock clock = new DefaultClock();
+        final InvoiceConfig invoiceConfig = new InvoiceConfig() {
             @Override
             public long getSleepTimeMs() {
                 throw new UnsupportedOperationException();
@@ -95,39 +94,39 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
 
     @Test
     public void testWithNullEventSetAndNullInvoiceSet() throws InvoiceApiException {
-        UUID accountId = UUID.randomUUID();
-        Invoice invoice = generator.generateInvoice(accountId, null, null, new DateTime(), Currency.USD);
+        final UUID accountId = UUID.randomUUID();
+        final Invoice invoice = generator.generateInvoice(accountId, null, null, new DateTime(), Currency.USD);
 
         assertNull(invoice);
     }
 
     @Test
     public void testWithEmptyEventSet() throws InvoiceApiException {
-        BillingEventSet events = new MockBillingEventSet();
+        final BillingEventSet events = new MockBillingEventSet();
 
-        UUID accountId = UUID.randomUUID();
-        Invoice invoice = generator.generateInvoice(accountId, events, null, new DateTime(), Currency.USD);
+        final UUID accountId = UUID.randomUUID();
+        final Invoice invoice = generator.generateInvoice(accountId, events, null, new DateTime(), Currency.USD);
 
         assertNull(invoice);
     }
 
     @Test
     public void testWithSingleMonthlyEvent() throws InvoiceApiException, CatalogApiException {
-        BillingEventSet events = new MockBillingEventSet();
+        final BillingEventSet events = new MockBillingEventSet();
 
-        Subscription sub = createZombieSubscription();
-        DateTime startDate = buildDateTime(2011, 9, 1);
+        final Subscription sub = createZombieSubscription();
+        final DateTime startDate = buildDateTime(2011, 9, 1);
 
-        Plan plan = new MockPlan();
-        BigDecimal rate1 = TEN;
-        PlanPhase phase = createMockMonthlyPlanPhase(rate1);
+        final Plan plan = new MockPlan();
+        final BigDecimal rate1 = TEN;
+        final PlanPhase phase = createMockMonthlyPlanPhase(rate1);
 
-        BillingEvent event = createBillingEvent(sub.getId(), startDate, plan, phase, 1);
+        final BillingEvent event = createBillingEvent(sub.getId(), startDate, plan, phase, 1);
         events.add(event);
 
-        DateTime targetDate = buildDateTime(2011, 10, 3);
-        UUID accountId = UUID.randomUUID();
-        Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
+        final DateTime targetDate = buildDateTime(2011, 10, 3);
+        final UUID accountId = UUID.randomUUID();
+        final Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
 
         assertNotNull(invoice);
         assertEquals(invoice.getNumberOfItems(), 2);
@@ -139,8 +138,8 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
         return createZombieSubscription(UUID.randomUUID());
     }
 
-    private Subscription createZombieSubscription(UUID subscriptionId) {
-        Subscription sub = BrainDeadProxyFactory.createBrainDeadProxyFor(Subscription.class);
+    private Subscription createZombieSubscription(final UUID subscriptionId) {
+        final Subscription sub = BrainDeadProxyFactory.createBrainDeadProxyFor(Subscription.class);
         ((ZombieControl) sub).addResult("getId", subscriptionId);
         ((ZombieControl) sub).addResult("getBundleId", UUID.randomUUID());
 
@@ -149,53 +148,53 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
 
     @Test
     public void testWithSingleMonthlyEventWithLeadingProRation() throws InvoiceApiException, CatalogApiException {
-        BillingEventSet events = new MockBillingEventSet();
+        final BillingEventSet events = new MockBillingEventSet();
 
-        Subscription sub = createZombieSubscription();
-        DateTime startDate = buildDateTime(2011, 9, 1);
+        final Subscription sub = createZombieSubscription();
+        final DateTime startDate = buildDateTime(2011, 9, 1);
 
-        Plan plan = new MockPlan();
-        BigDecimal rate = TEN;
-        PlanPhase phase = createMockMonthlyPlanPhase(rate);
-        BillingEvent event = createBillingEvent(sub.getId(), startDate, plan, phase, 15);
+        final Plan plan = new MockPlan();
+        final BigDecimal rate = TEN;
+        final PlanPhase phase = createMockMonthlyPlanPhase(rate);
+        final BillingEvent event = createBillingEvent(sub.getId(), startDate, plan, phase, 15);
         events.add(event);
 
-        DateTime targetDate = buildDateTime(2011, 10, 3);
-        UUID accountId = UUID.randomUUID();
-        Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
+        final DateTime targetDate = buildDateTime(2011, 10, 3);
+        final UUID accountId = UUID.randomUUID();
+        final Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
 
         assertNotNull(invoice);
         assertEquals(invoice.getNumberOfItems(), 2);
 
-        BigDecimal expectedNumberOfBillingCycles;
+        final BigDecimal expectedNumberOfBillingCycles;
         expectedNumberOfBillingCycles = ONE.add(FOURTEEN.divide(THIRTY_ONE, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD));
-        BigDecimal expectedAmount = expectedNumberOfBillingCycles.multiply(rate).setScale(NUMBER_OF_DECIMALS, ROUNDING_METHOD);
+        final BigDecimal expectedAmount = expectedNumberOfBillingCycles.multiply(rate).setScale(NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         assertEquals(invoice.getBalance(), expectedAmount);
     }
 
     @Test
     public void testTwoMonthlySubscriptionsWithAlignedBillingDates() throws InvoiceApiException, CatalogApiException {
-        BillingEventSet events = new MockBillingEventSet();
+        final BillingEventSet events = new MockBillingEventSet();
 
-        Plan plan1 = new MockPlan();
-        BigDecimal rate1 = FIVE;
-        PlanPhase phase1 = createMockMonthlyPlanPhase(rate1);
+        final Plan plan1 = new MockPlan();
+        final BigDecimal rate1 = FIVE;
+        final PlanPhase phase1 = createMockMonthlyPlanPhase(rate1);
 
-        Plan plan2 = new MockPlan();
-        BigDecimal rate2 = TEN;
-        PlanPhase phase2 = createMockMonthlyPlanPhase(rate2);
+        final Plan plan2 = new MockPlan();
+        final BigDecimal rate2 = TEN;
+        final PlanPhase phase2 = createMockMonthlyPlanPhase(rate2);
 
-        Subscription sub = createZombieSubscription();
+        final Subscription sub = createZombieSubscription();
 
-        BillingEvent event1 = createBillingEvent(sub.getId(), buildDateTime(2011, 9, 1), plan1, phase1, 1);
+        final BillingEvent event1 = createBillingEvent(sub.getId(), buildDateTime(2011, 9, 1), plan1, phase1, 1);
         events.add(event1);
 
-        BillingEvent event2 = createBillingEvent(sub.getId(), buildDateTime(2011, 10, 1), plan2, phase2, 1);
+        final BillingEvent event2 = createBillingEvent(sub.getId(), buildDateTime(2011, 10, 1), plan2, phase2, 1);
         events.add(event2);
 
-        DateTime targetDate = buildDateTime(2011, 10, 3);
-        UUID accountId = UUID.randomUUID();
-        Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
+        final DateTime targetDate = buildDateTime(2011, 10, 3);
+        final UUID accountId = UUID.randomUUID();
+        final Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
 
         assertNotNull(invoice);
         assertEquals(invoice.getNumberOfItems(), 2);
@@ -204,32 +203,32 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
 
     @Test
     public void testOnePlan_TwoMonthlyPhases_ChangeImmediate() throws InvoiceApiException, CatalogApiException {
-        BillingEventSet events = new MockBillingEventSet();
+        final BillingEventSet events = new MockBillingEventSet();
 
-        Plan plan1 = new MockPlan();
-        BigDecimal rate1 = FIVE;
-        PlanPhase phase1 = createMockMonthlyPlanPhase(rate1);
+        final Plan plan1 = new MockPlan();
+        final BigDecimal rate1 = FIVE;
+        final PlanPhase phase1 = createMockMonthlyPlanPhase(rate1);
 
-        Subscription sub = createZombieSubscription();
-        BillingEvent event1 = createBillingEvent(sub.getId(), buildDateTime(2011, 9, 1), plan1,phase1, 1);
+        final Subscription sub = createZombieSubscription();
+        final BillingEvent event1 = createBillingEvent(sub.getId(), buildDateTime(2011, 9, 1), plan1, phase1, 1);
         events.add(event1);
 
-        BigDecimal rate2 = TEN;
-        PlanPhase phase2 = createMockMonthlyPlanPhase(rate2);
-        BillingEvent event2 = createBillingEvent(sub.getId(), buildDateTime(2011, 10, 15), plan1, phase2, 15);
+        final BigDecimal rate2 = TEN;
+        final PlanPhase phase2 = createMockMonthlyPlanPhase(rate2);
+        final BillingEvent event2 = createBillingEvent(sub.getId(), buildDateTime(2011, 10, 15), plan1, phase2, 15);
         events.add(event2);
 
-        DateTime targetDate = buildDateTime(2011, 12, 3);
-        UUID accountId = UUID.randomUUID();
-        Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
+        final DateTime targetDate = buildDateTime(2011, 12, 3);
+        final UUID accountId = UUID.randomUUID();
+        final Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
 
         assertNotNull(invoice);
         assertEquals(invoice.getNumberOfItems(), 4);
 
-        BigDecimal numberOfCyclesEvent1;
+        final BigDecimal numberOfCyclesEvent1;
         numberOfCyclesEvent1 = ONE.add(FOURTEEN.divide(THIRTY_ONE, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD));
 
-        BigDecimal numberOfCyclesEvent2 = TWO;
+        final BigDecimal numberOfCyclesEvent2 = TWO;
 
         BigDecimal expectedValue;
         expectedValue = numberOfCyclesEvent1.multiply(rate1);
@@ -241,29 +240,29 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
 
     @Test
     public void testOnePlan_ThreeMonthlyPhases_ChangeEOT() throws InvoiceApiException, CatalogApiException {
-        BillingEventSet events = new MockBillingEventSet();
+        final BillingEventSet events = new MockBillingEventSet();
 
-        Plan plan1 = new MockPlan();
-        BigDecimal rate1 = FIVE;
-        PlanPhase phase1 = createMockMonthlyPlanPhase(rate1);
+        final Plan plan1 = new MockPlan();
+        final BigDecimal rate1 = FIVE;
+        final PlanPhase phase1 = createMockMonthlyPlanPhase(rate1);
 
-        Subscription sub = createZombieSubscription();
-        BillingEvent event1 = createBillingEvent(sub.getId(), buildDateTime(2011, 9, 1), plan1, phase1, 1);
+        final Subscription sub = createZombieSubscription();
+        final BillingEvent event1 = createBillingEvent(sub.getId(), buildDateTime(2011, 9, 1), plan1, phase1, 1);
         events.add(event1);
 
-        BigDecimal rate2 = TEN;
-        PlanPhase phase2 = createMockMonthlyPlanPhase(rate2);
-        BillingEvent event2 = createBillingEvent(sub.getId(), buildDateTime(2011, 10, 1), plan1, phase2, 1);
+        final BigDecimal rate2 = TEN;
+        final PlanPhase phase2 = createMockMonthlyPlanPhase(rate2);
+        final BillingEvent event2 = createBillingEvent(sub.getId(), buildDateTime(2011, 10, 1), plan1, phase2, 1);
         events.add(event2);
 
-        BigDecimal rate3 = THIRTY;
-        PlanPhase phase3 = createMockMonthlyPlanPhase(rate3);
-        BillingEvent event3 = createBillingEvent(sub.getId(), buildDateTime(2011, 11, 1), plan1, phase3, 1);
+        final BigDecimal rate3 = THIRTY;
+        final PlanPhase phase3 = createMockMonthlyPlanPhase(rate3);
+        final BillingEvent event3 = createBillingEvent(sub.getId(), buildDateTime(2011, 11, 1), plan1, phase3, 1);
         events.add(event3);
 
-        DateTime targetDate = buildDateTime(2011, 12, 3);
-        UUID accountId = UUID.randomUUID();
-        Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
+        final DateTime targetDate = buildDateTime(2011, 12, 3);
+        final UUID accountId = UUID.randomUUID();
+        final Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
 
         assertNotNull(invoice);
         assertEquals(invoice.getNumberOfItems(), 4);
@@ -272,26 +271,26 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
 
     @Test
     public void testSingleEventWithExistingInvoice() throws InvoiceApiException, CatalogApiException {
-        BillingEventSet events = new MockBillingEventSet();
+        final BillingEventSet events = new MockBillingEventSet();
 
-        Subscription sub = createZombieSubscription();
-        DateTime startDate = buildDateTime(2011, 9, 1);
+        final Subscription sub = createZombieSubscription();
+        final DateTime startDate = buildDateTime(2011, 9, 1);
 
-        Plan plan1 = new MockPlan();
-        BigDecimal rate = FIVE;
-        PlanPhase phase1 = createMockMonthlyPlanPhase(rate);
+        final Plan plan1 = new MockPlan();
+        final BigDecimal rate = FIVE;
+        final PlanPhase phase1 = createMockMonthlyPlanPhase(rate);
 
-        BillingEvent event1 = createBillingEvent(sub.getId(), startDate, plan1, phase1, 1);
+        final BillingEvent event1 = createBillingEvent(sub.getId(), startDate, plan1, phase1, 1);
         events.add(event1);
 
         DateTime targetDate = buildDateTime(2011, 12, 1);
-        UUID accountId = UUID.randomUUID();
-        Invoice invoice1 = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
-        List<Invoice> existingInvoices = new ArrayList<Invoice>();
+        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 = buildDateTime(2011, 12, 3);
-        Invoice invoice2 = generator.generateInvoice(accountId, events, existingInvoices, targetDate, Currency.USD);
+        final Invoice invoice2 = generator.generateInvoice(accountId, events, existingInvoices, targetDate, Currency.USD);
 
         assertNull(invoice2);
     }
@@ -304,52 +303,52 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
         // plan 3: change of term from monthly (BCD = 20) to annual (BCD = 31; immediate)
         // plan 4: change of plan, effective EOT, BCD = 7 (covers change of plan)
         // plan 5: addon to plan 2, with bill cycle alignment to plan; immediate cancellation
-        UUID accountId = UUID.randomUUID();
-        UUID subscriptionId1 = UUID.randomUUID();
-        UUID subscriptionId2 = UUID.randomUUID();
-        UUID subscriptionId3 = UUID.randomUUID();
-        UUID subscriptionId4 = UUID.randomUUID();
-        UUID subscriptionId5 = UUID.randomUUID();
-
-        Plan plan1 = new MockPlan("Change from trial to discount with immediate cancellation");
-        PlanPhase plan1Phase1 = createMockMonthlyPlanPhase(EIGHT, PhaseType.TRIAL);
-        PlanPhase plan1Phase2 = createMockMonthlyPlanPhase(TWELVE, PhaseType.DISCOUNT);
-        PlanPhase plan1Phase3 = createMockMonthlyPlanPhase();
-        DateTime plan1StartDate = buildDateTime(2011, 1, 5);
-        DateTime plan1PhaseChangeDate = buildDateTime(2011, 4, 5);
-        DateTime plan1CancelDate = buildDateTime(2011, 4, 29);
-
-        Plan plan2 = new MockPlan("Change phase from trial to discount to evergreen");
-        PlanPhase plan2Phase1 = createMockMonthlyPlanPhase(TWENTY, PhaseType.TRIAL);
-        PlanPhase plan2Phase2 = createMockMonthlyPlanPhase(THIRTY, PhaseType.DISCOUNT);
-        PlanPhase plan2Phase3 = createMockMonthlyPlanPhase(FORTY, PhaseType.EVERGREEN);
-        DateTime plan2StartDate = buildDateTime(2011, 3, 10);
-        DateTime plan2PhaseChangeToDiscountDate = buildDateTime(2011, 6, 10);
-        DateTime plan2PhaseChangeToEvergreenDate = buildDateTime(2011, 9, 10);
-
-        Plan plan3 = new MockPlan("Upgrade with immediate change, BCD = 31");
-        PlanPhase plan3Phase1 = createMockMonthlyPlanPhase(TEN, PhaseType.EVERGREEN);
-        PlanPhase plan3Phase2 = createMockAnnualPlanPhase(ONE_HUNDRED, PhaseType.EVERGREEN);
-        DateTime plan3StartDate = buildDateTime(2011, 5, 20);
-        DateTime plan3UpgradeToAnnualDate = buildDateTime(2011, 7, 31);
-
-        Plan plan4a = new MockPlan("Plan change effective EOT; plan 1");
-        Plan plan4b = new MockPlan("Plan change effective EOT; plan 2");
-        PlanPhase plan4aPhase1 = createMockMonthlyPlanPhase(FIFTEEN);
-        PlanPhase plan4bPhase1 = createMockMonthlyPlanPhase(TWENTY_FOUR);
-
-        DateTime plan4StartDate = buildDateTime(2011, 6, 7);
-        DateTime plan4ChangeOfPlanDate = buildDateTime(2011, 8, 7);
-
-        Plan plan5 = new MockPlan("Add-on");
-        PlanPhase plan5Phase1 = createMockMonthlyPlanPhase(TWENTY);
-        PlanPhase plan5Phase2 = createMockMonthlyPlanPhase();
-        DateTime plan5StartDate = buildDateTime(2011, 6, 21);
-        DateTime plan5CancelDate = buildDateTime(2011, 10, 7);
+        final UUID accountId = UUID.randomUUID();
+        final UUID subscriptionId1 = UUID.randomUUID();
+        final UUID subscriptionId2 = UUID.randomUUID();
+        final UUID subscriptionId3 = UUID.randomUUID();
+        final UUID subscriptionId4 = UUID.randomUUID();
+        final UUID subscriptionId5 = UUID.randomUUID();
+
+        final Plan plan1 = new MockPlan("Change from trial to discount with immediate cancellation");
+        final PlanPhase plan1Phase1 = createMockMonthlyPlanPhase(EIGHT, PhaseType.TRIAL);
+        final PlanPhase plan1Phase2 = createMockMonthlyPlanPhase(TWELVE, PhaseType.DISCOUNT);
+        final PlanPhase plan1Phase3 = createMockMonthlyPlanPhase();
+        final DateTime plan1StartDate = buildDateTime(2011, 1, 5);
+        final DateTime plan1PhaseChangeDate = buildDateTime(2011, 4, 5);
+        final DateTime plan1CancelDate = buildDateTime(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 DateTime plan2StartDate = buildDateTime(2011, 3, 10);
+        final DateTime plan2PhaseChangeToDiscountDate = buildDateTime(2011, 6, 10);
+        final DateTime plan2PhaseChangeToEvergreenDate = buildDateTime(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 DateTime plan3StartDate = buildDateTime(2011, 5, 20);
+        final DateTime plan3UpgradeToAnnualDate = buildDateTime(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 DateTime plan4StartDate = buildDateTime(2011, 6, 7);
+        final DateTime plan4ChangeOfPlanDate = buildDateTime(2011, 8, 7);
+
+        final Plan plan5 = new MockPlan("Add-on");
+        final PlanPhase plan5Phase1 = createMockMonthlyPlanPhase(TWENTY);
+        final PlanPhase plan5Phase2 = createMockMonthlyPlanPhase();
+        final DateTime plan5StartDate = buildDateTime(2011, 6, 21);
+        final DateTime plan5CancelDate = buildDateTime(2011, 10, 7);
 
         BigDecimal expectedAmount;
-        List<Invoice> invoices = new ArrayList<Invoice>();
-        BillingEventSet events = new MockBillingEventSet();
+        final List<Invoice> invoices = new ArrayList<Invoice>();
+        final BillingEventSet events = new MockBillingEventSet();
 
         // on 1/5/2011, create subscription 1 (trial)
         events.add(createBillingEvent(subscriptionId1, plan1StartDate, plan1, plan1Phase1, 5));
@@ -358,7 +357,7 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
 
         // on 2/5/2011, invoice subscription 1 (trial)
         expectedAmount = EIGHT;
-        testInvoiceGeneration(accountId, events, invoices, buildDateTime(2011, 2, 5) , 1, expectedAmount);
+        testInvoiceGeneration(accountId, events, invoices, buildDateTime(2011, 2, 5), 1, expectedAmount);
 
         // on 3/5/2011, invoice subscription 1 (trial)
         expectedAmount = EIGHT;
@@ -454,33 +453,33 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
         testInvoiceGeneration(accountId, events, invoices, plan5CancelDate, 3, expectedAmount);
 
         // on 10/10/2011, invoice plan 2 (evergreen)
-        expectedAmount = FORTY ;
+        expectedAmount = FORTY;
         testInvoiceGeneration(accountId, events, invoices, buildDateTime(2011, 10, 10), 1, expectedAmount);
     }
 
     @Test
     public void testZeroDollarEvents() throws InvoiceApiException, CatalogApiException {
-        Plan plan = new MockPlan();
-        PlanPhase planPhase = createMockMonthlyPlanPhase(ZERO);
-        BillingEventSet events = new MockBillingEventSet();
-        DateTime targetDate = buildDateTime(2011, 1, 1);
+        final Plan plan = new MockPlan();
+        final PlanPhase planPhase = createMockMonthlyPlanPhase(ZERO);
+        final BillingEventSet events = new MockBillingEventSet();
+        final DateTime targetDate = buildDateTime(2011, 1, 1);
         events.add(createBillingEvent(UUID.randomUUID(), targetDate, plan, planPhase, 1));
 
-        Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, targetDate, Currency.USD);
+        final Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, targetDate, Currency.USD);
 
         assertEquals(invoice.getNumberOfItems(), 1);
     }
 
     @Test
     public void testEndDateIsCorrect() throws InvoiceApiException, CatalogApiException {
-        Plan plan = new MockPlan();
-        PlanPhase planPhase = createMockMonthlyPlanPhase(ZERO);
-        BillingEventSet events = new MockBillingEventSet();
-        DateTime targetDate = new DateTime();
+        final Plan plan = new MockPlan();
+        final PlanPhase planPhase = createMockMonthlyPlanPhase(ZERO);
+        final BillingEventSet events = new MockBillingEventSet();
+        final DateTime targetDate = new DateTime();
         events.add(createBillingEvent(UUID.randomUUID(), targetDate, plan, planPhase, targetDate.getDayOfMonth()));
 
-        Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, targetDate, Currency.USD);
-        RecurringInvoiceItem item = (RecurringInvoiceItem) invoice.getInvoiceItems().get(0);
+        final Invoice invoice = generator.generateInvoice(UUID.randomUUID(), events, null, targetDate, Currency.USD);
+        final RecurringInvoiceItem item = (RecurringInvoiceItem) invoice.getInvoiceItems().get(0);
 
         // end date of the invoice item should be equal to exactly one month later
         assertEquals(item.getEndDate().compareTo(targetDate.plusMonths(1)), 0);
@@ -488,77 +487,77 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
 
     @Test
     public void testFixedPriceLifeCycle() throws InvoiceApiException {
-        UUID accountId = UUID.randomUUID();
-        Subscription subscription = createZombieSubscription();
+        final UUID accountId = UUID.randomUUID();
+        final Subscription subscription = createZombieSubscription();
 
-        Plan plan = new MockPlan("plan 1");
-        MockInternationalPrice zeroPrice = new MockInternationalPrice(new DefaultPrice(ZERO, Currency.USD));
-        MockInternationalPrice cheapPrice = new MockInternationalPrice(new DefaultPrice(ONE, Currency.USD));
+        final Plan plan = new MockPlan("plan 1");
+        final MockInternationalPrice zeroPrice = new MockInternationalPrice(new DefaultPrice(ZERO, Currency.USD));
+        final MockInternationalPrice cheapPrice = new MockInternationalPrice(new DefaultPrice(ONE, Currency.USD));
 
-        PlanPhase phase1 = new MockPlanPhase(null, zeroPrice, BillingPeriod.NO_BILLING_PERIOD, PhaseType.TRIAL);
-        PlanPhase phase2 = new MockPlanPhase(cheapPrice, null, BillingPeriod.MONTHLY, PhaseType.DISCOUNT);
+        final PlanPhase phase1 = new MockPlanPhase(null, zeroPrice, BillingPeriod.NO_BILLING_PERIOD, PhaseType.TRIAL);
+        final PlanPhase phase2 = new MockPlanPhase(cheapPrice, null, BillingPeriod.MONTHLY, PhaseType.DISCOUNT);
 
-        DateTime changeDate = new DateTime("2012-04-1T00:00:00.000-08:00");
+        final DateTime changeDate = new DateTime("2012-04-1T00:00:00.000-08:00");
 
-        BillingEventSet events = new MockBillingEventSet();
+        final BillingEventSet events = new MockBillingEventSet();
 
-        BillingEvent event1 = createMockBillingEvent(null, subscription, new DateTime("2012-01-1T00:00:00.000-08:00"),
-                plan, phase1,
-                ZERO, null, Currency.USD, BillingPeriod.NO_BILLING_PERIOD, 1,
-                BillingModeType.IN_ADVANCE, "Test Event 1", 1L,
-                SubscriptionTransitionType.CREATE);
+        final BillingEvent event1 = createMockBillingEvent(null, subscription, new DateTime("2012-01-1T00:00:00.000-08:00"),
+                                                           plan, phase1,
+                                                           ZERO, null, Currency.USD, BillingPeriod.NO_BILLING_PERIOD, 1,
+                                                           BillingModeType.IN_ADVANCE, "Test Event 1", 1L,
+                                                           SubscriptionTransitionType.CREATE);
 
-        BillingEvent event2 = createMockBillingEvent(null, subscription, changeDate,
-                plan, phase2,
-                ZERO, null, Currency.USD, BillingPeriod.NO_BILLING_PERIOD, 1,
-                BillingModeType.IN_ADVANCE, "Test Event 2", 2L,
-                SubscriptionTransitionType.PHASE);
+        final BillingEvent event2 = createMockBillingEvent(null, subscription, changeDate,
+                                                           plan, phase2,
+                                                           ZERO, null, Currency.USD, BillingPeriod.NO_BILLING_PERIOD, 1,
+                                                           BillingModeType.IN_ADVANCE, "Test Event 2", 2L,
+                                                           SubscriptionTransitionType.PHASE);
 
         events.add(event2);
         events.add(event1);
-        Invoice invoice1 = generator.generateInvoice(accountId, events, null, new DateTime("2012-02-01T00:01:00.000-08:00"), Currency.USD);
+        final Invoice invoice1 = generator.generateInvoice(accountId, events, null, new DateTime("2012-02-01T00:01:00.000-08:00"), Currency.USD);
         assertNotNull(invoice1);
         assertEquals(invoice1.getNumberOfItems(), 1);
 
-        List<Invoice> invoiceList = new ArrayList<Invoice>();
+        final List<Invoice> invoiceList = new ArrayList<Invoice>();
         invoiceList.add(invoice1);
-        Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, new DateTime("2012-04-05T00:01:00.000-08:00"), Currency.USD);
+        final Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, new DateTime("2012-04-05T00:01:00.000-08:00"), Currency.USD);
         assertNotNull(invoice2);
         assertEquals(invoice2.getNumberOfItems(), 1);
-        FixedPriceInvoiceItem item = (FixedPriceInvoiceItem) invoice2.getInvoiceItems().get(0);
+        final FixedPriceInvoiceItem item = (FixedPriceInvoiceItem) invoice2.getInvoiceItems().get(0);
         assertEquals(item.getStartDate().compareTo(changeDate), 0);
-   }
+    }
 
     @Test
     public void testMixedModeLifeCycle() throws InvoiceApiException, CatalogApiException {
         // create a subscription with a fixed price and recurring price
-        Plan plan1 = new MockPlan();
-        BigDecimal monthlyRate = FIVE;
-        BigDecimal fixedCost = TEN;
-        PlanPhase phase1 = createMockMonthlyPlanPhase(monthlyRate, fixedCost, PhaseType.TRIAL);
+        final Plan plan1 = new MockPlan();
+        final BigDecimal monthlyRate = FIVE;
+        final BigDecimal fixedCost = TEN;
+        final PlanPhase phase1 = createMockMonthlyPlanPhase(monthlyRate, fixedCost, PhaseType.TRIAL);
 
-        BillingEventSet events = new MockBillingEventSet();
-        UUID subscriptionId = UUID.randomUUID();
-        UUID accountId = UUID.randomUUID();
+        final BillingEventSet events = new MockBillingEventSet();
+        final UUID subscriptionId = UUID.randomUUID();
+        final UUID accountId = UUID.randomUUID();
 
-        DateTime startDate = new DateTime(2011, 1, 1, 3, 40, 27, 0);
-        BillingEvent event1 = createBillingEvent(subscriptionId, startDate, plan1, phase1, 1);
+        final DateTime startDate = new DateTime(2011, 1, 1, 3, 40, 27, 0);
+        final BillingEvent event1 = createBillingEvent(subscriptionId, startDate, plan1, phase1, 1);
         events.add(event1);
 
         // ensure both components are invoiced
-        Invoice invoice1 = generator.generateInvoice(accountId, events, null, startDate, Currency.USD);
+        final Invoice invoice1 = generator.generateInvoice(accountId, events, null, startDate, Currency.USD);
         assertNotNull(invoice1);
         assertEquals(invoice1.getNumberOfItems(), 2);
         assertEquals(invoice1.getBalance(), FIFTEEN);
 
-        List<Invoice> invoiceList = new ArrayList<Invoice>();
+        final List<Invoice> invoiceList = new ArrayList<Invoice>();
         invoiceList.add(invoice1);
 
         // move forward in time one billing period
-        DateTime currentDate = startDate.plusMonths(1);
+        final DateTime currentDate = startDate.plusMonths(1);
 
         // ensure that only the recurring price is invoiced
-        Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, currentDate, Currency.USD);
+        final Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, currentDate, Currency.USD);
         assertNotNull(invoice2);
         assertEquals(invoice2.getNumberOfItems(), 1);
         assertEquals(invoice2.getBalance(), FIVE);
@@ -567,36 +566,36 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
     @Test
     public void testFixedModePlanChange() throws InvoiceApiException, CatalogApiException {
         // create a subscription with a fixed price and recurring price
-        Plan plan1 = new MockPlan();
-        BigDecimal fixedCost1 = TEN;
-        BigDecimal fixedCost2 = TWENTY;
-        PlanPhase phase1 = createMockMonthlyPlanPhase(null, fixedCost1, PhaseType.TRIAL);
-        PlanPhase phase2 = createMockMonthlyPlanPhase(null, fixedCost2, PhaseType.EVERGREEN);
-
-        BillingEventSet events = new MockBillingEventSet();
-        UUID subscriptionId = UUID.randomUUID();
-        UUID accountId = UUID.randomUUID();
-
-        DateTime startDate = new DateTime(2011, 1, 1, 3, 40, 27, 0);
-        BillingEvent event1 = createBillingEvent(subscriptionId, startDate, plan1, phase1, 1);
+        final Plan plan1 = new MockPlan();
+        final BigDecimal fixedCost1 = TEN;
+        final BigDecimal fixedCost2 = TWENTY;
+        final PlanPhase phase1 = createMockMonthlyPlanPhase(null, fixedCost1, PhaseType.TRIAL);
+        final PlanPhase phase2 = createMockMonthlyPlanPhase(null, fixedCost2, PhaseType.EVERGREEN);
+
+        final BillingEventSet events = new MockBillingEventSet();
+        final UUID subscriptionId = UUID.randomUUID();
+        final UUID accountId = UUID.randomUUID();
+
+        final DateTime startDate = new DateTime(2011, 1, 1, 3, 40, 27, 0);
+        final BillingEvent event1 = createBillingEvent(subscriptionId, startDate, plan1, phase1, 1);
         events.add(event1);
 
         // ensure that a single invoice item is generated for the fixed cost
-        Invoice invoice1 = generator.generateInvoice(accountId, events, null, startDate, Currency.USD);
+        final Invoice invoice1 = generator.generateInvoice(accountId, events, null, startDate, Currency.USD);
         assertNotNull(invoice1);
         assertEquals(invoice1.getNumberOfItems(), 1);
         assertEquals(invoice1.getBalance(), fixedCost1);
 
-        List<Invoice> invoiceList = new ArrayList<Invoice>();
+        final List<Invoice> invoiceList = new ArrayList<Invoice>();
         invoiceList.add(invoice1);
 
         // move forward in time one billing period
-        DateTime phaseChangeDate = startDate.plusMonths(1);
-        BillingEvent event2 = createBillingEvent(subscriptionId, phaseChangeDate, plan1, phase2, 1);
+        final DateTime phaseChangeDate = startDate.plusMonths(1);
+        final BillingEvent event2 = createBillingEvent(subscriptionId, phaseChangeDate, plan1, phase2, 1);
         events.add(event2);
 
         // ensure that a single invoice item is generated for the fixed cost
-        Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, phaseChangeDate, Currency.USD);
+        final Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, phaseChangeDate, Currency.USD);
         assertNotNull(invoice2);
         assertEquals(invoice2.getNumberOfItems(), 1);
         assertEquals(invoice2.getBalance(), fixedCost2);
@@ -604,39 +603,39 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
 
     @Test
     public void testInvoiceGenerationFailureScenario() throws InvoiceApiException, CatalogApiException {
-        BillingEventSet events = new MockBillingEventSet();
-        UUID subscriptionId = UUID.randomUUID();
-        UUID accountId = UUID.randomUUID();
+        final BillingEventSet events = new MockBillingEventSet();
+        final UUID subscriptionId = UUID.randomUUID();
+        final UUID accountId = UUID.randomUUID();
         final int BILL_CYCLE_DAY = 15;
 
         // create subscription with a zero-dollar trial, a monthly discount period and a monthly evergreen
-        Plan plan1 = new MockPlan();
-        PlanPhase phase1 = createMockMonthlyPlanPhase(null, ZERO, PhaseType.TRIAL);
+        final Plan plan1 = new MockPlan();
+        final PlanPhase phase1 = createMockMonthlyPlanPhase(null, ZERO, PhaseType.TRIAL);
         final BigDecimal DISCOUNT_PRICE = new BigDecimal("9.95");
-        PlanPhase phase2 = createMockMonthlyPlanPhase(DISCOUNT_PRICE, null, PhaseType.DISCOUNT);
-        PlanPhase phase3 = createMockMonthlyPlanPhase(new BigDecimal("19.95"), null, PhaseType.EVERGREEN);
+        final PlanPhase phase2 = createMockMonthlyPlanPhase(DISCOUNT_PRICE, null, PhaseType.DISCOUNT);
+        final PlanPhase phase3 = createMockMonthlyPlanPhase(new BigDecimal("19.95"), null, PhaseType.EVERGREEN);
 
         // set up billing events
-        DateTime creationDate = new DateTime(2012, 3, 6, 21, 36, 18, 896);
+        final DateTime creationDate = new DateTime(2012, 3, 6, 21, 36, 18, 896);
         events.add(createBillingEvent(subscriptionId, creationDate, plan1, phase1, BILL_CYCLE_DAY));
 
         // trialPhaseEndDate = 2012/4/5
-        DateTime trialPhaseEndDate = creationDate.plusDays(30);
+        final DateTime trialPhaseEndDate = creationDate.plusDays(30);
         events.add(createBillingEvent(subscriptionId, trialPhaseEndDate, plan1, phase2, BILL_CYCLE_DAY));
 
         // discountPhaseEndDate = 2012/10/5
-        DateTime discountPhaseEndDate = trialPhaseEndDate.plusMonths(6);
+        final DateTime discountPhaseEndDate = trialPhaseEndDate.plusMonths(6);
         events.add(createBillingEvent(subscriptionId, discountPhaseEndDate, plan1, phase3, BILL_CYCLE_DAY));
 
-        Invoice invoice1 = generator.generateInvoice(accountId, events, null, creationDate, Currency.USD);
+        final Invoice invoice1 = generator.generateInvoice(accountId, events, null, creationDate, Currency.USD);
         assertNotNull(invoice1);
         assertEquals(invoice1.getNumberOfItems(), 1);
         assertEquals(invoice1.getBalance().compareTo(ZERO), 0);
 
-        List<Invoice> invoiceList = new ArrayList<Invoice>();
+        final List<Invoice> invoiceList = new ArrayList<Invoice>();
         invoiceList.add(invoice1);
 
-        Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, trialPhaseEndDate, Currency.USD);
+        final Invoice invoice2 = generator.generateInvoice(accountId, events, invoiceList, trialPhaseEndDate, Currency.USD);
         assertNotNull(invoice2);
         assertEquals(invoice2.getNumberOfItems(), 1);
         assertEquals(invoice2.getInvoiceItems().get(0).getStartDate().compareTo(trialPhaseEndDate), 0);
@@ -644,7 +643,7 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
 
         invoiceList.add(invoice2);
         DateTime targetDate = trialPhaseEndDate.toMutableDateTime().dayOfMonth().set(BILL_CYCLE_DAY).toDateTime();
-        Invoice invoice3 = generator.generateInvoice(accountId, events, invoiceList, targetDate, Currency.USD);
+        final Invoice invoice3 = generator.generateInvoice(accountId, events, invoiceList, targetDate, Currency.USD);
         assertNotNull(invoice3);
         assertEquals(invoice3.getNumberOfItems(), 1);
         assertEquals(invoice3.getInvoiceItems().get(0).getStartDate().compareTo(targetDate), 0);
@@ -652,17 +651,17 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
 
         invoiceList.add(invoice3);
         targetDate = targetDate.plusMonths(6);
-        Invoice invoice4 = generator.generateInvoice(accountId, events, invoiceList, targetDate, Currency.USD);
+        final Invoice invoice4 = generator.generateInvoice(accountId, events, invoiceList, targetDate, Currency.USD);
         assertNotNull(invoice4);
         assertEquals(invoice4.getNumberOfItems(), 7);
     }
 
     @Test(expectedExceptions = {InvoiceApiException.class})
     public void testTargetDateRestrictionFailure() throws InvoiceApiException, CatalogApiException {
-        DateTime targetDate = DateTime.now().plusMonths(60);
-        BillingEventSet events = new MockBillingEventSet();
-        Plan plan1 = new MockPlan();
-        PlanPhase phase1 = createMockMonthlyPlanPhase(null, ZERO, PhaseType.TRIAL);
+        final DateTime targetDate = DateTime.now().plusMonths(60);
+        final BillingEventSet events = new MockBillingEventSet();
+        final Plan plan1 = new MockPlan();
+        final PlanPhase phase1 = createMockMonthlyPlanPhase(null, ZERO, PhaseType.TRIAL);
         events.add(createBillingEvent(UUID.randomUUID(), DateTime.now(), plan1, phase1, 1));
         generator.generateInvoice(UUID.randomUUID(), events, null, targetDate, Currency.USD);
     }
@@ -681,11 +680,11 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
                                  null, BillingPeriod.MONTHLY, phaseType);
     }
 
-    private MockPlanPhase createMockMonthlyPlanPhase(@Nullable BigDecimal recurringRate,
+    private MockPlanPhase createMockMonthlyPlanPhase(@Nullable final BigDecimal recurringRate,
                                                      @Nullable final BigDecimal fixedCost,
                                                      final PhaseType phaseType) {
-        MockInternationalPrice recurringPrice = (recurringRate == null) ? null : new MockInternationalPrice(new DefaultPrice(recurringRate, Currency.USD));
-        MockInternationalPrice fixedPrice = (fixedCost == null) ? null : new MockInternationalPrice(new DefaultPrice(fixedCost, Currency.USD));
+        final MockInternationalPrice recurringPrice = (recurringRate == null) ? null : new MockInternationalPrice(new DefaultPrice(recurringRate, Currency.USD));
+        final MockInternationalPrice fixedPrice = (fixedCost == null) ? null : new MockInternationalPrice(new DefaultPrice(fixedCost, Currency.USD));
 
         return new MockPlanPhase(recurringPrice, fixedPrice, BillingPeriod.MONTHLY, phaseType);
     }
@@ -696,22 +695,22 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
     }
 
     private BillingEvent createBillingEvent(final UUID subscriptionId, final DateTime startDate,
-                                                   final Plan plan, final PlanPhase planPhase, final int billCycleDay) throws CatalogApiException {
-        Subscription sub = createZombieSubscription(subscriptionId);
-        Currency currency = Currency.USD;
+                                            final Plan plan, final PlanPhase planPhase, final int billCycleDay) throws CatalogApiException {
+        final Subscription sub = createZombieSubscription(subscriptionId);
+        final Currency currency = Currency.USD;
 
         return createMockBillingEvent(null, sub, startDate, plan, planPhase,
-                planPhase.getFixedPrice() == null ? null : planPhase.getFixedPrice().getPrice(currency),
-                planPhase.getRecurringPrice() == null ? null : planPhase.getRecurringPrice().getPrice(currency),
-                currency, planPhase.getBillingPeriod(),
-                billCycleDay, BillingModeType.IN_ADVANCE, "Test", 1L, SubscriptionTransitionType.CREATE);
+                                      planPhase.getFixedPrice() == null ? null : planPhase.getFixedPrice().getPrice(currency),
+                                      planPhase.getRecurringPrice() == null ? null : planPhase.getRecurringPrice().getPrice(currency),
+                                      currency, planPhase.getBillingPeriod(),
+                                      billCycleDay, BillingModeType.IN_ADVANCE, "Test", 1L, SubscriptionTransitionType.CREATE);
     }
 
     private void testInvoiceGeneration(final UUID accountId, final BillingEventSet events, final List<Invoice> existingInvoices,
                                        final DateTime targetDate, final int expectedNumberOfItems,
                                        final BigDecimal expectedAmount) throws InvoiceApiException {
-        Currency currency = Currency.USD;
-        Invoice invoice = generator.generateInvoice(accountId, events, existingInvoices, targetDate, currency);
+        final Currency currency = Currency.USD;
+        final Invoice invoice = generator.generateInvoice(accountId, events, existingInvoices, targetDate, currency);
         assertNotNull(invoice);
         assertEquals(invoice.getNumberOfItems(), expectedNumberOfItems);
         existingInvoices.add(invoice);
@@ -722,44 +721,44 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
 
     @Test
     public void testAddOnInvoiceGeneration() throws CatalogApiException, InvoiceApiException {
-        DateTime april25 = new DateTime(2012, 4, 25, 0, 0, 0, 0);
+        final DateTime april25 = new DateTime(2012, 4, 25, 0, 0, 0, 0);
 
         // create a base plan on April 25th
-        UUID accountId = UUID.randomUUID();
-        Subscription baseSubscription = createZombieSubscription();
+        final UUID accountId = UUID.randomUUID();
+        final Subscription baseSubscription = createZombieSubscription();
 
-        Plan basePlan = new MockPlan("base Plan");
-        MockInternationalPrice price5 = new MockInternationalPrice(new DefaultPrice(FIVE, Currency.USD));
-        MockInternationalPrice price10 = new MockInternationalPrice(new DefaultPrice(TEN, Currency.USD));
-        MockInternationalPrice price20 = new MockInternationalPrice(new DefaultPrice(TWENTY, Currency.USD));
-        PlanPhase basePlanEvergreen = new MockPlanPhase(price10, null, BillingPeriod.MONTHLY, PhaseType.EVERGREEN);
+        final Plan basePlan = new MockPlan("base Plan");
+        final MockInternationalPrice price5 = new MockInternationalPrice(new DefaultPrice(FIVE, Currency.USD));
+        final MockInternationalPrice price10 = new MockInternationalPrice(new DefaultPrice(TEN, Currency.USD));
+        final MockInternationalPrice price20 = new MockInternationalPrice(new DefaultPrice(TWENTY, Currency.USD));
+        final PlanPhase basePlanEvergreen = new MockPlanPhase(price10, null, BillingPeriod.MONTHLY, PhaseType.EVERGREEN);
 
-        BillingEventSet events = new MockBillingEventSet();
+        final BillingEventSet events = new MockBillingEventSet();
         events.add(createBillingEvent(baseSubscription.getId(), april25, basePlan, basePlanEvergreen, 25));
 
         // generate invoice
-        Invoice invoice1 = generator.generateInvoice(accountId, events, null, april25, Currency.USD);
+        final Invoice invoice1 = generator.generateInvoice(accountId, events, null, april25, Currency.USD);
         assertNotNull(invoice1);
         assertEquals(invoice1.getNumberOfItems(), 1);
         assertEquals(invoice1.getBalance().compareTo(TEN), 0);
 
-        List<Invoice> invoices = new ArrayList<Invoice>();
+        final List<Invoice> invoices = new ArrayList<Invoice>();
         invoices.add(invoice1);
 
         // create 2 add ons on April 28th
-        DateTime april28 = new DateTime(2012, 4, 28, 0, 0, 0, 0);
-        Subscription addOnSubscription1 = createZombieSubscription();
-        Plan addOn1Plan = new MockPlan("add on 1");
-        PlanPhase addOn1PlanPhaseEvergreen = new MockPlanPhase(price5, null, BillingPeriod.MONTHLY, PhaseType.EVERGREEN);
+        final DateTime april28 = new DateTime(2012, 4, 28, 0, 0, 0, 0);
+        final Subscription addOnSubscription1 = createZombieSubscription();
+        final Plan addOn1Plan = new MockPlan("add on 1");
+        final PlanPhase addOn1PlanPhaseEvergreen = new MockPlanPhase(price5, null, BillingPeriod.MONTHLY, PhaseType.EVERGREEN);
         events.add(createBillingEvent(addOnSubscription1.getId(), april28, addOn1Plan, addOn1PlanPhaseEvergreen, 25));
 
-        Subscription addOnSubscription2 = createZombieSubscription();
-        Plan addOn2Plan = new MockPlan("add on 2");
-        PlanPhase addOn2PlanPhaseEvergreen = new MockPlanPhase(price20, null, BillingPeriod.MONTHLY, PhaseType.EVERGREEN);
+        final Subscription addOnSubscription2 = createZombieSubscription();
+        final Plan addOn2Plan = new MockPlan("add on 2");
+        final PlanPhase addOn2PlanPhaseEvergreen = new MockPlanPhase(price20, null, BillingPeriod.MONTHLY, PhaseType.EVERGREEN);
         events.add(createBillingEvent(addOnSubscription2.getId(), april28, addOn2Plan, addOn2PlanPhaseEvergreen, 25));
 
         // generate invoice
-        Invoice invoice2 = generator.generateInvoice(accountId, events, invoices, april28, Currency.USD);
+        final Invoice invoice2 = generator.generateInvoice(accountId, events, invoices, april28, Currency.USD);
         invoices.add(invoice2);
         assertNotNull(invoice2);
         assertEquals(invoice2.getNumberOfItems(), 2);
@@ -767,16 +766,16 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
 
         // perform a repair (change base plan; remove one add-on)
         // event stream should include just two plans
-        MockBillingEventSet newEvents = new MockBillingEventSet();
-        Plan basePlan2 = new MockPlan("base plan 2");
-        MockInternationalPrice price13 = new MockInternationalPrice(new DefaultPrice(THIRTEEN, Currency.USD));
-        PlanPhase basePlan2Phase = new MockPlanPhase(price13, null, BillingPeriod.MONTHLY, PhaseType.EVERGREEN);
+        final MockBillingEventSet newEvents = new MockBillingEventSet();
+        final Plan basePlan2 = new MockPlan("base plan 2");
+        final MockInternationalPrice price13 = new MockInternationalPrice(new DefaultPrice(THIRTEEN, Currency.USD));
+        final PlanPhase basePlan2Phase = new MockPlanPhase(price13, null, BillingPeriod.MONTHLY, PhaseType.EVERGREEN);
         newEvents.add(createBillingEvent(baseSubscription.getId(), april25, basePlan2, basePlan2Phase, 25));
         newEvents.add(createBillingEvent(addOnSubscription1.getId(), april28, addOn1Plan, addOn1PlanPhaseEvergreen, 25));
 
         // generate invoice
-        DateTime may1 = new DateTime(2012, 5, 1, 0, 0, 0, 0);
-        Invoice invoice3 = generator.generateInvoice(accountId, newEvents, invoices, may1, Currency.USD);
+        final DateTime may1 = new DateTime(2012, 5, 1, 0, 0, 0, 0);
+        final Invoice invoice3 = generator.generateInvoice(accountId, newEvents, invoices, may1, Currency.USD);
         assertNotNull(invoice3);
         assertEquals(invoice3.getNumberOfItems(), 5);
         // -4.50 -18 - 10 (to correct the previous 2 invoices) + 4.50 + 13
@@ -786,22 +785,22 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
     @Test
     public void testRepairForPaidInvoice() throws CatalogApiException, InvoiceApiException {
         // create an invoice
-        DateTime april25 = new DateTime(2012, 4, 25, 0, 0, 0, 0);
+        final DateTime april25 = new DateTime(2012, 4, 25, 0, 0, 0, 0);
 
         // create a base plan on April 25th
-        UUID accountId = UUID.randomUUID();
-        Subscription originalSubscription = createZombieSubscription();
+        final UUID accountId = UUID.randomUUID();
+        final Subscription originalSubscription = createZombieSubscription();
 
-        Plan originalPlan = new MockPlan("original plan");
-        MockInternationalPrice price10 = new MockInternationalPrice(new DefaultPrice(TEN, Currency.USD));
-        PlanPhase originalPlanEvergreen = new MockPlanPhase(price10, null, BillingPeriod.MONTHLY, PhaseType.EVERGREEN);
+        final Plan originalPlan = new MockPlan("original plan");
+        final MockInternationalPrice price10 = new MockInternationalPrice(new DefaultPrice(TEN, Currency.USD));
+        final PlanPhase originalPlanEvergreen = new MockPlanPhase(price10, null, BillingPeriod.MONTHLY, PhaseType.EVERGREEN);
 
-        BillingEventSet events = new MockBillingEventSet();
+        final BillingEventSet events = new MockBillingEventSet();
         events.add(createBillingEvent(originalSubscription.getId(), april25, originalPlan, originalPlanEvergreen, 25));
 
-        Invoice invoice1 = generator.generateInvoice(accountId, events, null, april25, Currency.USD);
+        final Invoice invoice1 = generator.generateInvoice(accountId, events, null, april25, Currency.USD);
         assertEquals(invoice1.getNumberOfItems(), 1);
-        List<Invoice> invoices = new ArrayList<Invoice>();
+        final List<Invoice> invoices = new ArrayList<Invoice>();
         invoices.add(invoice1);
 
         // pay the invoice
@@ -810,14 +809,14 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
 
         // change the plan (i.e. repair) on start date
         events.clear();
-        Subscription newSubscription = createZombieSubscription();
-        Plan newPlan = new MockPlan("new plan");
-        MockInternationalPrice price5 = new MockInternationalPrice(new DefaultPrice(FIVE, Currency.USD));
-        PlanPhase newPlanEvergreen = new MockPlanPhase(price5, null, BillingPeriod.MONTHLY, PhaseType.EVERGREEN);
+        final Subscription newSubscription = createZombieSubscription();
+        final Plan newPlan = new MockPlan("new plan");
+        final MockInternationalPrice price5 = new MockInternationalPrice(new DefaultPrice(FIVE, Currency.USD));
+        final PlanPhase newPlanEvergreen = new MockPlanPhase(price5, null, BillingPeriod.MONTHLY, PhaseType.EVERGREEN);
         events.add(createBillingEvent(newSubscription.getId(), april25, newPlan, newPlanEvergreen, 25));
 
         // generate a new invoice
-        Invoice invoice2 = generator.generateInvoice(accountId, events, invoices, april25, Currency.USD);
+        final Invoice invoice2 = generator.generateInvoice(accountId, events, invoices, april25, Currency.USD);
         assertEquals(invoice2.getNumberOfItems(), 4);
         invoices.add(invoice2);
 
@@ -831,26 +830,26 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
         assertEquals(invoice2.getBalance().compareTo(ZERO), 0);
 
         // ensure that the account has a credit balance
-        BigDecimal creditBalance = invoice1.getAmountCredited().add(invoice2.getAmountCredited());
+        final BigDecimal creditBalance = invoice1.getAmountCredited().add(invoice2.getAmountCredited());
         assertTrue(creditBalance.compareTo(FIVE) == 0);
     }
 
-    private void distributeItems(List<Invoice> invoices) {
-        Map<UUID, Invoice> invoiceMap = new HashMap<UUID, Invoice>();
+    private void distributeItems(final List<Invoice> invoices) {
+        final Map<UUID, Invoice> invoiceMap = new HashMap<UUID, Invoice>();
 
-        for (Invoice invoice : invoices) {
+        for (final Invoice invoice : invoices) {
             invoiceMap.put(invoice.getId(), invoice);
         }
 
-        for (final Invoice invoice: invoices) {
-            Iterator<InvoiceItem> itemIterator = invoice.getInvoiceItems().iterator();
+        for (final Invoice invoice : invoices) {
+            final Iterator<InvoiceItem> itemIterator = invoice.getInvoiceItems().iterator();
             final UUID invoiceId = invoice.getId();
 
             while (itemIterator.hasNext()) {
-                InvoiceItem item = itemIterator.next();
+                final InvoiceItem item = itemIterator.next();
 
                 if (!item.getInvoiceId().equals(invoiceId)) {
-                    Invoice thisInvoice = invoiceMap.get(item.getInvoiceId());
+                    final Invoice thisInvoice = invoiceMap.get(item.getInvoiceId());
                     if (thisInvoice == null) {
                         throw new NullPointerException();
                     }
@@ -863,49 +862,49 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
 
     @Test
     public void testAutoInvoiceOffAccount() throws Exception {
-        MockBillingEventSet events = new MockBillingEventSet();
+        final MockBillingEventSet events = new MockBillingEventSet();
         events.setAccountInvoiceOff(true);
 
-        Subscription sub = createZombieSubscription();
-        DateTime startDate = buildDateTime(2011, 9, 1);
+        final Subscription sub = createZombieSubscription();
+        final DateTime startDate = buildDateTime(2011, 9, 1);
 
-        Plan plan = new MockPlan();
-        BigDecimal rate1 = TEN;
-        PlanPhase phase = createMockMonthlyPlanPhase(rate1);
+        final Plan plan = new MockPlan();
+        final BigDecimal rate1 = TEN;
+        final PlanPhase phase = createMockMonthlyPlanPhase(rate1);
 
-        BillingEvent event = createBillingEvent(sub.getId(), startDate, plan, phase, 1);
+        final BillingEvent event = createBillingEvent(sub.getId(), startDate, plan, phase, 1);
         events.add(event);
 
-        DateTime targetDate = buildDateTime(2011, 10, 3);
-        UUID accountId = UUID.randomUUID();
-        Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
+        final DateTime targetDate = buildDateTime(2011, 10, 3);
+        final UUID accountId = UUID.randomUUID();
+        final Invoice invoice = generator.generateInvoice(accountId, events, null, targetDate, Currency.USD);
 
         assertNull(invoice);
     }
-    
+
     public void testAutoInvoiceOffWithCredits() throws CatalogApiException, InvoiceApiException {
-        Currency currency = Currency.USD;
-        List<Invoice> invoices = new ArrayList<Invoice>();
-        MockBillingEventSet eventSet = new MockBillingEventSet();
-        UUID accountId = UUID.randomUUID();
+        final Currency currency = Currency.USD;
+        final List<Invoice> invoices = new ArrayList<Invoice>();
+        final MockBillingEventSet eventSet = new MockBillingEventSet();
+        final UUID accountId = UUID.randomUUID();
 
-        DateTime startDate = new DateTime(2012, 1, 1, 0, 12, 34, 0);
+        final DateTime startDate = new DateTime(2012, 1, 1, 0, 12, 34, 0);
 
         // add first subscription creation event
-        UUID subscriptionId1 = UUID.randomUUID();
-        Plan plan1 = new MockPlan();
-        PlanPhase plan1phase1 = createMockMonthlyPlanPhase(FIFTEEN, null, PhaseType.DISCOUNT);
-        BillingEvent subscription1creation = createBillingEvent(subscriptionId1, startDate, plan1, plan1phase1, 1);
+        final UUID subscriptionId1 = UUID.randomUUID();
+        final Plan plan1 = new MockPlan();
+        final PlanPhase plan1phase1 = createMockMonthlyPlanPhase(FIFTEEN, null, PhaseType.DISCOUNT);
+        final BillingEvent subscription1creation = createBillingEvent(subscriptionId1, startDate, plan1, plan1phase1, 1);
         eventSet.add(subscription1creation);
 
         // add second subscription creation event
-        UUID subscriptionId2 = UUID.randomUUID();
-        Plan plan2 = new MockPlan();
-        PlanPhase plan2phase1 = createMockMonthlyPlanPhase(TWELVE, null, PhaseType.EVERGREEN);
+        final UUID subscriptionId2 = UUID.randomUUID();
+        final Plan plan2 = new MockPlan();
+        final PlanPhase plan2phase1 = createMockMonthlyPlanPhase(TWELVE, null, PhaseType.EVERGREEN);
         eventSet.add(createBillingEvent(subscriptionId2, startDate, plan2, plan2phase1, 1));
 
         // generate the first invoice
-        Invoice invoice1 = generator.generateInvoice(accountId, eventSet, invoices, startDate, currency);
+        final Invoice invoice1 = generator.generateInvoice(accountId, eventSet, invoices, startDate, currency);
         assertNotNull(invoice1);
         assertTrue(invoice1.getBalance().compareTo(FIFTEEN.add(TWELVE)) == 0);
         invoices.add(invoice1);
@@ -915,51 +914,51 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
         eventSet.remove(subscription1creation);
         eventSet.addSubscriptionWithAutoInvoiceOff(subscriptionId1);
 
-        DateTime targetDate2 = startDate.plusMonths(1);
-        Invoice invoice2 = generator.generateInvoice(accountId, eventSet, invoices, targetDate2, currency);
+        final DateTime targetDate2 = startDate.plusMonths(1);
+        final Invoice invoice2 = generator.generateInvoice(accountId, eventSet, invoices, targetDate2, currency);
         assertNotNull(invoice2);
         assertTrue(invoice2.getBalance().compareTo(TWELVE) == 0);
         invoices.add(invoice2);
 
-        DateTime targetDate3 = targetDate2.plusMonths(1);
+        final DateTime targetDate3 = targetDate2.plusMonths(1);
         eventSet.clearSubscriptionsWithAutoInvoiceOff();
         eventSet.add(subscription1creation);
-        Invoice invoice3 = generator.generateInvoice(accountId, eventSet, invoices, targetDate3, currency);
+        final Invoice invoice3 = generator.generateInvoice(accountId, eventSet, invoices, targetDate3, currency);
         assertNotNull(invoice3);
         assertTrue(invoice3.getBalance().compareTo(FIFTEEN.multiply(TWO).add(TWELVE)) == 0);
     }
 
     @Test
     public void testAccountCredit() throws CatalogApiException, InvoiceApiException {
-        BillingEventSet billingEventSet = new MockBillingEventSet();
-
-        DateTime startDate = new DateTime(2012, 3, 1, 0, 0, 0, 0);
-        UUID accountId = UUID.randomUUID();
-        UUID subscriptionId = UUID.randomUUID();
-        Plan plan = new MockPlan("original plan");
-        MockInternationalPrice price10 = new MockInternationalPrice(new DefaultPrice(TEN, Currency.USD));
-        PlanPhase planPhase = new MockPlanPhase(price10, null, BillingPeriod.MONTHLY, PhaseType.EVERGREEN);
-        BillingEvent creation = createBillingEvent(subscriptionId, startDate, plan, planPhase, 1);
+        final BillingEventSet billingEventSet = new MockBillingEventSet();
+
+        final DateTime startDate = new DateTime(2012, 3, 1, 0, 0, 0, 0);
+        final UUID accountId = UUID.randomUUID();
+        final UUID subscriptionId = UUID.randomUUID();
+        final Plan plan = new MockPlan("original plan");
+        final MockInternationalPrice price10 = new MockInternationalPrice(new DefaultPrice(TEN, Currency.USD));
+        final PlanPhase planPhase = new MockPlanPhase(price10, null, BillingPeriod.MONTHLY, PhaseType.EVERGREEN);
+        final BillingEvent creation = createBillingEvent(subscriptionId, startDate, plan, planPhase, 1);
         billingEventSet.add(creation);
 
-        List<Invoice> invoices = new ArrayList<Invoice>();
+        final List<Invoice> invoices = new ArrayList<Invoice>();
 
-        Invoice initialInvoice = generator.generateInvoice(accountId, billingEventSet, null, startDate, Currency.USD);
+        final Invoice initialInvoice = generator.generateInvoice(accountId, billingEventSet, null, startDate, Currency.USD);
         assertNotNull(initialInvoice);
         assertEquals(initialInvoice.getNumberOfItems(), 1);
         assertEquals(initialInvoice.getBalance().compareTo(TEN), 0);
         invoices.add(initialInvoice);
 
         // add account-level credit
-        DateTime creditDate = startDate.plusDays(5);
-        Invoice invoiceWithCredit = new DefaultInvoice(accountId, creditDate, creditDate, Currency.USD);
-        InvoiceItem accountCredit = new CreditInvoiceItem(invoiceWithCredit.getId(), accountId, creditDate, FIVE, Currency.USD);
+        final DateTime creditDate = startDate.plusDays(5);
+        final Invoice invoiceWithCredit = new DefaultInvoice(accountId, creditDate, creditDate, Currency.USD);
+        final InvoiceItem accountCredit = new CreditInvoiceItem(invoiceWithCredit.getId(), accountId, creditDate, FIVE, Currency.USD);
         invoiceWithCredit.addInvoiceItem(accountCredit);
         invoices.add(invoiceWithCredit);
 
         // invoice one month after the initial subscription
-        Invoice finalInvoice = generator.generateInvoice(accountId, billingEventSet, invoices, startDate.plusMonths(1), Currency.USD);
+        final Invoice finalInvoice = generator.generateInvoice(accountId, billingEventSet, invoices, startDate.plusMonths(1), Currency.USD);
         assertEquals(finalInvoice.getBalance().compareTo(FIVE), 0);
         assertEquals(finalInvoice.getNumberOfItems(), 2);
     }
-}
\ No newline at end of file
+}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/DoubleProRationTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/DoubleProRationTests.java
index c08c8b8..524e666 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/DoubleProRationTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/DoubleProRationTests.java
@@ -34,39 +34,39 @@ public class DoubleProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testDoubleProRation_TargetDateOnStartDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2011, 1, 1);
-        DateTime endDate = buildDateTime(2012, 1, 27);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2011, 1, 1);
+        final DateTime endDate = buildDateTime(2012, 1, 27);
 
-        BigDecimal expectedValue = FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
+        final BigDecimal expectedValue = FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 15, expectedValue);
     }
 
     @Test
     public void testDoubleProRation_TargetDateInFirstProRationPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2011, 1, 7);
-        DateTime endDate = buildDateTime(2012, 1, 27);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2011, 1, 7);
+        final DateTime endDate = buildDateTime(2012, 1, 27);
 
-        BigDecimal expectedValue = FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
+        final BigDecimal expectedValue = FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 15, expectedValue);
     }
 
     @Test
     public void testDoubleProRation_TargetDateOnFirstBillingCycleDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2011, 1, 15);
-        DateTime endDate = buildDateTime(2012, 1, 27);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2011, 1, 15);
+        final DateTime endDate = buildDateTime(2012, 1, 27);
 
-        BigDecimal expectedValue = ONE.add(FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
+        final BigDecimal expectedValue = ONE.add(FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 15, expectedValue);
     }
 
     @Test
     public void testDoubleProRation_TargetDateInFullBillingPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2011, 1, 22);
-        DateTime endDate = buildDateTime(2012, 1, 27);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2011, 1, 22);
+        final DateTime endDate = buildDateTime(2012, 1, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -77,9 +77,9 @@ public class DoubleProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testDoubleProRation_TargetDateOnSecondBillingCycleDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2012, 1, 15);
-        DateTime endDate = buildDateTime(2012, 1, 27);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2012, 1, 15);
+        final DateTime endDate = buildDateTime(2012, 1, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -92,9 +92,9 @@ public class DoubleProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testDoubleProRation_TargetDateInSecondProRationPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2012, 1, 17);
-        DateTime endDate = buildDateTime(2012, 1, 27);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2012, 1, 17);
+        final DateTime endDate = buildDateTime(2012, 1, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -107,9 +107,9 @@ public class DoubleProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testDoubleProRation_TargetDateOnEndDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2012, 1, 27);
-        DateTime endDate = buildDateTime(2012, 1, 27);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2012, 1, 27);
+        final DateTime endDate = buildDateTime(2012, 1, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -122,9 +122,9 @@ public class DoubleProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testDoubleProRation_TargetDateAfterEndDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2012, 3, 7);
-        DateTime endDate = buildDateTime(2012, 1, 27);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2012, 3, 7);
+        final DateTime endDate = buildDateTime(2012, 1, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -137,9 +137,9 @@ public class DoubleProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testDoubleProRationWithMultiplePeriods_TargetDateInSecondFullBillingPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2012, 2, 26);
-        DateTime endDate = buildDateTime(2013, 4, 27);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2012, 2, 26);
+        final DateTime endDate = buildDateTime(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/LeadingProRationTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/LeadingProRationTests.java
index 68611f7..facea50 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/LeadingProRationTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/LeadingProRationTests.java
@@ -34,10 +34,10 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_Evergreen_TargetDateOnStartDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2011, 2, 1);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2011, 2, 1);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 13, expectedValue);
@@ -45,10 +45,10 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_Evergreen_TargetDateInProRationPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2011, 2, 4);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2011, 2, 4);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 13, expectedValue);
@@ -56,10 +56,10 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_Evergreen_TargetDateOnFirstBillingDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2011, 2, 13);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2011, 2, 13);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 13, expectedValue);
@@ -67,10 +67,10 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_Evergreen_TargetDateAfterFirstBillingPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2011, 4, 13);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2011, 4, 13);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 13, expectedValue);
@@ -78,11 +78,11 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_WithEndDate_TargetDateOnStartDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2011, 2, 1);
-        DateTime endDate = buildDateTime(2012, 2, 13);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2011, 2, 1);
+        final DateTime endDate = buildDateTime(2012, 2, 13);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 13, expectedValue);
@@ -90,11 +90,11 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_WithEndDate_TargetDateInProRationPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2011, 2, 4);
-        DateTime endDate = buildDateTime(2012, 2, 13);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2011, 2, 4);
+        final DateTime endDate = buildDateTime(2012, 2, 13);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 13, expectedValue);
@@ -102,11 +102,11 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_WithEndDate_TargetDateOnFirstBillingDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2011, 2, 13);
-        DateTime endDate = buildDateTime(2012, 2, 13);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2011, 2, 13);
+        final DateTime endDate = buildDateTime(2012, 2, 13);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 13, expectedValue);
@@ -114,11 +114,11 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_WithEndDate_TargetDateInFinalBillingPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2011, 4, 10);
-        DateTime endDate = buildDateTime(2012, 2, 13);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2011, 4, 10);
+        final DateTime endDate = buildDateTime(2012, 2, 13);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 13, expectedValue);
@@ -126,11 +126,11 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_WithEndDate_TargetDateOnEndDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2012, 2, 13);
-        DateTime endDate = buildDateTime(2012, 2, 13);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2012, 2, 13);
+        final DateTime endDate = buildDateTime(2012, 2, 13);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 13, expectedValue);
@@ -138,11 +138,11 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_WithEndDate_TargetDateAfterEndDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2012, 4, 10);
-        DateTime endDate = buildDateTime(2012, 2, 13);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2012, 4, 10);
+        final DateTime endDate = buildDateTime(2012, 2, 13);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 13, expectedValue);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/ProRationTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/ProRationTests.java
index 88922e2..4c9b88b 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/ProRationTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/ProRationTests.java
@@ -34,29 +34,29 @@ public class ProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testSinglePlan_PrecedingProRation() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 31);
-        DateTime targetDate = buildDateTime(2011, 2, 24);
+        final DateTime startDate = buildDateTime(2011, 1, 31);
+        final DateTime targetDate = buildDateTime(2011, 2, 24);
 
-        BigDecimal expectedValue = ONE.add(FIFTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
+        final BigDecimal expectedValue = ONE.add(FIFTEEN.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, targetDate, 15, expectedValue);
     }
 
     @Test
     public void testSinglePlan_PrecedingProRation_CrossingYearBoundary() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2010, 12, 15);
-        DateTime targetDate = buildDateTime(2011, 1, 13);
+        final DateTime startDate = buildDateTime(2010, 12, 15);
+        final DateTime targetDate = buildDateTime(2011, 1, 13);
 
-        BigDecimal expectedValue = ONE.add(TWENTY.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
+        final BigDecimal expectedValue = ONE.add(TWENTY.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, targetDate, 4, expectedValue);
     }
 
     @Test(enabled = false)
     public void testSinglePlanDoubleProRation() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 10);
-        DateTime endDate = buildDateTime(2012, 3, 4);
-        DateTime targetDate = buildDateTime(2012, 4, 5);
+        final DateTime startDate = buildDateTime(2011, 1, 10);
+        final DateTime endDate = buildDateTime(2012, 3, 4);
+        final DateTime targetDate = buildDateTime(2012, 4, 5);
 
-        BigDecimal expectedValue = BigDecimal.ZERO;
+        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/TrailingProRationTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TrailingProRationTests.java
index d1c2013..8861890 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TrailingProRationTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/annual/TrailingProRationTests.java
@@ -34,58 +34,58 @@ public class TrailingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testTargetDateOnStartDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2010, 6, 17);
-        DateTime endDate = buildDateTime(2012, 6, 25);
-        DateTime targetDate = buildDateTime(2010, 6, 17);
+        final DateTime startDate = buildDateTime(2010, 6, 17);
+        final DateTime endDate = buildDateTime(2012, 6, 25);
+        final DateTime targetDate = buildDateTime(2010, 6, 17);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, ONE);
     }
 
     @Test
     public void testTargetDateInFirstBillingPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2010, 6, 17);
-        DateTime endDate = buildDateTime(2011, 6, 25);
-        DateTime targetDate = buildDateTime(2010, 6, 20);
+        final DateTime startDate = buildDateTime(2010, 6, 17);
+        final DateTime endDate = buildDateTime(2011, 6, 25);
+        final DateTime targetDate = buildDateTime(2010, 6, 20);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, ONE);
     }
 
     @Test
     public void testTargetDateAtEndOfFirstBillingCycle() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2010, 6, 17);
-        DateTime endDate = buildDateTime(2011, 6, 25);
-        DateTime targetDate = buildDateTime(2011, 6, 17);
+        final DateTime startDate = buildDateTime(2010, 6, 17);
+        final DateTime endDate = buildDateTime(2011, 6, 25);
+        final DateTime targetDate = buildDateTime(2011, 6, 17);
 
-        BigDecimal expectedValue = ONE.add(EIGHT.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
+        final BigDecimal expectedValue = ONE.add(EIGHT.divide(THREE_HUNDRED_AND_SIXTY_FIVE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
     }
 
     @Test
     public void testTargetDateInProRationPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2010, 6, 17);
-        DateTime endDate = buildDateTime(2011, 6, 25);
-        DateTime targetDate = buildDateTime(2011, 6, 18);
+        final DateTime startDate = buildDateTime(2010, 6, 17);
+        final DateTime endDate = buildDateTime(2011, 6, 25);
+        final DateTime targetDate = buildDateTime(2011, 6, 18);
 
-        BigDecimal expectedValue = ONE.add(EIGHT.divide(THREE_HUNDRED_AND_SIXTY_SIX, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
+        final BigDecimal expectedValue = ONE.add(EIGHT.divide(THREE_HUNDRED_AND_SIXTY_SIX, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
     }
 
     @Test
     public void testTargetDateOnEndDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2010, 6, 17);
-        DateTime endDate = buildDateTime(2011, 6, 25);
+        final DateTime startDate = buildDateTime(2010, 6, 17);
+        final DateTime endDate = buildDateTime(2011, 6, 25);
 
-        BigDecimal expectedValue = ONE.add(EIGHT.divide(THREE_HUNDRED_AND_SIXTY_SIX, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
+        final BigDecimal expectedValue = ONE.add(EIGHT.divide(THREE_HUNDRED_AND_SIXTY_SIX, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, endDate, 17, expectedValue);
     }
 
     @Test
     public void testTargetDateAfterEndDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2010, 6, 17);
-        DateTime endDate = buildDateTime(2011, 6, 25);
-        DateTime targetDate = buildDateTime(2011, 7, 30);
+        final DateTime startDate = buildDateTime(2010, 6, 17);
+        final DateTime endDate = buildDateTime(2011, 6, 25);
+        final DateTime targetDate = buildDateTime(2011, 7, 30);
 
-        BigDecimal expectedValue = ONE.add(EIGHT.divide(THREE_HUNDRED_AND_SIXTY_SIX, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
+        final BigDecimal expectedValue = ONE.add(EIGHT.divide(THREE_HUNDRED_AND_SIXTY_SIX, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
     }
-}
\ No newline at end of file
+}
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 70f1f8f..ea37848 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
@@ -27,53 +27,54 @@ import com.ning.billing.invoice.model.InvalidDateSequenceException;
 public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBase {
     /**
      * used for testing cancellation in less than a single billing period
+     *
      * @return BigDecimal the number of days in the billing period beginning 2011/1/1
      */
     protected abstract BigDecimal getDaysInTestPeriod();
-    
+
     @Test
     public void testSinglePlan_OnStartDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 15);
+        final DateTime startDate = buildDateTime(2011, 2, 15);
 
         testCalculateNumberOfBillingCycles(startDate, startDate, 15, ONE);
     }
 
     @Test
     public void testSinglePlan_LessThanOnePeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 15);
-        DateTime targetDate = buildDateTime(2011, 3, 1);
+        final DateTime startDate = buildDateTime(2011, 2, 15);
+        final DateTime targetDate = buildDateTime(2011, 3, 1);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 15, ONE);
     }
 
     @Test
     public void testSinglePlan_OnePeriodLessADayAfterStart() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 15);
-        DateTime targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths()).plusDays(-1);
+        final DateTime startDate = buildDateTime(2011, 2, 15);
+        final DateTime targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths()).plusDays(-1);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 15, ONE);
     }
 
     @Test
     public void testSinglePlan_ExactlyOnePeriodAfterStart() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 15);
-        DateTime targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths());
+        final DateTime startDate = buildDateTime(2011, 2, 15);
+        final DateTime targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths());
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 15, TWO);
     }
 
     @Test
     public void testSinglePlan_SlightlyMoreThanOnePeriodAfterStart() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 15);
-        DateTime targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths()).plusDays(1);
+        final DateTime startDate = buildDateTime(2011, 2, 15);
+        final DateTime targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths()).plusDays(1);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 15, TWO);
     }
 
     @Test
     public void testSinglePlan_CrossingYearBoundary() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 12, 15);
-        DateTime oneCycleLater = startDate.plusMonths(getBillingPeriod().getNumberOfMonths());
+        final DateTime startDate = buildDateTime(2011, 12, 15);
+        final DateTime oneCycleLater = startDate.plusMonths(getBillingPeriod().getNumberOfMonths());
 
         // test just before the billing cycle day
         testCalculateNumberOfBillingCycles(startDate, oneCycleLater.plusDays(-1), 15, ONE);
@@ -87,27 +88,27 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
 
     @Test
     public void testSinglePlan_StartingMidFebruary() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 15);
-        DateTime targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths());
+        final DateTime startDate = buildDateTime(2011, 2, 15);
+        final DateTime targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths());
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 15, TWO);
     }
 
     @Test
     public void testSinglePlan_StartingMidFebruaryOfLeapYear() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2012, 2, 15);
-        DateTime targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths());
+        final DateTime startDate = buildDateTime(2012, 2, 15);
+        final DateTime targetDate = startDate.plusMonths(getBillingPeriod().getNumberOfMonths());
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 15, TWO);
     }
 
     @Test
     public void testSinglePlan_MovingForwardThroughTime() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 31);
+        final DateTime startDate = buildDateTime(2011, 1, 31);
         BigDecimal expectedValue = ONE;
 
         for (int i = 1; i <= 12; i++) {
-            DateTime oneCycleLater = startDate.plusMonths(i * getBillingPeriod().getNumberOfMonths());
+            final DateTime oneCycleLater = startDate.plusMonths(i * getBillingPeriod().getNumberOfMonths());
             // test just before the billing cycle day
             testCalculateNumberOfBillingCycles(startDate, oneCycleLater.plusDays(-1), 31, expectedValue);
 
@@ -120,65 +121,65 @@ public abstract class GenericProRationTestBase extends ProRationInAdvanceTestBas
             testCalculateNumberOfBillingCycles(startDate, oneCycleLater.plusDays(1), 31, expectedValue);
         }
     }
-    
+
     // tests for cancellation in less than one period, beginning Jan 1
     @Test
     public void testCancelledBeforeOnePeriod_TargetDateInStartDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2011, 1, 1);
-        DateTime endDate = buildDateTime(2011, 1, 15);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2011, 1, 1);
+        final DateTime endDate = buildDateTime(2011, 1, 15);
 
-        BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), NUMBER_OF_DECIMALS, ROUNDING_METHOD);
+        final BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
     }
 
     @Test
     public void testCancelledBeforeOnePeriod_TargetDateInSubscriptionPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2011, 1, 7);
-        DateTime endDate = buildDateTime(2011, 1, 15);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2011, 1, 7);
+        final DateTime endDate = buildDateTime(2011, 1, 15);
 
-        BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), NUMBER_OF_DECIMALS, ROUNDING_METHOD);
+        final BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
     }
 
     @Test
     public void testCancelledBeforeOnePeriod_TargetDateOnEndDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2011, 1, 15);
-        DateTime endDate = buildDateTime(2011, 1, 15);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2011, 1, 15);
+        final DateTime endDate = buildDateTime(2011, 1, 15);
 
-        BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), NUMBER_OF_DECIMALS, ROUNDING_METHOD);
+        final BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
     }
 
     @Test
     public void testCancelledBeforeOnePeriod_TargetDateAfterEndDateButInFirstBillingPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2011, 1, 17);
-        DateTime endDate = buildDateTime(2011, 1, 15);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2011, 1, 17);
+        final DateTime endDate = buildDateTime(2011, 1, 15);
 
-        BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), NUMBER_OF_DECIMALS, ROUNDING_METHOD);
+        final BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
     }
 
     @Test
     public void testCancelledBeforeOnePeriod_TargetDateAtEndOfFirstBillingPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2011, 2, 1);
-        DateTime endDate = buildDateTime(2011, 1, 15);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2011, 2, 1);
+        final DateTime endDate = buildDateTime(2011, 1, 15);
 
-        BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), NUMBER_OF_DECIMALS, ROUNDING_METHOD);
+        final BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
     }
 
     @Test
     public void testCancelledBeforeOnePeriod_TargetDateAfterFirstBillingPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2011, 4, 5);
-        DateTime endDate = buildDateTime(2011, 1, 15);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2011, 4, 5);
+        final DateTime endDate = buildDateTime(2011, 1, 15);
 
-        BigDecimal expectedValue = FOURTEEN.divide(getDaysInTestPeriod(), NUMBER_OF_DECIMALS, ROUNDING_METHOD);
+        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/DoubleProRationTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/DoubleProRationTests.java
index 8c9b61d..230d60c 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/DoubleProRationTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/DoubleProRationTests.java
@@ -34,39 +34,39 @@ public class DoubleProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testDoubleProRation_TargetDateOnStartDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2011, 1, 1);
-        DateTime endDate = buildDateTime(2011, 2, 27);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2011, 1, 1);
+        final DateTime endDate = buildDateTime(2011, 2, 27);
 
-        BigDecimal expectedValue = FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
+        final BigDecimal expectedValue = FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 15, expectedValue);
     }
 
     @Test
     public void testDoubleProRation_TargetDateInFirstProRationPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2011, 1, 7);
-        DateTime endDate = buildDateTime(2011, 2, 27);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2011, 1, 7);
+        final DateTime endDate = buildDateTime(2011, 2, 27);
 
-        BigDecimal expectedValue = FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
+        final BigDecimal expectedValue = FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 15, expectedValue);
     }
 
     @Test
     public void testDoubleProRation_TargetDateOnFirstBillingCycleDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2011, 1, 15);
-        DateTime endDate = buildDateTime(2011, 2, 27);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2011, 1, 15);
+        final DateTime endDate = buildDateTime(2011, 2, 27);
 
-        BigDecimal expectedValue = ONE.add(FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
+        final BigDecimal expectedValue = ONE.add(FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 15, expectedValue);
     }
 
     @Test
     public void testDoubleProRation_TargetDateInFullBillingPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2011, 1, 22);
-        DateTime endDate = buildDateTime(2011, 2, 27);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2011, 1, 22);
+        final DateTime endDate = buildDateTime(2011, 2, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -77,9 +77,9 @@ public class DoubleProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testDoubleProRation_TargetDateOnSecondBillingCycleDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2011, 2, 27);
-        DateTime endDate = buildDateTime(2011, 2, 27);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2011, 2, 27);
+        final DateTime endDate = buildDateTime(2011, 2, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -91,9 +91,9 @@ public class DoubleProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testDoubleProRation_TargetDateInSecondProRationPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2011, 2, 26);
-        DateTime endDate = buildDateTime(2011, 2, 27);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2011, 2, 26);
+        final DateTime endDate = buildDateTime(2011, 2, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -105,9 +105,9 @@ public class DoubleProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testDoubleProRation_TargetDateOnEndDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2011, 2, 27);
-        DateTime endDate = buildDateTime(2011, 2, 27);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2011, 2, 27);
+        final DateTime endDate = buildDateTime(2011, 2, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -119,9 +119,9 @@ public class DoubleProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testDoubleProRation_TargetDateAfterEndDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2011, 3, 7);
-        DateTime endDate = buildDateTime(2011, 2, 27);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2011, 3, 7);
+        final DateTime endDate = buildDateTime(2011, 2, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -133,9 +133,9 @@ public class DoubleProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testDoubleProRationWithMultiplePeriods_TargetDateInSecondFullBillingPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2011, 2, 26);
-        DateTime endDate = buildDateTime(2011, 4, 27);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2011, 2, 26);
+        final DateTime endDate = buildDateTime(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/LeadingProRationTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/LeadingProRationTests.java
index f723738..11b6789 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/LeadingProRationTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/LeadingProRationTests.java
@@ -34,10 +34,10 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_Evergreen_TargetDateOnStartDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2011, 2, 1);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2011, 2, 1);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 13, expectedValue);
@@ -45,10 +45,10 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_Evergreen_TargetDateInProRationPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2011, 2, 4);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2011, 2, 4);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 13, expectedValue);
@@ -56,10 +56,10 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_Evergreen_TargetDateOnFirstBillingDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2011, 2, 13);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2011, 2, 13);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 13, expectedValue);
@@ -67,10 +67,10 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_Evergreen_TargetDateAfterFirstBillingPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2011, 4, 13);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2011, 4, 13);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(THREE);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 13, expectedValue);
@@ -78,11 +78,11 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_WithEndDate_TargetDateOnStartDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2011, 2, 1);
-        DateTime endDate = buildDateTime(2011, 4, 13);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2011, 2, 1);
+        final DateTime endDate = buildDateTime(2011, 4, 13);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 13, expectedValue);
@@ -90,11 +90,11 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_WithEndDate_TargetDateInProRationPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2011, 2, 4);
-        DateTime endDate = buildDateTime(2011, 4, 13);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2011, 2, 4);
+        final DateTime endDate = buildDateTime(2011, 4, 13);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 13, expectedValue);
@@ -102,11 +102,11 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_WithEndDate_TargetDateOnFirstBillingDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2011, 2, 13);
-        DateTime endDate = buildDateTime(2011, 4, 13);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2011, 2, 13);
+        final DateTime endDate = buildDateTime(2011, 4, 13);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 13, expectedValue);
@@ -114,11 +114,11 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_WithEndDate_TargetDateInFinalBillingPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2011, 4, 10);
-        DateTime endDate = buildDateTime(2011, 4, 13);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2011, 4, 10);
+        final DateTime endDate = buildDateTime(2011, 4, 13);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(TWO);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 13, expectedValue);
@@ -126,11 +126,11 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_WithEndDate_TargetDateOnEndDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2011, 4, 13);
-        DateTime endDate = buildDateTime(2011, 4, 13);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2011, 4, 13);
+        final DateTime endDate = buildDateTime(2011, 4, 13);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(TWO);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 13, expectedValue);
@@ -138,11 +138,11 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_WithEndDate_TargetDateAfterEndDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2011, 4, 10);
-        DateTime endDate = buildDateTime(2011, 4, 13);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2011, 4, 10);
+        final DateTime endDate = buildDateTime(2011, 4, 13);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(TWO);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 13, expectedValue);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/ProRationTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/ProRationTests.java
index 78f06b4..eb2d3e8 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/ProRationTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/ProRationTests.java
@@ -34,9 +34,9 @@ public class ProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testSinglePlan_WithPhaseChange() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 10);
-        DateTime phaseChangeDate = buildDateTime(2011, 2, 24);
-        DateTime targetDate = buildDateTime(2011, 3, 6);
+        final DateTime startDate = buildDateTime(2011, 2, 10);
+        final DateTime phaseChangeDate = buildDateTime(2011, 2, 24);
+        final DateTime targetDate = buildDateTime(2011, 3, 6);
 
         testCalculateNumberOfBillingCycles(startDate, phaseChangeDate, targetDate, 10, ONE_HALF);
         testCalculateNumberOfBillingCycles(phaseChangeDate, targetDate, 10, ONE_HALF);
@@ -44,9 +44,9 @@ public class ProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testSinglePlan_WithPhaseChange_BeforeBillCycleDay() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 3);
-        DateTime phaseChangeDate = buildDateTime(2011, 2, 17);
-        DateTime targetDate = buildDateTime(2011, 3, 1);
+        final DateTime startDate = buildDateTime(2011, 2, 3);
+        final DateTime phaseChangeDate = buildDateTime(2011, 2, 17);
+        final DateTime targetDate = buildDateTime(2011, 3, 1);
 
         testCalculateNumberOfBillingCycles(startDate, phaseChangeDate, targetDate, 3, ONE_HALF);
         testCalculateNumberOfBillingCycles(phaseChangeDate, targetDate, 3, ONE_HALF);
@@ -54,9 +54,9 @@ public class ProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testSinglePlan_WithPhaseChange_OnBillCycleDay() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 3);
-        DateTime phaseChangeDate = buildDateTime(2011, 2, 17);
-        DateTime targetDate = buildDateTime(2011, 3, 3);
+        final DateTime startDate = buildDateTime(2011, 2, 3);
+        final DateTime phaseChangeDate = buildDateTime(2011, 2, 17);
+        final DateTime targetDate = buildDateTime(2011, 3, 3);
 
         testCalculateNumberOfBillingCycles(startDate, phaseChangeDate, targetDate, 3, ONE_HALF);
         testCalculateNumberOfBillingCycles(phaseChangeDate, targetDate, 3, ONE_AND_A_HALF);
@@ -64,9 +64,9 @@ public class ProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testSinglePlan_WithPhaseChange_AfterBillCycleDay() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 3);
-        DateTime phaseChangeDate = buildDateTime(2011, 2, 17);
-        DateTime targetDate = buildDateTime(2011, 3, 4);
+        final DateTime startDate = buildDateTime(2011, 2, 3);
+        final DateTime phaseChangeDate = buildDateTime(2011, 2, 17);
+        final DateTime targetDate = buildDateTime(2011, 3, 4);
 
         testCalculateNumberOfBillingCycles(startDate, phaseChangeDate, targetDate, 3, ONE_HALF);
         testCalculateNumberOfBillingCycles(phaseChangeDate, targetDate, 3, ONE_AND_A_HALF);
@@ -74,9 +74,9 @@ public class ProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testPlanChange_WithChangeOfBillCycleDayToLaterDay() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime planChangeDate = buildDateTime(2011, 2, 15);
-        DateTime targetDate = buildDateTime(2011, 3, 1);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime planChangeDate = buildDateTime(2011, 2, 15);
+        final DateTime targetDate = buildDateTime(2011, 3, 1);
 
         testCalculateNumberOfBillingCycles(startDate, planChangeDate, targetDate, 1, ONE_HALF);
         testCalculateNumberOfBillingCycles(planChangeDate, targetDate, 15, ONE);
@@ -84,9 +84,9 @@ public class ProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testPlanChange_WithChangeOfBillCycleDayToEarlierDay() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 20);
-        DateTime planChangeDate = buildDateTime(2011, 3, 6);
-        DateTime targetDate = buildDateTime(2011, 3, 9);
+        final DateTime startDate = buildDateTime(2011, 2, 20);
+        final DateTime planChangeDate = buildDateTime(2011, 3, 6);
+        final DateTime targetDate = buildDateTime(2011, 3, 9);
 
         testCalculateNumberOfBillingCycles(startDate, planChangeDate, targetDate, 20, ONE_HALF);
         testCalculateNumberOfBillingCycles(planChangeDate, targetDate, 6, ONE);
@@ -94,41 +94,41 @@ public class ProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testSinglePlan_CrossingYearBoundary() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2010, 12, 15);
-        DateTime targetDate = buildDateTime(2011, 1, 16);
+        final DateTime startDate = buildDateTime(2010, 12, 15);
+        final DateTime targetDate = buildDateTime(2011, 1, 16);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 15, TWO);
     }
 
     @Test
     public void testSinglePlan_LeapYear_StartingMidFebruary() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2012, 2, 15);
-        DateTime targetDate = buildDateTime(2012, 3, 15);
+        final DateTime startDate = buildDateTime(2012, 2, 15);
+        final DateTime targetDate = buildDateTime(2012, 3, 15);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 15, TWO);
     }
 
     @Test
     public void testSinglePlan_LeapYear_StartingBeforeFebruary() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2012, 1, 15);
-        DateTime targetDate = buildDateTime(2012, 2, 3);
+        final DateTime startDate = buildDateTime(2012, 1, 15);
+        final DateTime targetDate = buildDateTime(2012, 2, 3);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 15, ONE);
     }
 
     @Test
     public void testSinglePlan_LeapYear_IncludingAllOfFebruary() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2012, 1, 30);
-        DateTime targetDate = buildDateTime(2012, 3, 1);
+        final DateTime startDate = buildDateTime(2012, 1, 30);
+        final DateTime targetDate = buildDateTime(2012, 3, 1);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 30, TWO);
     }
 
     @Test
     public void testSinglePlan_ChangeBCDTo31() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime planChangeDate = buildDateTime(2011, 2, 14);
-        DateTime targetDate = buildDateTime(2011, 3, 1);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime planChangeDate = buildDateTime(2011, 2, 14);
+        final DateTime targetDate = buildDateTime(2011, 3, 1);
 
         BigDecimal expectedValue;
 
@@ -141,9 +141,9 @@ public class ProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testSinglePlan_ChangeBCD() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime planChangeDate = buildDateTime(2011, 2, 14);
-        DateTime targetDate = buildDateTime(2011, 3, 1);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime planChangeDate = buildDateTime(2011, 2, 14);
+        final DateTime targetDate = buildDateTime(2011, 3, 1);
 
         BigDecimal expectedValue;
 
@@ -156,11 +156,11 @@ public class ProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testSinglePlan_LeapYearFebruaryProRation() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2012, 2, 1);
-        DateTime endDate = buildDateTime(2012, 2, 15);
-        DateTime targetDate = buildDateTime(2012, 2, 19);
+        final DateTime startDate = buildDateTime(2012, 2, 1);
+        final DateTime endDate = buildDateTime(2012, 2, 15);
+        final DateTime targetDate = buildDateTime(2012, 2, 19);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(TWENTY_NINE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
@@ -168,11 +168,11 @@ public class ProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testPlanChange_BeforeBillingDay() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 7);
-        DateTime changeDate = buildDateTime(2011, 2, 15);
-        DateTime targetDate = buildDateTime(2011, 4, 21);
-        
-        BigDecimal expectedValue;
+        final DateTime startDate = buildDateTime(2011, 2, 7);
+        final DateTime changeDate = buildDateTime(2011, 2, 15);
+        final DateTime targetDate = buildDateTime(2011, 4, 21);
+
+        final BigDecimal expectedValue;
 
         expectedValue = EIGHT.divide(TWENTY_EIGHT, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         testCalculateNumberOfBillingCycles(startDate, changeDate, targetDate, 7, expectedValue);
@@ -182,22 +182,22 @@ public class ProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testPlanChange_OnBillingDay() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 7);
-        DateTime changeDate = buildDateTime(2011, 3, 7);
-        DateTime targetDate = buildDateTime(2011, 4, 21);
+        final DateTime startDate = buildDateTime(2011, 2, 7);
+        final DateTime changeDate = buildDateTime(2011, 3, 7);
+        final DateTime targetDate = buildDateTime(2011, 4, 21);
 
         testCalculateNumberOfBillingCycles(startDate, changeDate, targetDate, 7, ONE);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = EIGHT.divide(TWENTY_EIGHT, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(TWO);
         testCalculateNumberOfBillingCycles(changeDate, targetDate, 15, expectedValue);
     }
 
     @Test
     public void testPlanChange_AfterBillingDay() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 7);
-        DateTime changeDate = buildDateTime(2011, 3, 10);
-        DateTime targetDate = buildDateTime(2011, 4, 21);
+        final DateTime startDate = buildDateTime(2011, 2, 7);
+        final DateTime changeDate = buildDateTime(2011, 3, 10);
+        final DateTime targetDate = buildDateTime(2011, 4, 21);
 
         BigDecimal expectedValue;
 
@@ -210,9 +210,9 @@ public class ProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testPlanChange_DoubleProRation() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 31);
-        DateTime planChangeDate = buildDateTime(2011, 3, 10);
-        DateTime targetDate = buildDateTime(2011, 4, 21);
+        final DateTime startDate = buildDateTime(2011, 1, 31);
+        final DateTime planChangeDate = buildDateTime(2011, 3, 10);
+        final DateTime targetDate = buildDateTime(2011, 4, 21);
 
         BigDecimal expectedValue;
         expectedValue = SEVEN.divide(THIRTY_ONE, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -221,17 +221,17 @@ public class ProRationTests extends ProRationInAdvanceTestBase {
         expectedValue = expectedValue.setScale(NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         testCalculateNumberOfBillingCycles(startDate, planChangeDate, targetDate, 7, expectedValue);
 
-        expectedValue = FIVE.divide(TWENTY_EIGHT, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(TWO);  
+        expectedValue = FIVE.divide(TWENTY_EIGHT, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(TWO);
         testCalculateNumberOfBillingCycles(planChangeDate, targetDate, 15, expectedValue);
     }
 
     @Test
     public void testStartTargetEnd() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2010, 12, 15);
-        DateTime targetDate = buildDateTime(2011, 3, 15);
-        DateTime endDate = buildDateTime(2011, 3, 17);
+        final DateTime startDate = buildDateTime(2010, 12, 15);
+        final DateTime targetDate = buildDateTime(2011, 3, 15);
+        final DateTime endDate = buildDateTime(2011, 3, 17);
 
-        BigDecimal expectedValue = THREE.add(TWO.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
+        final BigDecimal expectedValue = THREE.add(TWO.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 15, expectedValue);
     }
-}
\ No newline at end of file
+}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TrailingProRationTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TrailingProRationTests.java
index 581e8af..5e6366d 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TrailingProRationTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/monthly/TrailingProRationTests.java
@@ -34,58 +34,58 @@ public class TrailingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testTargetDateOnStartDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2010, 6, 17);
-        DateTime endDate = buildDateTime(2010, 7, 25);
-        DateTime targetDate = buildDateTime(2010, 6, 17);
+        final DateTime startDate = buildDateTime(2010, 6, 17);
+        final DateTime endDate = buildDateTime(2010, 7, 25);
+        final DateTime targetDate = buildDateTime(2010, 6, 17);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, ONE);
     }
 
     @Test
     public void testTargetDateInFirstBillingPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2010, 6, 17);
-        DateTime endDate = buildDateTime(2010, 7, 25);
-        DateTime targetDate = buildDateTime(2010, 6, 20);
+        final DateTime startDate = buildDateTime(2010, 6, 17);
+        final DateTime endDate = buildDateTime(2010, 7, 25);
+        final DateTime targetDate = buildDateTime(2010, 6, 20);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, ONE);
     }
 
     @Test
     public void testTargetDateAtEndOfFirstBillingCycle() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2010, 6, 17);
-        DateTime endDate = buildDateTime(2010, 7, 25);
-        DateTime targetDate = buildDateTime(2010, 7, 17);
+        final DateTime startDate = buildDateTime(2010, 6, 17);
+        final DateTime endDate = buildDateTime(2010, 7, 25);
+        final DateTime targetDate = buildDateTime(2010, 7, 17);
 
-        BigDecimal expectedValue = ONE.add(EIGHT.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
+        final BigDecimal expectedValue = ONE.add(EIGHT.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
     }
 
     @Test
     public void testTargetDateInProRationPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2010, 6, 17);
-        DateTime endDate = buildDateTime(2010, 7, 25);
-        DateTime targetDate = buildDateTime(2010, 7, 18);
+        final DateTime startDate = buildDateTime(2010, 6, 17);
+        final DateTime endDate = buildDateTime(2010, 7, 25);
+        final DateTime targetDate = buildDateTime(2010, 7, 18);
 
-        BigDecimal expectedValue = ONE.add(EIGHT.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
+        final BigDecimal expectedValue = ONE.add(EIGHT.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
     }
 
     @Test
     public void testTargetDateOnEndDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2010, 6, 17);
-        DateTime endDate = buildDateTime(2010, 7, 25);
+        final DateTime startDate = buildDateTime(2010, 6, 17);
+        final DateTime endDate = buildDateTime(2010, 7, 25);
 
-        BigDecimal expectedValue = ONE.add(EIGHT.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
+        final BigDecimal expectedValue = ONE.add(EIGHT.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, endDate, 17, expectedValue);
     }
 
     @Test
     public void testTargetDateAfterEndDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2010, 6, 17);
-        DateTime endDate = buildDateTime(2010, 7, 25);
-        DateTime targetDate = buildDateTime(2010, 7, 30);
+        final DateTime startDate = buildDateTime(2010, 6, 17);
+        final DateTime endDate = buildDateTime(2010, 7, 25);
+        final DateTime targetDate = buildDateTime(2010, 7, 30);
 
-        BigDecimal expectedValue = ONE.add(EIGHT.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
+        final BigDecimal expectedValue = ONE.add(EIGHT.divide(THIRTY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
     }
-}
\ No newline at end of file
+}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/DoubleProRationTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/DoubleProRationTests.java
index e6c3cf3..6aa022b 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/DoubleProRationTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/DoubleProRationTests.java
@@ -34,9 +34,9 @@ public class DoubleProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testDoubleProRation_TargetDateOnStartDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2011, 1, 1);
-        DateTime endDate = buildDateTime(2011, 4, 27);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2011, 1, 1);
+        final DateTime endDate = buildDateTime(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 +45,9 @@ public class DoubleProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testDoubleProRation_TargetDateInFirstProRationPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2011, 1, 7);
-        DateTime endDate = buildDateTime(2011, 4, 27);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2011, 1, 7);
+        final DateTime endDate = buildDateTime(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 +56,9 @@ public class DoubleProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testDoubleProRation_TargetDateOnFirstBillingCycleDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2011, 1, 15);
-        DateTime endDate = buildDateTime(2011, 4, 27);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2011, 1, 15);
+        final DateTime endDate = buildDateTime(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 +67,9 @@ public class DoubleProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testDoubleProRation_TargetDateInFullBillingPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2011, 1, 22);
-        DateTime endDate = buildDateTime(2011, 4, 27);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2011, 1, 22);
+        final DateTime endDate = buildDateTime(2011, 4, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(NINETY_TWO, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -81,9 +81,9 @@ public class DoubleProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testDoubleProRation_TargetDateOnSecondBillingCycleDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2011, 4, 15);
-        DateTime endDate = buildDateTime(2011, 4, 27);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2011, 4, 15);
+        final DateTime endDate = buildDateTime(2011, 4, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(NINETY_TWO, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -96,9 +96,9 @@ public class DoubleProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testDoubleProRation_TargetDateInSecondProRationPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2011, 4, 26);
-        DateTime endDate = buildDateTime(2011, 4, 27);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2011, 4, 26);
+        final DateTime endDate = buildDateTime(2011, 4, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(NINETY_TWO, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -111,9 +111,9 @@ public class DoubleProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testDoubleProRation_TargetDateOnEndDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2011, 4, 27);
-        DateTime endDate = buildDateTime(2011, 4, 27);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2011, 4, 27);
+        final DateTime endDate = buildDateTime(2011, 4, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(NINETY_TWO, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -126,9 +126,9 @@ public class DoubleProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testDoubleProRation_TargetDateAfterEndDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2011, 5, 7);
-        DateTime endDate = buildDateTime(2011, 4, 27);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2011, 5, 7);
+        final DateTime endDate = buildDateTime(2011, 4, 27);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(NINETY_TWO, 2 * NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -141,9 +141,9 @@ public class DoubleProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testDoubleProRationWithMultiplePeriods_TargetDateInSecondFullBillingPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 1);
-        DateTime targetDate = buildDateTime(2011, 6, 26);
-        DateTime endDate = buildDateTime(2011, 8, 27);
+        final DateTime startDate = buildDateTime(2011, 1, 1);
+        final DateTime targetDate = buildDateTime(2011, 6, 26);
+        final DateTime endDate = buildDateTime(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/LeadingProRationTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/LeadingProRationTests.java
index 18bb8af..681fac1 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/LeadingProRationTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/LeadingProRationTests.java
@@ -34,10 +34,10 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_Evergreen_TargetDateOnStartDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2011, 2, 1);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2011, 2, 1);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 13, expectedValue);
@@ -45,10 +45,10 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_Evergreen_TargetDateInProRationPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2011, 2, 4);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2011, 2, 4);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 13, expectedValue);
@@ -56,10 +56,10 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_Evergreen_TargetDateOnFirstBillingDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2011, 2, 13);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2011, 2, 13);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 13, expectedValue);
@@ -67,10 +67,10 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_Evergreen_TargetDateAfterFirstBillingPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2011, 6, 13);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2011, 6, 13);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(TWO);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 13, expectedValue);
@@ -78,11 +78,11 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_WithEndDate_TargetDateOnStartDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2011, 2, 1);
-        DateTime endDate = buildDateTime(2011, 8, 13);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2011, 2, 1);
+        final DateTime endDate = buildDateTime(2011, 8, 13);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 13, expectedValue);
@@ -90,11 +90,11 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_WithEndDate_TargetDateInProRationPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2011, 2, 4);
-        DateTime endDate = buildDateTime(2011, 8, 13);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2011, 2, 4);
+        final DateTime endDate = buildDateTime(2011, 8, 13);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 13, expectedValue);
@@ -102,11 +102,11 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_WithEndDate_TargetDateOnFirstBillingDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2011, 2, 13);
-        DateTime endDate = buildDateTime(2011, 8, 13);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2011, 2, 13);
+        final DateTime endDate = buildDateTime(2011, 8, 13);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 13, expectedValue);
@@ -114,11 +114,11 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_WithEndDate_TargetDateInFinalBillingPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2011, 8, 10);
-        DateTime endDate = buildDateTime(2011, 8, 13);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2011, 8, 10);
+        final DateTime endDate = buildDateTime(2011, 8, 13);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(TWO);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 13, expectedValue);
@@ -126,11 +126,11 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_WithEndDate_TargetDateOnEndDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2011, 8, 13);
-        DateTime endDate = buildDateTime(2011, 8, 13);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2011, 8, 13);
+        final DateTime endDate = buildDateTime(2011, 8, 13);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(TWO);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 13, expectedValue);
@@ -138,11 +138,11 @@ public class LeadingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testLeadingProRation_WithEndDate_TargetDateAfterEndDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime targetDate = buildDateTime(2011, 9, 10);
-        DateTime endDate = buildDateTime(2011, 8, 13);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime targetDate = buildDateTime(2011, 9, 10);
+        final DateTime endDate = buildDateTime(2011, 8, 13);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = TWELVE.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(TWO);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 13, expectedValue);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/ProRationTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/ProRationTests.java
index 2988dfe..20611b1 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/ProRationTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/ProRationTests.java
@@ -34,9 +34,9 @@ public class ProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testSinglePlan_WithPhaseChange() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 10);
-        DateTime phaseChangeDate = buildDateTime(2011, 2, 24);
-        DateTime targetDate = buildDateTime(2011, 3, 6);
+        final DateTime startDate = buildDateTime(2011, 2, 10);
+        final DateTime phaseChangeDate = buildDateTime(2011, 2, 24);
+        final DateTime targetDate = buildDateTime(2011, 3, 6);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(EIGHTY_NINE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -48,9 +48,9 @@ public class ProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testSinglePlan_WithPhaseChange_BeforeBillCycleDay() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 3);
-        DateTime phaseChangeDate = buildDateTime(2011, 2, 17);
-        DateTime targetDate = buildDateTime(2011, 3, 1);
+        final DateTime startDate = buildDateTime(2011, 2, 3);
+        final DateTime phaseChangeDate = buildDateTime(2011, 2, 17);
+        final DateTime targetDate = buildDateTime(2011, 3, 1);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(EIGHTY_NINE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -62,9 +62,9 @@ public class ProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testSinglePlan_WithPhaseChange_OnBillCycleDay() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 3);
-        DateTime phaseChangeDate = buildDateTime(2011, 2, 17);
-        DateTime targetDate = buildDateTime(2011, 3, 3);
+        final DateTime startDate = buildDateTime(2011, 2, 3);
+        final DateTime phaseChangeDate = buildDateTime(2011, 2, 17);
+        final DateTime targetDate = buildDateTime(2011, 3, 3);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(EIGHTY_NINE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -76,9 +76,9 @@ public class ProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testSinglePlan_WithPhaseChange_AfterBillCycleDay() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 3);
-        DateTime phaseChangeDate = buildDateTime(2011, 2, 17);
-        DateTime targetDate = buildDateTime(2011, 3, 4);
+        final DateTime startDate = buildDateTime(2011, 2, 3);
+        final DateTime phaseChangeDate = buildDateTime(2011, 2, 17);
+        final DateTime targetDate = buildDateTime(2011, 3, 4);
 
         BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(EIGHTY_NINE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -90,63 +90,63 @@ public class ProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testPlanChange_WithChangeOfBillCycleDayToLaterDay() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime planChangeDate = buildDateTime(2011, 2, 15);
-        DateTime targetDate = buildDateTime(2011, 3, 1);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime planChangeDate = buildDateTime(2011, 2, 15);
+        final DateTime targetDate = buildDateTime(2011, 3, 1);
 
-        BigDecimal expectedValue = FOURTEEN.divide(EIGHTY_NINE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
+        final BigDecimal expectedValue = FOURTEEN.divide(EIGHTY_NINE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         testCalculateNumberOfBillingCycles(startDate, planChangeDate, targetDate, 1, expectedValue);
         testCalculateNumberOfBillingCycles(planChangeDate, targetDate, 15, ONE);
     }
 
     @Test
     public void testPlanChange_WithChangeOfBillCycleDayToEarlierDay() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 20);
-        DateTime planChangeDate = buildDateTime(2011, 3, 6);
-        DateTime targetDate = buildDateTime(2011, 3, 9);
+        final DateTime startDate = buildDateTime(2011, 2, 20);
+        final DateTime planChangeDate = buildDateTime(2011, 3, 6);
+        final DateTime targetDate = buildDateTime(2011, 3, 9);
 
-        BigDecimal expectedValue = FOURTEEN.divide(EIGHTY_NINE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
+        final BigDecimal expectedValue = FOURTEEN.divide(EIGHTY_NINE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         testCalculateNumberOfBillingCycles(startDate, planChangeDate, targetDate, 20, expectedValue);
         testCalculateNumberOfBillingCycles(planChangeDate, targetDate, 6, ONE);
     }
 
     @Test
     public void testSinglePlan_CrossingYearBoundary() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2010, 12, 15);
-        DateTime targetDate = buildDateTime(2011, 1, 16);
+        final DateTime startDate = buildDateTime(2010, 12, 15);
+        final DateTime targetDate = buildDateTime(2011, 1, 16);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 15, ONE);
     }
 
     @Test
     public void testSinglePlan_LeapYear_StartingMidFebruary() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2012, 2, 15);
-        DateTime targetDate = buildDateTime(2012, 3, 15);
+        final DateTime startDate = buildDateTime(2012, 2, 15);
+        final DateTime targetDate = buildDateTime(2012, 3, 15);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 15, ONE);
     }
 
     @Test
     public void testSinglePlan_LeapYear_StartingBeforeFebruary() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2012, 1, 15);
-        DateTime targetDate = buildDateTime(2012, 2, 3);
+        final DateTime startDate = buildDateTime(2012, 1, 15);
+        final DateTime targetDate = buildDateTime(2012, 2, 3);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 15, ONE);
     }
 
     @Test
     public void testSinglePlan_LeapYear_IncludingAllOfFebruary() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2012, 1, 30);
-        DateTime targetDate = buildDateTime(2012, 3, 1);
+        final DateTime startDate = buildDateTime(2012, 1, 30);
+        final DateTime targetDate = buildDateTime(2012, 3, 1);
 
         testCalculateNumberOfBillingCycles(startDate, targetDate, 30, ONE);
     }
 
     @Test
     public void testSinglePlan_ChangeBCDTo31() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime planChangeDate = buildDateTime(2011, 2, 14);
-        DateTime targetDate = buildDateTime(2011, 3, 1);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime planChangeDate = buildDateTime(2011, 2, 14);
+        final DateTime targetDate = buildDateTime(2011, 3, 1);
 
         BigDecimal expectedValue;
 
@@ -159,9 +159,9 @@ public class ProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testSinglePlan_ChangeBCD() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 1);
-        DateTime planChangeDate = buildDateTime(2011, 2, 14);
-        DateTime targetDate = buildDateTime(2011, 5, 1);
+        final DateTime startDate = buildDateTime(2011, 2, 1);
+        final DateTime planChangeDate = buildDateTime(2011, 2, 14);
+        final DateTime targetDate = buildDateTime(2011, 5, 1);
 
         BigDecimal expectedValue;
 
@@ -174,11 +174,11 @@ public class ProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testSinglePlan_LeapYearFebruaryProRation() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2012, 2, 1);
-        DateTime endDate = buildDateTime(2012, 2, 15);
-        DateTime targetDate = buildDateTime(2012, 2, 19);
+        final DateTime startDate = buildDateTime(2012, 2, 1);
+        final DateTime endDate = buildDateTime(2012, 2, 15);
+        final DateTime targetDate = buildDateTime(2012, 2, 19);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = FOURTEEN.divide(NINETY, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 1, expectedValue);
@@ -186,11 +186,11 @@ public class ProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testPlanChange_BeforeBillingDay() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 7);
-        DateTime changeDate = buildDateTime(2011, 2, 15);
-        DateTime targetDate = buildDateTime(2011, 9, 21);
-        
-        BigDecimal expectedValue;
+        final DateTime startDate = buildDateTime(2011, 2, 7);
+        final DateTime changeDate = buildDateTime(2011, 2, 15);
+        final DateTime targetDate = buildDateTime(2011, 9, 21);
+
+        final BigDecimal expectedValue;
 
         expectedValue = EIGHT.divide(EIGHTY_NINE, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
         testCalculateNumberOfBillingCycles(startDate, changeDate, targetDate, 7, expectedValue);
@@ -200,22 +200,22 @@ public class ProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testPlanChange_OnBillingDay() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 7);
-        DateTime changeDate = buildDateTime(2011, 5, 7);
-        DateTime targetDate = buildDateTime(2011, 7, 21);
+        final DateTime startDate = buildDateTime(2011, 2, 7);
+        final DateTime changeDate = buildDateTime(2011, 5, 7);
+        final DateTime targetDate = buildDateTime(2011, 7, 21);
 
         testCalculateNumberOfBillingCycles(startDate, changeDate, targetDate, 7, ONE);
 
-        BigDecimal expectedValue;
+        final BigDecimal expectedValue;
         expectedValue = EIGHT.divide(EIGHTY_NINE, NUMBER_OF_DECIMALS, ROUNDING_METHOD).add(ONE);
         testCalculateNumberOfBillingCycles(changeDate, targetDate, 15, expectedValue);
     }
 
     @Test
     public void testPlanChange_AfterBillingDay() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 2, 7);
-        DateTime changeDate = buildDateTime(2011, 5, 10);
-        DateTime targetDate = buildDateTime(2011, 9, 21);
+        final DateTime startDate = buildDateTime(2011, 2, 7);
+        final DateTime changeDate = buildDateTime(2011, 5, 10);
+        final DateTime targetDate = buildDateTime(2011, 9, 21);
 
         BigDecimal expectedValue;
 
@@ -228,9 +228,9 @@ public class ProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testPlanChange_DoubleProRation() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 31);
-        DateTime planChangeDate = buildDateTime(2011, 5, 10);
-        DateTime targetDate = buildDateTime(2011, 5, 21);
+        final DateTime startDate = buildDateTime(2011, 1, 31);
+        final DateTime planChangeDate = buildDateTime(2011, 5, 10);
+        final DateTime targetDate = buildDateTime(2011, 5, 21);
 
         BigDecimal expectedValue;
         expectedValue = SEVEN.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD);
@@ -244,11 +244,11 @@ public class ProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testStartTargetEnd() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2010, 12, 15);
-        DateTime targetDate = buildDateTime(2011, 6, 15);
-        DateTime endDate = buildDateTime(2011, 6, 17);
+        final DateTime startDate = buildDateTime(2010, 12, 15);
+        final DateTime targetDate = buildDateTime(2011, 6, 15);
+        final DateTime endDate = buildDateTime(2011, 6, 17);
 
-        BigDecimal expectedValue = TWO.add(TWO.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
+        final BigDecimal expectedValue = TWO.add(TWO.divide(NINETY_TWO, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 15, expectedValue);
     }
-}
\ No newline at end of file
+}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TrailingProRationTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TrailingProRationTests.java
index 270518d..a0b1573 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TrailingProRationTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/quarterly/TrailingProRationTests.java
@@ -34,58 +34,58 @@ public class TrailingProRationTests extends ProRationInAdvanceTestBase {
 
     @Test
     public void testTargetDateOnStartDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2010, 6, 17);
-        DateTime endDate = buildDateTime(2010, 9, 25);
-        DateTime targetDate = buildDateTime(2010, 6, 17);
+        final DateTime startDate = buildDateTime(2010, 6, 17);
+        final DateTime endDate = buildDateTime(2010, 9, 25);
+        final DateTime targetDate = buildDateTime(2010, 6, 17);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, ONE);
     }
 
     @Test
     public void testTargetDateInFirstBillingPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2010, 6, 17);
-        DateTime endDate = buildDateTime(2010, 9, 25);
-        DateTime targetDate = buildDateTime(2010, 6, 20);
+        final DateTime startDate = buildDateTime(2010, 6, 17);
+        final DateTime endDate = buildDateTime(2010, 9, 25);
+        final DateTime targetDate = buildDateTime(2010, 6, 20);
 
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, ONE);
     }
 
     @Test
     public void testTargetDateAtEndOfFirstBillingCycle() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2010, 6, 17);
-        DateTime endDate = buildDateTime(2010, 9, 25);
-        DateTime targetDate = buildDateTime(2010, 9, 17);
+        final DateTime startDate = buildDateTime(2010, 6, 17);
+        final DateTime endDate = buildDateTime(2010, 9, 25);
+        final DateTime targetDate = buildDateTime(2010, 9, 17);
 
-        BigDecimal expectedValue = ONE.add(EIGHT.divide(NINETY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
+        final BigDecimal expectedValue = ONE.add(EIGHT.divide(NINETY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
     }
 
     @Test
     public void testTargetDateInProRationPeriod() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2010, 6, 17);
-        DateTime endDate = buildDateTime(2010, 9, 25);
-        DateTime targetDate = buildDateTime(2010, 9, 18);
+        final DateTime startDate = buildDateTime(2010, 6, 17);
+        final DateTime endDate = buildDateTime(2010, 9, 25);
+        final DateTime targetDate = buildDateTime(2010, 9, 18);
 
-        BigDecimal expectedValue = ONE.add(EIGHT.divide(NINETY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
+        final BigDecimal expectedValue = ONE.add(EIGHT.divide(NINETY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
     }
 
     @Test
     public void testTargetDateOnEndDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2010, 6, 17);
-        DateTime endDate = buildDateTime(2010, 9, 25);
+        final DateTime startDate = buildDateTime(2010, 6, 17);
+        final DateTime endDate = buildDateTime(2010, 9, 25);
 
-        BigDecimal expectedValue = ONE.add(EIGHT.divide(NINETY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
+        final BigDecimal expectedValue = ONE.add(EIGHT.divide(NINETY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, endDate, 17, expectedValue);
     }
 
     @Test
     public void testTargetDateAfterEndDate() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2010, 6, 17);
-        DateTime endDate = buildDateTime(2010, 9, 25);
-        DateTime targetDate = buildDateTime(2010, 9, 30);
+        final DateTime startDate = buildDateTime(2010, 6, 17);
+        final DateTime endDate = buildDateTime(2010, 9, 25);
+        final DateTime targetDate = buildDateTime(2010, 9, 30);
 
-        BigDecimal expectedValue = ONE.add(EIGHT.divide(NINETY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
+        final BigDecimal expectedValue = ONE.add(EIGHT.divide(NINETY_ONE, NUMBER_OF_DECIMALS, ROUNDING_METHOD));
         testCalculateNumberOfBillingCycles(startDate, endDate, targetDate, 17, expectedValue);
     }
-}
\ No newline at end of file
+}
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/ValidationProRationTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/ValidationProRationTests.java
index 21dd092..30f0d4a 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/ValidationProRationTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/ValidationProRationTests.java
@@ -16,8 +16,6 @@
 
 package com.ning.billing.invoice.tests.inAdvance;
 
-import static org.testng.Assert.assertEquals;
-
 import java.math.BigDecimal;
 
 import org.joda.time.DateTime;
@@ -29,6 +27,8 @@ import com.ning.billing.invoice.model.InAdvanceBillingMode;
 import com.ning.billing.invoice.model.InvalidDateSequenceException;
 import com.ning.billing.invoice.tests.ProRationTestBase;
 
+import static org.testng.Assert.assertEquals;
+
 @Test(groups = {"fast", "invoicing", "proRation"})
 public class ValidationProRationTests extends ProRationTestBase {
     protected BillingPeriod getBillingPeriod() {
@@ -42,52 +42,52 @@ public class ValidationProRationTests extends ProRationTestBase {
 
     @Test(expectedExceptions = InvalidDateSequenceException.class)
     public void testTargetStartEnd() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 30);
-        DateTime endDate = buildDateTime(2011, 3, 15);
-        DateTime targetDate = buildDateTime(2011, 1, 15);
+        final DateTime startDate = buildDateTime(2011, 1, 30);
+        final DateTime endDate = buildDateTime(2011, 3, 15);
+        final DateTime targetDate = buildDateTime(2011, 1, 15);
 
         calculateNumberOfBillingCycles(startDate, endDate, targetDate, 15);
     }
 
     @Test(expectedExceptions = InvalidDateSequenceException.class)
     public void testTargetEndStart() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 4, 30);
-        DateTime endDate = buildDateTime(2011, 3, 15);
-        DateTime targetDate = buildDateTime(2011, 2, 15);
+        final DateTime startDate = buildDateTime(2011, 4, 30);
+        final DateTime endDate = buildDateTime(2011, 3, 15);
+        final DateTime targetDate = buildDateTime(2011, 2, 15);
 
         calculateNumberOfBillingCycles(startDate, endDate, targetDate, 15);
     }
 
     @Test(expectedExceptions = InvalidDateSequenceException.class)
     public void testEndTargetStart() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 3, 30);
-        DateTime endDate = buildDateTime(2011, 1, 15);
-        DateTime targetDate = buildDateTime(2011, 2, 15);
+        final DateTime startDate = buildDateTime(2011, 3, 30);
+        final DateTime endDate = buildDateTime(2011, 1, 15);
+        final DateTime targetDate = buildDateTime(2011, 2, 15);
 
         calculateNumberOfBillingCycles(startDate, endDate, targetDate, 15);
     }
 
     @Test(expectedExceptions = InvalidDateSequenceException.class)
     public void testEndStartTarget() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 1, 30);
-        DateTime endDate = buildDateTime(2011, 1, 15);
-        DateTime targetDate = buildDateTime(2011, 2, 15);
+        final DateTime startDate = buildDateTime(2011, 1, 30);
+        final DateTime endDate = buildDateTime(2011, 1, 15);
+        final DateTime targetDate = buildDateTime(2011, 2, 15);
 
         calculateNumberOfBillingCycles(startDate, endDate, targetDate, 15);
     }
 
     @Test(expectedExceptions = InvalidDateSequenceException.class)
     public void testTargetStart() throws InvalidDateSequenceException {
-        DateTime startDate = buildDateTime(2011, 4, 30);
-        DateTime targetDate = buildDateTime(2011, 2, 15);
+        final DateTime startDate = buildDateTime(2011, 4, 30);
+        final DateTime targetDate = buildDateTime(2011, 2, 15);
 
         calculateNumberOfBillingCycles(startDate, targetDate, 15);
     }
 
     @Test
     public void testBigDecimalTruncation() {
-        BigDecimal value = new BigDecimal("1.3349573498567");
-        BigDecimal truncated = value.setScale(0, BigDecimal.ROUND_DOWN).setScale(NUMBER_OF_DECIMALS);
+        final BigDecimal value = new BigDecimal("1.3349573498567");
+        final BigDecimal truncated = value.setScale(0, BigDecimal.ROUND_DOWN).setScale(NUMBER_OF_DECIMALS);
 
         assertEquals(truncated, ONE);
     }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/InternationalPriceMock.java b/invoice/src/test/java/com/ning/billing/invoice/tests/InternationalPriceMock.java
index ab11024..4e7467f 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/InternationalPriceMock.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/InternationalPriceMock.java
@@ -16,18 +16,18 @@
 
 package com.ning.billing.invoice.tests;
 
-import static org.testng.Assert.fail;
-
 import java.math.BigDecimal;
 
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.catalog.api.InternationalPrice;
 import com.ning.billing.catalog.api.Price;
 
+import static org.testng.Assert.fail;
+
 public class InternationalPriceMock implements InternationalPrice {
     private final BigDecimal rate;
 
-    public InternationalPriceMock(BigDecimal rate) {
+    public InternationalPriceMock(final BigDecimal rate) {
         this.rate = rate;
     }
 
@@ -39,13 +39,13 @@ public class InternationalPriceMock implements InternationalPrice {
     }
 
     @Override
-    public BigDecimal getPrice(Currency currency) {
+    public BigDecimal getPrice(final Currency currency) {
         return rate;
     }
 
-	@Override
-	public boolean isZero() {
-		return rate.compareTo(BigDecimal.ZERO) == 0;
-	}
+    @Override
+    public boolean isZero() {
+        return rate.compareTo(BigDecimal.ZERO) == 0;
+    }
 
 }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/InvoicingTestBase.java b/invoice/src/test/java/com/ning/billing/invoice/tests/InvoicingTestBase.java
index 5beea5c..1b4efdd 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/InvoicingTestBase.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/InvoicingTestBase.java
@@ -16,8 +16,12 @@
 
 package com.ning.billing.invoice.tests;
 
+import javax.annotation.Nullable;
 import java.math.BigDecimal;
 
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+
 import com.ning.billing.account.api.Account;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.Currency;
@@ -27,12 +31,8 @@ import com.ning.billing.entitlement.api.SubscriptionTransitionType;
 import com.ning.billing.entitlement.api.billing.BillingEvent;
 import com.ning.billing.entitlement.api.billing.BillingModeType;
 import com.ning.billing.entitlement.api.user.Subscription;
-import org.joda.time.DateTime;
-
 import com.ning.billing.invoice.model.InvoicingConfiguration;
 
-import javax.annotation.Nullable;
-
 public abstract class InvoicingTestBase {
     protected static final int NUMBER_OF_DECIMALS = InvoicingConfiguration.getNumberOfDecimals();
     protected static final int ROUNDING_METHOD = InvoicingConfiguration.getRoundingMode();
@@ -80,7 +80,7 @@ public abstract class InvoicingTestBase {
     protected static final BigDecimal THREE_HUNDRED_AND_SIXTY_FIVE = new BigDecimal("365.0").setScale(NUMBER_OF_DECIMALS);
     protected static final BigDecimal THREE_HUNDRED_AND_SIXTY_SIX = new BigDecimal("366.0").setScale(NUMBER_OF_DECIMALS);
 
-    protected DateTime buildDateTime(int year, int month, int day) {
+    protected DateTime buildDateTime(final int year, final int month, final int day) {
         return new DateTime(year, month, day, 0, 0, 0, 0);
     }
 
@@ -97,64 +97,83 @@ public abstract class InvoicingTestBase {
             public Account getAccount() {
                 return account;
             }
+
             @Override
             public int getBillCycleDay() {
                 return billCycleDay;
             }
+
             @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(BillingEvent e1) {
+            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
+                    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/ProRationTestBase.java b/invoice/src/test/java/com/ning/billing/invoice/tests/ProRationTestBase.java
index 1cd4e2f..578b199 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,9 +16,6 @@
 
 package com.ning.billing.invoice.tests;
 
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.fail;
-
 import java.math.BigDecimal;
 import java.util.List;
 
@@ -29,13 +26,17 @@ import com.ning.billing.invoice.model.BillingMode;
 import com.ning.billing.invoice.model.InvalidDateSequenceException;
 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 {
     protected abstract BillingMode getBillingMode();
+
     protected abstract BillingPeriod getBillingPeriod();
 
-    protected void testCalculateNumberOfBillingCycles(DateTime startDate, DateTime targetDate, int billingCycleDay, BigDecimal expectedValue) throws InvalidDateSequenceException {
+    protected void testCalculateNumberOfBillingCycles(final DateTime startDate, final DateTime targetDate, final int billingCycleDay, final BigDecimal expectedValue) throws InvalidDateSequenceException {
         try {
-            BigDecimal numberOfBillingCycles;
+            final BigDecimal numberOfBillingCycles;
             numberOfBillingCycles = calculateNumberOfBillingCycles(startDate, targetDate, billingCycleDay);
 
             assertEquals(numberOfBillingCycles.compareTo(expectedValue), 0, "Actual: " + numberOfBillingCycles.toString() + "; expected: " + expectedValue.toString());
@@ -46,9 +47,9 @@ public abstract class ProRationTestBase extends InvoicingTestBase {
         }
     }
 
-    protected void testCalculateNumberOfBillingCycles(DateTime startDate, DateTime endDate, DateTime targetDate, int billingCycleDay, BigDecimal expectedValue) throws InvalidDateSequenceException {
+    protected void testCalculateNumberOfBillingCycles(final DateTime startDate, final DateTime endDate, final DateTime targetDate, final int billingCycleDay, final BigDecimal expectedValue) throws InvalidDateSequenceException {
         try {
-            BigDecimal numberOfBillingCycles;
+            final BigDecimal numberOfBillingCycles;
             numberOfBillingCycles = calculateNumberOfBillingCycles(startDate, endDate, targetDate, billingCycleDay);
 
             assertEquals(numberOfBillingCycles.compareTo(expectedValue), 0);
@@ -59,25 +60,25 @@ public abstract class ProRationTestBase extends InvoicingTestBase {
         }
     }
 
-    protected BigDecimal calculateNumberOfBillingCycles(DateTime startDate, DateTime endDate, DateTime targetDate, int billingCycleDay) throws InvalidDateSequenceException {
-        List<RecurringInvoiceItemData> items = getBillingMode().calculateInvoiceItemData(startDate, endDate, targetDate, billingCycleDay, getBillingPeriod());
+    protected BigDecimal calculateNumberOfBillingCycles(final DateTime startDate, final DateTime endDate, final DateTime targetDate, final int billingCycleDay) throws InvalidDateSequenceException {
+        final List<RecurringInvoiceItemData> items = getBillingMode().calculateInvoiceItemData(startDate, endDate, targetDate, billingCycleDay, getBillingPeriod());
 
         BigDecimal numberOfBillingCycles = ZERO;
-        for (RecurringInvoiceItemData item : items) {
+        for (final RecurringInvoiceItemData item : items) {
             numberOfBillingCycles = numberOfBillingCycles.add(item.getNumberOfCycles());
         }
 
         return numberOfBillingCycles.setScale(NUMBER_OF_DECIMALS, ROUNDING_METHOD);
     }
 
-    protected BigDecimal calculateNumberOfBillingCycles(DateTime startDate, DateTime targetDate, int billingCycleDay) throws InvalidDateSequenceException {
-        List<RecurringInvoiceItemData> items = getBillingMode().calculateInvoiceItemData(startDate, targetDate, billingCycleDay, getBillingPeriod());
+    protected BigDecimal calculateNumberOfBillingCycles(final DateTime startDate, final DateTime targetDate, final int billingCycleDay) throws InvalidDateSequenceException {
+        final List<RecurringInvoiceItemData> items = getBillingMode().calculateInvoiceItemData(startDate, targetDate, billingCycleDay, getBillingPeriod());
 
         BigDecimal numberOfBillingCycles = ZERO;
-        for (RecurringInvoiceItemData item : items) {
+        for (final RecurringInvoiceItemData item : items) {
             numberOfBillingCycles = numberOfBillingCycles.add(item.getNumberOfCycles());
         }
 
         return numberOfBillingCycles.setScale(NUMBER_OF_DECIMALS, ROUNDING_METHOD);
     }
-}
\ No newline at end of file
+}
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/JaxRsResourceBase.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/JaxRsResourceBase.java
index a302336..33d778c 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/JaxRsResourceBase.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/JaxRsResourceBase.java
@@ -23,6 +23,7 @@ import com.ning.billing.jaxrs.json.CustomFieldJson;
 import com.ning.billing.jaxrs.util.JaxrsUriBuilder;
 import com.ning.billing.jaxrs.util.TagHelper;
 import com.ning.billing.util.api.CustomFieldUserApi;
+import com.ning.billing.util.api.TagApiException;
 import com.ning.billing.util.api.TagDefinitionApiException;
 import com.ning.billing.util.api.TagUserApi;
 import com.ning.billing.util.callcontext.CallContext;
@@ -87,6 +88,8 @@ public abstract class JaxRsResourceBase implements JaxrsResource {
             return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
         } catch (TagDefinitionApiException e) {
             return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
+        } catch (TagApiException e) {
+            return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
         }
     }
 
@@ -105,6 +108,8 @@ public abstract class JaxRsResourceBase implements JaxrsResource {
             return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
         } catch (TagDefinitionApiException e) {
             return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
+        } catch (TagApiException e) {
+            return Response.status(Response.Status.BAD_REQUEST).entity(e.getMessage()).build();
         }
     }
 
diff --git a/junction/src/main/java/com/ning/billing/junction/plumbing/billing/BlockingCalculator.java b/junction/src/main/java/com/ning/billing/junction/plumbing/billing/BlockingCalculator.java
index e33c063..19fce2b 100644
--- a/junction/src/main/java/com/ning/billing/junction/plumbing/billing/BlockingCalculator.java
+++ b/junction/src/main/java/com/ning/billing/junction/plumbing/billing/BlockingCalculator.java
@@ -26,6 +26,7 @@ import java.util.UUID;
 import java.util.concurrent.atomic.AtomicLong;
 
 import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
 
 import com.google.inject.Inject;
 import com.ning.billing.account.api.Account;
@@ -199,11 +200,12 @@ public class BlockingCalculator {
         final BillingPeriod billingPeriod = previousEvent.getBillingPeriod();
         final SubscriptionTransitionType type = SubscriptionTransitionType.CANCEL;
         final Long totalOrdering = globaltotalOrder.getAndIncrement(); 
+        final DateTimeZone tz = previousEvent.getTimeZone();
 
         return new DefaultBillingEvent(account, subscription, effectiveDate, plan, planPhase,
                 fixedPrice, recurringPrice, currency,
                 billingPeriod, billCycleDay, billingModeType,
-                description, totalOrdering, type);
+                description, totalOrdering, type, tz);
     }
 
     protected BillingEvent createNewReenableEvent(DateTime odEventTime, BillingEvent previousEvent) {
@@ -221,11 +223,12 @@ public class BlockingCalculator {
         final BillingPeriod billingPeriod = previousEvent.getBillingPeriod();
         final SubscriptionTransitionType type = SubscriptionTransitionType.RE_CREATE;
         final Long totalOrdering = globaltotalOrder.getAndIncrement();  
+        final DateTimeZone tz = previousEvent.getTimeZone();
 
         return new DefaultBillingEvent(account, subscription, effectiveDate, plan, planPhase,
                 fixedPrice, recurringPrice, currency,
                 billingPeriod, billCycleDay, billingModeType,
-                description, totalOrdering, type);
+                description, totalOrdering, type, tz);
     }
 
     protected Hashtable<UUID,List<Subscription>> createBundleSubscriptionMap(SortedSet<BillingEvent> billingEvents) {
diff --git a/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultBillingEvent.java b/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultBillingEvent.java
index 35bc837..be5005b 100644
--- a/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultBillingEvent.java
+++ b/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultBillingEvent.java
@@ -19,6 +19,7 @@ package com.ning.billing.junction.plumbing.billing;
 import java.math.BigDecimal;
 
 import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
 
 import com.ning.billing.account.api.Account;
 import com.ning.billing.catalog.api.BillingPeriod;
@@ -27,7 +28,6 @@ import com.ning.billing.catalog.api.CatalogApiException;
 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.billing.BillingEvent;
 import com.ning.billing.entitlement.api.billing.BillingModeType;
@@ -49,6 +49,7 @@ public class DefaultBillingEvent implements BillingEvent {
     final private BillingPeriod billingPeriod;
     final private SubscriptionTransitionType type;
     final private Long totalOrdering;
+    final private DateTimeZone timeZone;
 
     public DefaultBillingEvent(Account account, SubscriptionEvent transition, Subscription subscription, int billCycleDay, Currency currency, Catalog catalog) throws CatalogApiException {
 
@@ -82,12 +83,13 @@ public class DefaultBillingEvent implements BillingEvent {
                 nextPhase.getBillingPeriod() : prevPhase.getBillingPeriod();
         type = transition.getTransitionType();
         totalOrdering = transition.getTotalOrdering();
+        timeZone = account.getTimeZone();
     }
 
     public DefaultBillingEvent(Account account, Subscription subscription, DateTime effectiveDate, Plan plan, PlanPhase planPhase,
                                BigDecimal fixedPrice, BigDecimal recurringPrice, Currency currency,
                                BillingPeriod billingPeriod, int billCycleDay, BillingModeType billingModeType,
-                               String description, long totalOrdering, SubscriptionTransitionType type) {
+                               String description, long totalOrdering, SubscriptionTransitionType type, DateTimeZone timeZone) {
         this.account = account;
         this.subscription = subscription;
         this.effectiveDate = effectiveDate;
@@ -102,6 +104,7 @@ public class DefaultBillingEvent implements BillingEvent {
         this.description = description;
         this.type = type;
         this.totalOrdering = totalOrdering;
+        this.timeZone = timeZone;
     }
 
 
@@ -265,4 +268,9 @@ public class DefaultBillingEvent implements BillingEvent {
         result = 31 * result + totalOrdering.hashCode();
         return result;
     }
+
+    @Override
+    public DateTimeZone getTimeZone() {
+        return timeZone;
+    }
 }
\ No newline at end of file
diff --git a/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillingApi.java b/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillingApi.java
index 68469b6..f4aab90 100644
--- a/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillingApi.java
+++ b/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillingApi.java
@@ -253,6 +253,7 @@ public class TestBillingApi {
         ((ZombieControl)account).addResult("getBillCycleDay", 32);
         ((ZombieControl)account).addResult("getCurrency", Currency.USD);
         ((ZombieControl)account).addResult("getId", UUID.randomUUID());
+        ((ZombieControl)account).addResult("getTimeZone", DateTimeZone.UTC);
         ((ZombieControl)accountApi).addResult("getAccountById", account);
 		       
         BillCycleDayCalculator bcdCalculator = new BillCycleDayCalculator(catalogService, entitlementApi);
@@ -318,6 +319,7 @@ public class TestBillingApi {
         ((ZombieControl)account).addResult("getBillCycleDay", 32);
         ((ZombieControl)account).addResult("getCurrency", Currency.USD);
         ((ZombieControl)account).addResult("getId", UUID.randomUUID());
+        ((ZombieControl)account).addResult("getTimeZone", DateTimeZone.UTC);
         ((ZombieControl)accountApi).addResult("getAccountById", account);
 
         ((MockCatalog)catalogService.getFullCatalog()).setBillingAlignment(BillingAlignment.ACCOUNT);
@@ -351,6 +353,7 @@ public class TestBillingApi {
 		((ZombieControl)account).addResult("getBillCycleDay", 1).addResult("getTimeZone", DateTimeZone.UTC);
         ((ZombieControl)account).addResult("getCurrency", Currency.USD);
         ((ZombieControl)account).addResult("getId", UUID.randomUUID());
+        ((ZombieControl)account).addResult("getTimeZone", DateTimeZone.UTC);
 
         AccountUserApi accountApi = BrainDeadProxyFactory.createBrainDeadProxyFor(AccountUserApi.class);
         ((ZombieControl)accountApi).addResult("getAccountById", account);
@@ -389,6 +392,7 @@ public class TestBillingApi {
         Account account = BrainDeadProxyFactory.createBrainDeadProxyFor(Account.class);
         ((ZombieControl)account).addResult("getBillCycleDay", 32);
         ((ZombieControl)account).addResult("getCurrency", Currency.USD);
+        ((ZombieControl)account).addResult("getTimeZone", DateTimeZone.UTC);
         ((ZombieControl)accountApi).addResult("getAccountById", account);
         ((ZombieControl)account).addResult("getId", UUID.randomUUID());
 
@@ -551,7 +555,7 @@ public class TestBillingApi {
 
 		Assert.assertEquals(BCD, event.getBillCycleDay());
 		Assert.assertEquals(id, event.getSubscription().getId());
-		Assert.assertEquals(time, event.getEffectiveDate());
+		Assert.assertEquals(time.getDayOfMonth(), event.getEffectiveDate().getDayOfMonth());
 		Assert.assertEquals(nextPhase, event.getPlanPhase());
 		Assert.assertEquals(nextPlan, event.getPlan());
 		Assert.assertEquals(nextPhase.getBillingPeriod(), event.getBillingPeriod());
diff --git a/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBlockingCalculator.java b/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBlockingCalculator.java
index b501c98..9ca10cd 100644
--- a/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBlockingCalculator.java
+++ b/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBlockingCalculator.java
@@ -30,6 +30,7 @@ import java.util.TreeSet;
 import java.util.UUID;
 
 import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
@@ -557,11 +558,12 @@ public class TestBlockingCalculator {
         final BillingPeriod billingPeriod = BillingPeriod.MONTHLY;
         final SubscriptionTransitionType type = SubscriptionTransitionType.CHANGE;
         final Long totalOrdering = 0L; 
+        final DateTimeZone tz = DateTimeZone.UTC;
 
         return new DefaultBillingEvent(account, subscription, effectiveDate, plan, planPhase,
                 fixedPrice, recurringPrice, currency,
                 billingPeriod, billCycleDay, billingModeType,
-                description, totalOrdering, type);
+                description, totalOrdering, type, tz);
     }
 
 
@@ -629,7 +631,7 @@ public class TestBlockingCalculator {
     private class MockBillingEvent extends DefaultBillingEvent {
         public MockBillingEvent() {
             super(account, subscription1, clock.getUTCNow(), null, null, BigDecimal.ZERO, BigDecimal.TEN, Currency.USD, BillingPeriod.ANNUAL,
-                    4, BillingModeType.IN_ADVANCE, "", 3L, SubscriptionTransitionType.CREATE);
+                    4, BillingModeType.IN_ADVANCE, "", 3L, SubscriptionTransitionType.CREATE, DateTimeZone.UTC);
         }        
     }
 
diff --git a/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestDefaultBillingEvent.java b/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestDefaultBillingEvent.java
index 92e2bf2..10fdc1c 100644
--- a/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestDefaultBillingEvent.java
+++ b/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestDefaultBillingEvent.java
@@ -25,6 +25,7 @@ import java.util.UUID;
 import javax.annotation.Nullable;
 
 import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
@@ -142,7 +143,7 @@ public class TestDefaultBillingEvent {
 		return new DefaultBillingEvent(null, sub , effectiveDate,
 				shotgun, shotgunMonthly,
 				BigDecimal.ZERO, null, Currency.USD, BillingPeriod.NO_BILLING_PERIOD, billCycleDay,
-				BillingModeType.IN_ADVANCE, "Test Event 1", totalOrdering, type);
+				BillingModeType.IN_ADVANCE, "Test Event 1", totalOrdering, type, DateTimeZone.UTC);
 	}
 
 	private MockPlanPhase createMockMonthlyPlanPhase(@Nullable final BigDecimal recurringRate,
diff --git a/util/src/main/java/com/ning/billing/util/tag/api/DefaultTagService.java b/util/src/main/java/com/ning/billing/util/tag/api/DefaultTagService.java
index e5627e5..0a1fa28 100644
--- a/util/src/main/java/com/ning/billing/util/tag/api/DefaultTagService.java
+++ b/util/src/main/java/com/ning/billing/util/tag/api/DefaultTagService.java
@@ -21,8 +21,8 @@ import com.ning.billing.util.api.TagService;
 import com.ning.billing.util.api.TagUserApi;
 
 public class DefaultTagService implements TagService {
-    
     private static final String TAG_DEFINITION_SERVICE_NAME = "tag-service";
+
     private final TagUserApi api;
 
     @Inject
diff --git a/util/src/main/java/com/ning/billing/util/tag/api/DefaultTagUserApi.java b/util/src/main/java/com/ning/billing/util/tag/api/DefaultTagUserApi.java
index 4a065de..075e10e 100644
--- a/util/src/main/java/com/ning/billing/util/tag/api/DefaultTagUserApi.java
+++ b/util/src/main/java/com/ning/billing/util/tag/api/DefaultTagUserApi.java
@@ -21,6 +21,7 @@ import java.util.Map;
 import java.util.UUID;
 
 import com.google.inject.Inject;
+import com.ning.billing.util.api.TagApiException;
 import com.ning.billing.util.api.TagDefinitionApiException;
 import com.ning.billing.util.api.TagUserApi;
 import com.ning.billing.util.callcontext.CallContext;
@@ -35,7 +36,7 @@ public class DefaultTagUserApi implements TagUserApi {
     private final TagDao tagDao;
 
     @Inject
-    public DefaultTagUserApi(TagDefinitionDao tagDefinitionDao, TagDao tagDao) {
+    public DefaultTagUserApi(final TagDefinitionDao tagDefinitionDao, final TagDao tagDao) {
         this.tagDefinitionDao = tagDefinitionDao;
         this.tagDao = tagDao;
     }
@@ -51,41 +52,38 @@ public class DefaultTagUserApi implements TagUserApi {
     }
 
     @Override
-    public void deleteAllTagsForDefinition(final String definitionName, final CallContext context)
-            throws TagDefinitionApiException {
-        tagDefinitionDao.deleteAllTagsForDefinition(definitionName, context);
+    public void deleteTagDefinition(final String definitionName, final CallContext context) throws TagDefinitionApiException {
+        tagDefinitionDao.deleteTagDefinition(definitionName, context);
     }
 
     @Override
-    public void deleteTagDefinition(final String definitionName, final CallContext context) throws TagDefinitionApiException {
-        tagDefinitionDao.deleteAllTagsForDefinition(definitionName, context);
+    public TagDefinition getTagDefinition(final String name)
+            throws TagDefinitionApiException {
+        return tagDefinitionDao.getByName(name);
     }
 
-	@Override
-	public TagDefinition getTagDefinition(final String name)
-			throws TagDefinitionApiException {
-		return tagDefinitionDao.getByName(name);
-	}
-
     @Override
-    public void addTags(UUID objectId, ObjectType objectType, List<TagDefinition> tagDefinitions, CallContext context) {
-        tagDao.insertTags(objectId, objectType, tagDefinitions, context);
+    public void addTags(final UUID objectId, final ObjectType objectType, final List<TagDefinition> tagDefinitions, final CallContext context) throws TagApiException {
+        // TODO: consider making this batch
+        for (final TagDefinition tagDefinition : tagDefinitions) {
+            tagDao.insertTag(objectId, objectType, tagDefinition, context);
+        }
     }
 
     @Override
-    public void addTag(UUID objectId, ObjectType objectType, TagDefinition tagDefinition, CallContext context) {
+    public void addTag(final UUID objectId, final ObjectType objectType, final TagDefinition tagDefinition, final CallContext context) throws TagApiException {
         tagDao.insertTag(objectId, objectType, tagDefinition, context);
     }
 
     @Override
-    public void removeTag(UUID objectId, ObjectType objectType, TagDefinition tagDefinition, CallContext context) {
+    public void removeTag(final UUID objectId, final ObjectType objectType, final TagDefinition tagDefinition, final CallContext context) throws TagApiException {
         tagDao.deleteTag(objectId, objectType, tagDefinition, context);
     }
 
     @Override
-    public void removeTags(UUID objectId, ObjectType objectType, List<TagDefinition> tagDefinitions, CallContext context)  {
+    public void removeTags(final UUID objectId, final ObjectType objectType, final List<TagDefinition> tagDefinitions, final CallContext context) throws TagApiException {
         // TODO: consider making this batch
-        for (TagDefinition tagDefinition : tagDefinitions) {
+        for (final TagDefinition tagDefinition : tagDefinitions) {
             tagDao.deleteTag(objectId, objectType, tagDefinition, context);
         }
     }
@@ -94,26 +92,4 @@ public class DefaultTagUserApi implements TagUserApi {
     public Map<String, Tag> getTags(final UUID objectId, final ObjectType objectType) {
         return tagDao.loadEntities(objectId, objectType);
     }
-
-//    @Override
-//    public Tag createControlTags(String controlTagName) throws TagDefinitionApiException {
-//        ControlTagType type = null;
-//        for(ControlTagType t : ControlTagType.values()) {
-//            if(t.toString().equals(controlTagName)) {
-//                type = t;
-//            }
-//        }
-//
-//        if(type == null) {
-//            throw new TagDefinitionApiException(ErrorCode.CONTROL_TAG_DOES_NOT_EXIST, controlTagName);
-//        }
-//        return new DefaultControlTag(type);
-//    }
-//
-//    @Override
-//    public Tag createDescriptiveTags(List) throws TagDefinitionApiException {
-//        TagDefinition tagDefinition = getTagDefinition(tagDefinitionName);
-//
-//        return new DescriptiveTag(tagDefinition);
-//    }
 }
diff --git a/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultControlTagCreationEvent.java b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultControlTagCreationEvent.java
new file mode 100644
index 0000000..3f24ac4
--- /dev/null
+++ b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultControlTagCreationEvent.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.tag.api.user;
+
+import java.util.UUID;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.tag.TagDefinition;
+import com.ning.billing.util.tag.api.ControlTagCreationEvent;
+
+public class DefaultControlTagCreationEvent implements ControlTagCreationEvent {
+    private final UUID tagId;
+    private final UUID objectId;
+    private final ObjectType objectType;
+    private final TagDefinition tagDefinition;
+    private final UUID userToken;
+
+    @JsonCreator
+    public DefaultControlTagCreationEvent(@JsonProperty("tagId") final UUID tagId,
+                                          @JsonProperty("objectId") final UUID objectId,
+                                          @JsonProperty("objectType") final ObjectType objectType,
+                                          @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
+                                          @JsonProperty("userToken") final UUID userToken) {
+        this.tagId = tagId;
+        this.objectId = objectId;
+        this.objectType = objectType;
+        this.tagDefinition = tagDefinition;
+        this.userToken = userToken;
+    }
+
+    @Override
+    public UUID getTagId() {
+        return tagId;
+    }
+
+    @Override
+    public UUID getObjectId() {
+        return objectId;
+    }
+
+    @Override
+    public ObjectType getObjectType() {
+        return objectType;
+    }
+
+    @Override
+    public TagDefinition getTagDefinition() {
+        return tagDefinition;
+    }
+
+    @JsonIgnore
+    @Override
+    public BusEventType getBusEventType() {
+        return BusEventType.CONTROL_TAG_CREATION;
+    }
+
+    @Override
+    public UUID getUserToken() {
+        return userToken;
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder();
+        sb.append("DefaultControlTagCreationEvent");
+        sb.append("{objectId=").append(objectId);
+        sb.append(", tagId=").append(tagId);
+        sb.append(", objectType=").append(objectType);
+        sb.append(", tagDefinition=").append(tagDefinition);
+        sb.append(", userToken=").append(userToken);
+        sb.append('}');
+        return sb.toString();
+    }
+
+    @Override
+    public boolean equals(final Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        final DefaultControlTagCreationEvent that = (DefaultControlTagCreationEvent) o;
+
+        if (objectId != null ? !objectId.equals(that.objectId) : that.objectId != null) {
+            return false;
+        }
+        if (objectType != that.objectType) {
+            return false;
+        }
+        if (tagDefinition != null ? !tagDefinition.equals(that.tagDefinition) : that.tagDefinition != null) {
+            return false;
+        }
+        if (tagId != null ? !tagId.equals(that.tagId) : that.tagId != null) {
+            return false;
+        }
+        if (userToken != null ? !userToken.equals(that.userToken) : that.userToken != null) {
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = tagId != null ? tagId.hashCode() : 0;
+        result = 31 * result + (objectId != null ? objectId.hashCode() : 0);
+        result = 31 * result + (objectType != null ? objectType.hashCode() : 0);
+        result = 31 * result + (tagDefinition != null ? tagDefinition.hashCode() : 0);
+        result = 31 * result + (userToken != null ? userToken.hashCode() : 0);
+        return result;
+    }
+}
diff --git a/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultControlTagDefinitionCreationEvent.java b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultControlTagDefinitionCreationEvent.java
new file mode 100644
index 0000000..f21db81
--- /dev/null
+++ b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultControlTagDefinitionCreationEvent.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.tag.api.user;
+
+import java.util.UUID;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ning.billing.util.tag.TagDefinition;
+import com.ning.billing.util.tag.api.ControlTagDefinitionCreationEvent;
+
+public class DefaultControlTagDefinitionCreationEvent implements ControlTagDefinitionCreationEvent {
+    private final UUID tagDefinitionId;
+    private final TagDefinition tagDefinition;
+    private final UUID userToken;
+
+    @JsonCreator
+    public DefaultControlTagDefinitionCreationEvent(@JsonProperty("tagDefinitionId") final UUID tagDefinitionId,
+                                                    @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
+                                                    @JsonProperty("userToken") final UUID userToken) {
+        this.tagDefinitionId = tagDefinitionId;
+        this.tagDefinition = tagDefinition;
+        this.userToken = userToken;
+    }
+
+    @Override
+    public UUID getTagDefinitionId() {
+        return tagDefinitionId;
+    }
+
+    @Override
+    public TagDefinition getTagDefinition() {
+        return tagDefinition;
+    }
+
+    @JsonIgnore
+    @Override
+    public BusEventType getBusEventType() {
+        return BusEventType.CONTROL_TAGDEFINITION_CREATION;
+    }
+
+    @Override
+    public UUID getUserToken() {
+        return userToken;
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder();
+        sb.append("DefaultControlTagDefinitionCreationEvent");
+        sb.append("{tagDefinition=").append(tagDefinition);
+        sb.append(", tagDefinitionId=").append(tagDefinitionId);
+        sb.append(", userToken=").append(userToken);
+        sb.append('}');
+        return sb.toString();
+    }
+
+    @Override
+    public boolean equals(final Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        final DefaultControlTagDefinitionCreationEvent that = (DefaultControlTagDefinitionCreationEvent) o;
+
+        if (tagDefinition != null ? !tagDefinition.equals(that.tagDefinition) : that.tagDefinition != null) {
+            return false;
+        }
+        if (tagDefinitionId != null ? !tagDefinitionId.equals(that.tagDefinitionId) : that.tagDefinitionId != null) {
+            return false;
+        }
+        if (userToken != null ? !userToken.equals(that.userToken) : that.userToken != null) {
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = tagDefinitionId != null ? tagDefinitionId.hashCode() : 0;
+        result = 31 * result + (tagDefinition != null ? tagDefinition.hashCode() : 0);
+        result = 31 * result + (userToken != null ? userToken.hashCode() : 0);
+        return result;
+    }
+}
diff --git a/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultControlTagDefinitionDeletionEvent.java b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultControlTagDefinitionDeletionEvent.java
new file mode 100644
index 0000000..386b25b
--- /dev/null
+++ b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultControlTagDefinitionDeletionEvent.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.tag.api.user;
+
+import java.util.UUID;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ning.billing.util.tag.TagDefinition;
+import com.ning.billing.util.tag.api.ControlTagDefinitionDeletionEvent;
+
+public class DefaultControlTagDefinitionDeletionEvent implements ControlTagDefinitionDeletionEvent {
+    private final UUID tagDefinitionId;
+    private final TagDefinition tagDefinition;
+    private final UUID userToken;
+
+    @JsonCreator
+    public DefaultControlTagDefinitionDeletionEvent(@JsonProperty("tagDefinitionId") final UUID tagDefinitionId,
+                                                    @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
+                                                    @JsonProperty("userToken") final UUID userToken) {
+        this.tagDefinitionId = tagDefinitionId;
+        this.tagDefinition = tagDefinition;
+        this.userToken = userToken;
+    }
+
+    @Override
+    public UUID getTagDefinitionId() {
+        return tagDefinitionId;
+    }
+
+    @Override
+    public TagDefinition getTagDefinition() {
+        return tagDefinition;
+    }
+
+    @JsonIgnore
+    @Override
+    public BusEventType getBusEventType() {
+        return BusEventType.CONTROL_TAGDEFINITION_DELETION;
+    }
+
+    @Override
+    public UUID getUserToken() {
+        return userToken;
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder();
+        sb.append("DefaultControlTagDefinitionDeletionEvent");
+        sb.append("{tagDefinition=").append(tagDefinition);
+        sb.append(", tagDefinitionId=").append(tagDefinitionId);
+        sb.append(", userToken=").append(userToken);
+        sb.append('}');
+        return sb.toString();
+    }
+
+    @Override
+    public boolean equals(final Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        final DefaultControlTagDefinitionDeletionEvent that = (DefaultControlTagDefinitionDeletionEvent) o;
+
+        if (tagDefinition != null ? !tagDefinition.equals(that.tagDefinition) : that.tagDefinition != null) {
+            return false;
+        }
+        if (tagDefinitionId != null ? !tagDefinitionId.equals(that.tagDefinitionId) : that.tagDefinitionId != null) {
+            return false;
+        }
+        if (userToken != null ? !userToken.equals(that.userToken) : that.userToken != null) {
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = tagDefinitionId != null ? tagDefinitionId.hashCode() : 0;
+        result = 31 * result + (tagDefinition != null ? tagDefinition.hashCode() : 0);
+        result = 31 * result + (userToken != null ? userToken.hashCode() : 0);
+        return result;
+    }
+}
diff --git a/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultControlTagDeletionEvent.java b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultControlTagDeletionEvent.java
new file mode 100644
index 0000000..326d50f
--- /dev/null
+++ b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultControlTagDeletionEvent.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.tag.api.user;
+
+import java.util.UUID;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.tag.TagDefinition;
+import com.ning.billing.util.tag.api.ControlTagDeletionEvent;
+
+public class DefaultControlTagDeletionEvent implements ControlTagDeletionEvent {
+    private final UUID tagId;
+    final UUID objectId;
+    final ObjectType objectType;
+    final TagDefinition tagDefinition;
+    final UUID userToken;
+
+    @JsonCreator
+    public DefaultControlTagDeletionEvent(@JsonProperty("tagId") final UUID tagId,
+                                          @JsonProperty("objectId") final UUID objectId,
+                                          @JsonProperty("objectType") final ObjectType objectType,
+                                          @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
+                                          @JsonProperty("userToken") final UUID userToken) {
+        this.tagId = tagId;
+        this.objectId = objectId;
+        this.objectType = objectType;
+        this.tagDefinition = tagDefinition;
+        this.userToken = userToken;
+    }
+
+    @Override
+    public UUID getTagId() {
+        return tagId;
+    }
+
+    @Override
+    public UUID getObjectId() {
+        return objectId;
+    }
+
+    @Override
+    public ObjectType getObjectType() {
+        return objectType;
+    }
+
+    @Override
+    public TagDefinition getTagDefinition() {
+        return tagDefinition;
+    }
+
+    @JsonIgnore
+    @Override
+    public BusEventType getBusEventType() {
+        return BusEventType.CONTROL_TAG_DELETION;
+    }
+
+    @Override
+    public UUID getUserToken() {
+        return userToken;
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder();
+        sb.append("DefaultControlTagDeletionEvent");
+        sb.append("{objectId=").append(objectId);
+        sb.append(", tagId=").append(tagId);
+        sb.append(", objectType=").append(objectType);
+        sb.append(", tagDefinition=").append(tagDefinition);
+        sb.append(", userToken=").append(userToken);
+        sb.append('}');
+        return sb.toString();
+    }
+
+    @Override
+    public boolean equals(final Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        final DefaultControlTagDeletionEvent that = (DefaultControlTagDeletionEvent) o;
+
+        if (objectId != null ? !objectId.equals(that.objectId) : that.objectId != null) {
+            return false;
+        }
+        if (objectType != that.objectType) {
+            return false;
+        }
+        if (tagDefinition != null ? !tagDefinition.equals(that.tagDefinition) : that.tagDefinition != null) {
+            return false;
+        }
+        if (tagId != null ? !tagId.equals(that.tagId) : that.tagId != null) {
+            return false;
+        }
+        if (userToken != null ? !userToken.equals(that.userToken) : that.userToken != null) {
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = tagId != null ? tagId.hashCode() : 0;
+        result = 31 * result + (objectId != null ? objectId.hashCode() : 0);
+        result = 31 * result + (objectType != null ? objectType.hashCode() : 0);
+        result = 31 * result + (tagDefinition != null ? tagDefinition.hashCode() : 0);
+        result = 31 * result + (userToken != null ? userToken.hashCode() : 0);
+        return result;
+    }
+}
diff --git a/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagCreationEvent.java b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagCreationEvent.java
new file mode 100644
index 0000000..ae386f1
--- /dev/null
+++ b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagCreationEvent.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.tag.api.user;
+
+import java.util.UUID;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.tag.TagDefinition;
+import com.ning.billing.util.tag.api.UserTagCreationEvent;
+
+public class DefaultUserTagCreationEvent implements UserTagCreationEvent {
+    private final UUID tagId;
+    private final UUID objectId;
+    private final ObjectType objectType;
+    private final TagDefinition tagDefinition;
+    private final UUID userToken;
+
+    @JsonCreator
+    public DefaultUserTagCreationEvent(@JsonProperty("tagId") final UUID tagId,
+                                       @JsonProperty("objectId") final UUID objectId,
+                                       @JsonProperty("objectType") final ObjectType objectType,
+                                       @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
+                                       @JsonProperty("userToken") final UUID userToken) {
+        this.tagId = tagId;
+        this.objectId = objectId;
+        this.objectType = objectType;
+        this.tagDefinition = tagDefinition;
+        this.userToken = userToken;
+    }
+
+    @Override
+    public UUID getTagId() {
+        return tagId;
+    }
+
+    @Override
+    public UUID getObjectId() {
+        return objectId;
+    }
+
+    @Override
+    public ObjectType getObjectType() {
+        return objectType;
+    }
+
+    @Override
+    public TagDefinition getTagDefinition() {
+        return tagDefinition;
+    }
+
+    @JsonIgnore
+    @Override
+    public BusEventType getBusEventType() {
+        return BusEventType.USER_TAG_CREATION;
+    }
+
+    @Override
+    public UUID getUserToken() {
+        return userToken;
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder();
+        sb.append("DefaultUserTagCreationEvent");
+        sb.append("{objectId=").append(objectId);
+        sb.append(", tagId=").append(tagId);
+        sb.append(", objectType=").append(objectType);
+        sb.append(", tagDefinition=").append(tagDefinition);
+        sb.append(", userToken=").append(userToken);
+        sb.append('}');
+        return sb.toString();
+    }
+
+    @Override
+    public boolean equals(final Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        final DefaultUserTagCreationEvent that = (DefaultUserTagCreationEvent) o;
+
+        if (objectId != null ? !objectId.equals(that.objectId) : that.objectId != null) {
+            return false;
+        }
+        if (objectType != that.objectType) {
+            return false;
+        }
+        if (tagDefinition != null ? !tagDefinition.equals(that.tagDefinition) : that.tagDefinition != null) {
+            return false;
+        }
+        if (tagId != null ? !tagId.equals(that.tagId) : that.tagId != null) {
+            return false;
+        }
+        if (userToken != null ? !userToken.equals(that.userToken) : that.userToken != null) {
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = tagId != null ? tagId.hashCode() : 0;
+        result = 31 * result + (objectId != null ? objectId.hashCode() : 0);
+        result = 31 * result + (objectType != null ? objectType.hashCode() : 0);
+        result = 31 * result + (tagDefinition != null ? tagDefinition.hashCode() : 0);
+        result = 31 * result + (userToken != null ? userToken.hashCode() : 0);
+        return result;
+    }
+}
diff --git a/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagDefinitionCreationEvent.java b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagDefinitionCreationEvent.java
new file mode 100644
index 0000000..5d86e4b
--- /dev/null
+++ b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagDefinitionCreationEvent.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.tag.api.user;
+
+import java.util.UUID;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ning.billing.util.tag.TagDefinition;
+import com.ning.billing.util.tag.api.UserTagDefinitionCreationEvent;
+
+public class DefaultUserTagDefinitionCreationEvent implements UserTagDefinitionCreationEvent {
+    private final UUID tagDefinitionId;
+    private final TagDefinition tagDefinition;
+    private final UUID userToken;
+
+    @JsonCreator
+    public DefaultUserTagDefinitionCreationEvent(@JsonProperty("tagDefinitionId") final UUID tagDefinitionId,
+                                                 @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
+                                                 @JsonProperty("userToken") final UUID userToken) {
+        this.tagDefinitionId = tagDefinitionId;
+        this.tagDefinition = tagDefinition;
+        this.userToken = userToken;
+    }
+
+    @Override
+    public UUID getTagDefinitionId() {
+        return tagDefinitionId;
+    }
+
+    @Override
+    public TagDefinition getTagDefinition() {
+        return tagDefinition;
+    }
+
+    @JsonIgnore
+    @Override
+    public BusEventType getBusEventType() {
+        return BusEventType.USER_TAGDEFINITION_CREATION;
+    }
+
+    @Override
+    public UUID getUserToken() {
+        return userToken;
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder();
+        sb.append("DefaultUserTagDefinitionCreationEvent");
+        sb.append("{tagDefinition=").append(tagDefinition);
+        sb.append(", tagDefinitionId=").append(tagDefinitionId);
+        sb.append(", userToken=").append(userToken);
+        sb.append('}');
+        return sb.toString();
+    }
+
+    @Override
+    public boolean equals(final Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        final DefaultUserTagDefinitionCreationEvent that = (DefaultUserTagDefinitionCreationEvent) o;
+
+        if (tagDefinition != null ? !tagDefinition.equals(that.tagDefinition) : that.tagDefinition != null) {
+            return false;
+        }
+        if (tagDefinitionId != null ? !tagDefinitionId.equals(that.tagDefinitionId) : that.tagDefinitionId != null) {
+            return false;
+        }
+        if (userToken != null ? !userToken.equals(that.userToken) : that.userToken != null) {
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = tagDefinitionId != null ? tagDefinitionId.hashCode() : 0;
+        result = 31 * result + (tagDefinition != null ? tagDefinition.hashCode() : 0);
+        result = 31 * result + (userToken != null ? userToken.hashCode() : 0);
+        return result;
+    }
+}
diff --git a/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagDefinitionDeletionEvent.java b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagDefinitionDeletionEvent.java
new file mode 100644
index 0000000..a324d49
--- /dev/null
+++ b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagDefinitionDeletionEvent.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.tag.api.user;
+
+import java.util.UUID;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ning.billing.util.tag.TagDefinition;
+import com.ning.billing.util.tag.api.UserTagDefinitionDeletionEvent;
+
+public class DefaultUserTagDefinitionDeletionEvent implements UserTagDefinitionDeletionEvent {
+    private final UUID tagDefinitionId;
+    private final TagDefinition tagDefinition;
+    private final UUID userToken;
+
+    @JsonCreator
+    public DefaultUserTagDefinitionDeletionEvent(@JsonProperty("tagDefinitionId") final UUID tagDefinitionId,
+                                                 @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
+                                                 @JsonProperty("userToken") final UUID userToken) {
+        this.tagDefinitionId = tagDefinitionId;
+        this.tagDefinition = tagDefinition;
+        this.userToken = userToken;
+    }
+
+    @Override
+    public UUID getTagDefinitionId() {
+        return tagDefinitionId;
+    }
+
+    @Override
+    public TagDefinition getTagDefinition() {
+        return tagDefinition;
+    }
+
+    @JsonIgnore
+    @Override
+    public BusEventType getBusEventType() {
+        return BusEventType.USER_TAGDEFINITION_DELETION;
+    }
+
+    @Override
+    public UUID getUserToken() {
+        return userToken;
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder();
+        sb.append("DefaultUserTagDefinitionDeletionEvent");
+        sb.append("{tagDefinition=").append(tagDefinition);
+        sb.append(", tagDefinitionId=").append(tagDefinitionId);
+        sb.append(", userToken=").append(userToken);
+        sb.append('}');
+        return sb.toString();
+    }
+
+    @Override
+    public boolean equals(final Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        final DefaultUserTagDefinitionDeletionEvent that = (DefaultUserTagDefinitionDeletionEvent) o;
+
+        if (tagDefinition != null ? !tagDefinition.equals(that.tagDefinition) : that.tagDefinition != null) {
+            return false;
+        }
+        if (tagDefinitionId != null ? !tagDefinitionId.equals(that.tagDefinitionId) : that.tagDefinitionId != null) {
+            return false;
+        }
+        if (userToken != null ? !userToken.equals(that.userToken) : that.userToken != null) {
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = tagDefinitionId != null ? tagDefinitionId.hashCode() : 0;
+        result = 31 * result + (tagDefinition != null ? tagDefinition.hashCode() : 0);
+        result = 31 * result + (userToken != null ? userToken.hashCode() : 0);
+        return result;
+    }
+}
diff --git a/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagDeletionEvent.java b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagDeletionEvent.java
new file mode 100644
index 0000000..a19f97b
--- /dev/null
+++ b/util/src/main/java/com/ning/billing/util/tag/api/user/DefaultUserTagDeletionEvent.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.tag.api.user;
+
+import java.util.UUID;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.tag.TagDefinition;
+import com.ning.billing.util.tag.api.UserTagDeletionEvent;
+
+public class DefaultUserTagDeletionEvent implements UserTagDeletionEvent {
+    private final UUID tagId;
+    private final UUID objectId;
+    private final ObjectType objectType;
+    private final TagDefinition tagDefinition;
+    private final UUID userToken;
+
+    @JsonCreator
+    public DefaultUserTagDeletionEvent(@JsonProperty("tagId") final UUID tagId,
+                                       @JsonProperty("objectId") final UUID objectId,
+                                       @JsonProperty("objectType") final ObjectType objectType,
+                                       @JsonProperty("tagDefinition") final TagDefinition tagDefinition,
+                                       @JsonProperty("userToken") final UUID userToken) {
+        this.tagId = tagId;
+        this.objectId = objectId;
+        this.objectType = objectType;
+        this.tagDefinition = tagDefinition;
+        this.userToken = userToken;
+    }
+
+    @Override
+    public UUID getTagId() {
+        return tagId;
+    }
+
+    @Override
+    public UUID getObjectId() {
+        return objectId;
+    }
+
+    @Override
+    public ObjectType getObjectType() {
+        return objectType;
+    }
+
+    @Override
+    public TagDefinition getTagDefinition() {
+        return tagDefinition;
+    }
+
+    @JsonIgnore
+    @Override
+    public BusEventType getBusEventType() {
+        return BusEventType.USER_TAG_DELETION;
+    }
+
+    @Override
+    public UUID getUserToken() {
+        return userToken;
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder();
+        sb.append("DefaultUserTagDeletionEvent");
+        sb.append("{objectId=").append(objectId);
+        sb.append(", tagId=").append(tagId);
+        sb.append(", objectType=").append(objectType);
+        sb.append(", tagDefinition=").append(tagDefinition);
+        sb.append(", userToken=").append(userToken);
+        sb.append('}');
+        return sb.toString();
+    }
+
+    @Override
+    public boolean equals(final Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        final DefaultUserTagDeletionEvent that = (DefaultUserTagDeletionEvent) o;
+
+        if (objectId != null ? !objectId.equals(that.objectId) : that.objectId != null) {
+            return false;
+        }
+        if (objectType != that.objectType) {
+            return false;
+        }
+        if (tagDefinition != null ? !tagDefinition.equals(that.tagDefinition) : that.tagDefinition != null) {
+            return false;
+        }
+        if (tagId != null ? !tagId.equals(that.tagId) : that.tagId != null) {
+            return false;
+        }
+        if (userToken != null ? !userToken.equals(that.userToken) : that.userToken != null) {
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = tagId != null ? tagId.hashCode() : 0;
+        result = 31 * result + (objectId != null ? objectId.hashCode() : 0);
+        result = 31 * result + (objectType != null ? objectType.hashCode() : 0);
+        result = 31 * result + (tagDefinition != null ? tagDefinition.hashCode() : 0);
+        result = 31 * result + (userToken != null ? userToken.hashCode() : 0);
+        return result;
+    }
+}
diff --git a/util/src/main/java/com/ning/billing/util/tag/api/user/TagEventBuilder.java b/util/src/main/java/com/ning/billing/util/tag/api/user/TagEventBuilder.java
new file mode 100644
index 0000000..9160731
--- /dev/null
+++ b/util/src/main/java/com/ning/billing/util/tag/api/user/TagEventBuilder.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.tag.api.user;
+
+import java.util.UUID;
+
+import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.tag.TagDefinition;
+import com.ning.billing.util.tag.api.ControlTagCreationEvent;
+import com.ning.billing.util.tag.api.ControlTagDefinitionCreationEvent;
+import com.ning.billing.util.tag.api.ControlTagDefinitionDeletionEvent;
+import com.ning.billing.util.tag.api.ControlTagDeletionEvent;
+import com.ning.billing.util.tag.api.UserTagCreationEvent;
+import com.ning.billing.util.tag.api.UserTagDefinitionCreationEvent;
+import com.ning.billing.util.tag.api.UserTagDefinitionDeletionEvent;
+import com.ning.billing.util.tag.api.UserTagDeletionEvent;
+
+public class TagEventBuilder {
+    public UserTagDefinitionCreationEvent newUserTagDefinitionCreationEvent(final UUID tagDefinitionId, final TagDefinition tagDefinition, final UUID userToken) {
+        return new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken);
+    }
+
+    public UserTagDefinitionDeletionEvent newUserTagDefinitionDeletionEvent(final UUID tagDefinitionId, final TagDefinition tagDefinition, final UUID userToken) {
+        return new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken);
+    }
+
+    public ControlTagDefinitionCreationEvent newControlTagDefinitionCreationEvent(final UUID tagDefinitionId, final TagDefinition tagDefinition, final UUID userToken) {
+        return new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken);
+    }
+
+    public ControlTagDefinitionDeletionEvent newControlTagDefinitionDeletionEvent(final UUID tagDefinitionId, final TagDefinition tagDefinition, final UUID userToken) {
+        return new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken);
+    }
+
+    public UserTagCreationEvent newUserTagCreationEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinition tagDefinition, final UUID userToken) {
+        return new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken);
+    }
+
+    public UserTagDeletionEvent newUserTagDeletionEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinition tagDefinition, final UUID userToken) {
+        return new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken);
+    }
+
+    public ControlTagCreationEvent newControlTagCreationEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinition tagDefinition, final UUID userToken) {
+        return new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken);
+    }
+
+    public ControlTagDeletionEvent newControlTagDeletionEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final TagDefinition tagDefinition, final UUID userToken) {
+        return new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken);
+    }
+}
diff --git a/util/src/main/java/com/ning/billing/util/tag/dao/AuditedTagDao.java b/util/src/main/java/com/ning/billing/util/tag/dao/AuditedTagDao.java
index a803660..67410ee 100644
--- a/util/src/main/java/com/ning/billing/util/tag/dao/AuditedTagDao.java
+++ b/util/src/main/java/com/ning/billing/util/tag/dao/AuditedTagDao.java
@@ -16,7 +16,6 @@
 
 package com.ning.billing.util.tag.dao;
 
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
@@ -25,12 +24,17 @@ import java.util.UUID;
 import org.skife.jdbi.v2.IDBI;
 import org.skife.jdbi.v2.Transaction;
 import org.skife.jdbi.v2.TransactionStatus;
+import org.skife.jdbi.v2.exceptions.TransactionFailedException;
 import org.skife.jdbi.v2.sqlobject.mixins.Transmogrifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.inject.Inject;
 import com.ning.billing.ErrorCode;
-import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.util.ChangeType;
+import com.ning.billing.util.api.TagApiException;
+import com.ning.billing.util.api.TagDefinitionApiException;
+import com.ning.billing.util.bus.Bus;
 import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.dao.AuditedCollectionDaoBase;
 import com.ning.billing.util.dao.EntityAudit;
@@ -39,109 +43,132 @@ import com.ning.billing.util.dao.Mapper;
 import com.ning.billing.util.dao.ObjectType;
 import com.ning.billing.util.dao.TableName;
 import com.ning.billing.util.entity.collection.dao.UpdatableEntityCollectionSqlDao;
-import com.ning.billing.util.tag.ControlTagType;
-import com.ning.billing.util.tag.DefaultControlTag;
-import com.ning.billing.util.tag.DescriptiveTag;
 import com.ning.billing.util.tag.Tag;
 import com.ning.billing.util.tag.TagDefinition;
+import com.ning.billing.util.tag.api.TagEvent;
+import com.ning.billing.util.tag.api.user.TagEventBuilder;
 
 public class AuditedTagDao extends AuditedCollectionDaoBase<Tag, Tag> implements TagDao {
+    private static final Logger log = LoggerFactory.getLogger(AuditedTagDao.class);
+
     private final TagSqlDao tagSqlDao;
+    private final TagEventBuilder tagEventBuilder;
+    private final Bus bus;
 
     @Inject
-    public AuditedTagDao(final IDBI dbi) {
+    public AuditedTagDao(final IDBI dbi, final TagEventBuilder tagEventBuilder, final Bus bus) {
+        this.tagEventBuilder = tagEventBuilder;
+        this.bus = bus;
         this.tagSqlDao = dbi.onDemand(TagSqlDao.class);
     }
 
     @Override
-    protected Tag getEquivalenceObjectFor(Tag obj) {
+    protected Tag getEquivalenceObjectFor(final Tag obj) {
         return obj;
     }
 
     @Override
-    public void insertTag(final UUID objectId, final ObjectType objectType,
-                          final TagDefinition tagDefinition, final CallContext context) {
+    public void insertTag(final UUID objectId, final ObjectType objectType, final TagDefinition tagDefinition, final CallContext context) {
         tagSqlDao.inTransaction(new Transaction<Void, TagSqlDao>() {
             @Override
             public Void inTransaction(final TagSqlDao tagSqlDao, final TransactionStatus status) throws Exception {
-                String tagId = UUID.randomUUID().toString();
-                String tagName = tagDefinition.getName();
-                tagSqlDao.addTagFromTransaction(tagId, tagName, objectId.toString(), objectType, context);
+                final String tagId = UUID.randomUUID().toString();
+                final String tagName = tagDefinition.getName();
 
-                Tag tag = tagSqlDao.findTag(tagName, objectId.toString(), objectType);
-                List<Tag> tagList = new ArrayList<Tag>();
-                tagList.add(tag);
+                // Create the tag
+                tagSqlDao.addTagFromTransaction(tagId, tagName, objectId.toString(), objectType, context);
 
-                List<Mapper<UUID, Long>> recordIds = tagSqlDao.getRecordIds(objectId.toString(), objectType);
-                Map<UUID, Long> recordIdMap = convertToHistoryMap(recordIds);
+                final Tag tag = tagSqlDao.findTag(tagName, objectId.toString(), objectType);
+                final List<Tag> tagList = Arrays.asList(tag);
 
-                List<EntityHistory<Tag>> entityHistories = new ArrayList<EntityHistory<Tag>>();
-                entityHistories.addAll(convertToHistory(tagList, recordIdMap, ChangeType.INSERT));
+                // Gather the tag ids for this object id
+                final List<Mapper<UUID, Long>> recordIds = tagSqlDao.getRecordIds(objectId.toString(), objectType);
+                final Map<UUID, Long> recordIdMap = convertToHistoryMap(recordIds);
 
-                Long maxHistoryRecordId = tagSqlDao.getMaxHistoryRecordId();
+                // Update the history table
+                final List<EntityHistory<Tag>> entityHistories = convertToHistory(tagList, recordIdMap, ChangeType.INSERT);
+                final Long maxHistoryRecordId = tagSqlDao.getMaxHistoryRecordId();
                 tagSqlDao.addHistoryFromTransaction(objectId.toString(), objectType, entityHistories, context);
 
-                // have to fetch history record ids to update audit log
-                List<Mapper<Long, Long>> historyRecordIds = tagSqlDao.getHistoryRecordIds(maxHistoryRecordId);
-                Map<Long, Long> historyRecordIdMap = convertToAuditMap(historyRecordIds);
-                List<EntityAudit> entityAudits = convertToAudits(entityHistories, historyRecordIdMap);
+                // Have to fetch the history record ids to update the audit log
+                final List<Mapper<Long, Long>> historyRecordIds = tagSqlDao.getHistoryRecordIds(maxHistoryRecordId);
+                final Map<Long, Long> historyRecordIdMap = convertToAuditMap(historyRecordIds);
+                final List<EntityAudit> entityAudits = convertToAudits(entityHistories, historyRecordIdMap);
                 tagSqlDao.insertAuditFromTransaction(entityAudits, context);
 
+                // Post an event to the Bus
+                final TagEvent tagEvent;
+                if (tagDefinition.isControlTag()) {
+                    tagEvent = tagEventBuilder.newControlTagCreationEvent(tag.getId(), objectId, objectType, tagDefinition, context.getUserToken());
+                } else {
+                    tagEvent = tagEventBuilder.newUserTagCreationEvent(tag.getId(), objectId, objectType, tagDefinition, context.getUserToken());
+                }
+                try {
+                    bus.postFromTransaction(tagEvent, AuditedTagDao.this.tagSqlDao);
+                } catch (Bus.EventBusException e) {
+                    log.warn("Failed to post tag creation event for tag " + tag.getId().toString(), e);
+                }
+
                 return null;
             }
         });
     }
 
     @Override
-    public void insertTags(UUID objectId, ObjectType objectType, List<TagDefinition> tagDefinitions, CallContext context) {
-        List<Tag> tags = new ArrayList<Tag>();
-        for (TagDefinition tagDefinition : tagDefinitions) {
-            if (tagDefinition.isControlTag()) {
-                ControlTagType controlTagType = ControlTagType.valueOf(tagDefinition.getName());
-                tags.add(new DefaultControlTag(controlTagType));
+    public void deleteTag(final UUID objectId, final ObjectType objectType, final TagDefinition tagDefinition, final CallContext context) throws TagApiException {
+        try {
+            tagSqlDao.inTransaction(new Transaction<Void, TagSqlDao>() {
+                @Override
+                public Void inTransaction(final TagSqlDao tagSqlDao, final TransactionStatus status) throws Exception {
+                    // Make sure the tag exists
+                    final String tagName = tagDefinition.getName();
+                    final Tag tag = tagSqlDao.findTag(tagName, objectId.toString(), objectType);
+                    if (tag == null) {
+                        throw new TagApiException(ErrorCode.TAG_DOES_NOT_EXIST, tagName);
+                    }
+
+                    final List<Tag> tagList = Arrays.asList(tag);
+
+                    // Before the deletion, gather the tag ids for this object id
+                    final List<Mapper<UUID, Long>> recordIds = tagSqlDao.getRecordIds(objectId.toString(), objectType);
+                    final Map<UUID, Long> recordIdMap = convertToHistoryMap(recordIds);
+
+                    // Delete the tag
+                    tagSqlDao.deleteFromTransaction(objectId.toString(), objectType, tagList, context);
+
+                    // Update the history table
+                    final List<EntityHistory<Tag>> entityHistories = convertToHistory(tagList, recordIdMap, ChangeType.DELETE);
+                    final Long maxHistoryRecordId = tagSqlDao.getMaxHistoryRecordId();
+                    tagSqlDao.addHistoryFromTransaction(objectId.toString(), objectType, entityHistories, context);
+
+                    // Have to fetch the history record ids to update the audit log
+                    final List<Mapper<Long, Long>> historyRecordIds = tagSqlDao.getHistoryRecordIds(maxHistoryRecordId);
+                    final Map<Long, Long> historyRecordIdMap = convertToAuditMap(historyRecordIds);
+                    final List<EntityAudit> entityAudits = convertToAudits(entityHistories, historyRecordIdMap);
+                    tagSqlDao.insertAuditFromTransaction(entityAudits, context);
+
+                    // Post an event to the Bus
+                    final TagEvent tagEvent;
+                    if (tagDefinition.isControlTag()) {
+                        tagEvent = tagEventBuilder.newControlTagDeletionEvent(tag.getId(), objectId, objectType, tagDefinition, context.getUserToken());
+                    } else {
+                        tagEvent = tagEventBuilder.newUserTagDeletionEvent(tag.getId(), objectId, objectType, tagDefinition, context.getUserToken());
+                    }
+                    try {
+                        bus.postFromTransaction(tagEvent, tagSqlDao);
+                    } catch (Bus.EventBusException e) {
+                        log.warn("Failed to post tag deletion event for tag " + tag.getId().toString(), e);
+                    }
+                    return null;
+                }
+            });
+        } catch (TransactionFailedException exception) {
+            if (exception.getCause() instanceof TagDefinitionApiException) {
+                throw (TagApiException) exception.getCause();
             } else {
-                tags.add(new DescriptiveTag(tagDefinition));
+                throw exception;
             }
         }
-
-        saveEntities(objectId, objectType, tags, context);
-    }
-
-    @Override
-    public void deleteTag(final UUID objectId, final ObjectType objectType,
-                          final TagDefinition tagDefinition, final CallContext context) {
-        tagSqlDao.inTransaction(new Transaction<Void, TagSqlDao>() {
-            @Override
-            public Void inTransaction(final TagSqlDao tagSqlDao, final TransactionStatus status) throws Exception {
-                String tagName = tagDefinition.getName();
-                Tag tag = tagSqlDao.findTag(tagName, objectId.toString(), objectType);
-
-                if (tag == null) {
-                    throw new InvoiceApiException(ErrorCode.TAG_DOES_NOT_EXIST, tagName);
-                }
-
-                List<Tag> tagList = Arrays.asList(tag);
-
-                List<Mapper<UUID, Long>> recordIds = tagSqlDao.getRecordIds(objectId.toString(), objectType);
-                Map<UUID, Long> recordIdMap = convertToHistoryMap(recordIds);
-
-                tagSqlDao.deleteFromTransaction(objectId.toString(), objectType, tagList, context);
-
-                List<EntityHistory<Tag>> entityHistories = new ArrayList<EntityHistory<Tag>>();
-                entityHistories.addAll(convertToHistory(tagList, recordIdMap, ChangeType.DELETE));
-
-                Long maxHistoryRecordId = tagSqlDao.getMaxHistoryRecordId();
-                tagSqlDao.addHistoryFromTransaction(objectId.toString(), objectType, entityHistories, context);
-
-                // have to fetch history record ids to update audit log
-                List<Mapper<Long, Long>> historyRecordIds = tagSqlDao.getHistoryRecordIds(maxHistoryRecordId);
-                Map<Long, Long> historyRecordIdMap = convertToAuditMap(historyRecordIds);
-                List<EntityAudit> entityAudits = convertToAudits(entityHistories, historyRecordIdMap);
-                tagSqlDao.insertAuditFromTransaction(entityAudits, context);
-
-                return null;
-            }
-        });
     }
 
     @Override
@@ -150,7 +177,7 @@ public class AuditedTagDao extends AuditedCollectionDaoBase<Tag, Tag> implements
     }
 
     @Override
-    protected UpdatableEntityCollectionSqlDao<Tag> transmogrifyDao(Transmogrifier transactionalDao) {
+    protected UpdatableEntityCollectionSqlDao<Tag> transmogrifyDao(final Transmogrifier transactionalDao) {
         return transactionalDao.become(TagSqlDao.class);
     }
 
@@ -160,7 +187,7 @@ public class AuditedTagDao extends AuditedCollectionDaoBase<Tag, Tag> implements
     }
 
     @Override
-    protected String getKey(Tag entity) {
+    protected String getKey(final Tag entity) {
         return entity.getTagDefinitionName();
     }
 }
diff --git a/util/src/main/java/com/ning/billing/util/tag/dao/DefaultTagDefinitionDao.java b/util/src/main/java/com/ning/billing/util/tag/dao/DefaultTagDefinitionDao.java
index 39970da..f7f25b7 100644
--- a/util/src/main/java/com/ning/billing/util/tag/dao/DefaultTagDefinitionDao.java
+++ b/util/src/main/java/com/ning/billing/util/tag/dao/DefaultTagDefinitionDao.java
@@ -19,31 +19,46 @@ package com.ning.billing.util.tag.dao;
 import java.util.ArrayList;
 import java.util.List;
 
-import com.ning.billing.util.callcontext.CallContext;
-import com.ning.billing.util.tag.ControlTagType;
 import org.skife.jdbi.v2.IDBI;
+import org.skife.jdbi.v2.Transaction;
+import org.skife.jdbi.v2.TransactionStatus;
+import org.skife.jdbi.v2.exceptions.TransactionFailedException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import com.google.inject.Inject;
 import com.ning.billing.ErrorCode;
 import com.ning.billing.util.api.TagDefinitionApiException;
+import com.ning.billing.util.bus.Bus;
+import com.ning.billing.util.callcontext.CallContext;
+import com.ning.billing.util.tag.ControlTagType;
 import com.ning.billing.util.tag.DefaultTagDefinition;
 import com.ning.billing.util.tag.TagDefinition;
+import com.ning.billing.util.tag.api.TagDefinitionEvent;
+import com.ning.billing.util.tag.api.user.TagEventBuilder;
 
 public class DefaultTagDefinitionDao implements TagDefinitionDao {
-    private final TagDefinitionSqlDao dao;
+    private static final Logger log = LoggerFactory.getLogger(DefaultTagDefinitionDao.class);
+
+    private final TagDefinitionSqlDao tagDefinitionSqlDao;
+    private final TagEventBuilder tagEventBuilder;
+    private final Bus bus;
 
     @Inject
-    public DefaultTagDefinitionDao(IDBI dbi) {
-        this.dao = dbi.onDemand(TagDefinitionSqlDao.class);
+    public DefaultTagDefinitionDao(final IDBI dbi, final TagEventBuilder tagEventBuilder, final Bus bus) {
+        this.tagEventBuilder = tagEventBuilder;
+        this.bus = bus;
+        this.tagDefinitionSqlDao = dbi.onDemand(TagDefinitionSqlDao.class);
     }
 
     @Override
     public List<TagDefinition> getTagDefinitions() {
-        // get user definitions from the database
-        List<TagDefinition> definitionList = new ArrayList<TagDefinition>();
-        definitionList.addAll(dao.get());
+        // Get user definitions from the database
+        final List<TagDefinition> definitionList = new ArrayList<TagDefinition>();
+        definitionList.addAll(tagDefinitionSqlDao.get());
 
-        // add control tag definitions
-        for (ControlTagType controlTag : ControlTagType.values()) {
+        // Add control tag definitions
+        for (final ControlTagType controlTag : ControlTagType.values()) {
             definitionList.add(new DefaultTagDefinition(controlTag.toString(), controlTag.getDescription(), true));
         }
 
@@ -52,35 +67,65 @@ public class DefaultTagDefinitionDao implements TagDefinitionDao {
 
     @Override
     public TagDefinition getByName(final String definitionName) {
-        // add control tag definitions
-        for (ControlTagType controlTag : ControlTagType.values()) {
-            if(definitionName.equals(controlTag.name())) {
+        // Add control tag definitions
+        for (final ControlTagType controlTag : ControlTagType.values()) {
+            if (definitionName.equals(controlTag.name())) {
                 return new DefaultTagDefinition(controlTag.toString(), controlTag.getDescription(), true);
             }
         }
-        return dao.getByName(definitionName);
+
+        return tagDefinitionSqlDao.getByName(definitionName);
     }
 
     @Override
     public TagDefinition create(final String definitionName, final String description,
                                 final CallContext context) throws TagDefinitionApiException {
+        // Make sure a control tag with this name don't already exist
         if (isControlTagName(definitionName)) {
             throw new TagDefinitionApiException(ErrorCode.TAG_DEFINITION_CONFLICTS_WITH_CONTROL_TAG, definitionName);
         }
 
-        TagDefinition existingDefinition = dao.getByName(definitionName);
-
-        if (existingDefinition != null) {
-            throw new TagDefinitionApiException(ErrorCode.TAG_DEFINITION_ALREADY_EXISTS, definitionName);
+        try {
+            return tagDefinitionSqlDao.inTransaction(new Transaction<TagDefinition, TagDefinitionSqlDao>() {
+                @Override
+                public TagDefinition inTransaction(final TagDefinitionSqlDao tagDefinitionSqlDao, final TransactionStatus status) throws Exception {
+                    // Make sure the tag definition doesn't exist already
+                    final TagDefinition existingDefinition = tagDefinitionSqlDao.getByName(definitionName);
+                    if (existingDefinition != null) {
+                        throw new TagDefinitionApiException(ErrorCode.TAG_DEFINITION_ALREADY_EXISTS, definitionName);
+                    }
+
+                    // Create it
+                    final TagDefinition tagDefinition = new DefaultTagDefinition(definitionName, description, false);
+                    tagDefinitionSqlDao.create(tagDefinition, context);
+
+                    // Post an event to the bus
+                    final TagDefinitionEvent tagDefinitionEvent;
+                    if (tagDefinition.isControlTag()) {
+                        tagDefinitionEvent = tagEventBuilder.newControlTagDefinitionCreationEvent(tagDefinition.getId(), tagDefinition, context.getUserToken());
+                    } else {
+                        tagDefinitionEvent = tagEventBuilder.newUserTagDefinitionCreationEvent(tagDefinition.getId(), tagDefinition, context.getUserToken());
+                    }
+                    try {
+                        bus.postFromTransaction(tagDefinitionEvent, tagDefinitionSqlDao);
+                    } catch (Bus.EventBusException e) {
+                        log.warn("Failed to post tag definition creation event for tag " + tagDefinition.getId(), e);
+                    }
+
+                    return tagDefinition;
+                }
+            });
+        } catch (TransactionFailedException exception) {
+            if (exception.getCause() instanceof TagDefinitionApiException) {
+                throw (TagDefinitionApiException) exception.getCause();
+            } else {
+                throw exception;
+            }
         }
-
-        TagDefinition definition = new DefaultTagDefinition(definitionName, description, false);
-        dao.create(definition, context);
-        return definition;
     }
 
     private boolean isControlTagName(final String definitionName) {
-        for (ControlTagType controlTagName : ControlTagType.values()) {
+        for (final ControlTagType controlTagName : ControlTagType.values()) {
             if (controlTagName.toString().equals(definitionName)) {
                 return true;
             }
@@ -90,27 +135,47 @@ public class DefaultTagDefinitionDao implements TagDefinitionDao {
     }
 
     @Override
-    public void deleteAllTagsForDefinition(final String definitionName, final CallContext context) throws TagDefinitionApiException {
-        TagDefinition existingDefinition = dao.getByName(definitionName);
-        if (existingDefinition == null) {
-            throw new TagDefinitionApiException(ErrorCode.TAG_DEFINITION_DOES_NOT_EXIST, definitionName);
-        }
-
-        dao.deleteAllTagsForDefinition(definitionName, context);
-    }
-
-    @Override
     public void deleteTagDefinition(final String definitionName, final CallContext context) throws TagDefinitionApiException {
-        if (dao.tagDefinitionUsageCount(definitionName) > 0) {
-            throw new TagDefinitionApiException(ErrorCode.TAG_DEFINITION_IN_USE, definitionName);
-        }
-
-        TagDefinition existingDefinition = dao.getByName(definitionName);
-
-        if (existingDefinition == null) {
-            throw new TagDefinitionApiException(ErrorCode.TAG_DEFINITION_DOES_NOT_EXIST, definitionName);
+        try {
+            tagDefinitionSqlDao.inTransaction(new Transaction<Void, TagDefinitionSqlDao>() {
+                @Override
+                public Void inTransaction(final TagDefinitionSqlDao tagDefinitionSqlDao, final TransactionStatus status) throws Exception {
+                    // Make sure the tag definition exists
+                    final TagDefinition tagDefinition = tagDefinitionSqlDao.getByName(definitionName);
+                    if (tagDefinition == null) {
+                        throw new TagDefinitionApiException(ErrorCode.TAG_DEFINITION_DOES_NOT_EXIST, definitionName);
+                    }
+
+                    // Make sure it is not used currently
+                    if (tagDefinitionSqlDao.tagDefinitionUsageCount(definitionName) > 0) {
+                        throw new TagDefinitionApiException(ErrorCode.TAG_DEFINITION_IN_USE, definitionName);
+                    }
+
+                    // Delete it
+                    tagDefinitionSqlDao.deleteTagDefinition(definitionName, context);
+
+                    // Post an event to the Bus
+                    final TagDefinitionEvent tagDefinitionEvent;
+                    if (tagDefinition.isControlTag()) {
+                        tagDefinitionEvent = tagEventBuilder.newControlTagDefinitionDeletionEvent(tagDefinition.getId(), tagDefinition, context.getUserToken());
+                    } else {
+                        tagDefinitionEvent = tagEventBuilder.newUserTagDefinitionDeletionEvent(tagDefinition.getId(), tagDefinition, context.getUserToken());
+                    }
+                    try {
+                        bus.postFromTransaction(tagDefinitionEvent, tagDefinitionSqlDao);
+                    } catch (Bus.EventBusException e) {
+                        log.warn("Failed to post tag definition deletion event for tag " + tagDefinition.getId(), e);
+                    }
+
+                    return null;
+                }
+            });
+        } catch (TransactionFailedException exception) {
+            if (exception.getCause() instanceof TagDefinitionApiException) {
+                throw (TagDefinitionApiException) exception.getCause();
+            } else {
+                throw exception;
+            }
         }
-
-        dao.deleteTagDefinition(definitionName, context);
     }
 }
diff --git a/util/src/main/java/com/ning/billing/util/tag/dao/TagBinder.java b/util/src/main/java/com/ning/billing/util/tag/dao/TagBinder.java
index d2d4a6f..d1a8a7c 100644
--- a/util/src/main/java/com/ning/billing/util/tag/dao/TagBinder.java
+++ b/util/src/main/java/com/ning/billing/util/tag/dao/TagBinder.java
@@ -26,6 +26,7 @@ import org.skife.jdbi.v2.SQLStatement;
 import org.skife.jdbi.v2.sqlobject.Binder;
 import org.skife.jdbi.v2.sqlobject.BinderFactory;
 import org.skife.jdbi.v2.sqlobject.BindingAnnotation;
+
 import com.ning.billing.util.tag.Tag;
 
 @BindingAnnotation(TagBinder.TagBinderFactory.class)
@@ -33,9 +34,9 @@ import com.ning.billing.util.tag.Tag;
 @Target({ElementType.PARAMETER})
 public @interface TagBinder {
     public static class TagBinderFactory implements BinderFactory {
-        public Binder build(Annotation annotation) {
+        public Binder build(final Annotation annotation) {
             return new Binder<TagBinder, Tag>() {
-                public void bind(SQLStatement q, TagBinder bind, Tag tag) {
+                public void bind(final SQLStatement q, final TagBinder bind, final Tag tag) {
                     q.bind("id", tag.getId().toString());
                     q.bind("tagDefinitionName", tag.getTagDefinitionName());
                 }
diff --git a/util/src/main/java/com/ning/billing/util/tag/dao/TagDao.java b/util/src/main/java/com/ning/billing/util/tag/dao/TagDao.java
index 4e29fc2..3ffccf2 100644
--- a/util/src/main/java/com/ning/billing/util/tag/dao/TagDao.java
+++ b/util/src/main/java/com/ning/billing/util/tag/dao/TagDao.java
@@ -16,86 +16,18 @@
 
 package com.ning.billing.util.tag.dao;
 
-import com.ning.billing.invoice.api.InvoiceApiException;
+import java.util.List;
+import java.util.UUID;
+
+import com.ning.billing.util.api.TagApiException;
 import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.dao.AuditedCollectionDao;
 import com.ning.billing.util.dao.ObjectType;
 import com.ning.billing.util.tag.Tag;
 import com.ning.billing.util.tag.TagDefinition;
 
-import java.util.List;
-import java.util.UUID;
-
 public interface TagDao extends AuditedCollectionDao<Tag> {
-    void insertTag(UUID objectId, ObjectType objectType, TagDefinition tagDefinition, CallContext context);
-
-    void insertTags(UUID objectId, ObjectType objectType, List<TagDefinition> tagDefinitions, CallContext context);
-
-    void deleteTag(UUID objectId, ObjectType objectType, TagDefinition tagDefinition, CallContext context);
-
-//@Override
-//	public List<Tag> getTagList() {
-//		return tagStore.getEntityList();
-//	}
-//
-//	@Override
-//	public boolean hasTag(final TagDefinition tagDefinition) {
-//		return tagStore.containsTagForDefinition(tagDefinition);
-//	}
-//
-//    @Override
-//    public boolean hasTag(ControlTagType controlTagType) {
-//        return tagStore.containsTagForControlTagType(controlTagType);
-//    }
-//
-//	@Override
-//	public void addTag(final TagDefinition definition) {
-//		Tag tag = new DescriptiveTag(definition);
-//		tagStore.add(tag) ;
-//	}
-//
-//    @Override
-//    public void addTags(final List<Tag> tags) {
-//        this.tagStore.add(tags);
-//    }
-//
-//	@Override
-//	public void addTagsFromDefinitions(final List<TagDefinition> tagDefinitions) {
-//		if (tagStore != null) {
-//            List<Tag> tags = new ArrayList<Tag>();
-//            if (tagDefinitions != null) {
-//                for (TagDefinition tagDefinition : tagDefinitions) {
-//                    try {
-//                        ControlTagType controlTagType = ControlTagType.valueOf(tagDefinition.getName());
-//                        tags.add(new DefaultControlTag(controlTagType));
-//                    } catch (IllegalArgumentException ex) {
-//                        tags.add(new DescriptiveTag(tagDefinition));
-//                    }
-//                }
-//            }
-//
-//			this.tagStore.add(tags);
-//		}
-//	}
-//
-//	@Override
-//	public void clearTags() {
-//		this.tagStore.clear();
-//	}
-//
-//	@Override
-//	public void removeTag(final TagDefinition tagDefinition) {
-//		tagStore.remove(tagDefinition);
-//	}
-//
-//	@Override
-//	public boolean generateInvoice() {
-//		return tagStore.generateInvoice();
-//	}
-//
-//	@Override
-//	public boolean processPayment() {
-//		return tagStore.processPayment();
-//	}
+    void insertTag(UUID objectId, ObjectType objectType, TagDefinition tagDefinition, CallContext context) throws TagApiException;
 
+    void deleteTag(UUID objectId, ObjectType objectType, TagDefinition tagDefinition, CallContext context) throws TagApiException;
 }
diff --git a/util/src/main/java/com/ning/billing/util/tag/dao/TagDefinitionDao.java b/util/src/main/java/com/ning/billing/util/tag/dao/TagDefinitionDao.java
index 112ff75..ae645ea 100644
--- a/util/src/main/java/com/ning/billing/util/tag/dao/TagDefinitionDao.java
+++ b/util/src/main/java/com/ning/billing/util/tag/dao/TagDefinitionDao.java
@@ -18,8 +18,8 @@ package com.ning.billing.util.tag.dao;
 
 import java.util.List;
 
-import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.api.TagDefinitionApiException;
+import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.tag.TagDefinition;
 
 public interface TagDefinitionDao {
@@ -29,7 +29,5 @@ public interface TagDefinitionDao {
 
     public TagDefinition create(String definitionName, String description, CallContext context) throws TagDefinitionApiException;
 
-    public void deleteAllTagsForDefinition(String definitionName, CallContext context) throws TagDefinitionApiException;
-
     public void deleteTagDefinition(String definitionName, CallContext context) throws TagDefinitionApiException;
 }
diff --git a/util/src/main/java/com/ning/billing/util/tag/dao/TagDefinitionSqlDao.java b/util/src/main/java/com/ning/billing/util/tag/dao/TagDefinitionSqlDao.java
index f273c56..6dee4b8 100644
--- a/util/src/main/java/com/ning/billing/util/tag/dao/TagDefinitionSqlDao.java
+++ b/util/src/main/java/com/ning/billing/util/tag/dao/TagDefinitionSqlDao.java
@@ -25,11 +25,6 @@ import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.UUID;
 
-import com.ning.billing.util.callcontext.CallContext;
-import com.ning.billing.util.callcontext.CallContextBinder;
-import com.ning.billing.util.entity.dao.EntitySqlDao;
-import com.ning.billing.util.tag.DefaultTagDefinition;
-import com.ning.billing.util.tag.TagDefinition;
 import org.skife.jdbi.v2.SQLStatement;
 import org.skife.jdbi.v2.StatementContext;
 import org.skife.jdbi.v2.sqlobject.Bind;
@@ -39,12 +34,20 @@ import org.skife.jdbi.v2.sqlobject.BindingAnnotation;
 import org.skife.jdbi.v2.sqlobject.SqlQuery;
 import org.skife.jdbi.v2.sqlobject.SqlUpdate;
 import org.skife.jdbi.v2.sqlobject.customizers.RegisterMapper;
+import org.skife.jdbi.v2.sqlobject.mixins.Transactional;
+import org.skife.jdbi.v2.sqlobject.mixins.Transmogrifier;
 import org.skife.jdbi.v2.sqlobject.stringtemplate.ExternalizedSqlViaStringTemplate3;
 import org.skife.jdbi.v2.tweak.ResultSetMapper;
 
+import com.ning.billing.util.callcontext.CallContext;
+import com.ning.billing.util.callcontext.CallContextBinder;
+import com.ning.billing.util.entity.dao.EntitySqlDao;
+import com.ning.billing.util.tag.DefaultTagDefinition;
+import com.ning.billing.util.tag.TagDefinition;
+
 @ExternalizedSqlViaStringTemplate3
 @RegisterMapper(TagDefinitionSqlDao.TagDefinitionMapper.class)
-public interface TagDefinitionSqlDao extends EntitySqlDao<TagDefinition> {
+public interface TagDefinitionSqlDao extends EntitySqlDao<TagDefinition>, Transactional<TagDefinitionSqlDao>, Transmogrifier {
     @Override
     @SqlUpdate
     public void create(@TagDefinitionBinder final TagDefinition entity, @CallContextBinder final CallContext context);
@@ -64,9 +67,9 @@ public interface TagDefinitionSqlDao extends EntitySqlDao<TagDefinition> {
     public class TagDefinitionMapper implements ResultSetMapper<TagDefinition> {
         @Override
         public TagDefinition map(final int index, final ResultSet result, final StatementContext context) throws SQLException {
-            UUID id = UUID.fromString(result.getString("id"));
-            String name = result.getString("name");
-            String description = result.getString("description");
+            final UUID id = UUID.fromString(result.getString("id"));
+            final String name = result.getString("name");
+            final String description = result.getString("description");
             return new DefaultTagDefinition(id, name, description, false);
         }
     }
@@ -87,4 +90,4 @@ public interface TagDefinitionSqlDao extends EntitySqlDao<TagDefinition> {
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/util/src/main/java/com/ning/billing/util/tag/dao/TagHistoryBinder.java b/util/src/main/java/com/ning/billing/util/tag/dao/TagHistoryBinder.java
index 67bb3ca..05d9414 100644
--- a/util/src/main/java/com/ning/billing/util/tag/dao/TagHistoryBinder.java
+++ b/util/src/main/java/com/ning/billing/util/tag/dao/TagHistoryBinder.java
@@ -16,30 +16,30 @@
 
 package com.ning.billing.util.tag.dao;
 
-import com.ning.billing.util.dao.EntityHistory;
-import com.ning.billing.util.dao.MappedEntity;
-import com.ning.billing.util.tag.Tag;
-import org.skife.jdbi.v2.SQLStatement;
-import org.skife.jdbi.v2.sqlobject.Binder;
-import org.skife.jdbi.v2.sqlobject.BinderFactory;
-import org.skife.jdbi.v2.sqlobject.BindingAnnotation;
-
 import java.lang.annotation.Annotation;
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
+import org.skife.jdbi.v2.SQLStatement;
+import org.skife.jdbi.v2.sqlobject.Binder;
+import org.skife.jdbi.v2.sqlobject.BinderFactory;
+import org.skife.jdbi.v2.sqlobject.BindingAnnotation;
+
+import com.ning.billing.util.dao.EntityHistory;
+import com.ning.billing.util.tag.Tag;
+
 @BindingAnnotation(TagHistoryBinder.TagHistoryBinderFactory.class)
 @Retention(RetentionPolicy.RUNTIME)
 @Target({ElementType.PARAMETER})
 public @interface TagHistoryBinder {
     public static class TagHistoryBinderFactory implements BinderFactory {
         @Override
-        public Binder build(Annotation annotation) {
+        public Binder build(final Annotation annotation) {
             return new Binder<TagHistoryBinder, EntityHistory<Tag>>() {
                 @Override
-                public void bind(SQLStatement q, TagHistoryBinder bind, EntityHistory<Tag> tagHistory) {
+                public void bind(final SQLStatement q, final TagHistoryBinder bind, final EntityHistory<Tag> tagHistory) {
                     q.bind("recordId", tagHistory.getValue());
                     q.bind("changeType", tagHistory.getChangeType().toString());
                     q.bind("id", tagHistory.getId().toString());
@@ -48,4 +48,4 @@ public @interface TagHistoryBinder {
             };
         }
     }
-}
\ No newline at end of file
+}
diff --git a/util/src/main/java/com/ning/billing/util/tag/dao/TagMapper.java b/util/src/main/java/com/ning/billing/util/tag/dao/TagMapper.java
index bf08dcd..da0083d 100644
--- a/util/src/main/java/com/ning/billing/util/tag/dao/TagMapper.java
+++ b/util/src/main/java/com/ning/billing/util/tag/dao/TagMapper.java
@@ -20,11 +20,10 @@ import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.UUID;
 
-import com.ning.billing.util.dao.MapperBase;
-import org.joda.time.DateTime;
 import org.skife.jdbi.v2.StatementContext;
 import org.skife.jdbi.v2.tweak.ResultSetMapper;
 
+import com.ning.billing.util.dao.MapperBase;
 import com.ning.billing.util.tag.ControlTagType;
 import com.ning.billing.util.tag.DefaultControlTag;
 import com.ning.billing.util.tag.DescriptiveTag;
@@ -33,16 +32,16 @@ import com.ning.billing.util.tag.Tag;
 public class TagMapper extends MapperBase implements ResultSetMapper<Tag> {
     @Override
     public Tag map(final int index, final ResultSet result, final StatementContext context) throws SQLException {
-        String name = result.getString("tag_definition_name");
+        final String name = result.getString("tag_definition_name");
 
         ControlTagType thisTagType = null;
-        for (ControlTagType controlTagType : ControlTagType.values()) {
+        for (final ControlTagType controlTagType : ControlTagType.values()) {
             if (name.equals(controlTagType.toString())) {
                 thisTagType = controlTagType;
             }
         }
 
-        UUID id = UUID.fromString(result.getString("id"));
+        final UUID id = UUID.fromString(result.getString("id"));
         if (thisTagType == null) {
             return new DescriptiveTag(id, name);
         } else {
diff --git a/util/src/main/java/com/ning/billing/util/tag/dao/TagSqlDao.java b/util/src/main/java/com/ning/billing/util/tag/dao/TagSqlDao.java
index bde62e7..5f4b8bb 100644
--- a/util/src/main/java/com/ning/billing/util/tag/dao/TagSqlDao.java
+++ b/util/src/main/java/com/ning/billing/util/tag/dao/TagSqlDao.java
@@ -40,32 +40,32 @@ import com.ning.billing.util.tag.Tag;
 @RegisterMapper(TagMapper.class)
 public interface TagSqlDao extends UpdatableEntityCollectionSqlDao<Tag>, Transactional<TagSqlDao>, Transmogrifier {
     @Override
-    @SqlBatch(transactional=false)
+    @SqlBatch(transactional = false)
     public void insertFromTransaction(@Bind("objectId") final String objectId,
                                       @ObjectTypeBinder final ObjectType objectType,
                                       @TagBinder final Collection<Tag> tags,
                                       @CallContextBinder final CallContext context);
 
     @Override
-    @SqlBatch(transactional=false)
+    @SqlBatch(transactional = false)
     public void updateFromTransaction(@Bind("objectId") final String objectId,
                                       @ObjectTypeBinder final ObjectType objectType,
                                       @TagBinder final Collection<Tag> tags,
                                       @CallContextBinder final CallContext context);
 
     @Override
-    @SqlBatch(transactional=false)
+    @SqlBatch(transactional = false)
     public void deleteFromTransaction(@Bind("objectId") final String objectId,
                                       @ObjectTypeBinder final ObjectType objectType,
                                       @TagBinder final Collection<Tag> tags,
                                       @CallContextBinder final CallContext context);
 
     @Override
-    @SqlBatch(transactional=false)
+    @SqlBatch(transactional = false)
     public void addHistoryFromTransaction(@Bind("objectId") final String objectId,
-                                               @ObjectTypeBinder final ObjectType objectType,
-                                               @TagHistoryBinder final List<EntityHistory<Tag>> histories,
-                                               @CallContextBinder final CallContext context);
+                                          @ObjectTypeBinder final ObjectType objectType,
+                                          @TagHistoryBinder final List<EntityHistory<Tag>> histories,
+                                          @CallContextBinder final CallContext context);
 
     @SqlUpdate
     public void addTagFromTransaction(@Bind("id") final String tagId,
@@ -84,4 +84,4 @@ public interface TagSqlDao extends UpdatableEntityCollectionSqlDao<Tag>, Transac
     public Tag findTag(@Bind("tagDefinitionName") final String tagName,
                        @Bind("objectId") final String objectId,
                        @ObjectTypeBinder final ObjectType objectType);
-}
\ No newline at end of file
+}
diff --git a/util/src/main/java/com/ning/billing/util/tag/DefaultControlTag.java b/util/src/main/java/com/ning/billing/util/tag/DefaultControlTag.java
index 330b204..20efa9c 100644
--- a/util/src/main/java/com/ning/billing/util/tag/DefaultControlTag.java
+++ b/util/src/main/java/com/ning/billing/util/tag/DefaultControlTag.java
@@ -48,21 +48,25 @@ public class DefaultControlTag extends DescriptiveTag implements ControlTag {
         final int prime = 31;
         int result = super.hashCode();
         result = prime * result + ((controlTagType == null) ? 0
-                                                           : controlTagType.hashCode());
+                : controlTagType.hashCode());
         return result;
     }
 
     @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
+    public boolean equals(final Object obj) {
+        if (this == obj) {
             return true;
-        if (!super.equals(obj))
+        }
+        if (!super.equals(obj)) {
             return false;
-        if (getClass() != obj.getClass())
+        }
+        if (getClass() != obj.getClass()) {
             return false;
-        DefaultControlTag other = (DefaultControlTag) obj;
-        if (controlTagType != other.controlTagType)
+        }
+        final DefaultControlTag other = (DefaultControlTag) obj;
+        if (controlTagType != other.controlTagType) {
             return false;
+        }
         return true;
     }
 
diff --git a/util/src/main/java/com/ning/billing/util/tag/DefaultTagDefinition.java b/util/src/main/java/com/ning/billing/util/tag/DefaultTagDefinition.java
index bd951d5..f0e80ad 100644
--- a/util/src/main/java/com/ning/billing/util/tag/DefaultTagDefinition.java
+++ b/util/src/main/java/com/ning/billing/util/tag/DefaultTagDefinition.java
@@ -17,24 +17,31 @@
 package com.ning.billing.util.tag;
 
 import java.util.UUID;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
 import com.ning.billing.util.entity.EntityBase;
 
 public class DefaultTagDefinition extends EntityBase implements TagDefinition {
     private final String name;
     private final String description;
-    private final Boolean isControlTag;
+    private final Boolean controlTag;
 
-    public DefaultTagDefinition(String name, String description, Boolean isControlTag) {
+    public DefaultTagDefinition(final String name, final String description, final Boolean isControlTag) {
         this(UUID.randomUUID(), name, description, isControlTag);
     }
 
-    public DefaultTagDefinition(UUID id, String name, String description, Boolean isControlTag) {
+    @JsonCreator
+    public DefaultTagDefinition(@JsonProperty("id") final UUID id,
+                                @JsonProperty("name") final String name,
+                                @JsonProperty("description") final String description,
+                                @JsonProperty("controlTag") final Boolean controlTag) {
         super(id);
         this.name = name;
         this.description = description;
-        this.isControlTag = isControlTag;
+        this.controlTag = controlTag;
     }
-    
+
     @Override
     public String getName() {
         return name;
@@ -47,6 +54,49 @@ public class DefaultTagDefinition extends EntityBase implements TagDefinition {
 
     @Override
     public Boolean isControlTag() {
-        return isControlTag;
+        return controlTag;
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder();
+        sb.append("DefaultTagDefinition");
+        sb.append("{description='").append(description).append('\'');
+        sb.append(", name='").append(name).append('\'');
+        sb.append(", controlTag=").append(controlTag);
+        sb.append('}');
+        return sb.toString();
+    }
+
+    @Override
+    public boolean equals(final Object o) {
+        if (this == o) {
+            return true;
+        }
+        if (o == null || getClass() != o.getClass()) {
+            return false;
+        }
+
+        final DefaultTagDefinition that = (DefaultTagDefinition) o;
+
+        if (description != null ? !description.equals(that.description) : that.description != null) {
+            return false;
+        }
+        if (controlTag != null ? !controlTag.equals(that.controlTag) : that.controlTag != null) {
+            return false;
+        }
+        if (name != null ? !name.equals(that.name) : that.name != null) {
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = name != null ? name.hashCode() : 0;
+        result = 31 * result + (description != null ? description.hashCode() : 0);
+        result = 31 * result + (controlTag != null ? controlTag.hashCode() : 0);
+        return result;
     }
 }
diff --git a/util/src/main/java/com/ning/billing/util/tag/DefaultTagStore.java b/util/src/main/java/com/ning/billing/util/tag/DefaultTagStore.java
index a35b424..8bbe9e8 100644
--- a/util/src/main/java/com/ning/billing/util/tag/DefaultTagStore.java
+++ b/util/src/main/java/com/ning/billing/util/tag/DefaultTagStore.java
@@ -37,9 +37,9 @@ public class DefaultTagStore extends EntityCollectionBase<Tag> implements TagSto
      * @return true if no tags contraindicate payment processing
      */
     public boolean processPayment() {
-        for (Tag tag : entities.values()) {
+        for (final Tag tag : entities.values()) {
             if (tag instanceof ControlTag) {
-                ControlTag controlTag = (ControlTag) tag;
+                final ControlTag controlTag = (ControlTag) tag;
                 if (controlTag.getControlTagType() == ControlTagType.AUTO_PAY_OFF) {
                     return false;
                 }
@@ -49,15 +49,16 @@ public class DefaultTagStore extends EntityCollectionBase<Tag> implements TagSto
         return true;
     }
 
-    /***
+    /**
      * Collates the contents of the TagStore to determine if invoices should be generated
+     *
      * @return true if no tags contraindicate invoice generation
      */
     @Override
     public boolean generateInvoice() {
-        for (Tag tag : entities.values()) {
+        for (final Tag tag : entities.values()) {
             if (tag instanceof ControlTag) {
-                ControlTag controlTag = (ControlTag) tag;
+                final ControlTag controlTag = (ControlTag) tag;
                 if (controlTag.getControlTagType() == ControlTagType.AUTO_INVOICING_OFF) {
                     return false;
                 }
@@ -69,7 +70,7 @@ public class DefaultTagStore extends EntityCollectionBase<Tag> implements TagSto
 
     @Override
     public boolean containsTagForDefinition(final TagDefinition tagDefinition) {
-        for (Tag tag : entities.values()) {
+        for (final Tag tag : entities.values()) {
             if (tag.getTagDefinitionName().equals(tagDefinition.getName())) {
                 return true;
             }
@@ -80,7 +81,7 @@ public class DefaultTagStore extends EntityCollectionBase<Tag> implements TagSto
 
     @Override
     public boolean containsTagForControlTagType(final ControlTagType controlTagType) {
-        for (Tag tag : entities.values()) {
+        for (final Tag tag : entities.values()) {
             if (tag.getTagDefinitionName().equals(controlTagType.toString())) {
                 return true;
             }
@@ -90,8 +91,8 @@ public class DefaultTagStore extends EntityCollectionBase<Tag> implements TagSto
     }
 
     @Override
-    public Tag remove(TagDefinition tagDefinition) {
-        Tag tag = entities.get(tagDefinition.getName());
+    public Tag remove(final TagDefinition tagDefinition) {
+        final Tag tag = entities.get(tagDefinition.getName());
         return (tag == null) ? null : entities.remove(tag);
     }
-}
\ No newline at end of file
+}
diff --git a/util/src/main/java/com/ning/billing/util/tag/DescriptiveTag.java b/util/src/main/java/com/ning/billing/util/tag/DescriptiveTag.java
index 3f875be..7c87e7b 100644
--- a/util/src/main/java/com/ning/billing/util/tag/DescriptiveTag.java
+++ b/util/src/main/java/com/ning/billing/util/tag/DescriptiveTag.java
@@ -24,19 +24,19 @@ public class DescriptiveTag extends EntityBase implements Tag {
     private final String tagDefinitionName;
 
     // use to hydrate objects from the persistence layer
-    public DescriptiveTag(UUID id, String tagDefinitionName) {
+    public DescriptiveTag(final UUID id, final String tagDefinitionName) {
         super(id);
         this.tagDefinitionName = tagDefinitionName;
     }
 
     // use to create new objects
-    public DescriptiveTag(TagDefinition tagDefinition) {
+    public DescriptiveTag(final TagDefinition tagDefinition) {
         super();
         this.tagDefinitionName = tagDefinition.getName();
     }
 
     // use to create new objects
-    public DescriptiveTag(String tagDefinitionName) {
+    public DescriptiveTag(final String tagDefinitionName) {
         super();
         this.tagDefinitionName = tagDefinitionName;
     }
@@ -56,26 +56,29 @@ public class DescriptiveTag extends EntityBase implements Tag {
         final int prime = 31;
         int result = 1;
         result = prime * result + ((tagDefinitionName == null) ? 0
-                                                              : tagDefinitionName.hashCode());
+                : tagDefinitionName.hashCode());
         return result;
     }
 
     @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
+    public boolean equals(final Object obj) {
+        if (this == obj) {
             return true;
-        if (obj == null)
+        }
+        if (obj == null) {
             return false;
-        if (getClass() != obj.getClass())
+        }
+        if (getClass() != obj.getClass()) {
             return false;
-        DescriptiveTag other = (DescriptiveTag) obj;
+        }
+        final DescriptiveTag other = (DescriptiveTag) obj;
         if (tagDefinitionName == null) {
-            if (other.tagDefinitionName != null)
+            if (other.tagDefinitionName != null) {
                 return false;
-        }
-        else if (!tagDefinitionName.equals(other.tagDefinitionName))
+            }
+        } else if (!tagDefinitionName.equals(other.tagDefinitionName)) {
             return false;
+        }
         return true;
     }
-
 }
diff --git a/util/src/test/java/com/ning/billing/dbi/MysqlTestingHelper.java b/util/src/test/java/com/ning/billing/dbi/MysqlTestingHelper.java
index c68c759..2aef0a9 100644
--- a/util/src/test/java/com/ning/billing/dbi/MysqlTestingHelper.java
+++ b/util/src/test/java/com/ning/billing/dbi/MysqlTestingHelper.java
@@ -53,6 +53,7 @@ public class MysqlTestingHelper
     // Discover dynamically list of all tables in that database;
     private List<String> allTables;    
     private File dbDir;
+    private File dataDir;
     private MysqldResource mysqldResource;
     private int port;
 
@@ -85,10 +86,15 @@ public class MysqlTestingHelper
             return;
         }
 
-        dbDir = File.createTempFile("mysql", "");
-        dbDir.delete();
-        dbDir.mkdir();
-        mysqldResource = new MysqldResource(dbDir);
+        dbDir = File.createTempFile("mysqldb", "");
+        Assert.assertTrue(dbDir.delete());
+        Assert.assertTrue(dbDir.mkdir());
+
+        dataDir = File.createTempFile("mysqldata", "");
+        Assert.assertTrue(dataDir.delete());
+        Assert.assertTrue(dataDir.mkdir());
+
+        mysqldResource = new MysqldResource(dbDir, dataDir);
 
         final Map<String, String> dbOpts = new HashMap<String, String>();
         dbOpts.put(MysqldResourceI.PORT, Integer.toString(port));
@@ -103,6 +109,7 @@ public class MysqlTestingHelper
         }
         else {
             log.info("MySQL running on port " + mysqldResource.getPort());
+            log.info(String.format("To connect to it: mysql -u%s -p%s -P%s -S%s/mysql.sock %s", USERNAME, PASSWORD, port, dataDir, DB_NAME));
         }
     }
 
@@ -161,6 +168,7 @@ public class MysqlTestingHelper
         try {
             if (mysqldResource != null) {
                 mysqldResource.shutdown();
+                FileUtils.deleteQuietly(dataDir);
                 FileUtils.deleteQuietly(dbDir);
                 log.info("MySQLd stopped");
             }
diff --git a/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultControlTagCreationEvent.java b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultControlTagCreationEvent.java
new file mode 100644
index 0000000..5ebd270
--- /dev/null
+++ b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultControlTagCreationEvent.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.tag.api.user;
+
+import java.util.UUID;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import com.ning.billing.util.bus.BusEvent;
+import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.jackson.ObjectMapper;
+import com.ning.billing.util.tag.DefaultTagDefinition;
+import com.ning.billing.util.tag.TagDefinition;
+
+public class TestDefaultControlTagCreationEvent {
+    @Test(groups = "fast")
+    public void testPojo() throws Exception {
+        final UUID tagId = UUID.randomUUID();
+        final UUID objectId = UUID.randomUUID();
+        final ObjectType objectType = ObjectType.ACCOUNT_EMAIL;
+        final UUID tagDefinitionId = UUID.randomUUID();
+        final String tagDefinitionName = UUID.randomUUID().toString();
+        final String tagDefinitionDescription = UUID.randomUUID().toString();
+        final boolean controlTag = true;
+        final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
+        final UUID userToken = UUID.randomUUID();
+
+        final DefaultControlTagCreationEvent event = new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken);
+        Assert.assertEquals(event.getBusEventType(), BusEvent.BusEventType.CONTROL_TAG_CREATION);
+
+        Assert.assertEquals(event.getTagId(), tagId);
+        Assert.assertEquals(event.getObjectId(), objectId);
+        Assert.assertEquals(event.getObjectType(), objectType);
+        Assert.assertEquals(event.getTagDefinition(), tagDefinition);
+        Assert.assertEquals(event.getTagDefinition().getId(), tagDefinitionId);
+        Assert.assertEquals(event.getTagDefinition().getName(), tagDefinitionName);
+        Assert.assertEquals(event.getTagDefinition().getDescription(), tagDefinitionDescription);
+        Assert.assertEquals(event.getUserToken(), userToken);
+
+        Assert.assertEquals(event, event);
+        Assert.assertEquals(event, new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken));
+        Assert.assertTrue(event.equals(event));
+        Assert.assertTrue(event.equals(new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken)));
+    }
+
+    @Test(groups = "fast")
+    public void testSerialization() throws Exception {
+        final ObjectMapper objectMapper = new ObjectMapper();
+
+        final UUID tagId = UUID.randomUUID();
+        final UUID objectId = UUID.randomUUID();
+        final ObjectType objectType = ObjectType.ACCOUNT_EMAIL;
+        final UUID tagDefinitionId = UUID.randomUUID();
+        final String tagDefinitionName = UUID.randomUUID().toString();
+        final String tagDefinitionDescription = UUID.randomUUID().toString();
+        final boolean controlTag = true;
+        final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
+        final UUID userToken = UUID.randomUUID();
+
+        final DefaultControlTagCreationEvent event = new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken);
+
+        final String json = objectMapper.writeValueAsString(event);
+        final DefaultControlTagCreationEvent fromJson = objectMapper.readValue(json, DefaultControlTagCreationEvent.class);
+        Assert.assertEquals(fromJson, event);
+    }
+}
diff --git a/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultControlTagDefinitionCreationEvent.java b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultControlTagDefinitionCreationEvent.java
new file mode 100644
index 0000000..05d4c05
--- /dev/null
+++ b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultControlTagDefinitionCreationEvent.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.tag.api.user;
+
+import java.util.UUID;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import com.ning.billing.util.bus.BusEvent;
+import com.ning.billing.util.jackson.ObjectMapper;
+import com.ning.billing.util.tag.DefaultTagDefinition;
+import com.ning.billing.util.tag.TagDefinition;
+
+public class TestDefaultControlTagDefinitionCreationEvent {
+    @Test(groups = "fast")
+    public void testPojo() throws Exception {
+        final UUID tagDefinitionId = UUID.randomUUID();
+        final String tagDefinitionName = UUID.randomUUID().toString();
+        final String tagDefinitionDescription = UUID.randomUUID().toString();
+        final boolean controlTag = true;
+        final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
+        final UUID userToken = UUID.randomUUID();
+
+        final DefaultControlTagDefinitionCreationEvent event = new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken);
+        Assert.assertEquals(event.getBusEventType(), BusEvent.BusEventType.CONTROL_TAGDEFINITION_CREATION);
+
+        Assert.assertEquals(event.getTagDefinitionId(), tagDefinitionId);
+        Assert.assertEquals(event.getTagDefinition(), tagDefinition);
+        Assert.assertEquals(event.getTagDefinition().getId(), tagDefinitionId);
+        Assert.assertEquals(event.getTagDefinition().getName(), tagDefinitionName);
+        Assert.assertEquals(event.getTagDefinition().getDescription(), tagDefinitionDescription);
+        Assert.assertEquals(event.getUserToken(), userToken);
+
+        Assert.assertEquals(event, event);
+        Assert.assertEquals(event, new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken));
+        Assert.assertTrue(event.equals(event));
+        Assert.assertTrue(event.equals(new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken)));
+    }
+
+    @Test(groups = "fast")
+    public void testSerialization() throws Exception {
+        final ObjectMapper objectMapper = new ObjectMapper();
+
+        final UUID tagDefinitionId = UUID.randomUUID();
+        final String tagDefinitionName = UUID.randomUUID().toString();
+        final String tagDefinitionDescription = UUID.randomUUID().toString();
+        final boolean controlTag = true;
+        final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
+        final UUID userToken = UUID.randomUUID();
+
+        final DefaultControlTagDefinitionCreationEvent event = new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken);
+
+        final String json = objectMapper.writeValueAsString(event);
+        final DefaultControlTagDefinitionCreationEvent fromJson = objectMapper.readValue(json, DefaultControlTagDefinitionCreationEvent.class);
+        Assert.assertEquals(fromJson, event);
+    }
+}
diff --git a/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultControlTagDefinitionDeletionEvent.java b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultControlTagDefinitionDeletionEvent.java
new file mode 100644
index 0000000..08059d1
--- /dev/null
+++ b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultControlTagDefinitionDeletionEvent.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.tag.api.user;
+
+import java.util.UUID;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import com.ning.billing.util.bus.BusEvent;
+import com.ning.billing.util.jackson.ObjectMapper;
+import com.ning.billing.util.tag.DefaultTagDefinition;
+import com.ning.billing.util.tag.TagDefinition;
+
+public class TestDefaultControlTagDefinitionDeletionEvent {
+    @Test(groups = "fast")
+    public void testPojo() throws Exception {
+        final UUID tagDefinitionId = UUID.randomUUID();
+        final String tagDefinitionName = UUID.randomUUID().toString();
+        final String tagDefinitionDescription = UUID.randomUUID().toString();
+        final boolean controlTag = true;
+        final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
+        final UUID userToken = UUID.randomUUID();
+
+        final DefaultControlTagDefinitionDeletionEvent event = new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken);
+        Assert.assertEquals(event.getBusEventType(), BusEvent.BusEventType.CONTROL_TAGDEFINITION_DELETION);
+
+        Assert.assertEquals(event.getTagDefinitionId(), tagDefinitionId);
+        Assert.assertEquals(event.getTagDefinition(), tagDefinition);
+        Assert.assertEquals(event.getTagDefinition().getId(), tagDefinitionId);
+        Assert.assertEquals(event.getTagDefinition().getName(), tagDefinitionName);
+        Assert.assertEquals(event.getTagDefinition().getDescription(), tagDefinitionDescription);
+        Assert.assertEquals(event.getUserToken(), userToken);
+
+        Assert.assertEquals(event, event);
+        Assert.assertEquals(event, new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken));
+        Assert.assertTrue(event.equals(event));
+        Assert.assertTrue(event.equals(new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken)));
+    }
+
+    @Test(groups = "fast")
+    public void testSerialization() throws Exception {
+        final ObjectMapper objectMapper = new ObjectMapper();
+
+        final UUID tagDefinitionId = UUID.randomUUID();
+        final String tagDefinitionName = UUID.randomUUID().toString();
+        final String tagDefinitionDescription = UUID.randomUUID().toString();
+        final boolean controlTag = true;
+        final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
+        final UUID userToken = UUID.randomUUID();
+
+        final DefaultControlTagDefinitionDeletionEvent event = new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken);
+
+        final String json = objectMapper.writeValueAsString(event);
+        final DefaultControlTagDefinitionDeletionEvent fromJson = objectMapper.readValue(json, DefaultControlTagDefinitionDeletionEvent.class);
+        Assert.assertEquals(fromJson, event);
+    }
+}
diff --git a/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultControlTagDeletionEvent.java b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultControlTagDeletionEvent.java
new file mode 100644
index 0000000..692149a
--- /dev/null
+++ b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultControlTagDeletionEvent.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.tag.api.user;
+
+import java.util.UUID;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import com.ning.billing.util.bus.BusEvent;
+import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.jackson.ObjectMapper;
+import com.ning.billing.util.tag.DefaultTagDefinition;
+import com.ning.billing.util.tag.TagDefinition;
+
+public class TestDefaultControlTagDeletionEvent {
+    @Test(groups = "fast")
+    public void testPojo() throws Exception {
+        final UUID tagId = UUID.randomUUID();
+        final UUID objectId = UUID.randomUUID();
+        final ObjectType objectType = ObjectType.ACCOUNT_EMAIL;
+        final UUID tagDefinitionId = UUID.randomUUID();
+        final String tagDefinitionName = UUID.randomUUID().toString();
+        final String tagDefinitionDescription = UUID.randomUUID().toString();
+        final boolean controlTag = true;
+        final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
+        final UUID userToken = UUID.randomUUID();
+
+        final DefaultControlTagDeletionEvent event = new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken);
+        Assert.assertEquals(event.getBusEventType(), BusEvent.BusEventType.CONTROL_TAG_DELETION);
+
+        Assert.assertEquals(event.getTagId(), tagId);
+        Assert.assertEquals(event.getObjectId(), objectId);
+        Assert.assertEquals(event.getObjectType(), objectType);
+        Assert.assertEquals(event.getTagDefinition(), tagDefinition);
+        Assert.assertEquals(event.getTagDefinition().getId(), tagDefinitionId);
+        Assert.assertEquals(event.getTagDefinition().getName(), tagDefinitionName);
+        Assert.assertEquals(event.getTagDefinition().getDescription(), tagDefinitionDescription);
+        Assert.assertEquals(event.getUserToken(), userToken);
+
+        Assert.assertEquals(event, event);
+        Assert.assertEquals(event, new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken));
+        Assert.assertTrue(event.equals(event));
+        Assert.assertTrue(event.equals(new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken)));
+    }
+
+    @Test(groups = "fast")
+    public void testSerialization() throws Exception {
+        final ObjectMapper objectMapper = new ObjectMapper();
+
+        final UUID tagId = UUID.randomUUID();
+        final UUID objectId = UUID.randomUUID();
+        final ObjectType objectType = ObjectType.ACCOUNT_EMAIL;
+        final UUID tagDefinitionId = UUID.randomUUID();
+        final String tagDefinitionName = UUID.randomUUID().toString();
+        final String tagDefinitionDescription = UUID.randomUUID().toString();
+        final boolean controlTag = true;
+        final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
+        final UUID userToken = UUID.randomUUID();
+
+        final DefaultControlTagDeletionEvent event = new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken);
+
+        final String json = objectMapper.writeValueAsString(event);
+        final DefaultControlTagDeletionEvent fromJson = objectMapper.readValue(json, DefaultControlTagDeletionEvent.class);
+        Assert.assertEquals(fromJson, event);
+    }
+}
diff --git a/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultUserTagCreationEvent.java b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultUserTagCreationEvent.java
new file mode 100644
index 0000000..4d8162a
--- /dev/null
+++ b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultUserTagCreationEvent.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.tag.api.user;
+
+import java.util.UUID;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import com.ning.billing.util.bus.BusEvent;
+import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.jackson.ObjectMapper;
+import com.ning.billing.util.tag.DefaultTagDefinition;
+import com.ning.billing.util.tag.TagDefinition;
+
+public class TestDefaultUserTagCreationEvent {
+    @Test(groups = "fast")
+    public void testPojo() throws Exception {
+        final UUID tagId = UUID.randomUUID();
+        final UUID objectId = UUID.randomUUID();
+        final ObjectType objectType = ObjectType.ACCOUNT_EMAIL;
+        final UUID tagDefinitionId = UUID.randomUUID();
+        final String tagDefinitionName = UUID.randomUUID().toString();
+        final String tagDefinitionDescription = UUID.randomUUID().toString();
+        final boolean controlTag = true;
+        final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
+        final UUID userToken = UUID.randomUUID();
+
+        final DefaultUserTagCreationEvent event = new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken);
+        Assert.assertEquals(event.getBusEventType(), BusEvent.BusEventType.USER_TAG_CREATION);
+
+        Assert.assertEquals(event.getTagId(), tagId);
+        Assert.assertEquals(event.getObjectId(), objectId);
+        Assert.assertEquals(event.getObjectType(), objectType);
+        Assert.assertEquals(event.getTagDefinition(), tagDefinition);
+        Assert.assertEquals(event.getTagDefinition().getId(), tagDefinitionId);
+        Assert.assertEquals(event.getTagDefinition().getName(), tagDefinitionName);
+        Assert.assertEquals(event.getTagDefinition().getDescription(), tagDefinitionDescription);
+        Assert.assertEquals(event.getUserToken(), userToken);
+
+        Assert.assertEquals(event, event);
+        Assert.assertEquals(event, new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken));
+        Assert.assertTrue(event.equals(event));
+        Assert.assertTrue(event.equals(new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken)));
+    }
+
+    @Test(groups = "fast")
+    public void testSerialization() throws Exception {
+        final ObjectMapper objectMapper = new ObjectMapper();
+
+        final UUID tagId = UUID.randomUUID();
+        final UUID objectId = UUID.randomUUID();
+        final ObjectType objectType = ObjectType.ACCOUNT_EMAIL;
+        final UUID tagDefinitionId = UUID.randomUUID();
+        final String tagDefinitionName = UUID.randomUUID().toString();
+        final String tagDefinitionDescription = UUID.randomUUID().toString();
+        final boolean controlTag = true;
+        final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
+        final UUID userToken = UUID.randomUUID();
+
+        final DefaultUserTagCreationEvent event = new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken);
+
+        final String json = objectMapper.writeValueAsString(event);
+        final DefaultUserTagCreationEvent fromJson = objectMapper.readValue(json, DefaultUserTagCreationEvent.class);
+        Assert.assertEquals(fromJson, event);
+    }
+}
diff --git a/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultUserTagDefinitionCreationEvent.java b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultUserTagDefinitionCreationEvent.java
new file mode 100644
index 0000000..89507d3
--- /dev/null
+++ b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultUserTagDefinitionCreationEvent.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.tag.api.user;
+
+import java.util.UUID;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import com.ning.billing.util.bus.BusEvent;
+import com.ning.billing.util.jackson.ObjectMapper;
+import com.ning.billing.util.tag.DefaultTagDefinition;
+import com.ning.billing.util.tag.TagDefinition;
+
+public class TestDefaultUserTagDefinitionCreationEvent {
+    @Test(groups = "fast")
+    public void testPojo() throws Exception {
+        final UUID tagDefinitionId = UUID.randomUUID();
+        final String tagDefinitionName = UUID.randomUUID().toString();
+        final String tagDefinitionDescription = UUID.randomUUID().toString();
+        final boolean controlTag = true;
+        final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
+        final UUID userToken = UUID.randomUUID();
+
+        final DefaultUserTagDefinitionCreationEvent event = new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken);
+        Assert.assertEquals(event.getBusEventType(), BusEvent.BusEventType.USER_TAGDEFINITION_CREATION);
+
+        Assert.assertEquals(event.getTagDefinitionId(), tagDefinitionId);
+        Assert.assertEquals(event.getTagDefinition(), tagDefinition);
+        Assert.assertEquals(event.getTagDefinition().getId(), tagDefinitionId);
+        Assert.assertEquals(event.getTagDefinition().getName(), tagDefinitionName);
+        Assert.assertEquals(event.getTagDefinition().getDescription(), tagDefinitionDescription);
+        Assert.assertEquals(event.getUserToken(), userToken);
+
+        Assert.assertEquals(event, event);
+        Assert.assertEquals(event, new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken));
+        Assert.assertTrue(event.equals(event));
+        Assert.assertTrue(event.equals(new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken)));
+    }
+
+    @Test(groups = "fast")
+    public void testSerialization() throws Exception {
+        final ObjectMapper objectMapper = new ObjectMapper();
+
+        final UUID tagDefinitionId = UUID.randomUUID();
+        final String tagDefinitionName = UUID.randomUUID().toString();
+        final String tagDefinitionDescription = UUID.randomUUID().toString();
+        final boolean controlTag = true;
+        final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
+        final UUID userToken = UUID.randomUUID();
+
+        final DefaultUserTagDefinitionCreationEvent event = new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken);
+
+        final String json = objectMapper.writeValueAsString(event);
+        final DefaultUserTagDefinitionCreationEvent fromJson = objectMapper.readValue(json, DefaultUserTagDefinitionCreationEvent.class);
+        Assert.assertEquals(fromJson, event);
+    }
+}
diff --git a/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultUserTagDefinitionDeletionEvent.java b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultUserTagDefinitionDeletionEvent.java
new file mode 100644
index 0000000..bdcfaff
--- /dev/null
+++ b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultUserTagDefinitionDeletionEvent.java
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.tag.api.user;
+
+import java.util.UUID;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import com.ning.billing.util.bus.BusEvent;
+import com.ning.billing.util.jackson.ObjectMapper;
+import com.ning.billing.util.tag.DefaultTagDefinition;
+import com.ning.billing.util.tag.TagDefinition;
+
+public class TestDefaultUserTagDefinitionDeletionEvent {
+    @Test(groups = "fast")
+    public void testPojo() throws Exception {
+        final UUID tagDefinitionId = UUID.randomUUID();
+        final String tagDefinitionName = UUID.randomUUID().toString();
+        final String tagDefinitionDescription = UUID.randomUUID().toString();
+        final boolean controlTag = true;
+        final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
+        final UUID userToken = UUID.randomUUID();
+
+        final DefaultUserTagDefinitionDeletionEvent event = new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken);
+        Assert.assertEquals(event.getBusEventType(), BusEvent.BusEventType.USER_TAGDEFINITION_DELETION);
+
+        Assert.assertEquals(event.getTagDefinitionId(), tagDefinitionId);
+        Assert.assertEquals(event.getTagDefinition(), tagDefinition);
+        Assert.assertEquals(event.getTagDefinition().getId(), tagDefinitionId);
+        Assert.assertEquals(event.getTagDefinition().getName(), tagDefinitionName);
+        Assert.assertEquals(event.getTagDefinition().getDescription(), tagDefinitionDescription);
+        Assert.assertEquals(event.getUserToken(), userToken);
+
+        Assert.assertEquals(event, event);
+        Assert.assertEquals(event, new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken));
+        Assert.assertTrue(event.equals(event));
+        Assert.assertTrue(event.equals(new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken)));
+    }
+
+    @Test(groups = "fast")
+    public void testSerialization() throws Exception {
+        final ObjectMapper objectMapper = new ObjectMapper();
+
+        final UUID tagDefinitionId = UUID.randomUUID();
+        final String tagDefinitionName = UUID.randomUUID().toString();
+        final String tagDefinitionDescription = UUID.randomUUID().toString();
+        final boolean controlTag = true;
+        final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
+        final UUID userToken = UUID.randomUUID();
+
+        final DefaultUserTagDefinitionDeletionEvent event = new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken);
+
+        final String json = objectMapper.writeValueAsString(event);
+        final DefaultUserTagDefinitionDeletionEvent fromJson = objectMapper.readValue(json, DefaultUserTagDefinitionDeletionEvent.class);
+        Assert.assertEquals(fromJson, event);
+    }
+}
diff --git a/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultUserTagDeletionEvent.java b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultUserTagDeletionEvent.java
new file mode 100644
index 0000000..ff022ef
--- /dev/null
+++ b/util/src/test/java/com/ning/billing/util/tag/api/user/TestDefaultUserTagDeletionEvent.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.tag.api.user;
+
+import java.util.UUID;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import com.ning.billing.util.bus.BusEvent;
+import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.jackson.ObjectMapper;
+import com.ning.billing.util.tag.DefaultTagDefinition;
+import com.ning.billing.util.tag.TagDefinition;
+
+public class TestDefaultUserTagDeletionEvent {
+    @Test(groups = "fast")
+    public void testPojo() throws Exception {
+        final UUID tagId = UUID.randomUUID();
+        final UUID objectId = UUID.randomUUID();
+        final ObjectType objectType = ObjectType.ACCOUNT_EMAIL;
+        final UUID tagDefinitionId = UUID.randomUUID();
+        final String tagDefinitionName = UUID.randomUUID().toString();
+        final String tagDefinitionDescription = UUID.randomUUID().toString();
+        final boolean controlTag = true;
+        final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
+        final UUID userToken = UUID.randomUUID();
+
+        final DefaultUserTagDeletionEvent event = new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken);
+        Assert.assertEquals(event.getBusEventType(), BusEvent.BusEventType.USER_TAG_DELETION);
+
+        Assert.assertEquals(event.getTagId(), tagId);
+        Assert.assertEquals(event.getObjectId(), objectId);
+        Assert.assertEquals(event.getObjectType(), objectType);
+        Assert.assertEquals(event.getTagDefinition(), tagDefinition);
+        Assert.assertEquals(event.getTagDefinition().getId(), tagDefinitionId);
+        Assert.assertEquals(event.getTagDefinition().getName(), tagDefinitionName);
+        Assert.assertEquals(event.getTagDefinition().getDescription(), tagDefinitionDescription);
+        Assert.assertEquals(event.getUserToken(), userToken);
+
+        Assert.assertEquals(event, event);
+        Assert.assertEquals(event, new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken));
+        Assert.assertTrue(event.equals(event));
+        Assert.assertTrue(event.equals(new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken)));
+    }
+
+    @Test(groups = "fast")
+    public void testSerialization() throws Exception {
+        final ObjectMapper objectMapper = new ObjectMapper();
+
+        final UUID tagId = UUID.randomUUID();
+        final UUID objectId = UUID.randomUUID();
+        final ObjectType objectType = ObjectType.ACCOUNT_EMAIL;
+        final UUID tagDefinitionId = UUID.randomUUID();
+        final String tagDefinitionName = UUID.randomUUID().toString();
+        final String tagDefinitionDescription = UUID.randomUUID().toString();
+        final boolean controlTag = true;
+        final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
+        final UUID userToken = UUID.randomUUID();
+
+        final DefaultUserTagDeletionEvent event = new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken);
+
+        final String json = objectMapper.writeValueAsString(event);
+        final DefaultUserTagDeletionEvent fromJson = objectMapper.readValue(json, DefaultUserTagDeletionEvent.class);
+        Assert.assertEquals(fromJson, event);
+    }
+}
diff --git a/util/src/test/java/com/ning/billing/util/tag/api/user/TestTagEventBuilder.java b/util/src/test/java/com/ning/billing/util/tag/api/user/TestTagEventBuilder.java
new file mode 100644
index 0000000..724ad14
--- /dev/null
+++ b/util/src/test/java/com/ning/billing/util/tag/api/user/TestTagEventBuilder.java
@@ -0,0 +1,228 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.tag.api.user;
+
+import java.util.UUID;
+
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.tag.DefaultTagDefinition;
+import com.ning.billing.util.tag.TagDefinition;
+import com.ning.billing.util.tag.api.ControlTagCreationEvent;
+import com.ning.billing.util.tag.api.ControlTagDefinitionCreationEvent;
+import com.ning.billing.util.tag.api.ControlTagDefinitionDeletionEvent;
+import com.ning.billing.util.tag.api.ControlTagDeletionEvent;
+import com.ning.billing.util.tag.api.TagDefinitionEvent;
+import com.ning.billing.util.tag.api.TagEvent;
+import com.ning.billing.util.tag.api.UserTagCreationEvent;
+import com.ning.billing.util.tag.api.UserTagDefinitionCreationEvent;
+import com.ning.billing.util.tag.api.UserTagDefinitionDeletionEvent;
+import com.ning.billing.util.tag.api.UserTagDeletionEvent;
+
+public class TestTagEventBuilder {
+    @Test(groups = "fast")
+    public void testNewUserTagDefinitionCreationEvent() throws Exception {
+        final UUID tagDefinitionId = UUID.randomUUID();
+        final String tagDefinitionName = UUID.randomUUID().toString();
+        final String tagDefinitionDescription = UUID.randomUUID().toString();
+        final boolean controlTag = true;
+        final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
+        final UUID userToken = UUID.randomUUID();
+
+        final TagEventBuilder tagEventBuilder = new TagEventBuilder();
+        final TagDefinitionEvent event = tagEventBuilder.newUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken);
+        Assert.assertTrue(event instanceof UserTagDefinitionCreationEvent);
+
+        Assert.assertEquals(event, new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken));
+        Assert.assertTrue(event.equals(new DefaultUserTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken)));
+
+        verifyTagDefinitionEvent(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, tagDefinition, userToken, event);
+    }
+
+    @Test(groups = "fast")
+    public void testNewUserTagDefinitionDeletionEvent() throws Exception {
+        final UUID tagDefinitionId = UUID.randomUUID();
+        final String tagDefinitionName = UUID.randomUUID().toString();
+        final String tagDefinitionDescription = UUID.randomUUID().toString();
+        final boolean controlTag = true;
+        final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
+        final UUID userToken = UUID.randomUUID();
+
+        final TagEventBuilder tagEventBuilder = new TagEventBuilder();
+        final TagDefinitionEvent event = tagEventBuilder.newUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken);
+        Assert.assertTrue(event instanceof UserTagDefinitionDeletionEvent);
+
+        Assert.assertEquals(event, new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken));
+        Assert.assertTrue(event.equals(new DefaultUserTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken)));
+
+        verifyTagDefinitionEvent(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, tagDefinition, userToken, event);
+    }
+
+    @Test(groups = "fast")
+    public void testNewControlTagDefinitionCreationEvent() throws Exception {
+        final UUID tagDefinitionId = UUID.randomUUID();
+        final String tagDefinitionName = UUID.randomUUID().toString();
+        final String tagDefinitionDescription = UUID.randomUUID().toString();
+        final boolean controlTag = true;
+        final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
+        final UUID userToken = UUID.randomUUID();
+
+        final TagEventBuilder tagEventBuilder = new TagEventBuilder();
+        final TagDefinitionEvent event = tagEventBuilder.newControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken);
+        Assert.assertTrue(event instanceof ControlTagDefinitionCreationEvent);
+
+        Assert.assertEquals(event, new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken));
+        Assert.assertTrue(event.equals(new DefaultControlTagDefinitionCreationEvent(tagDefinitionId, tagDefinition, userToken)));
+
+        verifyTagDefinitionEvent(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, tagDefinition, userToken, event);
+    }
+
+    @Test(groups = "fast")
+    public void testNewControlTagDefinitionDeletionEvent() throws Exception {
+        final UUID tagDefinitionId = UUID.randomUUID();
+        final String tagDefinitionName = UUID.randomUUID().toString();
+        final String tagDefinitionDescription = UUID.randomUUID().toString();
+        final boolean controlTag = true;
+        final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
+        final UUID userToken = UUID.randomUUID();
+
+        final TagEventBuilder tagEventBuilder = new TagEventBuilder();
+        final TagDefinitionEvent event = tagEventBuilder.newControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken);
+        Assert.assertTrue(event instanceof ControlTagDefinitionDeletionEvent);
+
+        Assert.assertEquals(event, new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken));
+        Assert.assertTrue(event.equals(new DefaultControlTagDefinitionDeletionEvent(tagDefinitionId, tagDefinition, userToken)));
+
+        verifyTagDefinitionEvent(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, tagDefinition, userToken, event);
+    }
+
+    @Test(groups = "fast")
+    public void testNewUserTagCreationEvent() throws Exception {
+        final UUID tagId = UUID.randomUUID();
+        final UUID objectId = UUID.randomUUID();
+        final ObjectType objectType = ObjectType.ACCOUNT_EMAIL;
+        final UUID tagDefinitionId = UUID.randomUUID();
+        final String tagDefinitionName = UUID.randomUUID().toString();
+        final String tagDefinitionDescription = UUID.randomUUID().toString();
+        final boolean controlTag = true;
+        final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
+        final UUID userToken = UUID.randomUUID();
+
+        final TagEventBuilder tagEventBuilder = new TagEventBuilder();
+        final TagEvent event = tagEventBuilder.newUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken);
+        Assert.assertTrue(event instanceof UserTagCreationEvent);
+
+        Assert.assertEquals(event, new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken));
+        Assert.assertTrue(event.equals(new DefaultUserTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken)));
+
+        verifyTagEvent(tagId, objectId, objectType, tagDefinitionId, tagDefinitionName, tagDefinitionDescription, tagDefinition, userToken, event);
+    }
+
+    @Test(groups = "fast")
+    public void testNewUserTagDeletionEvent() throws Exception {
+        final UUID tagId = UUID.randomUUID();
+        final UUID objectId = UUID.randomUUID();
+        final ObjectType objectType = ObjectType.ACCOUNT_EMAIL;
+        final UUID tagDefinitionId = UUID.randomUUID();
+        final String tagDefinitionName = UUID.randomUUID().toString();
+        final String tagDefinitionDescription = UUID.randomUUID().toString();
+        final boolean controlTag = true;
+        final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
+        final UUID userToken = UUID.randomUUID();
+
+        final TagEventBuilder tagEventBuilder = new TagEventBuilder();
+        final TagEvent event = tagEventBuilder.newUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken);
+        Assert.assertTrue(event instanceof UserTagDeletionEvent);
+
+        Assert.assertEquals(event, new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken));
+        Assert.assertTrue(event.equals(new DefaultUserTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken)));
+
+        verifyTagEvent(tagId, objectId, objectType, tagDefinitionId, tagDefinitionName, tagDefinitionDescription, tagDefinition, userToken, event);
+    }
+
+    @Test(groups = "fast")
+    public void testNewControlTagCreationEvent() throws Exception {
+        final UUID tagId = UUID.randomUUID();
+        final UUID objectId = UUID.randomUUID();
+        final ObjectType objectType = ObjectType.ACCOUNT_EMAIL;
+        final UUID tagDefinitionId = UUID.randomUUID();
+        final String tagDefinitionName = UUID.randomUUID().toString();
+        final String tagDefinitionDescription = UUID.randomUUID().toString();
+        final boolean controlTag = true;
+        final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
+        final UUID userToken = UUID.randomUUID();
+
+        final TagEventBuilder tagEventBuilder = new TagEventBuilder();
+        final TagEvent event = tagEventBuilder.newControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken);
+        Assert.assertTrue(event instanceof ControlTagCreationEvent);
+
+        Assert.assertEquals(event, new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken));
+        Assert.assertTrue(event.equals(new DefaultControlTagCreationEvent(tagId, objectId, objectType, tagDefinition, userToken)));
+
+        verifyTagEvent(tagId, objectId, objectType, tagDefinitionId, tagDefinitionName, tagDefinitionDescription, tagDefinition, userToken, event);
+    }
+
+    @Test(groups = "fast")
+    public void testNewControlTagDeletionEvent() throws Exception {
+        final UUID tagId = UUID.randomUUID();
+        final UUID objectId = UUID.randomUUID();
+        final ObjectType objectType = ObjectType.ACCOUNT_EMAIL;
+        final UUID tagDefinitionId = UUID.randomUUID();
+        final String tagDefinitionName = UUID.randomUUID().toString();
+        final String tagDefinitionDescription = UUID.randomUUID().toString();
+        final boolean controlTag = true;
+        final TagDefinition tagDefinition = new DefaultTagDefinition(tagDefinitionId, tagDefinitionName, tagDefinitionDescription, controlTag);
+        final UUID userToken = UUID.randomUUID();
+
+        final TagEventBuilder tagEventBuilder = new TagEventBuilder();
+        final TagEvent event = tagEventBuilder.newControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken);
+        Assert.assertTrue(event instanceof ControlTagDeletionEvent);
+
+        Assert.assertEquals(event, new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken));
+        Assert.assertTrue(event.equals(new DefaultControlTagDeletionEvent(tagId, objectId, objectType, tagDefinition, userToken)));
+
+        verifyTagEvent(tagId, objectId, objectType, tagDefinitionId, tagDefinitionName, tagDefinitionDescription, tagDefinition, userToken, event);
+    }
+
+    private void verifyTagDefinitionEvent(final UUID tagDefinitionId, final String tagDefinitionName, final String tagDefinitionDescription, final TagDefinition tagDefinition, final UUID userToken, final TagDefinitionEvent event) {
+        Assert.assertEquals(event.getTagDefinitionId(), tagDefinitionId);
+        Assert.assertEquals(event.getTagDefinition(), tagDefinition);
+        Assert.assertEquals(event.getTagDefinition().getId(), tagDefinitionId);
+        Assert.assertEquals(event.getTagDefinition().getName(), tagDefinitionName);
+        Assert.assertEquals(event.getTagDefinition().getDescription(), tagDefinitionDescription);
+        Assert.assertEquals(event.getUserToken(), userToken);
+
+        Assert.assertEquals(event, event);
+        Assert.assertTrue(event.equals(event));
+    }
+
+    private void verifyTagEvent(final UUID tagId, final UUID objectId, final ObjectType objectType, final UUID tagDefinitionId, final String tagDefinitionName, final String tagDefinitionDescription, final TagDefinition tagDefinition, final UUID userToken, final TagEvent event) {
+        Assert.assertEquals(event.getTagId(), tagId);
+        Assert.assertEquals(event.getObjectId(), objectId);
+        Assert.assertEquals(event.getObjectType(), objectType);
+        Assert.assertEquals(event.getTagDefinition(), tagDefinition);
+        Assert.assertEquals(event.getTagDefinition().getId(), tagDefinitionId);
+        Assert.assertEquals(event.getTagDefinition().getName(), tagDefinitionName);
+        Assert.assertEquals(event.getTagDefinition().getDescription(), tagDefinitionDescription);
+        Assert.assertEquals(event.getUserToken(), userToken);
+
+        Assert.assertEquals(event, event);
+        Assert.assertTrue(event.equals(event));
+    }
+}
diff --git a/util/src/test/java/com/ning/billing/util/tag/dao/MockTagDao.java b/util/src/test/java/com/ning/billing/util/tag/dao/MockTagDao.java
index 9253c07..a09a952 100644
--- a/util/src/test/java/com/ning/billing/util/tag/dao/MockTagDao.java
+++ b/util/src/test/java/com/ning/billing/util/tag/dao/MockTagDao.java
@@ -17,13 +17,6 @@
 package com.ning.billing.util.tag.dao;
 
 import javax.annotation.Nullable;
-
-import com.ning.billing.util.callcontext.CallContext;
-import com.ning.billing.util.dao.ObjectType;
-import com.ning.billing.util.tag.Tag;
-import com.ning.billing.util.tag.TagDefinition;
-import org.skife.jdbi.v2.sqlobject.mixins.Transmogrifier;
-
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -31,34 +24,41 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
+import org.skife.jdbi.v2.sqlobject.mixins.Transmogrifier;
+
+import com.ning.billing.util.callcontext.CallContext;
+import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.tag.Tag;
+import com.ning.billing.util.tag.TagDefinition;
+
 public class MockTagDao implements TagDao {
-    private Map<UUID, List<Tag>> tagStore = new HashMap<UUID, List<Tag>>();
+    private final Map<UUID, List<Tag>> tagStore = new HashMap<UUID, List<Tag>>();
 
     @Override
     public void saveEntitiesFromTransaction(final Transmogrifier dao, final UUID objectId, final ObjectType objectType,
-                                        final List<Tag> tags, final CallContext context) {
+                                            final List<Tag> tags, final CallContext context) {
         tagStore.put(objectId, tags);
     }
 
     @Override
-    public void saveEntities(UUID objectId, ObjectType objectType, List<Tag> tags, CallContext context) {
-        tagStore.put(objectId, tags) ;
+    public void saveEntities(final UUID objectId, final ObjectType objectType, final List<Tag> tags, final CallContext context) {
+        tagStore.put(objectId, tags);
     }
 
     @Override
-    public Map<String, Tag> loadEntities(UUID objectId, ObjectType objectType) {
+    public Map<String, Tag> loadEntities(final UUID objectId, final ObjectType objectType) {
         return getMap(tagStore.get(objectId));
     }
 
     @Override
-    public Map<String, Tag> loadEntitiesFromTransaction(Transmogrifier dao, UUID objectId, ObjectType objectType) {
+    public Map<String, Tag> loadEntitiesFromTransaction(final Transmogrifier dao, final UUID objectId, final ObjectType objectType) {
         return getMap(tagStore.get(objectId));
     }
 
     private Map<String, Tag> getMap(@Nullable final List<Tag> tags) {
-        Map<String, Tag> map = new HashMap<String, Tag>();
+        final Map<String, Tag> map = new HashMap<String, Tag>();
         if (tags != null) {
-            for (Tag tag : tags) {
+            for (final Tag tag : tags) {
                 map.put(tag.getTagDefinitionName(), tag);
             }
         }
@@ -68,8 +68,8 @@ public class MockTagDao implements TagDao {
     @Override
     public void insertTag(final UUID objectId, final ObjectType objectType,
                           final TagDefinition tagDefinition, final CallContext context) {
-        Tag tag = new Tag() {
-            private UUID id = UUID.randomUUID();
+        final Tag tag = new Tag() {
+            private final UUID id = UUID.randomUUID();
 
             @Override
             public String getTagDefinitionName() {
@@ -90,21 +90,13 @@ public class MockTagDao implements TagDao {
     }
 
     @Override
-    public void insertTags(final UUID objectId, final ObjectType objectType,
-                           final List<TagDefinition> tagDefinitions, final CallContext context) {
-        for (TagDefinition tagDefinition : tagDefinitions) {
-            insertTag(objectId, objectType, tagDefinition, context);
-        }
-    }
-
-    @Override
     public void deleteTag(final UUID objectId, final ObjectType objectType,
                           final TagDefinition tagDefinition, final CallContext context) {
-        List<Tag> tags = tagStore.get(objectId);
+        final List<Tag> tags = tagStore.get(objectId);
         if (tags != null) {
-            Iterator<Tag> tagIterator = tags.iterator();
+            final Iterator<Tag> tagIterator = tags.iterator();
             while (tagIterator.hasNext()) {
-                Tag tag = tagIterator.next();
+                final Tag tag = tagIterator.next();
                 if (tag.getTagDefinitionName().equals(tagDefinition.getName())) {
                     tagIterator.remove();
                 }
diff --git a/util/src/test/java/com/ning/billing/util/tag/dao/MockTagDefinitionDao.java b/util/src/test/java/com/ning/billing/util/tag/dao/MockTagDefinitionDao.java
index 5b5956b..d7a3e63 100644
--- a/util/src/test/java/com/ning/billing/util/tag/dao/MockTagDefinitionDao.java
+++ b/util/src/test/java/com/ning/billing/util/tag/dao/MockTagDefinitionDao.java
@@ -21,8 +21,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
-import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.api.TagDefinitionApiException;
+import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.tag.DefaultTagDefinition;
 import com.ning.billing.util.tag.TagDefinition;
 
@@ -42,18 +42,13 @@ public class MockTagDefinitionDao implements TagDefinitionDao {
     @Override
     public TagDefinition create(final String definitionName, final String description,
                                 final CallContext context) throws TagDefinitionApiException {
-        TagDefinition tag = new DefaultTagDefinition(definitionName, description, false);
+        final TagDefinition tag = new DefaultTagDefinition(definitionName, description, false);
 
         tags.put(definitionName, tag);
         return tag;
     }
 
     @Override
-    public void deleteAllTagsForDefinition(final String definitionName, final CallContext context) throws TagDefinitionApiException {
-        tags.remove(definitionName);
-    }
-
-    @Override
     public void deleteTagDefinition(final String definitionName, final CallContext context) throws TagDefinitionApiException {
         tags.remove(definitionName);
     }
diff --git a/util/src/test/java/com/ning/billing/util/tag/dao/TestAuditedTagDao.java b/util/src/test/java/com/ning/billing/util/tag/dao/TestAuditedTagDao.java
new file mode 100644
index 0000000..e986950
--- /dev/null
+++ b/util/src/test/java/com/ning/billing/util/tag/dao/TestAuditedTagDao.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.tag.dao;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+
+import org.apache.commons.io.IOUtils;
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import com.google.common.eventbus.Subscribe;
+import com.google.inject.Inject;
+import com.ning.billing.dbi.MysqlTestingHelper;
+import com.ning.billing.util.bus.Bus;
+import com.ning.billing.util.bus.BusEvent;
+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.UserType;
+import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.tag.MockTagStoreModuleSql;
+import com.ning.billing.util.tag.Tag;
+import com.ning.billing.util.tag.TagDefinition;
+import com.ning.billing.util.tag.TestTagStore;
+import com.ning.billing.util.tag.api.TagEvent;
+
+@Guice(modules = MockTagStoreModuleSql.class)
+public class TestAuditedTagDao {
+    @Inject
+    private MysqlTestingHelper helper;
+
+    @Inject
+    private TagDefinitionDao tagDefinitionDao;
+
+    @Inject
+    private AuditedTagDao tagDao;
+
+    @Inject
+    private Clock clock;
+
+    @Inject
+    private Bus bus;
+
+    private CallContext context;
+    private EventsListener eventsListener;
+
+    @BeforeClass(groups = "slow")
+    public void setup() throws IOException {
+        final String utilDdl = IOUtils.toString(TestTagStore.class.getResourceAsStream("/com/ning/billing/util/ddl.sql"));
+
+        helper.startMysql();
+        helper.initDb(utilDdl);
+
+        context = new DefaultCallContextFactory(clock).createCallContext("Tag DAO test", CallOrigin.TEST, UserType.TEST, UUID.randomUUID());
+        bus.start();
+    }
+
+    @BeforeMethod(groups = "slow")
+    public void cleanup() throws Bus.EventBusException {
+        eventsListener = new EventsListener();
+        bus.register(eventsListener);
+    }
+
+    @AfterClass(groups = "slow")
+    public void stopMysql() {
+        bus.stop();
+        helper.stopMysql();
+    }
+
+    @Test(groups = "slow")
+    public void testCatchEventsOnCreateAndDelete() throws Exception {
+        final String definitionName = UUID.randomUUID().toString().substring(0, 5);
+        final String description = UUID.randomUUID().toString().substring(0, 5);
+        final UUID objectId = UUID.randomUUID();
+        final ObjectType objectType = ObjectType.RECURRING_INVOICE_ITEM;
+
+        // Verify the initial state
+        Assert.assertEquals(eventsListener.getEvents().size(), 0);
+        Assert.assertEquals(eventsListener.getTagEvents().size(), 0);
+
+        // Create a tag definition
+        final TagDefinition createdTagDefinition = tagDefinitionDao.create(definitionName, description, context);
+        Assert.assertEquals(createdTagDefinition.getName(), definitionName);
+        Assert.assertEquals(createdTagDefinition.getDescription(), description);
+
+        // Make sure we can create a tag
+        tagDao.insertTag(objectId, objectType, createdTagDefinition, context);
+
+        // Make sure we can retrieve it via the DAO
+        final Map<String, Tag> foundTags = tagDao.loadEntities(objectId, objectType);
+        Assert.assertEquals(foundTags.keySet().size(), 1);
+        Assert.assertEquals(foundTags.get(definitionName).getTagDefinitionName(), definitionName);
+
+        // Verify we caught an event on the bus -  we got 2 total (one for the tag definition, one for the tag)
+        Assert.assertEquals(eventsListener.getEvents().size(), 2);
+        Assert.assertEquals(eventsListener.getTagEvents().size(), 1);
+        final TagEvent tagFirstEventReceived = eventsListener.getTagEvents().get(0);
+        Assert.assertEquals(eventsListener.getEvents().get(1), tagFirstEventReceived);
+        Assert.assertEquals(tagFirstEventReceived.getObjectId(), objectId);
+        Assert.assertEquals(tagFirstEventReceived.getObjectType(), objectType);
+        Assert.assertEquals(tagFirstEventReceived.getTagDefinition().getName(), createdTagDefinition.getName());
+        Assert.assertEquals(tagFirstEventReceived.getTagDefinition().getDescription(), createdTagDefinition.getDescription());
+        Assert.assertEquals(tagFirstEventReceived.getBusEventType(), BusEvent.BusEventType.USER_TAG_CREATION);
+        Assert.assertEquals(tagFirstEventReceived.getUserToken(), context.getUserToken());
+
+        // Delete the tag
+        tagDao.deleteTag(objectId, objectType, createdTagDefinition, context);
+
+        // Make sure the tag is deleted
+        Assert.assertEquals(tagDao.loadEntities(objectId, objectType).keySet().size(), 0);
+
+        // Verify we caught an event on the bus
+        Assert.assertEquals(eventsListener.getEvents().size(), 3);
+        Assert.assertEquals(eventsListener.getTagEvents().size(), 2);
+        final TagEvent tagSecondEventReceived = eventsListener.getTagEvents().get(1);
+        Assert.assertEquals(eventsListener.getEvents().get(2), tagSecondEventReceived);
+        Assert.assertEquals(tagSecondEventReceived.getObjectId(), objectId);
+        Assert.assertEquals(tagSecondEventReceived.getObjectType(), objectType);
+        Assert.assertEquals(tagSecondEventReceived.getTagDefinition().getName(), createdTagDefinition.getName());
+        Assert.assertEquals(tagSecondEventReceived.getTagDefinition().getDescription(), createdTagDefinition.getDescription());
+        Assert.assertEquals(tagSecondEventReceived.getBusEventType(), BusEvent.BusEventType.USER_TAG_DELETION);
+        Assert.assertEquals(tagSecondEventReceived.getUserToken(), context.getUserToken());
+    }
+
+    private static final class EventsListener {
+        private final List<BusEvent> events = new ArrayList<BusEvent>();
+        private final List<TagEvent> tagEvents = new ArrayList<TagEvent>();
+
+        @Subscribe
+        public synchronized void processEvent(final BusEvent event) {
+            events.add(event);
+        }
+
+        @Subscribe
+        public synchronized void processTagDefinitionEvent(final TagEvent tagEvent) {
+            tagEvents.add(tagEvent);
+        }
+
+        public List<BusEvent> getEvents() {
+            return events;
+        }
+
+        public List<TagEvent> getTagEvents() {
+            return tagEvents;
+        }
+    }
+}
diff --git a/util/src/test/java/com/ning/billing/util/tag/dao/TestDefaultTagDefinitionDao.java b/util/src/test/java/com/ning/billing/util/tag/dao/TestDefaultTagDefinitionDao.java
new file mode 100644
index 0000000..cc74c55
--- /dev/null
+++ b/util/src/test/java/com/ning/billing/util/tag/dao/TestDefaultTagDefinitionDao.java
@@ -0,0 +1,154 @@
+/*
+ * Copyright 2010-2012 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.util.tag.dao;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+import org.apache.commons.io.IOUtils;
+import org.testng.Assert;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import com.google.common.eventbus.Subscribe;
+import com.google.inject.Inject;
+import com.ning.billing.dbi.MysqlTestingHelper;
+import com.ning.billing.util.bus.Bus;
+import com.ning.billing.util.bus.BusEvent;
+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.UserType;
+import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.tag.MockTagStoreModuleSql;
+import com.ning.billing.util.tag.TagDefinition;
+import com.ning.billing.util.tag.TestTagStore;
+import com.ning.billing.util.tag.api.TagDefinitionEvent;
+
+@Guice(modules = MockTagStoreModuleSql.class)
+public class TestDefaultTagDefinitionDao {
+    @Inject
+    private MysqlTestingHelper helper;
+
+    @Inject
+    private TagDefinitionDao tagDefinitionDao;
+
+    @Inject
+    private Clock clock;
+
+    @Inject
+    private Bus bus;
+
+    private CallContext context;
+    private EventsListener eventsListener;
+
+    @BeforeClass(groups = "slow")
+    public void setup() throws IOException {
+        final String utilDdl = IOUtils.toString(TestTagStore.class.getResourceAsStream("/com/ning/billing/util/ddl.sql"));
+
+        helper.startMysql();
+        helper.initDb(utilDdl);
+
+        context = new DefaultCallContextFactory(clock).createCallContext("TagDefinition DAO test", CallOrigin.TEST, UserType.TEST, UUID.randomUUID());
+        bus.start();
+    }
+
+    @BeforeMethod(groups = "slow")
+    public void cleanup() throws Bus.EventBusException {
+        eventsListener = new EventsListener();
+        bus.register(eventsListener);
+    }
+
+    @AfterClass(groups = "slow")
+    public void stopMysql() {
+        bus.stop();
+        helper.stopMysql();
+    }
+
+    @Test(groups = "slow")
+    public void testCatchEventsOnCreateAndDelete() throws Exception {
+        final String definitionName = UUID.randomUUID().toString().substring(0, 5);
+        final String description = UUID.randomUUID().toString().substring(0, 5);
+
+        // Verify the initial state
+        Assert.assertEquals(eventsListener.getEvents().size(), 0);
+        Assert.assertEquals(eventsListener.getTagDefinitionEvents().size(), 0);
+
+        // Make sure we can create a tag definition
+        final TagDefinition createdTagDefinition = tagDefinitionDao.create(definitionName, description, context);
+        Assert.assertEquals(createdTagDefinition.getName(), definitionName);
+        Assert.assertEquals(createdTagDefinition.getDescription(), description);
+
+        // Make sure we can retrieve it via the DAO
+        final TagDefinition foundTagDefinition = tagDefinitionDao.getByName(definitionName);
+        Assert.assertEquals(foundTagDefinition, createdTagDefinition);
+
+        // Verify we caught an event on the bus
+        Assert.assertEquals(eventsListener.getEvents().size(), 1);
+        Assert.assertEquals(eventsListener.getTagDefinitionEvents().size(), 1);
+        final TagDefinitionEvent tagDefinitionFirstEventReceived = eventsListener.getTagDefinitionEvents().get(0);
+        Assert.assertEquals(eventsListener.getEvents().get(0), tagDefinitionFirstEventReceived);
+        Assert.assertEquals(tagDefinitionFirstEventReceived.getTagDefinitionId(), createdTagDefinition.getId());
+        Assert.assertEquals(tagDefinitionFirstEventReceived.getTagDefinition(), createdTagDefinition);
+        Assert.assertEquals(tagDefinitionFirstEventReceived.getBusEventType(), BusEvent.BusEventType.USER_TAGDEFINITION_CREATION);
+        Assert.assertEquals(tagDefinitionFirstEventReceived.getUserToken(), context.getUserToken());
+
+        // Delete the tag definition
+        tagDefinitionDao.deleteTagDefinition(definitionName, context);
+
+        // Make sure the tag definition is deleted
+        Assert.assertNull(tagDefinitionDao.getByName(definitionName));
+
+        // Verify we caught an event on the bus
+        Assert.assertEquals(eventsListener.getEvents().size(), 2);
+        Assert.assertEquals(eventsListener.getTagDefinitionEvents().size(), 2);
+        final TagDefinitionEvent tagDefinitionSecondEventReceived = eventsListener.getTagDefinitionEvents().get(1);
+        Assert.assertEquals(eventsListener.getEvents().get(1), tagDefinitionSecondEventReceived);
+        Assert.assertEquals(tagDefinitionSecondEventReceived.getTagDefinitionId(), createdTagDefinition.getId());
+        Assert.assertEquals(tagDefinitionSecondEventReceived.getTagDefinition(), createdTagDefinition);
+        Assert.assertEquals(tagDefinitionSecondEventReceived.getBusEventType(), BusEvent.BusEventType.USER_TAGDEFINITION_DELETION);
+        Assert.assertEquals(tagDefinitionSecondEventReceived.getUserToken(), context.getUserToken());
+    }
+
+    private static final class EventsListener {
+        private final List<BusEvent> events = new ArrayList<BusEvent>();
+        private final List<TagDefinitionEvent> tagDefinitionEvents = new ArrayList<TagDefinitionEvent>();
+
+        @Subscribe
+        public synchronized void processEvent(final BusEvent event) {
+            events.add(event);
+        }
+
+        @Subscribe
+        public synchronized void processTagDefinitionEvent(final TagDefinitionEvent tagDefinitionEvent) {
+            tagDefinitionEvents.add(tagDefinitionEvent);
+        }
+
+        public List<BusEvent> getEvents() {
+            return events;
+        }
+
+        public List<TagDefinitionEvent> getTagDefinitionEvents() {
+            return tagDefinitionEvents;
+        }
+    }
+}
diff --git a/util/src/test/java/com/ning/billing/util/tag/MockTagStoreModuleSql.java b/util/src/test/java/com/ning/billing/util/tag/MockTagStoreModuleSql.java
index 6dbc537..d7a704b 100644
--- a/util/src/test/java/com/ning/billing/util/tag/MockTagStoreModuleSql.java
+++ b/util/src/test/java/com/ning/billing/util/tag/MockTagStoreModuleSql.java
@@ -19,11 +19,13 @@ package com.ning.billing.util.tag;
 
 import org.skife.jdbi.v2.Handle;
 import org.skife.jdbi.v2.IDBI;
+import org.skife.jdbi.v2.tweak.HandleCallback;
 
 import com.ning.billing.dbi.MysqlTestingHelper;
 import com.ning.billing.mock.glue.MockClockModule;
+import com.ning.billing.util.bus.Bus;
+import com.ning.billing.util.bus.InMemoryBus;
 import com.ning.billing.util.glue.TagStoreModule;
-import org.skife.jdbi.v2.tweak.HandleCallback;
 
 public class MockTagStoreModuleSql extends TagStoreModule {
     private MysqlTestingHelper helper;
@@ -34,13 +36,14 @@ public class MockTagStoreModuleSql extends TagStoreModule {
         bind(IDBI.class).toInstance(helper.getDBI());
         bind(MysqlTestingHelper.class).toInstance(helper);
         install(new MockClockModule());
+        bind(Bus.class).toInstance(new InMemoryBus());
         super.configure();
     }
 
     public void execute(final String ddl) {
         helper.getDBI().withHandle(new HandleCallback<Void>() {
             @Override
-            public Void withHandle(Handle handle) throws Exception {
+            public Void withHandle(final Handle handle) throws Exception {
                 handle.execute(ddl);
                 return null;
             }
diff --git a/util/src/test/java/com/ning/billing/util/tag/TestTagStore.java b/util/src/test/java/com/ning/billing/util/tag/TestTagStore.java
index b452203..69187ae 100644
--- a/util/src/test/java/com/ning/billing/util/tag/TestTagStore.java
+++ b/util/src/test/java/com/ning/billing/util/tag/TestTagStore.java
@@ -22,14 +22,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 
-import com.ning.billing.invoice.api.InvoiceApiException;
-import com.ning.billing.util.callcontext.CallContext;
-import com.ning.billing.util.callcontext.CallOrigin;
-import com.ning.billing.util.callcontext.UserType;
-import com.ning.billing.util.callcontext.DefaultCallContextFactory;
-import com.ning.billing.util.clock.Clock;
-import com.ning.billing.util.dao.ObjectType;
-import com.ning.billing.util.tag.dao.TagDao;
 import org.apache.commons.io.IOUtils;
 import org.joda.time.DateTime;
 import org.joda.time.Seconds;
@@ -38,15 +30,23 @@ import org.skife.jdbi.v2.IDBI;
 import org.skife.jdbi.v2.tweak.HandleCallback;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.testng.annotations.Guice;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Guice;
 import org.testng.annotations.Test;
 
 import com.google.inject.Inject;
 import com.ning.billing.dbi.MysqlTestingHelper;
-
+import com.ning.billing.util.api.TagApiException;
 import com.ning.billing.util.api.TagDefinitionApiException;
+import com.ning.billing.util.bus.Bus;
+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.UserType;
+import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.tag.dao.TagDao;
 import com.ning.billing.util.tag.dao.TagDefinitionDao;
 
 import static org.testng.Assert.assertEquals;
@@ -55,7 +55,7 @@ import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 
-@Test(groups={"slow"})
+@Test(groups = {"slow"})
 @Guice(modules = MockTagStoreModuleSql.class)
 public class TestTagStore {
     @Inject
@@ -66,19 +66,22 @@ public class TestTagStore {
 
     @Inject
     private TagDao tagDao;
-    
+
     @Inject
     private TagDefinitionDao tagDefinitionDao;
 
     @Inject
     private Clock clock;
 
+    @Inject
+    private Bus bus;
+
     private TagDefinition testTag;
 
     private final Logger log = LoggerFactory.getLogger(TestTagStore.class);
     private CallContext context;
 
-    @BeforeClass(groups="slow")
+    @BeforeClass(groups = "slow")
     protected void setup() throws IOException {
         // Health check test to make sure MySQL is setup properly
         try {
@@ -88,20 +91,20 @@ public class TestTagStore {
             helper.initDb(utilDdl);
 
             context = new DefaultCallContextFactory(clock).createCallContext("Tag store test", CallOrigin.TEST, UserType.TEST);
-            
+            bus.start();
+
             cleanupTags();
             tagDefinitionDao.create("tag1", "First tag", context);
             testTag = tagDefinitionDao.create("testTag", "Second tag", context);
-        }
-        catch (Throwable t) {
+        } catch (Throwable t) {
             log.error("Failed to start tag store tests", t);
             fail(t.toString());
         }
     }
 
-    @AfterClass(groups="slow")
-    public void stopMysql()
-    {
+    @AfterClass(groups = "slow")
+    public void stopMysql() {
+        bus.stop();
         if (helper != null) {
             helper.stopMysql();
         }
@@ -111,7 +114,7 @@ public class TestTagStore {
         try {
             helper.getDBI().withHandle(new HandleCallback<Void>() {
                 @Override
-                public Void withHandle(Handle handle) throws Exception {
+                public Void withHandle(final Handle handle) throws Exception {
                     handle.createScript("delete from tag_definitions").execute();
                     handle.createScript("delete from tag_definition_history").execute();
                     handle.createScript("delete from tags").execute();
@@ -122,52 +125,53 @@ public class TestTagStore {
         } catch (Throwable ignore) {
         }
     }
-    @Test(groups="slow")
+
+    @Test(groups = "slow")
     public void testTagCreationAndRetrieval() {
-        UUID accountId = UUID.randomUUID();
+        final UUID accountId = UUID.randomUUID();
 
-        TagStore tagStore = new DefaultTagStore(accountId, ObjectType.ACCOUNT);
-        Tag tag = new DescriptiveTag(testTag);
+        final TagStore tagStore = new DefaultTagStore(accountId, ObjectType.ACCOUNT);
+        final Tag tag = new DescriptiveTag(testTag);
         tagStore.add(tag);
 
         tagDao.saveEntities(accountId, ObjectType.ACCOUNT, tagStore.getEntityList(), context);
 
-        Map<String, Tag> savedTags = tagDao.loadEntities(accountId, ObjectType.ACCOUNT);
+        final Map<String, Tag> savedTags = tagDao.loadEntities(accountId, ObjectType.ACCOUNT);
         assertEquals(savedTags.size(), 1);
 
-        Tag savedTag = savedTags.get(tag.getTagDefinitionName());
+        final Tag savedTag = savedTags.get(tag.getTagDefinitionName());
         assertEquals(savedTag.getTagDefinitionName(), tag.getTagDefinitionName());
         assertEquals(savedTag.getId(), tag.getId());
     }
 
 
-    @Test(groups="slow")
+    @Test(groups = "slow")
     public void testControlTagCreation() {
-        UUID accountId = UUID.randomUUID();
-        TagStore tagStore = new DefaultTagStore(accountId, ObjectType.ACCOUNT);
+        final UUID accountId = UUID.randomUUID();
+        final TagStore tagStore = new DefaultTagStore(accountId, ObjectType.ACCOUNT);
 
-        ControlTag tag = new DefaultControlTag(ControlTagType.AUTO_INVOICING_OFF);
+        final ControlTag tag = new DefaultControlTag(ControlTagType.AUTO_INVOICING_OFF);
         tagStore.add(tag);
         assertEquals(tagStore.generateInvoice(), false);
 
-        List<Tag> tagList = tagStore.getEntityList();
+        final List<Tag> tagList = tagStore.getEntityList();
         tagDao.saveEntities(accountId, ObjectType.ACCOUNT, tagList, context);
 
         tagStore.clear();
         assertEquals(tagStore.getEntityList().size(), 0);
 
-        Map<String, Tag> tagMap = tagDao.loadEntities(accountId, ObjectType.ACCOUNT);
+        final Map<String, Tag> tagMap = tagDao.loadEntities(accountId, ObjectType.ACCOUNT);
         assertEquals(tagMap.size(), 1);
 
         assertEquals(tagMap.containsKey(ControlTagType.AUTO_INVOICING_OFF.toString()), true);
     }
 
-    @Test(groups="slow")
+    @Test(groups = "slow")
     public void testDescriptiveTagCreation() {
-        UUID accountId = UUID.randomUUID();
-        TagStore tagStore = new DefaultTagStore(accountId, ObjectType.ACCOUNT);
+        final UUID accountId = UUID.randomUUID();
+        final TagStore tagStore = new DefaultTagStore(accountId, ObjectType.ACCOUNT);
 
-        String definitionName = "SomeTestTag";
+        final String definitionName = "SomeTestTag";
         TagDefinition tagDefinition = null;
         try {
             tagDefinition = tagDefinitionDao.create(definitionName, "Test tag for some test purpose", context);
@@ -175,7 +179,7 @@ public class TestTagStore {
             fail("Tag definition creation failed.", e);
         }
 
-        DescriptiveTag tag = new DescriptiveTag(tagDefinition);
+        final DescriptiveTag tag = new DescriptiveTag(tagDefinition);
         tagStore.add(tag);
         assertEquals(tagStore.generateInvoice(), true);
 
@@ -184,18 +188,18 @@ public class TestTagStore {
         tagStore.clear();
         assertEquals(tagStore.getEntityList().size(), 0);
 
-        Map<String, Tag> tagMap = tagDao.loadEntities(accountId, ObjectType.ACCOUNT);
+        final Map<String, Tag> tagMap = tagDao.loadEntities(accountId, ObjectType.ACCOUNT);
         assertEquals(tagMap.size(), 1);
 
         assertEquals(tagMap.containsKey(ControlTagType.AUTO_INVOICING_OFF.toString()), false);
     }
 
-    @Test(groups="slow")
+    @Test(groups = "slow")
     public void testMixedTagCreation() {
-        UUID accountId = UUID.randomUUID();
-        TagStore tagStore = new DefaultTagStore(accountId, ObjectType.ACCOUNT);
+        final UUID accountId = UUID.randomUUID();
+        final TagStore tagStore = new DefaultTagStore(accountId, ObjectType.ACCOUNT);
 
-        String definitionName = "MixedTagTest";
+        final String definitionName = "MixedTagTest";
         TagDefinition tagDefinition = null;
         try {
             tagDefinition = tagDefinitionDao.create(definitionName, "Test tag for some test purpose", context);
@@ -203,11 +207,11 @@ public class TestTagStore {
             fail("Tag definition creation failed.", e);
         }
 
-        DescriptiveTag descriptiveTag = new DescriptiveTag(tagDefinition);
+        final DescriptiveTag descriptiveTag = new DescriptiveTag(tagDefinition);
         tagStore.add(descriptiveTag);
         assertEquals(tagStore.generateInvoice(), true);
 
-        ControlTag controlTag = new DefaultControlTag(ControlTagType.AUTO_INVOICING_OFF);
+        final ControlTag controlTag = new DefaultControlTag(ControlTagType.AUTO_INVOICING_OFF);
         tagStore.add(controlTag);
         assertEquals(tagStore.generateInvoice(), false);
 
@@ -216,39 +220,39 @@ public class TestTagStore {
         tagStore.clear();
         assertEquals(tagStore.getEntityList().size(), 0);
 
-        Map<String, Tag> tagMap = tagDao.loadEntities(accountId, ObjectType.ACCOUNT);
+        final Map<String, Tag> tagMap = tagDao.loadEntities(accountId, ObjectType.ACCOUNT);
         assertEquals(tagMap.size(), 2);
 
         assertEquals(tagMap.containsKey(ControlTagType.AUTO_INVOICING_OFF.toString()), true);
     }
 
-    @Test(groups="slow")
+    @Test(groups = "slow")
     public void testControlTags() {
-        UUID accountId = UUID.randomUUID();
-        TagStore tagStore = new DefaultTagStore(accountId, ObjectType.ACCOUNT);
+        final UUID accountId = UUID.randomUUID();
+        final TagStore tagStore = new DefaultTagStore(accountId, ObjectType.ACCOUNT);
         assertEquals(tagStore.generateInvoice(), true);
         assertEquals(tagStore.processPayment(), true);
 
-        ControlTag invoiceTag = new DefaultControlTag(ControlTagType.AUTO_INVOICING_OFF);
+        final ControlTag invoiceTag = new DefaultControlTag(ControlTagType.AUTO_INVOICING_OFF);
         tagStore.add(invoiceTag);
         assertEquals(tagStore.generateInvoice(), false);
         assertEquals(tagStore.processPayment(), true);
 
-        ControlTag paymentTag = new DefaultControlTag(ControlTagType.AUTO_PAY_OFF);
+        final ControlTag paymentTag = new DefaultControlTag(ControlTagType.AUTO_PAY_OFF);
         tagStore.add(paymentTag);
         assertEquals(tagStore.generateInvoice(), false);
         assertEquals(tagStore.processPayment(), false);
     }
 
-    @Test(groups="slow", expectedExceptions = TagDefinitionApiException.class)
+    @Test(groups = "slow", expectedExceptions = TagDefinitionApiException.class)
     public void testTagDefinitionCreationWithControlTagName() throws TagDefinitionApiException {
-        String definitionName = ControlTagType.AUTO_PAY_OFF.toString();
+        final String definitionName = ControlTagType.AUTO_PAY_OFF.toString();
         tagDefinitionDao.create(definitionName, "This should break", context);
     }
 
-    @Test(groups="slow")
+    @Test(groups = "slow")
     public void testTagDefinitionDeletionForUnusedDefinition() throws TagDefinitionApiException {
-        String definitionName = "TestTag1234";
+        final String definitionName = "TestTag1234";
         tagDefinitionDao.create(definitionName, "Some test tag", context);
 
         TagDefinition tagDefinition = tagDefinitionDao.getByName(definitionName);
@@ -259,79 +263,52 @@ public class TestTagStore {
         assertNull(tagDefinition);
     }
 
-    @Test(groups="slow", expectedExceptions = TagDefinitionApiException.class)
+    @Test(groups = "slow", expectedExceptions = TagDefinitionApiException.class)
     public void testTagDefinitionDeletionForDefinitionInUse() throws TagDefinitionApiException {
-        String definitionName = "TestTag12345";
+        final String definitionName = "TestTag12345";
         tagDefinitionDao.create(definitionName, "Some test tag", context);
 
-        TagDefinition tagDefinition = tagDefinitionDao.getByName(definitionName);
+        final TagDefinition tagDefinition = tagDefinitionDao.getByName(definitionName);
         assertNotNull(tagDefinition);
 
-        UUID objectId = UUID.randomUUID();
-        TagStore tagStore = new DefaultTagStore(objectId, ObjectType.ACCOUNT);
-        Tag tag = new DescriptiveTag(tagDefinition);
+        final UUID objectId = UUID.randomUUID();
+        final TagStore tagStore = new DefaultTagStore(objectId, ObjectType.ACCOUNT);
+        final Tag tag = new DescriptiveTag(tagDefinition);
         tagStore.add(tag);
 
         tagDao.saveEntities(objectId, ObjectType.ACCOUNT, tagStore.getEntityList(), context);
 
-        Map<String, Tag> tagMap = tagDao.loadEntities(objectId, ObjectType.ACCOUNT);
+        final Map<String, Tag> tagMap = tagDao.loadEntities(objectId, ObjectType.ACCOUNT);
         assertEquals(tagMap.size(), 1);
 
         tagDefinitionDao.deleteTagDefinition(definitionName, context);
     }
 
-    @Test(groups="slow")
-    public void testDeleteAllTagsForDefinitionInUse() {
-        String definitionName = "TestTag1234567";
+    @Test(groups = "slow")
+    public void testDeleteTagBeforeDeleteTagDefinition() throws TagApiException {
+        final String definitionName = "TestTag1234567";
         try {
             tagDefinitionDao.create(definitionName, "Some test tag", context);
         } catch (TagDefinitionApiException e) {
             fail("Could not create tag definition", e);
         }
 
-        TagDefinition tagDefinition = tagDefinitionDao.getByName(definitionName);
+        final TagDefinition tagDefinition = tagDefinitionDao.getByName(definitionName);
         assertNotNull(tagDefinition);
 
-        UUID objectId = UUID.randomUUID();
-        TagStore tagStore = new DefaultTagStore(objectId, ObjectType.ACCOUNT);
-        Tag tag = new DescriptiveTag(tagDefinition);
+        final UUID objectId = UUID.randomUUID();
+        final TagStore tagStore = new DefaultTagStore(objectId, ObjectType.ACCOUNT);
+        final Tag tag = new DescriptiveTag(tagDefinition);
         tagStore.add(tag);
 
         tagDao.saveEntities(objectId, ObjectType.ACCOUNT, tagStore.getEntityList(), context);
 
-        Map<String, Tag> tagMap = tagDao.loadEntities(objectId, ObjectType.ACCOUNT);
+        final Map<String, Tag> tagMap = tagDao.loadEntities(objectId, ObjectType.ACCOUNT);
         assertEquals(tagMap.size(), 1);
 
-        try {
-            tagDefinitionDao.deleteAllTagsForDefinition(definitionName, context);
-        } catch (TagDefinitionApiException e) {
-            fail("Could not delete tagStore for tag definition", e);
-        }
-
-        try {
-            tagDefinitionDao.deleteTagDefinition(definitionName, context);
-        } catch (TagDefinitionApiException e) {
-            fail("Could not delete tag definition", e);
-        }
-    }
-
-    @Test(groups="slow")
-    public void testDeleteAllTagsForDefinitionNotInUse() {
-        String definitionName = "TestTag4321";
-        try {
-            tagDefinitionDao.create(definitionName, "Some test tag", context);
-        } catch (TagDefinitionApiException e) {
-            fail("Could not create tag definition", e);
-        }
-
-        TagDefinition tagDefinition = tagDefinitionDao.getByName(definitionName);
-        assertNotNull(tagDefinition);
-
-        try {
-            tagDefinitionDao.deleteAllTagsForDefinition(definitionName, context);
-        } catch (TagDefinitionApiException e) {
-            fail("Could not delete tagStore for tag definition", e);
-        }
+        tagDao.deleteTag(objectId, ObjectType.ACCOUNT, tagDefinition, context);
+        final Map<String, Tag> tagMapAfterDeletion = tagDao.loadEntities(objectId, ObjectType.ACCOUNT);
+        assertEquals(tagMapAfterDeletion.size(), 0);
 
         try {
             tagDefinitionDao.deleteTagDefinition(definitionName, context);
@@ -340,72 +317,50 @@ public class TestTagStore {
         }
     }
 
-    @Test(groups="slow", expectedExceptions = TagDefinitionApiException.class)
-    public void testDeleteAllTagsForDefinitionWithWrongName() throws TagDefinitionApiException {
-        String definitionName = "TestTag654321";
-        String wrongDefinitionName = "TestTag564321";
-        try {
-            tagDefinitionDao.create(definitionName, "Some test tag", context);
-        } catch (TagDefinitionApiException e) {
-            fail("Could not create tag definition", e);
-        }
-
-        TagDefinition tagDefinition = tagDefinitionDao.getByName(definitionName);
-        assertNotNull(tagDefinition);
-
-        tagDefinitionDao.deleteAllTagsForDefinition(wrongDefinitionName, context);
-
-        try {
-            tagDefinitionDao.deleteTagDefinition(definitionName, context);
-        } catch (TagDefinitionApiException e) {
-            fail("Could not delete tag definition", e);
-        }
-    }
-
-    @Test(groups="slow")
+    @Test(groups = "slow")
     public void testGetTagDefinitions() {
-        List<TagDefinition> definitionList = tagDefinitionDao.getTagDefinitions();
+        final List<TagDefinition> definitionList = tagDefinitionDao.getTagDefinitions();
         assertTrue(definitionList.size() >= ControlTagType.values().length);
     }
 
     @Test
     public void testTagInsertAudit() {
-        UUID accountId = UUID.randomUUID();
+        final UUID accountId = UUID.randomUUID();
 
-        TagStore tagStore = new DefaultTagStore(accountId, ObjectType.ACCOUNT);
-        Tag tag = new DescriptiveTag(testTag);
+        final TagStore tagStore = new DefaultTagStore(accountId, ObjectType.ACCOUNT);
+        final Tag tag = new DescriptiveTag(testTag);
         tagStore.add(tag);
 
         tagDao.saveEntities(accountId, ObjectType.ACCOUNT, tagStore.getEntityList(), context);
 
-        Map<String, Tag> savedTags = tagDao.loadEntities(accountId, ObjectType.ACCOUNT);
+        final Map<String, Tag> savedTags = tagDao.loadEntities(accountId, ObjectType.ACCOUNT);
         assertEquals(savedTags.size(), 1);
 
-        Tag savedTag = savedTags.get(tag.getTagDefinitionName());
+        final Tag savedTag = savedTags.get(tag.getTagDefinitionName());
         assertEquals(savedTag.getTagDefinitionName(), tag.getTagDefinitionName());
         assertEquals(savedTag.getId(), tag.getId());
 
-        Handle handle = dbi.open();
-        String query = String.format("select * from audit_log a inner join tag_history th on a.record_id = th.history_record_id where a.table_name = 'tag_history' and th.id='%s' and a.change_type='INSERT'",
-                                     tag.getId().toString());
-        List<Map<String, Object>> result = handle.select(query);
+        final Handle handle = dbi.open();
+        final String query = String.format("select * from audit_log a inner join tag_history th on a.record_id = th.history_record_id where a.table_name = 'tag_history' and th.id='%s' and a.change_type='INSERT'",
+                                           tag.getId().toString());
+        final List<Map<String, Object>> result = handle.select(query);
         handle.close();
 
         assertNotNull(result);
         assertEquals(result.size(), 1);
         assertEquals(result.get(0).get("change_type"), "INSERT");
         assertNotNull(result.get(0).get("change_date"));
-        DateTime changeDate = new DateTime(result.get(0).get("change_date"));
+        final DateTime changeDate = new DateTime(result.get(0).get("change_date"));
         assertTrue(Seconds.secondsBetween(changeDate, context.getCreatedDate()).getSeconds() < 2);
         assertEquals(result.get(0).get("changed_by"), context.getUserName());
     }
 
     @Test
     public void testTagDeleteAudit() {
-        UUID accountId = UUID.randomUUID();
+        final UUID accountId = UUID.randomUUID();
 
-        TagStore tagStore = new DefaultTagStore(accountId, ObjectType.ACCOUNT);
-        Tag tag = new DescriptiveTag(testTag);
+        final TagStore tagStore = new DefaultTagStore(accountId, ObjectType.ACCOUNT);
+        final Tag tag = new DescriptiveTag(testTag);
         tagStore.add(tag);
 
         tagDao.saveEntities(accountId, ObjectType.ACCOUNT, tagStore.getEntityList(), context);
@@ -413,38 +368,38 @@ public class TestTagStore {
         tagStore.remove(tag);
         tagDao.saveEntities(accountId, ObjectType.ACCOUNT, tagStore.getEntityList(), context);
 
-        Map<String, Tag> savedTags = tagDao.loadEntities(accountId, ObjectType.ACCOUNT);
+        final Map<String, Tag> savedTags = tagDao.loadEntities(accountId, ObjectType.ACCOUNT);
         assertEquals(savedTags.size(), 0);
 
-        Handle handle = dbi.open();
-        String query = String.format("select * from audit_log a inner join tag_history th on a.record_id = th.history_record_id where a.table_name = 'tag_history' and th.id='%s' and a.change_type='DELETE'",
-                tag.getId().toString());
-        List<Map<String, Object>> result = handle.select(query);
+        final Handle handle = dbi.open();
+        final String query = String.format("select * from audit_log a inner join tag_history th on a.record_id = th.history_record_id where a.table_name = 'tag_history' and th.id='%s' and a.change_type='DELETE'",
+                                           tag.getId().toString());
+        final List<Map<String, Object>> result = handle.select(query);
         handle.close();
 
         assertNotNull(result);
         assertEquals(result.size(), 1);
         assertNotNull(result.get(0).get("change_date"));
-        DateTime changeDate = new DateTime(result.get(0).get("change_date"));
+        final DateTime changeDate = new DateTime(result.get(0).get("change_date"));
         assertTrue(Seconds.secondsBetween(changeDate, context.getUpdatedDate()).getSeconds() < 2);
         assertEquals(result.get(0).get("changed_by"), context.getUserName());
     }
 
     @Test
-    public void testAddTag() {
-        UUID objectId = UUID.randomUUID();
-        ObjectType objectType = ObjectType.INVOICE;
-        TagDefinition tagDefinition = new DefaultTagDefinition("test tag", "test", false);
+    public void testAddTag() throws TagApiException {
+        final UUID objectId = UUID.randomUUID();
+        final ObjectType objectType = ObjectType.INVOICE;
+        final TagDefinition tagDefinition = new DefaultTagDefinition("test tag", "test", false);
         tagDao.insertTag(objectId, objectType, tagDefinition, context);
-        Map<String, Tag> savedTags = tagDao.loadEntities(objectId, objectType);
+        final Map<String, Tag> savedTags = tagDao.loadEntities(objectId, objectType);
         assertEquals(savedTags.size(), 1);
     }
 
     @Test
-    public void testRemoveTag() throws InvoiceApiException {
-        UUID objectId = UUID.randomUUID();
-        ObjectType objectType = ObjectType.INVOICE;
-        TagDefinition tagDefinition = new DefaultTagDefinition("test tag", "test", false);
+    public void testRemoveTag() throws TagApiException {
+        final UUID objectId = UUID.randomUUID();
+        final ObjectType objectType = ObjectType.INVOICE;
+        final TagDefinition tagDefinition = new DefaultTagDefinition("test tag", "test", false);
         tagDao.insertTag(objectId, objectType, tagDefinition, context);
         Map<String, Tag> savedTags = tagDao.loadEntities(objectId, objectType);
         assertEquals(savedTags.size(), 1);
@@ -456,10 +411,10 @@ public class TestTagStore {
 
     @Test
     public void testSetTags() {
-        UUID objectId = UUID.randomUUID();
-        ObjectType objectType = ObjectType.INVOICE;
+        final UUID objectId = UUID.randomUUID();
+        final ObjectType objectType = ObjectType.INVOICE;
 
-        List<Tag> tags = new ArrayList<Tag>();
+        final List<Tag> tags = new ArrayList<Tag>();
         tags.add(new DescriptiveTag("test 1"));
         tags.add(new DescriptiveTag("test 2"));
         tags.add(new DefaultControlTag(ControlTagType.AUTO_INVOICING_OFF));