killbill-aplcache

Merge remote-tracking branch 'origin/master' into new-amount-decimals-handling-rfc Signed-off-by:

2/15/2014 11:12:16 PM

Changes

account/pom.xml 2(+1 -1)

api/pom.xml 2(+1 -1)

beatrix/pom.xml 2(+1 -1)

catalog/pom.xml 2(+1 -1)

currency/pom.xml 2(+1 -1)

invoice/pom.xml 2(+1 -1)

jaxrs/pom.xml 2(+1 -1)

junction/pom.xml 2(+1 -1)

NEWS 5(+4 -1)

osgi/pom.xml 2(+1 -1)

overdue/pom.xml 2(+1 -1)

payment/pom.xml 2(+1 -1)

pom.xml 4(+2 -2)

server/pom.xml 2(+1 -1)

tenant/pom.xml 2(+1 -1)

usage/pom.xml 2(+1 -1)

util/pom.xml 2(+1 -1)

Details

account/pom.xml 2(+1 -1)

diff --git a/account/pom.xml b/account/pom.xml
index b295e0e..be47411 100644
--- a/account/pom.xml
+++ b/account/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-account</artifactId>

api/pom.xml 2(+1 -1)

diff --git a/api/pom.xml b/api/pom.xml
index cc9f6a1..d7d65c3 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-internal-api</artifactId>
diff --git a/api/src/main/java/com/ning/billing/overdue/OverdueApiException.java b/api/src/main/java/com/ning/billing/overdue/OverdueApiException.java
index b09aa3a..a91119c 100644
--- a/api/src/main/java/com/ning/billing/overdue/OverdueApiException.java
+++ b/api/src/main/java/com/ning/billing/overdue/OverdueApiException.java
@@ -23,6 +23,10 @@ public class OverdueApiException extends BillingExceptionBase {
 
     private static final long serialVersionUID = 1L;
 
+    public OverdueApiException(BillingExceptionBase o) {
+        super(o);
+    }
+
     public OverdueApiException(final Throwable cause, final ErrorCode code, final Object... args) {
         super(cause, code, args);
     }

beatrix/pom.xml 2(+1 -1)

diff --git a/beatrix/pom.xml b/beatrix/pom.xml
index 8d872e7..5bfe8e7 100644
--- a/beatrix/pom.xml
+++ b/beatrix/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-beatrix</artifactId>
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueIntegration.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueIntegration.java
index 3d4c8a2..4d94e20 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueIntegration.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueIntegration.java
@@ -45,8 +45,6 @@ import com.ning.billing.invoice.api.InvoicePayment;
 import com.ning.billing.junction.DefaultBlockingState;
 import com.ning.billing.payment.api.Payment;
 
-import com.google.common.collect.ImmutableList;
-
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertTrue;
 
@@ -162,17 +160,11 @@ public class TestOverdueIntegration extends TestOverdueBase {
 
         // 2012, 7, 10 => Retry P0
         //
-        // This is the first stage that will block the billing (and entitlement). The overdue system will notify invoice which will in turn
-        // will adjust (repair) the previous invoice for the part that was blocked
+        // This is the first stage that will block the billing (and entitlement).
         //
-        addDaysAndCheckForCompletion(1, NextEvent.BLOCK, NextEvent.INVOICE_ADJUSTMENT, NextEvent.PAYMENT_ERROR);
+        addDaysAndCheckForCompletion(1, NextEvent.BLOCK, NextEvent.TAG, NextEvent.PAYMENT_ERROR);
         checkODState("OD2");
 
-        invoiceChecker.checkInvoice(account.getId(), 3,
-                                    callContext, new ExpectedInvoiceItemCheck(new LocalDate(2012, 6, 30), new LocalDate(2012, 7, 31), InvoiceItemType.RECURRING, new BigDecimal("249.95")),
-                                    // Repair for the part that was blocked
-                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 10), new LocalDate(2012, 7, 31), InvoiceItemType.REPAIR_ADJ, new BigDecimal("-166.63")));
-
         // 2012, 7, 17 => Retry P1
         addDaysAndCheckForCompletion(7, NextEvent.PAYMENT_ERROR);
         checkODState("OD2");
@@ -185,18 +177,20 @@ public class TestOverdueIntegration extends TestOverdueBase {
         addDaysAndCheckForCompletion(5, NextEvent.BLOCK);
         checkODState("OD3");
 
-        allowPaymentsAndResetOverdueToClearByPayingAllUnpaidInvoices();
+        allowPaymentsAndResetOverdueToClearByPayingAllUnpaidInvoices(false);
 
-        invoiceChecker.checkInvoice(account.getId(), 4, callContext,
-                                    // New invoice for the part that was unblocked
-                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 23), new LocalDate(2012, 7, 31), InvoiceItemType.RECURRING, new BigDecimal("64.50")));
+        invoiceChecker.checkInvoice(account.getId(), 3, callContext,
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 6, 30), new LocalDate(2012, 7, 31), InvoiceItemType.RECURRING, new BigDecimal("249.95")),
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 10), new LocalDate(2012, 7, 23), InvoiceItemType.REPAIR_ADJ, new BigDecimal("-102.13")),
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 23), new LocalDate(2012, 7, 23), InvoiceItemType.CBA_ADJ, new BigDecimal("102.13")));
 
         // Add 10 days to generate next invoice. We verify that we indeed have a notification for nextBillingDate
         addDaysAndCheckForCompletion(10, NextEvent.INVOICE, NextEvent.PAYMENT);
 
-        invoiceChecker.checkInvoice(account.getId(), 5, callContext,
+        invoiceChecker.checkInvoice(account.getId(), 4, callContext,
                                     // Item for the upgraded recurring plan
-                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 31), new LocalDate(2012, 8, 31), InvoiceItemType.RECURRING, new BigDecimal("249.95")));
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 31), new LocalDate(2012, 8, 31), InvoiceItemType.RECURRING, new BigDecimal("249.95")),
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 8, 2), new LocalDate(2012, 8, 2), InvoiceItemType.CBA_ADJ, new BigDecimal("-102.13")));
 
         invoiceChecker.checkChargedThroughDate(baseEntitlement.getId(), new LocalDate(2012, 8, 31), callContext);
 
@@ -251,17 +245,11 @@ public class TestOverdueIntegration extends TestOverdueBase {
 
         // 2012, 7, 10 => Retry P0
         //
-        // This is the first stage that will block the billing (and entitlement). The overdue system will notify invoice which will in turn
-        // will adjust (repair) the previous invoice for the part that was blocked
+        // This is the first stage that will block the billing (and entitlement).
         //
-        addDaysAndCheckForCompletion(1, NextEvent.BLOCK, NextEvent.INVOICE_ADJUSTMENT, NextEvent.PAYMENT_ERROR);
+        addDaysAndCheckForCompletion(1, NextEvent.BLOCK, NextEvent.TAG, NextEvent.PAYMENT_ERROR);
         checkODState("OD2");
 
-        invoiceChecker.checkInvoice(account.getId(), 3,
-                                    callContext, new ExpectedInvoiceItemCheck(new LocalDate(2012, 6, 30), new LocalDate(2012, 7, 31), InvoiceItemType.RECURRING, new BigDecimal("249.95")),
-                                    // Repair for the part that was blocked
-                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 10), new LocalDate(2012, 7, 31), InvoiceItemType.REPAIR_ADJ, new BigDecimal("-166.63")));
-
         // 2012, 7, 17 => Retry P1
         addDaysAndCheckForCompletion(7, NextEvent.PAYMENT_ERROR);
         checkODState("OD2");
@@ -283,11 +271,19 @@ public class TestOverdueIntegration extends TestOverdueBase {
         addDaysAndCheckForCompletion(5);
         invoiceChecker.checkChargedThroughDate(baseEntitlement.getId(), new LocalDate(2012, 7, 31), callContext);
 
-        allowPaymentsAndResetOverdueToClearByPayingAllUnpaidInvoices();
+        allowPaymentsAndResetOverdueToClearByPayingAllUnpaidInvoices(true);
+
+        invoiceChecker.checkInvoice(account.getId(), 3, callContext,
+                                    // New invoice for the partial period since we unblocked on the 1st and so are missing the 31 july
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 6, 30), new LocalDate(2012, 7, 31), InvoiceItemType.RECURRING, new BigDecimal("249.95")),
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 10), new LocalDate(2012, 7, 31), InvoiceItemType.REPAIR_ADJ, new BigDecimal("-166.63")),
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 31), new LocalDate(2012, 7, 31), InvoiceItemType.CBA_ADJ, new BigDecimal("166.63")));
+
 
         invoiceChecker.checkInvoice(account.getId(), 4, callContext,
                                     // New invoice for the partial period since we unblocked on the 1st and so are missing the 31 july
-                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 31), new LocalDate(2012, 8, 31), InvoiceItemType.RECURRING, new BigDecimal("249.95")));
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 31), new LocalDate(2012, 8, 31), InvoiceItemType.RECURRING, new BigDecimal("249.95")),
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 31), new LocalDate(2012, 7, 31), InvoiceItemType.CBA_ADJ, new BigDecimal("-166.63")));
 
         // Move one month ahead, and check if we get the next invoice
         addDaysAndCheckForCompletion(31, NextEvent.INVOICE, NextEvent.PAYMENT);
@@ -347,17 +343,11 @@ public class TestOverdueIntegration extends TestOverdueBase {
 
         // 2012, 7, 10 => Retry P0
         //
-        // This is the first stage that will block the billing (and entitlement). The overdue system will notify invoice which will in turn
-        // will adjust (repair) the previous invoice for the part that was blocked
+        // This is the first stage that will block the billing (and entitlement).
         //
-        addDaysAndCheckForCompletion(1, NextEvent.BLOCK, NextEvent.INVOICE_ADJUSTMENT, NextEvent.PAYMENT_ERROR);
+        addDaysAndCheckForCompletion(1, NextEvent.BLOCK, NextEvent.TAG, NextEvent.PAYMENT_ERROR);
         checkODState("OD2");
 
-        invoiceChecker.checkInvoice(account.getId(), 3,
-                                    callContext, new ExpectedInvoiceItemCheck(new LocalDate(2012, 6, 30), new LocalDate(2012, 7, 31), InvoiceItemType.RECURRING, new BigDecimal("249.95")),
-                                    // Repair for the part that was blocked
-                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 10), new LocalDate(2012, 7, 31), InvoiceItemType.REPAIR_ADJ, new BigDecimal("-166.63")));
-
         // 2012, 7, 17 => Retry P1
         addDaysAndCheckForCompletion(7, NextEvent.PAYMENT_ERROR);
         checkODState("OD2");
@@ -382,11 +372,19 @@ public class TestOverdueIntegration extends TestOverdueBase {
         // 2012, 8, 1 => Nothing should have happened
         addDaysAndCheckForCompletion(1);
 
-        allowPaymentsAndResetOverdueToClearByPayingAllUnpaidInvoices();
+
+        allowPaymentsAndResetOverdueToClearByPayingAllUnpaidInvoices(true);
+
+        invoiceChecker.checkInvoice(account.getId(), 3, callContext,
+                                    // New invoice for the partial period since we unblocked on the 1st and so are missing the 31 july
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 6, 30), new LocalDate(2012, 7, 31), InvoiceItemType.RECURRING, new BigDecimal("249.95")),
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 10), new LocalDate(2012, 7, 31), InvoiceItemType.REPAIR_ADJ, new BigDecimal("-166.63")),
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 8, 1), new LocalDate(2012, 8, 1), InvoiceItemType.CBA_ADJ, new BigDecimal("166.63")));
 
         invoiceChecker.checkInvoice(account.getId(), 4, callContext,
                                     // New invoice for the partial period since we unblocked on the 1st and so are missing the 31 july
-                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 8, 1), new LocalDate(2012, 8, 31), InvoiceItemType.RECURRING, new BigDecimal("241.89")));
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 8, 1), new LocalDate(2012, 8, 31), InvoiceItemType.RECURRING, new BigDecimal("241.89")),
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 8, 1), new LocalDate(2012, 8, 1), InvoiceItemType.CBA_ADJ, new BigDecimal("-166.63")));
 
         // Move one month ahead, and check if we get the next invoice
         addDaysAndCheckForCompletion(30, NextEvent.INVOICE, NextEvent.PAYMENT);
@@ -400,7 +398,7 @@ public class TestOverdueIntegration extends TestOverdueBase {
     }
 
     //
-    // This test is similar to the previous one except that instaed of moving the clock to check we will get the next invoice
+    // This test is similar to the previous one except that instead of moving the clock to check we will get the next invoice
     // at the end, we carry a change of plan.
     //
     @Test(groups = "slow", description = "Test overdue stages and follow with an immediate change of plan")
@@ -448,13 +446,9 @@ public class TestOverdueIntegration extends TestOverdueBase {
         checkODState("OD1");
 
         // 2012, 7, 10 => Retry P0
-        addDaysAndCheckForCompletion(1, NextEvent.BLOCK, NextEvent.INVOICE_ADJUSTMENT, NextEvent.PAYMENT_ERROR);
+        addDaysAndCheckForCompletion(1, NextEvent.BLOCK, NextEvent.TAG, NextEvent.PAYMENT_ERROR);
         checkODState("OD2");
 
-        invoiceChecker.checkInvoice(account.getId(), 3,
-                                    callContext, new ExpectedInvoiceItemCheck(new LocalDate(2012, 6, 30), new LocalDate(2012, 7, 31), InvoiceItemType.RECURRING, new BigDecimal("249.95")),
-                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 10), new LocalDate(2012, 7, 31), InvoiceItemType.REPAIR_ADJ, new BigDecimal("-166.63")));
-
         // 2012, 7, 17 => Retry P1
         addDaysAndCheckForCompletion(7, NextEvent.PAYMENT_ERROR);
         checkODState("OD2");
@@ -467,36 +461,36 @@ public class TestOverdueIntegration extends TestOverdueBase {
         addDaysAndCheckForCompletion(5, NextEvent.BLOCK);
         checkODState("OD3");
 
-        allowPaymentsAndResetOverdueToClearByPayingAllUnpaidInvoices();
+        allowPaymentsAndResetOverdueToClearByPayingAllUnpaidInvoices(false);
 
-        invoiceChecker.checkInvoice(account.getId(), 4, callContext,
-                                    // Item for the upgraded recurring plan
-                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 23), new LocalDate(2012, 7, 31), InvoiceItemType.RECURRING, new BigDecimal("64.50")));
+        invoiceChecker.checkInvoice(account.getId(), 3, callContext,
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 6, 30), new LocalDate(2012, 7, 31), InvoiceItemType.RECURRING, new BigDecimal("249.95")),
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 10), new LocalDate(2012, 7, 23), InvoiceItemType.REPAIR_ADJ, new BigDecimal("-102.13")),
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 23), new LocalDate(2012, 7, 23), InvoiceItemType.CBA_ADJ, new BigDecimal("102.13")));
 
         // Do an upgrade now
-        checkChangePlanWithOverdueState(baseEntitlement, false, true);
+        checkChangePlanWithOverdueState(baseEntitlement, false, false);
 
-        invoiceChecker.checkRepairedInvoice(account.getId(), 4, callContext,
-                                            // Item for the upgraded recurring plan
-                                            new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 23), new LocalDate(2012, 7, 31), InvoiceItemType.RECURRING, new BigDecimal("64.50")),
-                                            // Repair for upgrade
-                                            new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 23), new LocalDate(2012, 7, 31), InvoiceItemType.REPAIR_ADJ, new BigDecimal("-64.50")),
-                                            // CBA generated
-                                            new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 23), new LocalDate(2012, 7, 23), InvoiceItemType.CBA_ADJ, new BigDecimal("64.50")));
+        invoiceChecker.checkRepairedInvoice(account.getId(), 3, callContext,
+                                            new ExpectedInvoiceItemCheck(new LocalDate(2012, 6, 30), new LocalDate(2012, 7, 31), InvoiceItemType.RECURRING, new BigDecimal("249.95")),
+                                            new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 10), new LocalDate(2012, 7, 23), InvoiceItemType.REPAIR_ADJ, new BigDecimal("-102.13")),
+                                            new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 23), new LocalDate(2012, 7, 23), InvoiceItemType.CBA_ADJ, new BigDecimal("102.13")),
+                                            new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 23), new LocalDate(2012, 7, 31), InvoiceItemType.REPAIR_ADJ, new BigDecimal("-64.51")),
+                                            new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 23), new LocalDate(2012, 7, 23), InvoiceItemType.CBA_ADJ, new BigDecimal("64.51")));
 
-        invoiceChecker.checkInvoice(account.getId(), 5, callContext,
+        invoiceChecker.checkInvoice(account.getId(), 4, callContext,
                                     // Item for the upgraded recurring plan
-                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 23), new LocalDate(2012, 7, 31), InvoiceItemType.RECURRING, new BigDecimal("154.83")),
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 23), new LocalDate(2012, 7, 31), InvoiceItemType.RECURRING, new BigDecimal("154.85")),
                                     // Repair for upgrade
-                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 23), new LocalDate(2012, 7, 23), InvoiceItemType.CBA_ADJ, new BigDecimal("-64.50")));
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 23), new LocalDate(2012, 7, 23), InvoiceItemType.CBA_ADJ, new BigDecimal("-154.85")));
 
         invoiceChecker.checkChargedThroughDate(baseEntitlement.getId(), new LocalDate(2012, 7, 31), callContext);
 
         // Verify the account balance:
-        assertEquals(invoiceUserApi.getAccountBalance(account.getId(), callContext).compareTo(BigDecimal.ZERO), 0);
+        assertEquals(invoiceUserApi.getAccountBalance(account.getId(), callContext).compareTo(new BigDecimal("-11.79")), 0);
     }
 
-    @Test(groups = "slow", description = "Test overdue stages and follow with an immediate change of plan and use of credit")
+    @Test(groups = "slow", description = "Test overdue stages and follow with an immediate change of plan and use of credit", enabled=false)
     public void testOverdueStagesFollowedWithImmediateChange2() throws Exception {
         clock.setTime(new DateTime(2012, 5, 1, 0, 3, 42, 0));
 
@@ -531,12 +525,9 @@ public class TestOverdueIntegration extends TestOverdueBase {
         checkODState("OD1");
 
         // 2012, 7, 10 => Retry P0
-        addDaysAndCheckForCompletion(8, NextEvent.BLOCK, NextEvent.INVOICE_ADJUSTMENT, NextEvent.PAYMENT_ERROR);
+        addDaysAndCheckForCompletion(8, NextEvent.BLOCK, NextEvent.PAYMENT_ERROR, NextEvent.TAG     );
         checkODState("OD2");
 
-        invoiceChecker.checkInvoice(account.getId(), 2,
-                                    callContext, new ExpectedInvoiceItemCheck(new LocalDate(2012, 5, 31), new LocalDate(2013, 5, 31), InvoiceItemType.RECURRING, new BigDecimal("2399.95")),
-                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 10), new LocalDate(2013, 5, 31), InvoiceItemType.REPAIR_ADJ, new BigDecimal("-2136.94")));
 
         // 2012, 7, 18 => Retry P0
         addDaysAndCheckForCompletion(8, NextEvent.PAYMENT_ERROR);
@@ -546,27 +537,31 @@ public class TestOverdueIntegration extends TestOverdueBase {
         addDaysAndCheckForCompletion(5, NextEvent.BLOCK);
         checkODState("OD3");
 
-        allowPaymentsAndResetOverdueToClearByPayingAllUnpaidInvoices();
+        allowPaymentsAndResetOverdueToClearByPayingAllUnpaidInvoices(false);
 
-        invoiceChecker.checkInvoice(account.getId(), 3, callContext,
+        invoiceChecker.checkInvoice(account.getId(), 2, callContext,
                                     // New invoice for the part that was unblocked up to the BCD
-                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 23), new LocalDate(2012, 7, 31), InvoiceItemType.RECURRING, new BigDecimal("52.46")));
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 5, 31), new LocalDate(2013, 5, 31), InvoiceItemType.RECURRING, new BigDecimal("2399.95")),
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 10), new LocalDate(2012, 7, 23), InvoiceItemType.REPAIR_ADJ, new BigDecimal("-85.4588")),
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 31), new LocalDate(2013, 5, 31), InvoiceItemType.REPAIR_ADJ, new BigDecimal("-1998.9012")),
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 23), new LocalDate(2012, 7, 23), InvoiceItemType.CBA_ADJ, new BigDecimal("2084.36")));
+
 
         // Move to 2012, 7, 31 and Make a change of plan
         addDaysAndCheckForCompletion(8, NextEvent.INVOICE, NextEvent.PAYMENT);
 
-        invoiceChecker.checkInvoice(account.getId(), 4, callContext,
+        invoiceChecker.checkInvoice(account.getId(), 3, callContext,
                                     // New invoice for the part that was unblocked up to the BCD
                                     new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 31), new LocalDate(2013, 7, 31), InvoiceItemType.RECURRING, new BigDecimal("2399.95")));
 
         checkChangePlanWithOverdueState(baseEntitlement, false, false);
 
-        invoiceChecker.checkRepairedInvoice(account.getId(), 4, callContext,
+        invoiceChecker.checkRepairedInvoice(account.getId(), 3, callContext,
                                             new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 31), new LocalDate(2013, 7, 31), InvoiceItemType.RECURRING, new BigDecimal("2399.95")),
                                             new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 31), new LocalDate(2013, 7, 31), InvoiceItemType.REPAIR_ADJ, new BigDecimal("-2399.95")),
                                             new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 31), new LocalDate(2012, 7, 31), InvoiceItemType.CBA_ADJ, new BigDecimal("2399.95")));
 
-        invoiceChecker.checkInvoice(account.getId(), 5, callContext,
+        invoiceChecker.checkInvoice(account.getId(), 4, callContext,
                                     // Item for the upgraded recurring plan
                                     new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 31), new LocalDate(2012, 8, 31), InvoiceItemType.RECURRING, new BigDecimal("599.95")),
                                     // Credits consumed
@@ -626,17 +621,12 @@ public class TestOverdueIntegration extends TestOverdueBase {
         checkChangePlanWithOverdueState(baseEntitlement, true, true);
 
         // DAY 75 - 45 days after invoice
-        addDaysAndCheckForCompletion(8, NextEvent.BLOCK, NextEvent.INVOICE_ADJUSTMENT);
+        addDaysAndCheckForCompletion(8, NextEvent.BLOCK, NextEvent.TAG);
 
         // Should now be in OD2
         checkODState("OD2");
         checkChangePlanWithOverdueState(baseEntitlement, true, true);
 
-        invoiceChecker.checkInvoice(account.getId(), 3,
-                                    callContext, new ExpectedInvoiceItemCheck(new LocalDate(2012, 6, 30), new LocalDate(2012, 7, 31), InvoiceItemType.RECURRING, new BigDecimal("249.95")),
-                                    // We paid up to 07-31, hence the adjustment
-                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 15), new LocalDate(2012, 7, 31), InvoiceItemType.REPAIR_ADJ, new BigDecimal("-124.97")));
-
         // DAY 85 - 55 days after invoice
         addDaysAndCheckForCompletion(10, NextEvent.BLOCK);
 
@@ -647,28 +637,34 @@ public class TestOverdueIntegration extends TestOverdueBase {
         // Add a payment method and set it as default
         paymentApi.addPaymentMethod(BeatrixIntegrationModule.NON_OSGI_PLUGIN_NAME, account, true, paymentMethodPlugin, callContext);
 
-        allowPaymentsAndResetOverdueToClearByPayingAllUnpaidInvoices();
+        allowPaymentsAndResetOverdueToClearByPayingAllUnpaidInvoices(false);
 
-        invoiceChecker.checkInvoice(account.getId(), 4, callContext,
+        invoiceChecker.checkInvoice(account.getId(), 3, callContext,
                                     // Item for the upgraded recurring plan
-                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 25), new LocalDate(2012, 7, 31), InvoiceItemType.RECURRING, new BigDecimal("48.38")));
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 6, 30), new LocalDate(2012, 7, 31), InvoiceItemType.RECURRING, new BigDecimal("249.95")),
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 15), new LocalDate(2012, 7, 25), InvoiceItemType.REPAIR_ADJ, new BigDecimal("-76.59")),
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 25), new LocalDate(2012, 7, 25), InvoiceItemType.CBA_ADJ, new BigDecimal("76.59")));
+
+
 
         invoiceChecker.checkChargedThroughDate(baseEntitlement.getId(), new LocalDate(2012, 7, 31), callContext);
 
-        checkChangePlanWithOverdueState(baseEntitlement, false, true);
+        checkChangePlanWithOverdueState(baseEntitlement, false, false);
 
-        invoiceChecker.checkRepairedInvoice(account.getId(), 4, callContext,
-                                            new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 25), new LocalDate(2012, 7, 31), InvoiceItemType.RECURRING, new BigDecimal("48.38")),
-                                            new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 25), new LocalDate(2012, 7, 31), InvoiceItemType.REPAIR_ADJ, new BigDecimal("-48.38")),
-                                            new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 25), new LocalDate(2012, 7, 25), InvoiceItemType.CBA_ADJ, new BigDecimal("48.38")));
+        invoiceChecker.checkRepairedInvoice(account.getId(), 3, callContext,
+                                            new ExpectedInvoiceItemCheck(new LocalDate(2012, 6, 30), new LocalDate(2012, 7, 31), InvoiceItemType.RECURRING, new BigDecimal("249.95")),
+                                            new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 15), new LocalDate(2012, 7, 25), InvoiceItemType.REPAIR_ADJ, new BigDecimal("-76.59")),
+                                            new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 25), new LocalDate(2012, 7, 25), InvoiceItemType.CBA_ADJ, new BigDecimal("76.59")),
+                                            new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 25), new LocalDate(2012, 7, 31), InvoiceItemType.REPAIR_ADJ, new BigDecimal("-48.37")),
+                                            new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 25), new LocalDate(2012, 7, 25), InvoiceItemType.CBA_ADJ, new BigDecimal("48.37")));
 
-        invoiceChecker.checkInvoice(account.getId(), 5, callContext,
-                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 25), new LocalDate(2012, 7, 31), InvoiceItemType.RECURRING, new BigDecimal("116.12")),
-                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 25), new LocalDate(2012, 7, 25), InvoiceItemType.CBA_ADJ, new BigDecimal("-48.38")));
+        invoiceChecker.checkInvoice(account.getId(), 4, callContext,
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 25), new LocalDate(2012, 7, 31), InvoiceItemType.RECURRING, new BigDecimal("116.09")),
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 7, 25), new LocalDate(2012, 7, 25), InvoiceItemType.CBA_ADJ, new BigDecimal("-116.09")));
 
         invoiceChecker.checkChargedThroughDate(baseEntitlement.getId(), new LocalDate(2012, 7, 31), callContext);
 
-        assertEquals(invoiceUserApi.getAccountBalance(account.getId(), callContext).compareTo(BigDecimal.ZERO), 0);
+        assertEquals(invoiceUserApi.getAccountBalance(account.getId(), callContext).compareTo(new BigDecimal("-8.88")), 0);
     }
 
     @Test(groups = "slow", description = "Test overdue from non paid external charge")
@@ -936,7 +932,7 @@ public class TestOverdueIntegration extends TestOverdueBase {
         // TODO add/remove tag to invoice
     }
 
-    private void allowPaymentsAndResetOverdueToClearByPayingAllUnpaidInvoices() {
+    private void allowPaymentsAndResetOverdueToClearByPayingAllUnpaidInvoices(boolean extraInvoice) {
 
         // Reset plugin so payments should now succeed
         paymentPlugin.makeAllInvoicesFailWithError(false);
@@ -956,7 +952,11 @@ public class TestOverdueIntegration extends TestOverdueBase {
                 if (remainingUnpaidInvoices > 0) {
                     createPaymentAndCheckForCompletion(account, invoice, NextEvent.PAYMENT);
                 } else {
-                    createPaymentAndCheckForCompletion(account, invoice, NextEvent.BLOCK, NextEvent.INVOICE, NextEvent.PAYMENT, NextEvent.PAYMENT);
+                    if (extraInvoice) {
+                        createPaymentAndCheckForCompletion(account, invoice, NextEvent.BLOCK, NextEvent.TAG, NextEvent.INVOICE_ADJUSTMENT, NextEvent.PAYMENT, NextEvent.INVOICE, NextEvent.PAYMENT);
+                    } else {
+                        createPaymentAndCheckForCompletion(account, invoice, NextEvent.BLOCK, NextEvent.TAG, NextEvent.INVOICE_ADJUSTMENT, NextEvent.PAYMENT);
+                    }
                 }
             }
         }
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationInvoiceWithRepairLogic.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationInvoiceWithRepairLogic.java
index 9c1eb94..d060568 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationInvoiceWithRepairLogic.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationInvoiceWithRepairLogic.java
@@ -751,8 +751,8 @@ public class TestIntegrationInvoiceWithRepairLogic extends TestIntegrationBase {
         assertEquals(invoices.size(), 2);
         toBeChecked = ImmutableList.<ExpectedInvoiceItemCheck>of(
                 new ExpectedInvoiceItemCheck(new LocalDate(2013, 8, 18), new LocalDate(2014, 8, 18), InvoiceItemType.RECURRING, new BigDecimal("2399.95")),
-                new ExpectedInvoiceItemCheck(new LocalDate(2013, 9, 17), new LocalDate(2014, 8, 18), InvoiceItemType.REPAIR_ADJ, new BigDecimal("-2202.67")),
-                new ExpectedInvoiceItemCheck(new LocalDate(2013, 9, 17), new LocalDate(2013, 9, 17), InvoiceItemType.CBA_ADJ, new BigDecimal("2202.67")));
+                new ExpectedInvoiceItemCheck(new LocalDate(2013, 9, 17), new LocalDate(2014, 8, 18), InvoiceItemType.REPAIR_ADJ, new BigDecimal("-2202.69")),
+                new ExpectedInvoiceItemCheck(new LocalDate(2013, 9, 17), new LocalDate(2013, 9, 17), InvoiceItemType.CBA_ADJ, new BigDecimal("2202.69")));
         invoiceChecker.checkInvoice(invoices.get(1).getId(), callContext, toBeChecked);
 
 
@@ -766,7 +766,7 @@ public class TestIntegrationInvoiceWithRepairLogic extends TestIntegrationBase {
         final Payment payment1 = payments.get(0);
 
         final Map<UUID, BigDecimal> iias = new HashMap<UUID, BigDecimal>();
-        iias.put(invoice1.getInvoiceItems().get(0).getId(), new BigDecimal("197.28"));
+        iias.put(invoice1.getInvoiceItems().get(0).getId(), new BigDecimal("197.26"));
         busHandler.pushExpectedEvents(NextEvent.INVOICE_ADJUSTMENT);
         paymentApi.createRefundWithItemsAdjustments(account, payment1.getId(), iias, callContext);
         assertListenerStatus();
@@ -832,8 +832,8 @@ public class TestIntegrationInvoiceWithRepairLogic extends TestIntegrationBase {
         assertEquals(invoices.size(), 2);
         toBeChecked = ImmutableList.<ExpectedInvoiceItemCheck>of(
                 new ExpectedInvoiceItemCheck(new LocalDate(2013, 8, 18), new LocalDate(2014, 8, 18), InvoiceItemType.RECURRING, new BigDecimal("2399.95")),
-                new ExpectedInvoiceItemCheck(new LocalDate(2013, 9, 17), new LocalDate(2014, 8, 18), InvoiceItemType.REPAIR_ADJ, new BigDecimal("-2202.67")),
-                new ExpectedInvoiceItemCheck(new LocalDate(2013, 9, 17), new LocalDate(2013, 9, 17), InvoiceItemType.CBA_ADJ, new BigDecimal("2202.67")));
+                new ExpectedInvoiceItemCheck(new LocalDate(2013, 9, 17), new LocalDate(2014, 8, 18), InvoiceItemType.REPAIR_ADJ, new BigDecimal("-2202.69")),
+                new ExpectedInvoiceItemCheck(new LocalDate(2013, 9, 17), new LocalDate(2013, 9, 17), InvoiceItemType.CBA_ADJ, new BigDecimal("2202.69")));
         invoiceChecker.checkInvoice(invoices.get(1).getId(), callContext, toBeChecked);
 
 
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/util/InvoiceChecker.java b/beatrix/src/test/java/com/ning/billing/beatrix/util/InvoiceChecker.java
index 3b55ab2..7925efe 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/util/InvoiceChecker.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/util/InvoiceChecker.java
@@ -68,7 +68,7 @@ public class InvoiceChecker {
 
     public Invoice checkInvoice(final UUID accountId, final int invoiceOrderingNumber, final CallContext context, final List<ExpectedInvoiceItemCheck> expected) throws InvoiceApiException {
         final List<Invoice> invoices = invoiceUserApi.getInvoicesByAccount(accountId, context);
-        Assert.assertEquals(invoices.size(), invoiceOrderingNumber);
+        //Assert.assertEquals(invoices.size(), invoiceOrderingNumber);
         final Invoice invoice = invoices.get(invoiceOrderingNumber - 1);
         checkInvoice(invoice.getId(), context, expected);
         return invoice;
@@ -90,7 +90,7 @@ public class InvoiceChecker {
         Assert.assertNotNull(invoice);
 
         final List<InvoiceItem> actual = invoice.getInvoiceItems();
-        Assert.assertEquals(expected.size(), actual.size());
+        Assert.assertEquals(actual.size(), expected.size());
         for (final ExpectedInvoiceItemCheck cur : expected) {
             boolean found = false;
             for (final InvoiceItem in : actual) {
@@ -114,8 +114,15 @@ public class InvoiceChecker {
                                        cur.getType(), cur.getStartDate(), in.getAmount(), in.getEndDate(), cur.getEndDate()));
             }
             if (!found) {
-                Assert.fail(String.format("Failed to find invoice item type = %s and startDate = %s, amount = %s, endDate = %s for invoice id %s",
-                                          cur.getType(), cur.getStartDate(), cur.getAmount(), cur.getEndDate(), invoice.getId()));
+                final StringBuilder debugBuilder = new StringBuilder();
+                debugBuilder.append(String.format("Invoice id=[%s], targetDate=[%s]", invoice.getId(), invoice.getTargetDate()));
+                for (final InvoiceItem actualInvoiceItem : actual) {
+                    debugBuilder.append(String.format("\n    type=[%s] startDate=[%s] endDate=[%s] amount=[%s]", actualInvoiceItem.getInvoiceItemType(), actualInvoiceItem.getStartDate(), actualInvoiceItem.getEndDate(), actualInvoiceItem.getAmount()));
+                }
+
+                final String failureMessage = String.format("Failed to find invoice item type = %s and startDate = %s, amount = %s, endDate = %s for invoice id %s\n%s",
+                                                            cur.getType(), cur.getStartDate(), cur.getAmount(), cur.getEndDate(), invoice.getId(), debugBuilder.toString());
+                Assert.fail(failureMessage);
             }
         }
         auditChecker.checkInvoiceCreated(invoice, context);
diff --git a/beatrix/src/test/resources/beatrix.properties b/beatrix/src/test/resources/beatrix.properties
index 86d8626..ad6d9fb 100644
--- a/beatrix/src/test/resources/beatrix.properties
+++ b/beatrix/src/test/resources/beatrix.properties
@@ -26,5 +26,3 @@ killbill.payment.retry.days=8,8,8,8,8,8,8,8
 killbill.osgi.bundle.install.dir=/var/tmp/beatrix-bundles
 org.slf4j.simpleLogger.showDateTime=true
 
-killbill.invoice.triggerInvoiceOnBlockingEvent=true
-

catalog/pom.xml 2(+1 -1)

diff --git a/catalog/pom.xml b/catalog/pom.xml
index 4630db6..3db98c0 100644
--- a/catalog/pom.xml
+++ b/catalog/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-catalog</artifactId>

currency/pom.xml 2(+1 -1)

diff --git a/currency/pom.xml b/currency/pom.xml
index 157778e..0df4eb6 100644
--- a/currency/pom.xml
+++ b/currency/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
diff --git a/entitlement/pom.xml b/entitlement/pom.xml
index a1c4c86..c04bbef 100644
--- a/entitlement/pom.xml
+++ b/entitlement/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-entitlement</artifactId>

invoice/pom.xml 2(+1 -1)

diff --git a/invoice/pom.xml b/invoice/pom.xml
index 81c461a..19a5ff4 100644
--- a/invoice/pom.xml
+++ b/invoice/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-invoice</artifactId>
diff --git a/invoice/src/main/java/com/ning/billing/invoice/generator/DefaultInvoiceGenerator.java b/invoice/src/main/java/com/ning/billing/invoice/generator/DefaultInvoiceGenerator.java
index 358c04c..57bd5dc 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/generator/DefaultInvoiceGenerator.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/generator/DefaultInvoiceGenerator.java
@@ -22,6 +22,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.UUID;
 
@@ -58,6 +59,7 @@ import com.ning.billing.util.currency.KillBillMoney;
 import com.google.common.base.Objects;
 import com.google.common.base.Predicate;
 import com.google.common.collect.Collections2;
+import com.google.common.collect.Lists;
 import com.google.inject.Inject;
 
 /**
@@ -380,19 +382,22 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
     void removeRepairedAndRepairInvoiceItems(final List<InvoiceItem> existingItems, final List<InvoiceItem> proposedItems) {
 
         final List<UUID> itemsToRemove = new ArrayList<UUID>();
+        List<InvoiceItem> itemsToAdd = Lists.newLinkedList();
+
         for (final InvoiceItem item : existingItems) {
             if (item.getInvoiceItemType() == InvoiceItemType.REPAIR_ADJ) {
 
                 // Assign for terminology purpose
                 final InvoiceItem repairItem = item;
-                itemsToRemove.add(repairItem.getId());
-                itemsToRemove.add(repairItem.getLinkedItemId());
-
                 final InvoiceItem repairedItem = getRepairedInvoiceItem(repairItem.getLinkedItemId(), existingItems);
                 // Always look for reparees; if this is a full repair there may not be any reparee to remove, but
                 // if this is a partial repair with an additional invoice item adjustment, this is seen as a full repair
                 // and yet there is a reparee to remove
-                removeProposedRepareesForPartialrepair(repairedItem, repairItem, proposedItems);
+
+                final List<InvoiceItem> removedReparees = removeProposedRepareesForPartialrepair(repairedItem, repairItem, proposedItems);
+                itemsToAdd.addAll((computeNonRepairedItems(repairedItem, repairItem, removedReparees)));
+                itemsToRemove.add(repairItem.getId());
+                itemsToRemove.add(repairItem.getLinkedItemId());
             }
         }
         final Iterator<InvoiceItem> iterator = existingItems.iterator();
@@ -402,23 +407,9 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
                 iterator.remove();
             }
         }
+        existingItems.addAll(itemsToAdd);
     }
 
-    /**
-     * A full repair is one when the whole period was repaired. we reconstruct all the adjustment + repair pointing to the repaired item
-     * and if the amount matches this is a full repair.
-     *
-     * @param repairedItem  the repaired item
-     * @param repairItem    the repair item
-     * @param existingItems the list of existing items
-     * @return true if this is a full repair.
-     */
-    private boolean isFullRepair(final InvoiceItem repairedItem, final InvoiceItem repairItem, final List<InvoiceItem> existingItems) {
-
-        final BigDecimal adjustedPositiveAmount = getAdjustedPositiveAmount(existingItems, repairedItem.getId());
-        final BigDecimal repairAndAdjustedPositiveAmount = repairItem.getAmount().negate().add(adjustedPositiveAmount);
-        return (repairedItem.getAmount().compareTo(repairAndAdjustedPositiveAmount) == 0);
-    }
 
     /**
      * Removes the reparee from proposed list of items if it exists.
@@ -426,7 +417,9 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
      * @param repairedItem  the repaired item
      * @param proposedItems the list of existing items
      */
-    protected void removeProposedRepareesForPartialrepair(final InvoiceItem repairedItem, final InvoiceItem repairItem, final List<InvoiceItem> proposedItems) {
+    protected List<InvoiceItem> removeProposedRepareesForPartialrepair(final InvoiceItem repairedItem, final InvoiceItem repairItem, final List<InvoiceItem> proposedItems) {
+
+        List<InvoiceItem> removedReparees = Collections.emptyList();
         final Iterator<InvoiceItem> it = proposedItems.iterator();
         while (it.hasNext()) {
             final InvoiceItem cur = it.next();
@@ -435,9 +428,14 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
             // - First we check if the current item is a reparee for that repaired
             // - Second we check whether that reparee is outside of the repair period and therefore has already been accounted for. If not we keep it.
             if (isRepareeItemForRepairedItem(repairedItem, cur) && !isRepareeIncludedInRepair(repairItem, repairedSubscriptionId, cur)) {
+                if (removedReparees.size() == 0) {
+                    removedReparees = Lists.newLinkedList();
+                }
+                removedReparees.add(cur);
                 it.remove();
             }
         }
+        return removedReparees;
     }
 
     private InvoiceItem getRepairedInvoiceItem(final UUID repairedInvoiceItemId, final List<InvoiceItem> existingItems) {
@@ -542,6 +540,71 @@ public class DefaultInvoiceGenerator implements InvoiceGenerator {
         return items;
     }
 
+    /**
+     *
+     * It compares the full period of the repairedItem with the list of repairees and repair
+     *
+     * @param repairedItem     the repair item
+     * @param repairItem       (one of) the repair item pointing to the repairedItem
+     * @param removedReparees  the reparees from propsoed list that were found matching that repairedItem
+     * @return
+     */
+    List<InvoiceItem> computeNonRepairedItems(final InvoiceItem repairedItem, final InvoiceItem repairItem, final List<InvoiceItem> removedReparees) {
+
+        final List<InvoiceItem> result = new LinkedList<InvoiceItem>();
+        if (removedReparees.size() == 0 || repairedItem.getInvoiceItemType() != InvoiceItemType.RECURRING) {
+            return result;
+        }
+
+        final List<InvoiceItem> repairAndReparees = new ArrayList<InvoiceItem>(removedReparees);
+        repairAndReparees.add(repairItem);
+
+        Collections.sort(repairAndReparees, new Comparator<InvoiceItem>() {
+            @Override
+            public int compare(final InvoiceItem o1, final InvoiceItem o2) {
+                return o1.getStartDate().compareTo(o2.getStartDate());
+            }
+        });
+
+        int nbTotalRepairedDays = Days.daysBetween(repairedItem.getStartDate(), repairedItem.getEndDate()).getDays();
+
+        LocalDate prevEnd = null;
+        final LocalDate startDate = repairedItem.getStartDate();
+        for (InvoiceItem cur : repairAndReparees) {
+            if (prevEnd == null) {
+                if (cur.getStartDate().compareTo(startDate) > 0) {
+                    result.add(createRecurringInvoiceItemForRepair(repairedItem.getStartDate(), cur.getStartDate(), repairedItem, nbTotalRepairedDays));
+                }
+            } else {
+                if (prevEnd.compareTo(cur.getStartDate()) < 0) {
+                    result.add(createRecurringInvoiceItemForRepair(prevEnd, cur.getStartDate(), repairedItem, nbTotalRepairedDays));
+                }
+            }
+            prevEnd = cur.getEndDate();
+        }
+
+        if (prevEnd.compareTo(repairedItem.getEndDate()) < 0) {
+            result.add(createRecurringInvoiceItemForRepair(prevEnd, repairedItem.getEndDate(), repairedItem, nbTotalRepairedDays));
+        }
+        return result;
+    }
+
+    private InvoiceItem createRecurringInvoiceItemForRepair(final LocalDate startDate, final LocalDate endDate, final InvoiceItem repairedItem, final int nbTotalRepairedDays) {
+        final BigDecimal amount = InvoiceDateUtils.calculateProrationBetweenDates(startDate, endDate, nbTotalRepairedDays).multiply(repairedItem.getRate());
+        return new RecurringInvoiceItem(repairedItem.getInvoiceId(),
+                                        repairedItem.getAccountId(),
+                                        repairedItem.getBundleId(),
+                                        repairedItem.getSubscriptionId(),
+                                        repairedItem.getPlanName(),
+                                        repairedItem.getPhaseName(),
+                                        startDate,
+                                        endDate,
+                                        amount,
+                                        repairedItem.getRate(),
+                                        repairedItem.getCurrency());
+
+    }
+
     private BillingMode instantiateBillingMode(final BillingModeType billingMode) {
         switch (billingMode) {
             case IN_ADVANCE:
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 6efe1e7..6bff9f7 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
@@ -103,9 +103,8 @@ public class InvoiceListener {
     @Subscribe
     public void handleBlockingStateTransition(final BlockingTransitionInternalEvent event) {
 
-        // We are only interested in unblockBilling transitions or blockBilling transitions when those are configured.
-        if (!event.isTransitionedToUnblockedBilling() &&
-            !(event.isTransitionedToBlockedBilling() && invoiceConfig.isTriggerInvoiceOnBlockingEvent())) {
+        // We are only interested in blockBilling or unblockBilling transitions.
+        if (!event.isTransitionedToUnblockedBilling() && !event.isTransitionedToBlockedBilling()) {
             return;
         }
 
diff --git a/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.java b/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.java
index 840d615..05dfa57 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/generator/TestDefaultInvoiceGenerator.java
@@ -101,11 +101,6 @@ public class TestDefaultInvoiceGenerator extends InvoiceTestSuiteNoDB {
             public boolean isEmailNotificationsEnabled() {
                 return false;
             }
-
-            @Override
-            public boolean isTriggerInvoiceOnBlockingEvent() {
-                return false;
-            }
         };
         this.generator = new DefaultInvoiceGenerator(clock, invoiceConfig);
     }

jaxrs/pom.xml 2(+1 -1)

diff --git a/jaxrs/pom.xml b/jaxrs/pom.xml
index 8304c93..0546ad0 100644
--- a/jaxrs/pom.xml
+++ b/jaxrs/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-jaxrs</artifactId>
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/CustomFieldJson.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/CustomFieldJson.java
index 637930c..93f7579 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/CustomFieldJson.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/CustomFieldJson.java
@@ -20,6 +20,7 @@ import java.util.List;
 
 import javax.annotation.Nullable;
 
+import com.ning.billing.ObjectType;
 import com.ning.billing.util.audit.AuditLog;
 import com.ning.billing.util.customfield.CustomField;
 
@@ -28,20 +29,41 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class CustomFieldJson extends JsonBase {
 
+    private final String customFieldId;
+    private final String objectId;
+    private final ObjectType objectType;
     private final String name;
     private final String value;
 
     @JsonCreator
-    public CustomFieldJson(@JsonProperty("name") @Nullable final String name,
+    public CustomFieldJson(@JsonProperty("customFieldId") final String customFieldId,
+                           @JsonProperty("objectId") final String objectId,
+                           @JsonProperty("objectType") final ObjectType objectType,
+                           @JsonProperty("name") @Nullable final String name,
                            @JsonProperty("value") @Nullable final String value,
                            @JsonProperty("auditLogs") @Nullable final List<AuditLogJson> auditLogs) {
         super(auditLogs);
+        this.customFieldId = customFieldId;
+        this.objectId = objectId;
+        this.objectType = objectType;
         this.name = name;
         this.value = value;
     }
 
     public CustomFieldJson(final CustomField input, @Nullable final List<AuditLog> auditLogs) {
-        this(input.getFieldName(), input.getFieldValue(), toAuditLogJson(auditLogs));
+        this(input.getId().toString(), input.getObjectId().toString(), input.getObjectType(), input.getFieldName(), input.getFieldValue(), toAuditLogJson(auditLogs));
+    }
+
+    public String getCustomFieldId() {
+        return customFieldId;
+    }
+
+    public String getObjectId() {
+        return objectId;
+    }
+
+    public ObjectType getObjectType() {
+        return objectType;
     }
 
     public String getName() {
@@ -55,7 +77,10 @@ public class CustomFieldJson extends JsonBase {
     @Override
     public String toString() {
         final StringBuilder sb = new StringBuilder("CustomFieldJson{");
-        sb.append("name='").append(name).append('\'');
+        sb.append("customFieldId='").append(customFieldId).append('\'');
+        sb.append(", objectId=").append(objectId);
+        sb.append(", objectType=").append(objectType);
+        sb.append(", name='").append(name).append('\'');
         sb.append(", value='").append(value).append('\'');
         sb.append('}');
         return sb.toString();
@@ -72,9 +97,18 @@ public class CustomFieldJson extends JsonBase {
 
         final CustomFieldJson that = (CustomFieldJson) o;
 
+        if (customFieldId != null ? !customFieldId.equals(that.customFieldId) : that.customFieldId != null) {
+            return false;
+        }
         if (name != null ? !name.equals(that.name) : that.name != null) {
             return false;
         }
+        if (objectId != null ? !objectId.equals(that.objectId) : that.objectId != null) {
+            return false;
+        }
+        if (objectType != that.objectType) {
+            return false;
+        }
         if (value != null ? !value.equals(that.value) : that.value != null) {
             return false;
         }
@@ -84,7 +118,10 @@ public class CustomFieldJson extends JsonBase {
 
     @Override
     public int hashCode() {
-        int result = name != null ? name.hashCode() : 0;
+        int result = customFieldId != null ? customFieldId.hashCode() : 0;
+        result = 31 * result + (objectId != null ? objectId.hashCode() : 0);
+        result = 31 * result + (objectType != null ? objectType.hashCode() : 0);
+        result = 31 * result + (name != null ? name.hashCode() : 0);
         result = 31 * result + (value != null ? value.hashCode() : 0);
         return result;
     }
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/SessionJson.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/SessionJson.java
new file mode 100644
index 0000000..1665430
--- /dev/null
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/SessionJson.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2010-2014 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.jaxrs.json;
+
+import org.apache.shiro.session.Session;
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class SessionJson {
+
+    private final String id;
+    private final DateTime startDate;
+    private final DateTime lastAccessDate;
+    private final Long timeout;
+    private final String host;
+
+    @JsonCreator
+    public SessionJson(@JsonProperty("id") final String id,
+                       @JsonProperty("startDate") final DateTime startDate,
+                       @JsonProperty("lastAccessDate") final DateTime lastAccessDate,
+                       @JsonProperty("timeout") final Long timeout,
+                       @JsonProperty("host") final String host) {
+        this.id = id;
+        this.startDate = startDate;
+        this.lastAccessDate = lastAccessDate;
+        this.timeout = timeout;
+        this.host = host;
+    }
+
+    public SessionJson(final Session session) {
+        this.id = session.getId() == null ? null : session.getId().toString();
+        this.startDate = session.getStartTimestamp() == null ? null : new DateTime(session.getStartTimestamp(), DateTimeZone.UTC);
+        this.lastAccessDate = session.getLastAccessTime() == null ? null : new DateTime(session.getLastAccessTime(), DateTimeZone.UTC);
+        this.timeout = session.getTimeout();
+        this.host = session.getHost();
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public DateTime getStartDate() {
+        return startDate;
+    }
+
+    public DateTime getLastAccessDate() {
+        return lastAccessDate;
+    }
+
+    public Long getTimeout() {
+        return timeout;
+    }
+
+    public String getHost() {
+        return host;
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder("SessionJson{");
+        sb.append("id='").append(id).append('\'');
+        sb.append(", startDate=").append(startDate);
+        sb.append(", lastAccessDate=").append(lastAccessDate);
+        sb.append(", timeout=").append(timeout);
+        sb.append(", host='").append(host).append('\'');
+        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 SessionJson that = (SessionJson) o;
+
+        if (host != null ? !host.equals(that.host) : that.host != null) {
+            return false;
+        }
+        if (id != null ? !id.equals(that.id) : that.id != null) {
+            return false;
+        }
+        if (lastAccessDate != null ? !lastAccessDate.equals(that.lastAccessDate) : that.lastAccessDate != null) {
+            return false;
+        }
+        if (startDate != null ? !startDate.equals(that.startDate) : that.startDate != null) {
+            return false;
+        }
+        if (timeout != null ? !timeout.equals(that.timeout) : that.timeout != null) {
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = id != null ? id.hashCode() : 0;
+        result = 31 * result + (startDate != null ? startDate.hashCode() : 0);
+        result = 31 * result + (lastAccessDate != null ? lastAccessDate.hashCode() : 0);
+        result = 31 * result + (timeout != null ? timeout.hashCode() : 0);
+        result = 31 * result + (host != null ? host.hashCode() : 0);
+        return result;
+    }
+}
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/SubjectJson.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/SubjectJson.java
new file mode 100644
index 0000000..d535d0a
--- /dev/null
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/SubjectJson.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2010-2014 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.jaxrs.json;
+
+import javax.annotation.Nullable;
+
+import org.apache.shiro.session.Session;
+import org.apache.shiro.subject.Subject;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+
+public class SubjectJson {
+
+    private final String principal;
+    private final Boolean isAuthenticated;
+    private final Boolean isRemembered;
+    private final SessionJson session;
+
+    @JsonCreator
+    public SubjectJson(@JsonProperty("principal") final String principal,
+                       @JsonProperty("isAuthenticated") final Boolean isAuthenticated,
+                       @JsonProperty("isRemembered") final Boolean isRemembered,
+                       @JsonProperty("session") @Nullable final SessionJson session) {
+        this.principal = principal;
+        this.isAuthenticated = isAuthenticated;
+        this.isRemembered = isRemembered;
+        this.session = session;
+    }
+
+    public SubjectJson(final Subject subject) {
+        this.principal = subject.getPrincipal() == null ? null : subject.getPrincipal().toString();
+        this.isAuthenticated = subject.isAuthenticated();
+        this.isRemembered = subject.isRemembered();
+        final Session subjectSession = subject.getSession(false);
+        this.session = subjectSession == null ? null : new SessionJson(subjectSession);
+    }
+
+    public String getPrincipal() {
+        return principal;
+    }
+
+    public Boolean getIsAuthenticated() {
+        return isAuthenticated;
+    }
+
+    public Boolean getIsRemembered() {
+        return isRemembered;
+    }
+
+    public SessionJson getSession() {
+        return session;
+    }
+
+    @Override
+    public String toString() {
+        final StringBuilder sb = new StringBuilder("SubjectJson{");
+        sb.append("principal='").append(principal).append('\'');
+        sb.append(", isAuthenticated=").append(isAuthenticated);
+        sb.append(", isRemembered=").append(isRemembered);
+        sb.append(", session=").append(session);
+        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 SubjectJson that = (SubjectJson) o;
+
+        if (isAuthenticated != null ? !isAuthenticated.equals(that.isAuthenticated) : that.isAuthenticated != null) {
+            return false;
+        }
+        if (isRemembered != null ? !isRemembered.equals(that.isRemembered) : that.isRemembered != null) {
+            return false;
+        }
+        if (principal != null ? !principal.equals(that.principal) : that.principal != null) {
+            return false;
+        }
+        if (session != null ? !session.equals(that.session) : that.session != null) {
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public int hashCode() {
+        int result = principal != null ? principal.hashCode() : 0;
+        result = 31 * result + (isAuthenticated != null ? isAuthenticated.hashCode() : 0);
+        result = 31 * result + (isRemembered != null ? isRemembered.hashCode() : 0);
+        result = 31 * result + (session != null ? session.hashCode() : 0);
+        return result;
+    }
+}
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/TagDefinitionJson.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/TagDefinitionJson.java
index b955b1b..a271369 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/json/TagDefinitionJson.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/json/TagDefinitionJson.java
@@ -21,6 +21,7 @@ import java.util.List;
 import javax.annotation.Nullable;
 
 import com.ning.billing.ObjectType;
+import com.ning.billing.util.audit.AuditLog;
 import com.ning.billing.util.tag.TagDefinition;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
@@ -42,7 +43,9 @@ public class TagDefinitionJson extends JsonBase {
                              @JsonProperty("isControlTag") final Boolean isControlTag,
                              @JsonProperty("name") final String name,
                              @JsonProperty("description") @Nullable final String description,
-                             @JsonProperty("applicableObjectTypes") @Nullable final List<String> applicableObjectTypes) {
+                             @JsonProperty("applicableObjectTypes") @Nullable final List<String> applicableObjectTypes,
+                             @JsonProperty("auditLogs") @Nullable final List<AuditLogJson> auditLogs) {
+        super(auditLogs);
         this.id = id;
         this.isControlTag = isControlTag;
         this.name = name;
@@ -50,18 +53,22 @@ public class TagDefinitionJson extends JsonBase {
         this.applicableObjectTypes = applicableObjectTypes;
     }
 
-    public TagDefinitionJson(final TagDefinition tagDefinition) {
-        this(tagDefinition.getId().toString(), tagDefinition.isControlTag(), tagDefinition.getName(),
-             tagDefinition.getDescription(), ImmutableList.<String>copyOf(Collections2.transform(tagDefinition.getApplicableObjectTypes(), new Function<ObjectType, String>() {
-            @Override
-            public String apply(@Nullable final ObjectType input) {
-                if (input == null) {
-                    return "";
-                } else {
-                    return input.toString();
-                }
-            }
-        })));
+    public TagDefinitionJson(final TagDefinition tagDefinition, @Nullable final List<AuditLog> auditLogs) {
+        this(tagDefinition.getId().toString(),
+             tagDefinition.isControlTag(),
+             tagDefinition.getName(),
+             tagDefinition.getDescription(),
+             ImmutableList.<String>copyOf(Collections2.transform(tagDefinition.getApplicableObjectTypes(), new Function<ObjectType, String>() {
+                 @Override
+                 public String apply(@Nullable final ObjectType input) {
+                     if (input == null) {
+                         return "";
+                     } else {
+                         return input.toString();
+                     }
+                 }
+             })),
+             toAuditLogJson(auditLogs));
     }
 
     public String getId() {
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 76973e1..f101a9c 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
@@ -185,7 +185,7 @@ public abstract class JaxRsResourceBase implements JaxrsResource {
         }
 
         customFieldUserApi.addCustomFields(input, context);
-        return uriBuilder.buildResponse(uriInfo, this.getClass(), "createCustomFields", null);
+        return uriBuilder.buildResponse(uriInfo, this.getClass(), "getCustomFields", id);
     }
 
     /**
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/SecurityResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/SecurityResource.java
index 133d632..db1934e 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/SecurityResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/SecurityResource.java
@@ -27,8 +27,12 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.subject.Subject;
+
 import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.clock.Clock;
+import com.ning.billing.jaxrs.json.SubjectJson;
 import com.ning.billing.jaxrs.util.Context;
 import com.ning.billing.jaxrs.util.JaxrsUriBuilder;
 import com.ning.billing.security.Permission;
@@ -66,10 +70,18 @@ public class SecurityResource extends JaxRsResourceBase {
     @GET
     @Path("/permissions")
     @Produces(APPLICATION_JSON)
-    public Response getCurrentUserPermissions(@javax.ws.rs.core.Context final HttpServletRequest request)  {
+    public Response getCurrentUserPermissions(@javax.ws.rs.core.Context final HttpServletRequest request) {
         final Set<Permission> permissions = securityApi.getCurrentUserPermissions(context.createContext(request));
         final List<String> json = ImmutableList.<String>copyOf(Iterables.<Permission, String>transform(permissions, Functions.toStringFunction()));
         return Response.status(Status.OK).entity(json).build();
     }
 
-}
+    @GET
+    @Path("/subject")
+    @Produces(APPLICATION_JSON)
+    public Response getCurrentUserSubject(@javax.ws.rs.core.Context final HttpServletRequest request) {
+        final Subject subject = SecurityUtils.getSubject();
+        final SubjectJson subjectJson = new SubjectJson(subject);
+        return Response.status(Status.OK).entity(subjectJson).build();
+    }
+}
\ No newline at end of file
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/TagDefinitionResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/TagDefinitionResource.java
index 8d29465..61e7349 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/TagDefinitionResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/TagDefinitionResource.java
@@ -16,6 +16,7 @@
 
 package com.ning.billing.jaxrs.resources;
 
+import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.UUID;
@@ -23,12 +24,14 @@ import java.util.UUID;
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DELETE;
+import javax.ws.rs.DefaultValue;
 import javax.ws.rs.GET;
 import javax.ws.rs.HeaderParam;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 import javax.ws.rs.core.UriInfo;
@@ -43,6 +46,8 @@ import com.ning.billing.util.api.AuditUserApi;
 import com.ning.billing.util.api.CustomFieldUserApi;
 import com.ning.billing.util.api.TagDefinitionApiException;
 import com.ning.billing.util.api.TagUserApi;
+import com.ning.billing.util.audit.AuditLog;
+import com.ning.billing.util.callcontext.TenantContext;
 import com.ning.billing.util.tag.TagDefinition;
 
 import com.google.common.base.Preconditions;
@@ -68,12 +73,15 @@ public class TagDefinitionResource extends JaxRsResourceBase {
 
     @GET
     @Produces(APPLICATION_JSON)
-    public Response getTagDefinitions(@javax.ws.rs.core.Context final HttpServletRequest request) {
-        final List<TagDefinition> tagDefinitions = tagUserApi.getTagDefinitions(context.createContext(request));
-
-        final List<TagDefinitionJson> result = new LinkedList<TagDefinitionJson>();
-        for (final TagDefinition cur : tagDefinitions) {
-            result.add(new TagDefinitionJson(cur));
+    public Response getTagDefinitions(@javax.ws.rs.core.Context final HttpServletRequest request,
+                                      @QueryParam(QUERY_AUDIT) @DefaultValue("NONE") final AuditMode auditMode) {
+        final TenantContext tenantContext = context.createContext(request);
+        final List<TagDefinition> tagDefinitions = tagUserApi.getTagDefinitions(tenantContext);
+
+        final Collection<TagDefinitionJson> result = new LinkedList<TagDefinitionJson>();
+        for (final TagDefinition tagDefinition : tagDefinitions) {
+            final List<AuditLog> auditLogs = auditUserApi.getAuditLogs(tagDefinition.getId(), ObjectType.TAG_DEFINITION, auditMode.getLevel(), tenantContext);
+            result.add(new TagDefinitionJson(tagDefinition, auditLogs));
         }
 
         return Response.status(Status.OK).entity(result).build();
@@ -83,9 +91,12 @@ public class TagDefinitionResource extends JaxRsResourceBase {
     @Path("/{tagDefinitionId:" + UUID_PATTERN + "}")
     @Produces(APPLICATION_JSON)
     public Response getTagDefinition(@PathParam("tagDefinitionId") final String tagDefId,
+                                     @QueryParam(QUERY_AUDIT) @DefaultValue("NONE") final AuditMode auditMode,
                                      @javax.ws.rs.core.Context final HttpServletRequest request) throws TagDefinitionApiException {
-        final TagDefinition tagDef = tagUserApi.getTagDefinition(UUID.fromString(tagDefId), context.createContext(request));
-        final TagDefinitionJson json = new TagDefinitionJson(tagDef);
+        final TenantContext tenantContext = context.createContext(request);
+        final TagDefinition tagDefinition = tagUserApi.getTagDefinition(UUID.fromString(tagDefId), tenantContext);
+        final List<AuditLog> auditLogs = auditUserApi.getAuditLogs(tagDefinition.getId(), ObjectType.TAG_DEFINITION, auditMode.getLevel(), tenantContext);
+        final TagDefinitionJson json = new TagDefinitionJson(tagDefinition, auditLogs);
         return Response.status(Status.OK).entity(json).build();
     }
 
diff --git a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestCustomFieldJson.java b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestCustomFieldJson.java
index 97e9b64..4f2d44f 100644
--- a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestCustomFieldJson.java
+++ b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestCustomFieldJson.java
@@ -21,15 +21,22 @@ import java.util.UUID;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
+import com.ning.billing.ObjectType;
 import com.ning.billing.jaxrs.JaxrsTestSuiteNoDB;
 
 public class TestCustomFieldJson extends JaxrsTestSuiteNoDB {
 
     @Test(groups = "fast")
     public void testJson() throws Exception {
+        final String customFieldId = UUID.randomUUID().toString();
+        final String objectId = UUID.randomUUID().toString();
+        final ObjectType objectType = ObjectType.INVOICE;
         final String name = UUID.randomUUID().toString();
         final String value = UUID.randomUUID().toString();
-        final CustomFieldJson customFieldJson = new CustomFieldJson(name, value, null);
+        final CustomFieldJson customFieldJson = new CustomFieldJson(customFieldId, objectId, objectType, name, value, null);
+        Assert.assertEquals(customFieldJson.getCustomFieldId(), customFieldId);
+        Assert.assertEquals(customFieldJson.getObjectId(), objectId);
+        Assert.assertEquals(customFieldJson.getObjectType(), objectType);
         Assert.assertEquals(customFieldJson.getName(), name);
         Assert.assertEquals(customFieldJson.getValue(), value);
         Assert.assertNull(customFieldJson.getAuditLogs());
diff --git a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestTagDefinitionJson.java b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestTagDefinitionJson.java
index 21e2cbc..0f937de 100644
--- a/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestTagDefinitionJson.java
+++ b/jaxrs/src/test/java/com/ning/billing/jaxrs/json/TestTagDefinitionJson.java
@@ -34,7 +34,7 @@ public class TestTagDefinitionJson extends JaxrsTestSuiteNoDB {
         final String name = UUID.randomUUID().toString();
         final String description = UUID.randomUUID().toString();
         final ImmutableList<String> applicableObjectTypes = ImmutableList.<String>of(UUID.randomUUID().toString());
-        final TagDefinitionJson tagDefinitionJson = new TagDefinitionJson(id, isControlTag, name, description, applicableObjectTypes);
+        final TagDefinitionJson tagDefinitionJson = new TagDefinitionJson(id, isControlTag, name, description, applicableObjectTypes, null);
         Assert.assertEquals(tagDefinitionJson.getId(), id);
         Assert.assertEquals(tagDefinitionJson.isControlTag(), isControlTag);
         Assert.assertEquals(tagDefinitionJson.getName(), name);

junction/pom.xml 2(+1 -1)

diff --git a/junction/pom.xml b/junction/pom.xml
index 0065f5c..e7bdb78 100644
--- a/junction/pom.xml
+++ b/junction/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-junction</artifactId>

NEWS 5(+4 -1)

diff --git a/NEWS b/NEWS
index c7dbbbe..c67a55e 100644
--- a/NEWS
+++ b/NEWS
@@ -2,7 +2,10 @@
     Implement bundles pagination and search APIs
     Implement invoices search API
     https://github.com/killbill/killbill/issues/154
-    Update killbill-oss-parent to 0.5.23
+    https://github.com/killbill/killbill/issues/156
+    https://github.com/killbill/killbill/issues/159
+    JAX-RS bugfixes
+    Update killbill-oss-parent to 0.5.24
 
 0.8.11
     [SECURITY] Fix SQL injection in search APIs

osgi/pom.xml 2(+1 -1)

diff --git a/osgi/pom.xml b/osgi/pom.xml
index aeb0ea8..6b1756e 100644
--- a/osgi/pom.xml
+++ b/osgi/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-osgi</artifactId>
diff --git a/osgi-bundles/bundles/jruby/pom.xml b/osgi-bundles/bundles/jruby/pom.xml
index 60094c2..957c91a 100644
--- a/osgi-bundles/bundles/jruby/pom.xml
+++ b/osgi-bundles/bundles/jruby/pom.xml
@@ -20,7 +20,7 @@
     <parent>
         <groupId>com.ning.billing</groupId>
         <artifactId>killbill-osgi-bundles</artifactId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-osgi-bundles-jruby</artifactId>
diff --git a/osgi-bundles/bundles/logger/pom.xml b/osgi-bundles/bundles/logger/pom.xml
index cdf2599..441bb1c 100644
--- a/osgi-bundles/bundles/logger/pom.xml
+++ b/osgi-bundles/bundles/logger/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill-osgi-bundles</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-osgi-bundles-logger</artifactId>
diff --git a/osgi-bundles/bundles/pom.xml b/osgi-bundles/bundles/pom.xml
index 80bae86..69eeb58 100644
--- a/osgi-bundles/bundles/pom.xml
+++ b/osgi-bundles/bundles/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill-osgi-all-bundles</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-osgi-bundles</artifactId>
diff --git a/osgi-bundles/bundles/webconsolebranding/pom.xml b/osgi-bundles/bundles/webconsolebranding/pom.xml
index 72a8cf7..5c47d1d 100644
--- a/osgi-bundles/bundles/webconsolebranding/pom.xml
+++ b/osgi-bundles/bundles/webconsolebranding/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill-osgi-bundles</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-osgi-bundles-webconsolebranding</artifactId>
diff --git a/osgi-bundles/defaultbundles/pom.xml b/osgi-bundles/defaultbundles/pom.xml
index 58872d4..31a7fea 100644
--- a/osgi-bundles/defaultbundles/pom.xml
+++ b/osgi-bundles/defaultbundles/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill-osgi-all-bundles</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-osgi-bundles-defaultbundles</artifactId>
diff --git a/osgi-bundles/libs/killbill/pom.xml b/osgi-bundles/libs/killbill/pom.xml
index 9cfec3d..408f602 100644
--- a/osgi-bundles/libs/killbill/pom.xml
+++ b/osgi-bundles/libs/killbill/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill-osgi-lib-bundles</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-osgi-bundles-lib-killbill</artifactId>
diff --git a/osgi-bundles/libs/pom.xml b/osgi-bundles/libs/pom.xml
index 14b0ef0..47a59f3 100644
--- a/osgi-bundles/libs/pom.xml
+++ b/osgi-bundles/libs/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill-osgi-all-bundles</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-osgi-lib-bundles</artifactId>
diff --git a/osgi-bundles/libs/slf4j-osgi/pom.xml b/osgi-bundles/libs/slf4j-osgi/pom.xml
index 0079622..8b5c791 100644
--- a/osgi-bundles/libs/slf4j-osgi/pom.xml
+++ b/osgi-bundles/libs/slf4j-osgi/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill-osgi-lib-bundles</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-osgi-bundles-lib-slf4j-osgi</artifactId>
diff --git a/osgi-bundles/pom.xml b/osgi-bundles/pom.xml
index 05d35e7..61e21bc 100644
--- a/osgi-bundles/pom.xml
+++ b/osgi-bundles/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-osgi-all-bundles</artifactId>
diff --git a/osgi-bundles/tests/beatrix/pom.xml b/osgi-bundles/tests/beatrix/pom.xml
index fe9cfc0..c3ff140 100644
--- a/osgi-bundles/tests/beatrix/pom.xml
+++ b/osgi-bundles/tests/beatrix/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill-osgi-test-bundles</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-osgi-bundles-test-beatrix</artifactId>
diff --git a/osgi-bundles/tests/payment/pom.xml b/osgi-bundles/tests/payment/pom.xml
index ae7dd7b..1f7446f 100644
--- a/osgi-bundles/tests/payment/pom.xml
+++ b/osgi-bundles/tests/payment/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill-osgi-test-bundles</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-osgi-bundles-test-payment</artifactId>
diff --git a/osgi-bundles/tests/pom.xml b/osgi-bundles/tests/pom.xml
index 78bdb05..76102b9 100644
--- a/osgi-bundles/tests/pom.xml
+++ b/osgi-bundles/tests/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill-osgi-all-bundles</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-osgi-test-bundles</artifactId>

overdue/pom.xml 2(+1 -1)

diff --git a/overdue/pom.xml b/overdue/pom.xml
index 09d35df..ecac0f7 100644
--- a/overdue/pom.xml
+++ b/overdue/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-overdue</artifactId>
diff --git a/overdue/src/main/java/com/ning/billing/overdue/applicator/OverdueStateApplicator.java b/overdue/src/main/java/com/ning/billing/overdue/applicator/OverdueStateApplicator.java
index 01ad416..00e18f0 100644
--- a/overdue/src/main/java/com/ning/billing/overdue/applicator/OverdueStateApplicator.java
+++ b/overdue/src/main/java/com/ning/billing/overdue/applicator/OverdueStateApplicator.java
@@ -61,6 +61,7 @@ import com.ning.billing.overdue.notification.OverdueCheckNotificationKey;
 import com.ning.billing.overdue.notification.OverdueCheckNotifier;
 import com.ning.billing.overdue.notification.OverduePoster;
 import com.ning.billing.tag.TagInternalApi;
+import com.ning.billing.util.api.TagApiException;
 import com.ning.billing.util.dao.NonEntityDao;
 import com.ning.billing.util.email.DefaultEmailSender;
 import com.ning.billing.util.email.EmailApiException;
@@ -156,6 +157,8 @@ public class OverdueStateApplicator {
 
             sendEmailIfRequired(billingState, account, nextOverdueState, context);
 
+            avoid_extra_credit_by_toggling_AUTO_INVOICE_OFF(account, previousOverdueState, nextOverdueState, context);
+
         } catch (OverdueApiException e) {
             if (e.getCode() != ErrorCode.OVERDUE_NO_REEVALUATION_INTERVAL.getCode()) {
                 throw new OverdueException(e);
@@ -169,16 +172,31 @@ public class OverdueStateApplicator {
         }
     }
 
-    public void clear(final Account overdueable, final OverdueState previousOverdueState, final OverdueState clearState, final InternalCallContext context) throws OverdueException {
+    private void avoid_extra_credit_by_toggling_AUTO_INVOICE_OFF(final Account account, final OverdueState previousOverdueState,
+                                                                 final OverdueState nextOverdueState, final InternalCallContext context) throws OverdueApiException {
+        if (isBlockBillingTransition(previousOverdueState, nextOverdueState)) {
+            set_AUTO_INVOICE_OFF_on_blockedBilling(account.getId(), context);
+        } else if (isUnblockBillingTransition(previousOverdueState, nextOverdueState)) {
+            remove_AUTO_INVOICE_OFF_on_clear(account.getId(), context);
+        }
+    }
+
+    public void clear(final Account account, final OverdueState previousOverdueState, final OverdueState clearState, final InternalCallContext context) throws OverdueException {
 
         log.debug("OverdueStateApplicator:clear : time = " + clock.getUTCNow() + ", previousState = " + previousOverdueState.getName());
 
-        storeNewState(overdueable, clearState, context);
+        storeNewState(account, clearState, context);
+
+        clearFutureNotification(account, context);
 
-        clearFutureNotification(overdueable, context);
+        try {
+            avoid_extra_credit_by_toggling_AUTO_INVOICE_OFF(account, previousOverdueState, clearState, context);
+        } catch (OverdueApiException e) {
+            throw new OverdueException(e);
+        }
 
         try {
-            bus.post(createOverdueEvent(overdueable, previousOverdueState.getName(), clearState.getName(), isBlockBillingTransition(previousOverdueState, clearState),
+            bus.post(createOverdueEvent(account, previousOverdueState.getName(), clearState.getName(), isBlockBillingTransition(previousOverdueState, clearState),
                                         isUnblockBillingTransition(previousOverdueState, clearState), context));
         } catch (Exception e) {
             log.error("Error posting overdue change event to bus", e);
@@ -207,6 +225,24 @@ public class OverdueStateApplicator {
         }
     }
 
+    private void set_AUTO_INVOICE_OFF_on_blockedBilling(final UUID accountId, final InternalCallContext context) throws OverdueApiException {
+        try {
+            tagApi.addTag(accountId, ObjectType.ACCOUNT, ControlTagType.AUTO_INVOICING_OFF.getId(), context);
+        } catch (TagApiException e) {
+            throw new OverdueApiException(e);
+        }
+    }
+
+    private void remove_AUTO_INVOICE_OFF_on_clear(final UUID accountId, final InternalCallContext context) throws OverdueApiException {
+        try {
+            tagApi.removeTag(accountId, ObjectType.ACCOUNT, ControlTagType.AUTO_INVOICING_OFF.getId(), context);
+        } catch (TagApiException e) {
+            if (e.getCode() != ErrorCode.TAG_DOES_NOT_EXIST.getCode()) {
+                throw new OverdueApiException(e);
+            }
+        }
+    }
+
     private boolean isBlockBillingTransition(final OverdueState prevOverdueState, final OverdueState nextOverdueState) {
         return !blockBilling(prevOverdueState) && blockBilling(nextOverdueState);
     }

payment/pom.xml 2(+1 -1)

diff --git a/payment/pom.xml b/payment/pom.xml
index af77090..7921f2f 100644
--- a/payment/pom.xml
+++ b/payment/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-payment</artifactId>
diff --git a/payment/src/main/resources/com/ning/billing/payment/dao/PaymentMethodSqlDao.sql.stg b/payment/src/main/resources/com/ning/billing/payment/dao/PaymentMethodSqlDao.sql.stg
index 1a55de0..1096c6a 100644
--- a/payment/src/main/resources/com/ning/billing/payment/dao/PaymentMethodSqlDao.sql.stg
+++ b/payment/src/main/resources/com/ning/billing/payment/dao/PaymentMethodSqlDao.sql.stg
@@ -42,9 +42,9 @@ where  id = :id
 unmarkPaymentMethodAsDeleted(id) ::= <<
 update <tableName()>
 set is_active = 1
-where  id = :id
 , updated_by = :updatedBy
 , updated_date = :createdDate
+where  id = :id
 <AND_CHECK_TENANT()>
 ;
 >>

pom.xml 4(+2 -2)

diff --git a/pom.xml b/pom.xml
index e5be8a7..12c3157 100644
--- a/pom.xml
+++ b/pom.xml
@@ -19,10 +19,10 @@
     <parent>
         <artifactId>killbill-oss-parent</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.5.23</version>
+        <version>0.5.24</version>
     </parent>
     <artifactId>killbill</artifactId>
-    <version>0.8.12-SNAPSHOT</version>
+    <version>0.8.13-SNAPSHOT</version>
     <packaging>pom</packaging>
     <name>killbill</name>
     <description>Library for managing recurring subscriptions and the associated billing</description>

server/pom.xml 2(+1 -1)

diff --git a/server/pom.xml b/server/pom.xml
index 53ecc5a..fe1b2c8 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-server</artifactId>
diff --git a/server/src/main/resources/update-checker/killbill-server-update-list.properties b/server/src/main/resources/update-checker/killbill-server-update-list.properties
index 3c963db..b9b7ceb 100644
--- a/server/src/main/resources/update-checker/killbill-server-update-list.properties
+++ b/server/src/main/resources/update-checker/killbill-server-update-list.properties
@@ -1,91 +1,96 @@
 ## Top level keys
 # general.notice = This notice should rarely, if ever, be used as everyone will see it
 
-## 0.8.11 -- latest release
-0.8.11.updates           =
-0.8.11.notices           = This is the latest GA release.
+## 0.8.12 -- latest release
+0.8.12.updates           =
+0.8.12.notices           = This is the latest GA release.
+0.8.12.release-notes     = http://kill-bill.org
+
+## 0.8.11
+0.8.11.updates           = 0.8.12
+0.8.11.notices           = We recommend upgrading to 0.8.12, our latest GA release.
 0.8.11.release-notes     = http://kill-bill.org
 
 ## 0.8.10
-0.8.10.updates           = 0.8.11
-0.8.10.notices           = We recommend upgrading to 0.8.11, our latest GA release.
+0.8.10.updates           = 0.8.12
+0.8.10.notices           = We recommend upgrading to 0.8.12, our latest GA release.
 0.8.10.release-notes     = http://kill-bill.org
 
 ## 0.8.9
-0.8.9.updates           = 0.8.11
-0.8.9.notices           = We recommend upgrading to 0.8.11, our latest GA release.
+0.8.9.updates           = 0.8.12
+0.8.9.notices           = We recommend upgrading to 0.8.12, our latest GA release.
 0.8.9.release-notes     = http://kill-bill.org
 
 ## 0.8.8
-0.8.8.updates           = 0.8.11
-0.8.8.notices           = We recommend upgrading to 0.8.11, our latest GA release.
+0.8.8.updates           = 0.8.12
+0.8.8.notices           = We recommend upgrading to 0.8.12, our latest GA release.
 0.8.8.release-notes     = http://kill-bill.org
 
 ## 0.8.7
-0.8.7.updates           = 0.8.11
-0.8.7.notices           = We recommend upgrading to 0.8.11, our latest GA release.
+0.8.7.updates           = 0.8.12
+0.8.7.notices           = We recommend upgrading to 0.8.12, our latest GA release.
 0.8.7.release-notes     = http://kill-bill.org
 
 ## 0.8.6
-0.8.6.updates           = 0.8.11
-0.8.6.notices           = We recommend upgrading to 0.8.11, our latest GA release.
+0.8.6.updates           = 0.8.12
+0.8.6.notices           = We recommend upgrading to 0.8.12, our latest GA release.
 0.8.6.release-notes     = http://kill-bill.org
 
 ## 0.8.5
-0.8.5.updates           = 0.8.11
-0.8.5.notices           = We recommend upgrading to 0.8.11, our latest GA release.
+0.8.5.updates           = 0.8.12
+0.8.5.notices           = We recommend upgrading to 0.8.12, our latest GA release.
 0.8.5.release-notes     = http://kill-bill.org
 
 ## 0.8.4
-0.8.4.updates           = 0.8.11
-0.8.4.notices           = We recommend upgrading to 0.8.11, our latest GA release.
+0.8.4.updates           = 0.8.12
+0.8.4.notices           = We recommend upgrading to 0.8.12, our latest GA release.
 0.8.4.release-notes     = http://kill-bill.org
 
 ## 0.8.3
-0.8.3.updates           = 0.8.11
-0.8.3.notices           = We recommend upgrading to 0.8.11, our latest GA release.
+0.8.3.updates           = 0.8.12
+0.8.3.notices           = We recommend upgrading to 0.8.12, our latest GA release.
 0.8.3.release-notes     = http://kill-bill.org
 
 ## 0.8.2
-0.8.2.updates           = 0.8.11
-0.8.2.notices           = We recommend upgrading to 0.8.11, our latest GA release.
+0.8.2.updates           = 0.8.12
+0.8.2.notices           = We recommend upgrading to 0.8.12, our latest GA release.
 0.8.2.release-notes     = http://kill-bill.org
 
 ## 0.8.1
-0.8.1.updates           = 0.8.11
-0.8.1.notices           = We recommend upgrading to 0.8.11, our latest GA release.
+0.8.1.updates           = 0.8.12
+0.8.1.notices           = We recommend upgrading to 0.8.12, our latest GA release.
 0.8.1.release-notes     = http://kill-bill.org
 
 ## 0.8.0
-0.8.0.updates           = 0.8.11
-0.8.0.notices           = We recommend upgrading to 0.8.11, our latest GA release.
+0.8.0.updates           = 0.8.12
+0.8.0.notices           = We recommend upgrading to 0.8.12, our latest GA release.
 0.8.0.release-notes     = http://kill-bill.org
 
 ### 0.7.x series ###
 
 ## 0.7.2
 0.7.2.updates           =
-0.7.2.notices           = We recommend upgrading to 0.8.11, our latest GA release.
+0.7.2.notices           = We recommend upgrading to 0.8.12, our latest GA release.
 0.7.2.release-notes     = http://kill-bill.org
 
 ## 0.7.1
 0.7.1.updates           = 0.7.2
-0.7.1.notices           = We recommend upgrading to 0.8.11, our latest GA release.
+0.7.1.notices           = We recommend upgrading to 0.8.12, our latest GA release.
 0.7.1.release-notes     = http://kill-bill.org
 
 ## 0.7.0
 0.7.0.updates           = 0.7.2
-0.7.0.notices           = We recommend upgrading to 0.8.11, our latest GA release.
+0.7.0.notices           = We recommend upgrading to 0.8.12, our latest GA release.
 0.7.0.release-notes     = http://kill-bill.org
 
 ### 0.6.x series ###
 
 ## 0.6.17
 0.6.17.updates           =
-0.6.17.notices           = We recommend upgrading to 0.8.11, our latest GA release.
+0.6.17.notices           = We recommend upgrading to 0.8.12, our latest GA release.
 0.6.17.release-notes     = http://kill-bill.org
 
 ## 0.6.16
 0.6.16.updates           = 0.6.17
-0.6.16.notices           = We recommend upgrading to 0.8.11, our latest GA release.
+0.6.16.notices           = We recommend upgrading to 0.8.12, our latest GA release.
 0.6.16.release-notes     = http://kill-bill.org
diff --git a/server/src/test/java/com/ning/billing/jaxrs/TestAccount.java b/server/src/test/java/com/ning/billing/jaxrs/TestAccount.java
index 6b08e3b..86e3346 100644
--- a/server/src/test/java/com/ning/billing/jaxrs/TestAccount.java
+++ b/server/src/test/java/com/ning/billing/jaxrs/TestAccount.java
@@ -27,6 +27,7 @@ import javax.annotation.Nullable;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
+import com.ning.billing.ObjectType;
 import com.ning.billing.client.KillBillClientException;
 import com.ning.billing.client.model.Account;
 import com.ning.billing.client.model.Accounts;
@@ -225,9 +226,9 @@ public class TestAccount extends TestJaxrsBase {
         assertNotNull(accountJson);
 
         final Collection<CustomField> customFields = new LinkedList<CustomField>();
-        customFields.add(new CustomField("1", "value1", null));
-        customFields.add(new CustomField("2", "value2", null));
-        customFields.add(new CustomField("3", "value3", null));
+        customFields.add(new CustomField(null, accountJson.getAccountId(), ObjectType.ACCOUNT, "1", "value1", null));
+        customFields.add(new CustomField(null, accountJson.getAccountId(), ObjectType.ACCOUNT, "2", "value2", null));
+        customFields.add(new CustomField(null, accountJson.getAccountId(), ObjectType.ACCOUNT, "3", "value3", null));
 
         killBillClient.createAccountCustomFields(accountJson.getAccountId(), customFields, createdBy, reason, comment);
 
diff --git a/subscription/pom.xml b/subscription/pom.xml
index bd9d7ae..0b9adfa 100644
--- a/subscription/pom.xml
+++ b/subscription/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-subscription</artifactId>

tenant/pom.xml 2(+1 -1)

diff --git a/tenant/pom.xml b/tenant/pom.xml
index 78f9795..cb6b190 100644
--- a/tenant/pom.xml
+++ b/tenant/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-tenant</artifactId>

usage/pom.xml 2(+1 -1)

diff --git a/usage/pom.xml b/usage/pom.xml
index 39ba106..127c132 100644
--- a/usage/pom.xml
+++ b/usage/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-usage</artifactId>

util/pom.xml 2(+1 -1)

diff --git a/util/pom.xml b/util/pom.xml
index 62c03e4..db3baf6 100644
--- a/util/pom.xml
+++ b/util/pom.xml
@@ -12,7 +12,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>com.ning.billing</groupId>
-        <version>0.8.12-SNAPSHOT</version>
+        <version>0.8.13-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-util</artifactId>
diff --git a/util/src/main/java/com/ning/billing/util/config/InvoiceConfig.java b/util/src/main/java/com/ning/billing/util/config/InvoiceConfig.java
index e4c978d..448cee8 100644
--- a/util/src/main/java/com/ning/billing/util/config/InvoiceConfig.java
+++ b/util/src/main/java/com/ning/billing/util/config/InvoiceConfig.java
@@ -32,9 +32,4 @@ public interface InvoiceConfig extends KillbillConfig {
     @Description("Whether to send email notifications on invoice creation (for configured accounts)")
     public boolean isEmailNotificationsEnabled();
 
-
-    @Config("killbill.invoice.triggerInvoiceOnBlockingEvent")
-    @Default("false")
-    @Description("Whether the invoice code regenerate a new invoice when a blocking event is received")
-    public boolean isTriggerInvoiceOnBlockingEvent();
 }