killbill-memoizeit

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 3(+3 -0)

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

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

pom.xml 2(+1 -1)

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

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

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

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

Details

diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
index 3e1dd16..1eb38a9 100644
--- a/.idea/inspectionProfiles/Project_Default.xml
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -16,15 +16,12 @@
       <option name="REPORT_VARIABLES" value="true" />
       <option name="REPORT_PARAMETERS" value="true" />
     </inspection_tool>
-    <inspection_tool class="LoggerInitializedWithForeignClass" enabled="false" level="WARNING" enabled_by_default="false">
-      <option name="loggerClassName" value="org.apache.log4j.Logger,org.slf4j.LoggerFactory,org.apache.commons.logging.LogFactory,java.util.logging.Logger" />
-      <option name="loggerFactoryMethodName" value="getLogger,getLogger,getLog,getLogger" />
-    </inspection_tool>
     <inspection_tool class="MissortedModifiers" enabled="true" level="WARNING" enabled_by_default="true">
       <option name="m_requireAnnotationsFirst" value="true" />
     </inspection_tool>
     <inspection_tool class="RedundantTypeArguments" enabled="false" level="WARNING" enabled_by_default="false" />
     <inspection_tool class="SizeReplaceableByIsEmpty" enabled="true" level="WARNING" enabled_by_default="true" />
+    <inspection_tool class="StaticPseudoFunctionalStyleMethod" enabled="false" level="WARNING" enabled_by_default="false" />
     <inspection_tool class="TryWithIdenticalCatches" enabled="false" level="WARNING" enabled_by_default="false" />
     <inspection_tool class="TypeMayBeWeakened" enabled="true" level="WARNING" enabled_by_default="true">
       <option name="useRighthandTypeAsWeakestTypeInAssignments" value="true" />

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

diff --git a/account/pom.xml b/account/pom.xml
index 9939f94..322704d 100644
--- a/account/pom.xml
+++ b/account/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.20.4-SNAPSHOT</version>
+        <version>0.20.5-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 4d207d8..9b5c838 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.20.4-SNAPSHOT</version>
+        <version>0.20.5-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-internal-api</artifactId>

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

diff --git a/beatrix/pom.xml b/beatrix/pom.xml
index 6f6cf8f..467ba89 100644
--- a/beatrix/pom.xml
+++ b/beatrix/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.20.4-SNAPSHOT</version>
+        <version>0.20.5-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-beatrix</artifactId>
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithBCDUpdate.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithBCDUpdate.java
index 52efaf9..e557041 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithBCDUpdate.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithBCDUpdate.java
@@ -27,6 +27,7 @@ import javax.inject.Inject;
 import org.joda.time.DateTime;
 import org.joda.time.LocalDate;
 import org.killbill.billing.account.api.Account;
+import org.killbill.billing.account.api.AccountData;
 import org.killbill.billing.api.TestApiListener.NextEvent;
 import org.killbill.billing.beatrix.util.InvoiceChecker.ExpectedInvoiceItemCheck;
 import org.killbill.billing.catalog.DefaultPlanPhasePriceOverride;
@@ -54,13 +55,13 @@ import com.google.common.collect.ImmutableList;
 
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
 
 public class TestWithBCDUpdate extends TestIntegrationBase {
 
     @Inject
     protected SubscriptionBaseInternalApi subscriptionBaseInternalApi;
 
-
     @Test(groups = "slow")
     public void testBCDChangeInTrial() throws Exception {
 
@@ -123,7 +124,6 @@ public class TestWithBCDUpdate extends TestIntegrationBase {
         assertEquals(subscription.getBillingEndDate().compareTo(new LocalDate(2016, 5, 15)), 0);
     }
 
-
     @Test(groups = "slow")
     public void testBCDChangeAfterTrialFollowOtherBCDChange() throws Exception {
 
@@ -203,7 +203,6 @@ public class TestWithBCDUpdate extends TestIntegrationBase {
 
     }
 
-
     @Test(groups = "slow")
     public void testBCDChangeBeforeChangePlan() throws Exception {
 
@@ -250,7 +249,6 @@ public class TestWithBCDUpdate extends TestIntegrationBase {
 
     }
 
-
     @Test(groups = "slow")
     public void testBCDChangeAfterChangePlan() throws Exception {
 
@@ -347,7 +345,6 @@ public class TestWithBCDUpdate extends TestIntegrationBase {
 
     }
 
-
     @Test(groups = "slow")
     public void testBCDChangeForAO() throws Exception {
 
@@ -494,7 +491,6 @@ public class TestWithBCDUpdate extends TestIntegrationBase {
         expectedInvoices.clear();
     }
 
-
     @Test(groups = "slow")
     public void testBCDChangeWithEffectiveDateFromInTheFuture() throws Exception {
 
@@ -741,8 +737,6 @@ public class TestWithBCDUpdate extends TestIntegrationBase {
                                     new ExpectedInvoiceItemCheck(new LocalDate(2016, 6, 15), new LocalDate(2016, 7, 15), InvoiceItemType.RECURRING, new BigDecimal("29.95")));
     }
 
-
-
     @Test(groups = "slow")
     public void testWithBCDOnOperations() throws Exception {
 
@@ -793,4 +787,72 @@ public class TestWithBCDUpdate extends TestIntegrationBase {
 
 
     }
+
+    @Test(groups = "slow")
+    public void testBCDChangeForConsumableInArrearPlan() throws Exception {
+        // We take april as it has 30 days (easier to play with BCD)
+        // Set clock to the initial start date - we implicitly assume here that the account timezone is UTC
+        clock.setDay(new LocalDate(2012, 4, 1));
+
+        final AccountData accountData = getAccountData(1);
+        final Account account = createAccountWithNonOsgiPaymentMethod(accountData);
+        accountChecker.checkAccount(account.getId(), accountData, callContext);
+
+        // Create BASE subscription
+        final DefaultEntitlement bpSubscription = createBaseEntitlementAndCheckForCompletion(account.getId(), "bundleKey", "Shotgun", ProductCategory.BASE, BillingPeriod.ANNUAL, NextEvent.CREATE, NextEvent.BLOCK, NextEvent.INVOICE);
+        // Check bundle after BP got created otherwise we get an error from auditApi.
+        subscriptionChecker.checkSubscriptionCreated(bpSubscription.getId(), internalCallContext);
+        invoiceChecker.checkInvoice(account.getId(), 1, callContext, new ExpectedInvoiceItemCheck(new LocalDate(2012, 4, 1), null, InvoiceItemType.FIXED, new BigDecimal("0")));
+        assertListenerStatus();
+
+        // Add ADD_ON on the same day
+        final DefaultEntitlement aoSubscription = addAOEntitlementAndCheckForCompletion(bpSubscription.getBundleId(), "Bullets", ProductCategory.ADD_ON, BillingPeriod.NO_BILLING_PERIOD, NextEvent.CREATE, NextEvent.BLOCK, NextEvent.NULL_INVOICE);
+        assertListenerStatus();
+        assertNull(bpSubscription.getSubscriptionBase().getChargedThroughDate());
+
+        // Record usage for first month
+        recordUsageData(aoSubscription.getId(), "bullets", new LocalDate(2012, 4, 5), 100L, callContext);
+        recordUsageData(aoSubscription.getId(), "bullets", new LocalDate(2012, 4, 15), 100L, callContext);
+
+        // 2012-05-01
+        busHandler.pushExpectedEvents(NextEvent.PHASE, NextEvent.NULL_INVOICE, NextEvent.INVOICE, NextEvent.PAYMENT, NextEvent.INVOICE_PAYMENT);
+        clock.addMonths(1);
+        assertListenerStatus();
+
+        invoiceChecker.checkInvoice(account.getId(), 2, callContext,
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 5, 1), new LocalDate(2013, 5, 1), InvoiceItemType.RECURRING, new BigDecimal("2399.95")),
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 4, 1), new LocalDate(2012, 5, 1), InvoiceItemType.USAGE, new BigDecimal("5.90")));
+
+        final DateTime bpExpectedCTD = new DateTime("2013-05-01T00:00:00.000Z");
+        assertEquals(subscriptionBaseInternalApiApi.getSubscriptionFromId(bpSubscription.getId(), internalCallContext).getChargedThroughDate().compareTo(bpExpectedCTD), 0);
+        DateTime aoExpectedCTD = new DateTime("2012-05-01T00:00:00.000Z");
+        assertEquals(subscriptionBaseInternalApiApi.getSubscriptionFromId(aoSubscription.getId(), internalCallContext).getChargedThroughDate().compareTo(aoExpectedCTD), 0);
+
+        // 2012-05-05
+        clock.addDays(4);
+        assertListenerStatus();
+
+        // Set BCD to be the 5
+        busHandler.pushExpectedEvents(NextEvent.BCD_CHANGE, NextEvent.INVOICE);
+        subscriptionBaseInternalApi.updateBCD(aoSubscription.getId(), 5, null, internalCallContext);
+        assertListenerStatus();
+
+        invoiceChecker.checkInvoice(account.getId(), 3, callContext,
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 5, 1), new LocalDate(2012, 5, 5), InvoiceItemType.USAGE, BigDecimal.ZERO));
+
+        // Record usage for second month
+        recordUsageData(aoSubscription.getId(), "bullets", new LocalDate(2012, 5, 5), 100L, callContext);
+        recordUsageData(aoSubscription.getId(), "bullets", new LocalDate(2012, 6, 4), 100L, callContext);
+
+        // 2012-06-05
+        busHandler.pushExpectedEvents(NextEvent.NULL_INVOICE, NextEvent.INVOICE, NextEvent.PAYMENT, NextEvent.INVOICE_PAYMENT);
+        clock.addMonths(1);
+        assertListenerStatus();
+
+        invoiceChecker.checkInvoice(account.getId(), 4, callContext,
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2012, 5, 5), new LocalDate(2012, 6, 5), InvoiceItemType.USAGE, new BigDecimal("5.90")));
+
+        aoExpectedCTD = new DateTime("2012-06-05T00:00:00.000Z");
+        assertEquals(subscriptionBaseInternalApiApi.getSubscriptionFromId(aoSubscription.getId(), internalCallContext).getChargedThroughDate().compareTo(aoExpectedCTD), 0);
+    }
 }
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithTaxItems.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithTaxItems.java
index 2710710..0a14679 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithTaxItems.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithTaxItems.java
@@ -251,6 +251,102 @@ public class TestWithTaxItems extends TestIntegrationBase {
     }
 
     @Test(groups = "slow")
+    public void testTaxRateStartAndEndDate() throws Exception {
+        // Set clock to the initial start date - we implicitly assume here that the account timezone is UTC
+        clock.setDay(new LocalDate(2017, 11, 15));
+
+        final AccountData accountData = getAccountData(null);
+        final Account account = createAccountWithNonOsgiPaymentMethod(accountData);
+        accountChecker.checkAccount(account.getId(), accountData, callContext);
+
+        // Create original subscription (Trial PHASE) -> $0 invoice.
+        final DefaultEntitlement bpSubscription = createBaseEntitlementAndCheckForCompletion(
+                account.getId(),
+                "bundleKey",
+                "Pistol",
+                ProductCategory.BASE,
+                BillingPeriod.MONTHLY,
+                NextEvent.CREATE,
+                NextEvent.BLOCK,
+                NextEvent.INVOICE
+                                                                                            );
+        invoiceChecker.checkInvoice(account.getId(), 1, callContext, new ExpectedInvoiceItemCheck(new LocalDate(2017, 11, 15), null, InvoiceItemType.FIXED, new BigDecimal("0")));
+        subscriptionChecker.checkSubscriptionCreated(bpSubscription.getId(), internalCallContext);
+
+        busHandler.pushExpectedEvents(NextEvent.INVOICE);
+        invoiceUserApi.insertCredit(account.getId(), new BigDecimal("100"), clock.getUTCToday(), account.getCurrency(), true, "VIP", null, null, callContext);
+        assertListenerStatus();
+
+        invoiceChecker.checkInvoice(account.getId(), 2, callContext,
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2017, 11, 15), new LocalDate(2017, 11, 15), InvoiceItemType.CBA_ADJ, new BigDecimal("100")),
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2017, 11, 15), new LocalDate(2017, 11, 15), InvoiceItemType.CREDIT_ADJ, new BigDecimal("-100")));
+
+
+        // Make sure TestInvoicePluginApi will return an additional TAX item
+        testInvoicePluginApi.addTaxItem(
+                new TaxInvoiceItem(
+                        UUID.randomUUID(),
+                        null,
+                        null,
+                        account.getId(),
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        new LocalDate(2017, 12, 15),
+                        new LocalDate(2017, 12, 31),
+                        "Tax Item 2017",
+                        BigDecimal.ONE,
+                        account.getCurrency(),
+                        null,
+                        null
+                )
+        );
+        testInvoicePluginApi.addTaxItem(
+                new TaxInvoiceItem(
+                        UUID.randomUUID(),
+                        null,
+                        null,
+                        account.getId(),
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        null,
+                        new LocalDate(2018, 1, 1),
+                        new LocalDate(2018, 1, 15),
+                        "Tax Item 2018",
+                        BigDecimal.TEN,
+                        account.getCurrency(),
+                        null,
+                        null
+                )
+        );
+
+        // Move to Evergreen PHASE to verify non-dry-run scenario
+        busHandler.pushExpectedEvents(NextEvent.PHASE, NextEvent.INVOICE);
+        clock.addDays(30);
+        assertListenerStatus();
+
+        invoiceChecker.checkInvoice(account.getId(), 3, callContext,
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2017, 12, 15), new LocalDate(2018, 1, 15), InvoiceItemType.RECURRING, new BigDecimal("29.95")),
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2017, 12, 15), new LocalDate(2017, 12, 31), InvoiceItemType.TAX, new BigDecimal("1.0")),
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2018, 1, 1), new LocalDate(2018, 1, 15), InvoiceItemType.TAX, new BigDecimal("10.0")),
+                                    new ExpectedInvoiceItemCheck(new LocalDate(2017, 12, 15), new LocalDate(2017, 12, 15), InvoiceItemType.CBA_ADJ, new BigDecimal("-40.95")));
+    }
+
+    @Test(groups = "slow")
     public void testUpdateTaxItems() throws Exception {
 
         clock.setDay(new LocalDate(2012, 4, 1));
@@ -315,7 +411,37 @@ public class TestWithTaxItems extends TestIntegrationBase {
         public List<InvoiceItem> getAdditionalInvoiceItems(final Invoice invoice, final boolean isDryRun, final Iterable<PluginProperty> pluginProperties, final CallContext callContext) {
             final List<InvoiceItem> result = new ArrayList<InvoiceItem>();
             for (final TaxInvoiceItem item : taxItems) {
-                result.add(new TaxInvoiceItem(item.getId(), invoice.getId(), invoice.getAccountId(), item.getBundleId(), "Tax Item", item.getStartDate(), item.getAmount(), invoice.getCurrency()));
+                final String description;
+                if (item.getDescription() != null) {
+                    description = item.getDescription();
+                } else {
+                    description = "Tax Item";
+                }
+
+                result.add(
+                        new TaxInvoiceItem(
+                                item.getId(),
+                                item.getCreatedDate(),
+                                invoice.getId(),
+                                invoice.getAccountId(),
+                                item.getBundleId(),
+                                item.getSubscriptionId(),
+                                item.getProductName(),
+                                item.getPlanName(),
+                                item.getPhaseName(),
+                                item.getUsageName(),
+                                item.getPrettyProductName(),
+                                item.getPrettyPlanName(),
+                                item.getPrettyPhaseName(),
+                                item.getPrettyUsageName(),
+                                item.getStartDate(),
+                                item.getEndDate(),
+                                description,
+                                item.getAmount(),
+                                invoice.getCurrency(),
+                                item.getLinkedItemId(),
+                                item.getItemDetails())
+                          );
             }
             return result;
         }

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

diff --git a/catalog/pom.xml b/catalog/pom.xml
index cba1319..f298df7 100644
--- a/catalog/pom.xml
+++ b/catalog/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.20.4-SNAPSHOT</version>
+        <version>0.20.5-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-catalog</artifactId>
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/caching/DefaultCatalogCache.java b/catalog/src/main/java/org/killbill/billing/catalog/caching/DefaultCatalogCache.java
index 02d5d9d..067bd95 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/caching/DefaultCatalogCache.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/caching/DefaultCatalogCache.java
@@ -18,6 +18,7 @@
 package org.killbill.billing.catalog.caching;
 
 import java.util.List;
+import java.util.Set;
 
 import javax.inject.Inject;
 
@@ -147,7 +148,8 @@ public class DefaultCatalogCache implements CatalogCache {
 
     private DefaultVersionedCatalog getCatalogFromPlugins(final InternalTenantContext internalTenantContext) throws CatalogApiException {
         final TenantContext tenantContext = internalCallContextFactory.createTenantContext(internalTenantContext);
-        for (final String service : pluginRegistry.getAllServices()) {
+        final Set<String> allServices = pluginRegistry.getAllServices();
+        for (final String service : allServices) {
             final CatalogPluginApi plugin = pluginRegistry.getServiceForName(service);
 
             //
@@ -158,9 +160,9 @@ public class DefaultCatalogCache implements CatalogCache {
             // (e.g deleted Plans...), then multiple versions must be returned.
             //
             final DateTime latestCatalogUpdatedDate = plugin.getLatestCatalogVersion(ImmutableList.<PluginProperty>of(), tenantContext);
-            // A null latestCatalogUpdatedDate by passing caching, by fetching full catalog from plugin below (compatibility mode with 0.18.x or non optimized plugin api mode)
-            //
-            if (latestCatalogUpdatedDate != null) {
+            // A null latestCatalogUpdatedDate bypasses caching, by fetching full catalog from plugin below (compatibility mode with 0.18.x or non optimized plugin api mode)
+            final boolean cacheable = latestCatalogUpdatedDate != null;
+            if (cacheable) {
                 final DefaultVersionedCatalog tenantCatalog = cacheController.get(internalTenantContext.getTenantRecordId(), cacheLoaderArgument);
                 if (tenantCatalog != null) {
                     initializeCatalog(tenantCatalog);
@@ -174,10 +176,19 @@ public class DefaultCatalogCache implements CatalogCache {
             final VersionedPluginCatalog pluginCatalog = plugin.getVersionedPluginCatalog(ImmutableList.<PluginProperty>of(), tenantContext);
             // First plugin that gets something (for that tenant) returns it
             if (pluginCatalog != null) {
-                logger.info("Returning catalog from plugin {} on tenant {} ", service, internalTenantContext.getTenantRecordId());
+                // The log entry is only interesting if there are multiple plugins
+                if (allServices.size() > 1) {
+                    logger.info("Returning catalog from plugin {} on tenant {} ", service, internalTenantContext.getTenantRecordId());
+                }
+
                 final DefaultVersionedCatalog resolvedPluginCatalog = versionedCatalogMapper.toVersionedCatalog(pluginCatalog, internalTenantContext);
+
+                // Always clear the cache for safety
                 cacheController.remove(internalTenantContext.getTenantRecordId());
-                cacheController.putIfAbsent(internalTenantContext.getTenantRecordId(), resolvedPluginCatalog);
+                if (cacheable) {
+                    cacheController.putIfAbsent(internalTenantContext.getTenantRecordId(), resolvedPluginCatalog);
+                }
+
                 return resolvedPluginCatalog;
             }
         }
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/DefaultPlan.java b/catalog/src/main/java/org/killbill/billing/catalog/DefaultPlan.java
index ad332e6..c898f14 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/DefaultPlan.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/DefaultPlan.java
@@ -247,7 +247,8 @@ public class DefaultPlan extends ValidatingConfig<StandaloneCatalog> implements 
                                            DefaultPlan.class, ""));
         }
 
-        if (recurringBillingMode == null) {
+        // Pure usage based plans would not have a recurringBillingMode
+        if (!BillingPeriod.NO_BILLING_PERIOD.equals(getRecurringBillingPeriod()) && recurringBillingMode == null) {
             errors.add(new ValidationError(String.format("Invalid recurring billingMode for plan '%s'", name), DefaultPlan.class, ""));
         }
 
diff --git a/catalog/src/main/java/org/killbill/billing/catalog/DefaultUnit.java b/catalog/src/main/java/org/killbill/billing/catalog/DefaultUnit.java
index 6bd7330..f2f7d67 100644
--- a/catalog/src/main/java/org/killbill/billing/catalog/DefaultUnit.java
+++ b/catalog/src/main/java/org/killbill/billing/catalog/DefaultUnit.java
@@ -106,12 +106,15 @@ public class DefaultUnit extends ValidatingConfig<StandaloneCatalog> implements 
     @Override
     public void writeExternal(final ObjectOutput out) throws IOException {
         out.writeUTF(name);
-        out.writeUTF(prettyName);
+        out.writeBoolean(prettyName != null);
+        if (prettyName != null) {
+            out.writeUTF(prettyName);
+        }
     }
 
     @Override
     public void readExternal(final ObjectInput in) throws IOException, ClassNotFoundException {
         this.name = in.readUTF();
-        this.prettyName = in.readUTF();
+        this.prettyName = in.readBoolean() ? in.readUTF() : null;
     }
 }

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

diff --git a/currency/pom.xml b/currency/pom.xml
index f4f35f6..8df8a92 100644
--- a/currency/pom.xml
+++ b/currency/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.20.4-SNAPSHOT</version>
+        <version>0.20.5-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-currency</artifactId>
diff --git a/entitlement/pom.xml b/entitlement/pom.xml
index 9bb4d31..3477637 100644
--- a/entitlement/pom.xml
+++ b/entitlement/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.20.4-SNAPSHOT</version>
+        <version>0.20.5-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 a272ad1..6bf9366 100644
--- a/invoice/pom.xml
+++ b/invoice/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.20.4-SNAPSHOT</version>
+        <version>0.20.5-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-invoice</artifactId>
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/model/InvoiceItemFactory.java b/invoice/src/main/java/org/killbill/billing/invoice/model/InvoiceItemFactory.java
index ea0beae..bfda274 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/model/InvoiceItemFactory.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/model/InvoiceItemFactory.java
@@ -110,7 +110,7 @@ public class InvoiceItemFactory {
                 item = new UsageInvoiceItem(id, createdDate, invoiceId, accountId, bundleId, subscriptionId, productName, planName, phaseName, usageName, prettyProductName, prettyPlanName, prettyPlanPhaseName, prettyUsageName, startDate, endDate, description, amount, rate, currency, quantity, itemDetails);
                 break;
             case TAX:
-                item = new TaxInvoiceItem(id, createdDate, invoiceId, accountId, bundleId, subscriptionId, productName, planName, phaseName, usageName, prettyProductName, prettyPlanName, prettyPlanPhaseName, prettyUsageName, startDate, description, amount, currency, linkedItemId, itemDetails);
+                item = new TaxInvoiceItem(id, createdDate, invoiceId, accountId, bundleId, subscriptionId, productName, planName, phaseName, usageName, prettyProductName, prettyPlanName, prettyPlanPhaseName, prettyUsageName, startDate, endDate, description, amount, currency, linkedItemId, itemDetails);
                 break;
             case PARENT_SUMMARY:
                 item = new ParentInvoiceItem(id, createdDate, invoiceId, accountId, childAccountId, amount, currency, description);
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/model/TaxInvoiceItem.java b/invoice/src/main/java/org/killbill/billing/invoice/model/TaxInvoiceItem.java
index 4d90d99..2757a30 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/model/TaxInvoiceItem.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/model/TaxInvoiceItem.java
@@ -37,14 +37,14 @@ public class TaxInvoiceItem extends InvoiceItemCatalogBase {
 
     public TaxInvoiceItem(final UUID id, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId,
                           @Nullable final String description, final LocalDate date, final BigDecimal amount, final Currency currency) {
-        this(id, null, invoiceId, accountId, bundleId, null, null, null, null, null, null, null, null, null, date, description, amount, currency, null, null);
+        this(id, null, invoiceId, accountId, bundleId, null, null, null, null, null, null, null, null, null, date, null, description, amount, currency, null, null);
     }
 
     public TaxInvoiceItem(final UUID id, @Nullable final DateTime createdDate, final UUID invoiceId, final UUID accountId, @Nullable final UUID bundleId,
                           @Nullable final UUID subscriptionId, @Nullable final String productName, @Nullable final String planName, @Nullable final String phaseName, @Nullable final String usageName,
                           @Nullable final String prettyProductName, @Nullable final String prettyPlanName, @Nullable final String prettyPhaseName, @Nullable final String prettyUsageName,
-                          final LocalDate date, @Nullable final String description, final BigDecimal amount, final Currency currency, @Nullable final UUID linkedItemId, @Nullable final String itemDetails) {
-        super(id, createdDate, invoiceId, accountId, bundleId, subscriptionId, description, productName, planName, phaseName, usageName, prettyProductName, prettyPlanName, prettyPhaseName, prettyUsageName, date, null, amount, null, currency, linkedItemId, null, itemDetails, InvoiceItemType.TAX);
+                          final LocalDate startDate, @Nullable final LocalDate endDate, @Nullable final String description, final BigDecimal amount, final Currency currency, @Nullable final UUID linkedItemId, @Nullable final String itemDetails) {
+        super(id, createdDate, invoiceId, accountId, bundleId, subscriptionId, description, productName, planName, phaseName, usageName, prettyProductName, prettyPlanName, prettyPhaseName, prettyUsageName, startDate, endDate, amount, null, currency, linkedItemId, null, itemDetails, InvoiceItemType.TAX);
     }
 
     @Override
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalUsageInArrear.java b/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalUsageInArrear.java
index b568323..47ea11f 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalUsageInArrear.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/usage/ContiguousIntervalUsageInArrear.java
@@ -135,23 +135,22 @@ public abstract class ContiguousIntervalUsageInArrear {
         }
         final LocalDate endDate = closedInterval ? internalTenantContext.toLocalDate(billingEvents.get(billingEvents.size() - 1).getEffectiveDate()) : targetDate;
 
-        final BillingIntervalDetail bid = new BillingIntervalDetail(startDate, endDate, targetDate, getBCD(), usage.getBillingPeriod(), usage.getBillingMode());
-
-        int numberOfPeriod = 0;
-        // First billingCycleDate prior startDate
-        LocalDate nextBillCycleDate = bid.getFutureBillingDateFor(numberOfPeriod);
         if (startDate.compareTo(rawUsageStartDate) >= 0) {
             transitionTimes.add(startDate);
         }
-        while (!nextBillCycleDate.isAfter(endDate)) {
-            if (nextBillCycleDate.isAfter(startDate)) {
-                if (nextBillCycleDate.compareTo(rawUsageStartDate) >= 0) {
-                    transitionTimes.add(nextBillCycleDate);
-                }
+
+        for (int i = 0; i < billingEvents.size(); i++) {
+            final BillingEvent billingEvent = billingEvents.get(i);
+            final LocalDate transitionStartDate = internalTenantContext.toLocalDate(billingEvent.getEffectiveDate());
+            if (i == billingEvents.size() - 1) {
+                addTransitionTimesForBillingEvent(transitionStartDate, endDate, billingEvent.getBillCycleDayLocal());
+            } else {
+                final BillingEvent nextBillingEvent = billingEvents.get(i + 1);
+                final LocalDate nextEndDate = internalTenantContext.toLocalDate(nextBillingEvent.getEffectiveDate());
+                addTransitionTimesForBillingEvent(transitionStartDate, nextEndDate, billingEvent.getBillCycleDayLocal());
             }
-            numberOfPeriod++;
-            nextBillCycleDate = bid.getFutureBillingDateFor(numberOfPeriod);
         }
+
         if (closedInterval &&
             transitionTimes.size() > 0 &&
             endDate.isAfter(transitionTimes.get(transitionTimes.size() - 1))) {
@@ -161,6 +160,23 @@ public abstract class ContiguousIntervalUsageInArrear {
         return this;
     }
 
+    private void addTransitionTimesForBillingEvent(final LocalDate startDate, final LocalDate endDate, final int bcd) {
+        final BillingIntervalDetail bid = new BillingIntervalDetail(startDate, endDate, targetDate, bcd, usage.getBillingPeriod(), usage.getBillingMode());
+
+        int numberOfPeriod = 0;
+        // First billingCycleDate prior startDate
+        LocalDate nextBillCycleDate = bid.getFutureBillingDateFor(numberOfPeriod);
+        while (!nextBillCycleDate.isAfter(endDate)) {
+            if (transitionTimes.isEmpty() || nextBillCycleDate.isAfter(transitionTimes.get(transitionTimes.size() - 1))) {
+                if (nextBillCycleDate.compareTo(rawUsageStartDate) >= 0) {
+                    transitionTimes.add(nextBillCycleDate);
+                }
+            }
+            numberOfPeriod++;
+            nextBillCycleDate = bid.getFutureBillingDateFor(numberOfPeriod);
+        }
+    }
+
     /**
      * Compute the missing usage invoice items based on what should be billed and what has been billed ($ amount comparison).
      *
@@ -440,10 +456,6 @@ public abstract class ContiguousIntervalUsageInArrear {
         return usage;
     }
 
-    public int getBCD() {
-        return billingEvents.get(0).getBillCycleDayLocal();
-    }
-
     public UUID getBundleId() {
         return billingEvents.get(0).getSubscription().getBundleId();
     }
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/usage/SubscriptionUsageInArrear.java b/invoice/src/main/java/org/killbill/billing/invoice/usage/SubscriptionUsageInArrear.java
index b006668..a9b11f3 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/usage/SubscriptionUsageInArrear.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/usage/SubscriptionUsageInArrear.java
@@ -140,9 +140,6 @@ public class SubscriptionUsageInArrear {
         final Set<UsageKey> allSeenUsage = new HashSet<UsageKey>();
 
         for (final BillingEvent event : subscriptionBillingEvents) {
-
-
-
             // Extract all in arrear /consumable usage section for that billing event.
             final List<Usage> usages = findUsageInArrearUsages(event);
             allSeenUsage.addAll(Collections2.transform(usages, new Function<Usage, UsageKey>() {
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceItemDao.java b/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceItemDao.java
index 9dff772..4174435 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceItemDao.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceItemDao.java
@@ -23,6 +23,7 @@ import java.util.List;
 import java.util.UUID;
 
 import org.joda.time.LocalDate;
+import org.killbill.billing.invoice.model.TaxInvoiceItem;
 import org.testng.Assert;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
@@ -199,6 +200,22 @@ public class TestInvoiceItemDao extends InvoiceTestSuiteWithEmbeddedDB {
     }
 
     @Test(groups = "slow")
+    public void testTaxInvoiceSqlDao() throws Exception {
+        final UUID invoiceId = UUID.randomUUID();
+        final UUID accountId = account.getId();
+        final UUID bundleId = UUID.randomUUID();
+        final UUID linkedItemId = UUID.randomUUID();
+        final String description = UUID.randomUUID().toString();
+        final LocalDate startDate = new LocalDate(2012, 4, 1);
+        final LocalDate endDate = new LocalDate(2012, 5, 1);
+        final InvoiceItem taxInvoiceItem = new TaxInvoiceItem(UUID.randomUUID(), null, invoiceId, accountId, bundleId, null, null, null, null, null, null, null, null, null, startDate, endDate, description, TEN, Currency.USD, linkedItemId, null);
+        invoiceUtil.createInvoiceItem(taxInvoiceItem, context);
+
+        final InvoiceItemModelDao savedItem = invoiceUtil.getInvoiceItemById(taxInvoiceItem.getId(), context);
+        assertSameInvoiceItem(taxInvoiceItem, savedItem);
+    }
+
+    @Test(groups = "slow")
     public void testExternalChargeForVariousCurrenciesInvoiceSqlDao() throws Exception {
         // 0 decimal place
         createAndVerifyExternalCharge(new BigDecimal("10"), Currency.VND);
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/usage/TestContiguousIntervalUsageInArrear.java b/invoice/src/test/java/org/killbill/billing/invoice/usage/TestContiguousIntervalUsageInArrear.java
new file mode 100644
index 0000000..326e3c6
--- /dev/null
+++ b/invoice/src/test/java/org/killbill/billing/invoice/usage/TestContiguousIntervalUsageInArrear.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
+ *
+ * The Billing Project 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 org.killbill.billing.invoice.usage;
+
+import java.math.BigDecimal;
+import java.util.Collections;
+
+import org.joda.time.DateTimeZone;
+import org.joda.time.LocalDate;
+import org.killbill.billing.catalog.DefaultTier;
+import org.killbill.billing.catalog.DefaultTieredBlock;
+import org.killbill.billing.catalog.DefaultUsage;
+import org.killbill.billing.catalog.api.BillingPeriod;
+import org.killbill.billing.catalog.api.TierBlockPolicy;
+import org.killbill.billing.catalog.api.Usage;
+import org.killbill.billing.junction.BillingEvent;
+import org.killbill.billing.usage.RawUsage;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableList;
+
+public class TestContiguousIntervalUsageInArrear extends TestUsageInArrearBase {
+
+    @Test(groups = "fast")
+    public void testVerifyTransitionTimes() {
+        final DefaultTieredBlock block = createDefaultTieredBlock("unit", 100, 1000, BigDecimal.ONE);
+        final DefaultTier tier = createDefaultTierWithBlocks(block);
+        final DefaultUsage usage = createConsumableInArrearUsage(usageName, BillingPeriod.MONTHLY, TierBlockPolicy.ALL_TIERS, tier);
+
+        final LocalDate targetDate = new LocalDate(2019, 3, 10);
+
+        final BillingEvent billingEvent1 = createMockBillingEvent(1,
+                                                                  new LocalDate(2019, 1, 1).toDateTimeAtStartOfDay(DateTimeZone.UTC),
+                                                                  BillingPeriod.MONTHLY,
+                                                                  Collections.<Usage>emptyList());
+        final BillingEvent billingEvent2 = createMockBillingEvent(1,
+                                                                  new LocalDate(2019, 1, 31).toDateTimeAtStartOfDay(DateTimeZone.UTC),
+                                                                  BillingPeriod.MONTHLY,
+                                                                  Collections.<Usage>emptyList());
+        final BillingEvent billingEvent3 = createMockBillingEvent(5,
+                                                                  new LocalDate(2019, 2, 5).toDateTimeAtStartOfDay(DateTimeZone.UTC),
+                                                                  BillingPeriod.MONTHLY,
+                                                                  Collections.<Usage>emptyList());
+        final BillingEvent billingEvent4 = createMockBillingEvent(10,
+                                                                  new LocalDate(2019, 3, 10).toDateTimeAtStartOfDay(DateTimeZone.UTC),
+                                                                  BillingPeriod.MONTHLY,
+                                                                  Collections.<Usage>emptyList());
+        final ContiguousIntervalConsumableUsageInArrear intervalConsumableInArrear = createContiguousIntervalConsumableInArrear(usage,
+                                                                                                                                ImmutableList.<RawUsage>of(),
+                                                                                                                                targetDate,
+                                                                                                                                false,
+                                                                                                                                billingEvent1,
+                                                                                                                                billingEvent2,
+                                                                                                                                billingEvent3,
+                                                                                                                                billingEvent4);
+
+        Assert.assertEquals(intervalConsumableInArrear.getTransitionTimes().size(), 5);
+        Assert.assertEquals(intervalConsumableInArrear.getTransitionTimes().get(0), new LocalDate(2019, 1, 1));
+        Assert.assertEquals(intervalConsumableInArrear.getTransitionTimes().get(1), new LocalDate(2019, 2, 1));
+        Assert.assertEquals(intervalConsumableInArrear.getTransitionTimes().get(2), new LocalDate(2019, 2, 5));
+        Assert.assertEquals(intervalConsumableInArrear.getTransitionTimes().get(3), new LocalDate(2019, 3, 5));
+        Assert.assertEquals(intervalConsumableInArrear.getTransitionTimes().get(4), new LocalDate(2019, 3, 10));
+    }
+}
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/usage/TestUsageInArrearBase.java b/invoice/src/test/java/org/killbill/billing/invoice/usage/TestUsageInArrearBase.java
index 3bccb32..5daaec1 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/usage/TestUsageInArrearBase.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/usage/TestUsageInArrearBase.java
@@ -1,6 +1,6 @@
 /*
- * Copyright 2014-2017 Groupon, Inc
- * Copyright 2014-2017 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project 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
@@ -178,9 +178,13 @@ public abstract class TestUsageInArrearBase extends InvoiceTestSuiteNoDB {
     }
 
     protected BillingEvent createMockBillingEvent(final DateTime effectiveDate, final BillingPeriod billingPeriod, final List<Usage> usages) {
+        return createMockBillingEvent(BCD, effectiveDate, billingPeriod, usages);
+    }
+
+    protected BillingEvent createMockBillingEvent(final int bcd, final DateTime effectiveDate, final BillingPeriod billingPeriod, final List<Usage> usages) {
         final BillingEvent result = Mockito.mock(BillingEvent.class);
         Mockito.when(result.getCurrency()).thenReturn(Currency.BTC);
-        Mockito.when(result.getBillCycleDayLocal()).thenReturn(BCD);
+        Mockito.when(result.getBillCycleDayLocal()).thenReturn(bcd);
         Mockito.when(result.getEffectiveDate()).thenReturn(effectiveDate);
         Mockito.when(result.getBillingPeriod()).thenReturn(billingPeriod);
 

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

diff --git a/jaxrs/pom.xml b/jaxrs/pom.xml
index 96f978b..bdf9cf5 100644
--- a/jaxrs/pom.xml
+++ b/jaxrs/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.20.4-SNAPSHOT</version>
+        <version>0.20.5-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-jaxrs</artifactId>
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/mappers/RuntimeExceptionMapper.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/mappers/RuntimeExceptionMapper.java
index 5117e1f..f8cbbaa 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/mappers/RuntimeExceptionMapper.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/mappers/RuntimeExceptionMapper.java
@@ -1,7 +1,9 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
- * Ning licenses this file to you under the Apache License, version 2.0
+ * The Billing Project 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:
  *
@@ -42,9 +44,7 @@ public class RuntimeExceptionMapper extends ExceptionMapperBase implements Excep
     @Override
     public Response toResponse(final RuntimeException exception) {
         if (exception instanceof NullPointerException) {
-            // Assume bad payload
-            exception.printStackTrace();
-            log.warn("Exception : " + exception.getMessage());
+            log.warn("Unexpected NullPointerException", exception);
             return buildBadRequestResponse(exception, uriInfo);
         } else if (exception instanceof WebApplicationException) {
             // e.g. com.sun.jersey.api.NotFoundException

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

diff --git a/junction/pom.xml b/junction/pom.xml
index 9a7b41b..913338f 100644
--- a/junction/pom.xml
+++ b/junction/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.20.4-SNAPSHOT</version>
+        <version>0.20.5-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-junction</artifactId>

NEWS 3(+3 -0)

diff --git a/NEWS b/NEWS
index 4415ad7..17bb229 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,6 @@
+0.20.4
+    https://github.com/killbill/killbill/releases/tag/killbill-0.20.4
+
 0.20.3
     https://github.com/killbill/killbill/releases/tag/killbill-0.20.3
 

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

diff --git a/overdue/pom.xml b/overdue/pom.xml
index a8f7184..7e33fa3 100644
--- a/overdue/pom.xml
+++ b/overdue/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.20.4-SNAPSHOT</version>
+        <version>0.20.5-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-overdue</artifactId>

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

diff --git a/payment/pom.xml b/payment/pom.xml
index 9b357bb..89df62a 100644
--- a/payment/pom.xml
+++ b/payment/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.20.4-SNAPSHOT</version>
+        <version>0.20.5-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-payment</artifactId>

pom.xml 2(+1 -1)

diff --git a/pom.xml b/pom.xml
index b6630de..85f9cc4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -24,7 +24,7 @@
         <version>0.142.7</version>
     </parent>
     <artifactId>killbill</artifactId>
-    <version>0.20.4-SNAPSHOT</version>
+    <version>0.20.5-SNAPSHOT</version>
     <packaging>pom</packaging>
     <name>killbill</name>
     <description>Library for managing recurring subscriptions and the associated billing</description>
diff --git a/profiles/killbill/pom.xml b/profiles/killbill/pom.xml
index 5d9bd60..bbb20e0 100644
--- a/profiles/killbill/pom.xml
+++ b/profiles/killbill/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <artifactId>killbill-profiles</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.20.4-SNAPSHOT</version>
+        <version>0.20.5-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-profiles-killbill</artifactId>
diff --git a/profiles/killbill/src/main/resources/update-checker/killbill-server-update-list.properties b/profiles/killbill/src/main/resources/update-checker/killbill-server-update-list.properties
index abbeecd..305593d 100644
--- a/profiles/killbill/src/main/resources/update-checker/killbill-server-update-list.properties
+++ b/profiles/killbill/src/main/resources/update-checker/killbill-server-update-list.properties
@@ -1,128 +1,160 @@
 ## Top level keys
 # general.notice = This notice should rarely, if ever, be used as everyone will see it
 
+### 0.20.x series ###
+
+# 0.20.4
+0.20.4.updates           =
+0.20.4.notices           = This is the latest GA release.
+0.20.4.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.20.4
+
+# 0.20.3
+0.20.3.updates           = 0.20.4
+0.20.3.notices           = We recommend upgrading to 0.20.4, our latest GA release.
+0.20.3.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.20.3
+
+# 0.20.2
+0.20.2.updates           = 0.20.4
+0.20.2.notices           = We recommend upgrading to 0.20.4, our latest GA release.
+0.20.2.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.20.2
+
+# 0.20.1
+0.20.1.updates           = 0.20.4
+0.20.1.notices           = We recommend upgrading to 0.20.4, our latest GA release.
+0.20.1.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.20.1
+
+# 0.20.0
+0.20.0.updates           = 0.20.4
+0.20.0.notices           = We recommend upgrading to 0.20.4, our latest GA release.
+0.20.0.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.20.0
+
 ### 0.19.x series ###
 
+# 0.19.19
+0.19.19.updates           =
+0.19.19.notices           = This is the latest dev release.
+0.19.19.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.19
+
 # 0.19.18
-0.19.18.updates           =
-0.19.18.notices           = This is the latest dev release.
+0.19.18.updates           = 0.19.19
+0.19.18.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.18.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.18
 
 # 0.19.17
-0.19.17.updates           = 0.19.18
-0.19.17.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.17.updates           = 0.19.19
+0.19.17.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.17.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.17
 
 # 0.19.16
-0.19.16.updates           = 0.19.18
-0.19.16.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.16.updates           = 0.19.19
+0.19.16.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.16.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.16
 
 # 0.19.15
-0.19.15.updates           = 0.19.18
-0.19.15.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.15.updates           = 0.19.19
+0.19.15.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.15.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.15
 
 # 0.19.14
-0.19.14.updates           = 0.19.18
-0.19.14.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.14.updates           = 0.19.19
+0.19.14.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.14.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.14
 
 # 0.19.13
-0.19.13.updates           = 0.19.18
-0.19.13.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.13.updates           = 0.19.19
+0.19.13.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.13.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.13
 
 # 0.19.12
-0.19.12.updates           = 0.19.18
-0.19.12.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.12.updates           = 0.19.19
+0.19.12.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.12.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.12
 
 # 0.19.11
-0.19.11.updates           = 0.19.18
-0.19.11.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.11.updates           = 0.19.19
+0.19.11.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.11.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.11
 
 # 0.19.10
-0.19.10.updates           = 0.19.18
-0.19.10.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.10.updates           = 0.19.19
+0.19.10.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.10.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.10
 
 # 0.19.9
-0.19.9.updates           = 0.19.18
-0.19.9.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.9.updates           = 0.19.19
+0.19.9.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.9.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.9
 
 # 0.19.8
-0.19.8.updates           = 0.19.18
-0.19.8.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.8.updates           = 0.19.19
+0.19.8.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.8.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.8
 
 # 0.19.7
-0.19.7.updates           = 0.19.18
-0.19.7.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.7.updates           = 0.19.19
+0.19.7.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.7.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.7
 
 # 0.19.6
-0.19.6.updates           = 0.19.18
-0.19.6.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.6.updates           = 0.19.19
+0.19.6.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.6.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.6
 
 # 0.19.5
-0.19.5.updates           = 0.19.18
-0.19.5.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.5.updates           = 0.19.19
+0.19.5.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.5.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.5
 
 # 0.19.4
-0.19.4.updates           = 0.19.18
-0.19.4.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.4.updates           = 0.19.19
+0.19.4.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.4.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.4
 
 # 0.19.3
-0.19.3.updates           = 0.19.18
-0.19.3.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.3.updates           = 0.19.19
+0.19.3.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.3.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.3
 
 # 0.19.2
-0.19.2.updates           = 0.19.18
-0.19.2.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.2.updates           = 0.19.19
+0.19.2.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.2.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.2
 
 # 0.19.1
-0.19.1.updates           = 0.19.18
-0.19.1.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.1.updates           = 0.19.19
+0.19.1.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.1.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.1
 
 # 0.19.0
-0.19.0.updates           = 0.19.18
-0.19.0.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.0.updates           = 0.19.19
+0.19.0.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.0.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.0
 
 ### 0.18.x series ###
 
 # 0.18.22
 0.18.22.updates           =
-0.18.22.notices           = This is the latest GA release.
+0.18.22.notices           = We recommend upgrading to 0.20.4, our latest GA release.
 0.18.22.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.18.22
 
 # 0.18.21
 0.18.21.updates           = 0.18.22
-0.18.21.notices           = We recommend upgrading to 0.18.22, our latest GA release.
+0.18.21.notices           = We recommend upgrading to 0.20.4, our latest GA release.
 0.18.21.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.18.21
 
 # 0.18.20
 0.18.20.updates           = 0.18.22
-0.18.20.notices           = We recommend upgrading to 0.18.22, our latest GA release.
+0.18.20.notices           = We recommend upgrading to 0.20.4, our latest GA release.
 0.18.20.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.18.20
 
 # 0.18.19
 0.18.19.updates           = 0.18.22
-0.18.19.notices           = We recommend upgrading to 0.18.22, our latest GA release.
+0.18.19.notices           = We recommend upgrading to 0.20.4, our latest GA release.
 0.18.19.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.18.19
 
 # 0.18.18
 0.18.18.updates           = 0.18.22
-0.18.18.notices           = We recommend upgrading to 0.18.22, our latest GA release.
+0.18.18.notices           = We recommend upgrading to 0.20.4, our latest GA release.
 0.18.18.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.18.18
 
 # 0.18.17
diff --git a/profiles/killpay/pom.xml b/profiles/killpay/pom.xml
index ff07543..d4359cd 100644
--- a/profiles/killpay/pom.xml
+++ b/profiles/killpay/pom.xml
@@ -20,7 +20,7 @@
     <parent>
         <artifactId>killbill-profiles</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.20.4-SNAPSHOT</version>
+        <version>0.20.5-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-profiles-killpay</artifactId>
diff --git a/profiles/killpay/src/main/resources/update-checker/killbill-server-update-list.properties b/profiles/killpay/src/main/resources/update-checker/killbill-server-update-list.properties
index abbeecd..305593d 100644
--- a/profiles/killpay/src/main/resources/update-checker/killbill-server-update-list.properties
+++ b/profiles/killpay/src/main/resources/update-checker/killbill-server-update-list.properties
@@ -1,128 +1,160 @@
 ## Top level keys
 # general.notice = This notice should rarely, if ever, be used as everyone will see it
 
+### 0.20.x series ###
+
+# 0.20.4
+0.20.4.updates           =
+0.20.4.notices           = This is the latest GA release.
+0.20.4.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.20.4
+
+# 0.20.3
+0.20.3.updates           = 0.20.4
+0.20.3.notices           = We recommend upgrading to 0.20.4, our latest GA release.
+0.20.3.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.20.3
+
+# 0.20.2
+0.20.2.updates           = 0.20.4
+0.20.2.notices           = We recommend upgrading to 0.20.4, our latest GA release.
+0.20.2.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.20.2
+
+# 0.20.1
+0.20.1.updates           = 0.20.4
+0.20.1.notices           = We recommend upgrading to 0.20.4, our latest GA release.
+0.20.1.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.20.1
+
+# 0.20.0
+0.20.0.updates           = 0.20.4
+0.20.0.notices           = We recommend upgrading to 0.20.4, our latest GA release.
+0.20.0.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.20.0
+
 ### 0.19.x series ###
 
+# 0.19.19
+0.19.19.updates           =
+0.19.19.notices           = This is the latest dev release.
+0.19.19.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.19
+
 # 0.19.18
-0.19.18.updates           =
-0.19.18.notices           = This is the latest dev release.
+0.19.18.updates           = 0.19.19
+0.19.18.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.18.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.18
 
 # 0.19.17
-0.19.17.updates           = 0.19.18
-0.19.17.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.17.updates           = 0.19.19
+0.19.17.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.17.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.17
 
 # 0.19.16
-0.19.16.updates           = 0.19.18
-0.19.16.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.16.updates           = 0.19.19
+0.19.16.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.16.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.16
 
 # 0.19.15
-0.19.15.updates           = 0.19.18
-0.19.15.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.15.updates           = 0.19.19
+0.19.15.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.15.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.15
 
 # 0.19.14
-0.19.14.updates           = 0.19.18
-0.19.14.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.14.updates           = 0.19.19
+0.19.14.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.14.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.14
 
 # 0.19.13
-0.19.13.updates           = 0.19.18
-0.19.13.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.13.updates           = 0.19.19
+0.19.13.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.13.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.13
 
 # 0.19.12
-0.19.12.updates           = 0.19.18
-0.19.12.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.12.updates           = 0.19.19
+0.19.12.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.12.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.12
 
 # 0.19.11
-0.19.11.updates           = 0.19.18
-0.19.11.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.11.updates           = 0.19.19
+0.19.11.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.11.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.11
 
 # 0.19.10
-0.19.10.updates           = 0.19.18
-0.19.10.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.10.updates           = 0.19.19
+0.19.10.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.10.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.10
 
 # 0.19.9
-0.19.9.updates           = 0.19.18
-0.19.9.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.9.updates           = 0.19.19
+0.19.9.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.9.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.9
 
 # 0.19.8
-0.19.8.updates           = 0.19.18
-0.19.8.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.8.updates           = 0.19.19
+0.19.8.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.8.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.8
 
 # 0.19.7
-0.19.7.updates           = 0.19.18
-0.19.7.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.7.updates           = 0.19.19
+0.19.7.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.7.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.7
 
 # 0.19.6
-0.19.6.updates           = 0.19.18
-0.19.6.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.6.updates           = 0.19.19
+0.19.6.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.6.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.6
 
 # 0.19.5
-0.19.5.updates           = 0.19.18
-0.19.5.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.5.updates           = 0.19.19
+0.19.5.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.5.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.5
 
 # 0.19.4
-0.19.4.updates           = 0.19.18
-0.19.4.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.4.updates           = 0.19.19
+0.19.4.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.4.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.4
 
 # 0.19.3
-0.19.3.updates           = 0.19.18
-0.19.3.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.3.updates           = 0.19.19
+0.19.3.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.3.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.3
 
 # 0.19.2
-0.19.2.updates           = 0.19.18
-0.19.2.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.2.updates           = 0.19.19
+0.19.2.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.2.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.2
 
 # 0.19.1
-0.19.1.updates           = 0.19.18
-0.19.1.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.1.updates           = 0.19.19
+0.19.1.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.1.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.1
 
 # 0.19.0
-0.19.0.updates           = 0.19.18
-0.19.0.notices           = We recommend upgrading to 0.19.18, our latest dev release.
+0.19.0.updates           = 0.19.19
+0.19.0.notices           = We recommend upgrading to 0.19.19, our latest dev release.
 0.19.0.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.19.0
 
 ### 0.18.x series ###
 
 # 0.18.22
 0.18.22.updates           =
-0.18.22.notices           = This is the latest GA release.
+0.18.22.notices           = We recommend upgrading to 0.20.4, our latest GA release.
 0.18.22.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.18.22
 
 # 0.18.21
 0.18.21.updates           = 0.18.22
-0.18.21.notices           = We recommend upgrading to 0.18.22, our latest GA release.
+0.18.21.notices           = We recommend upgrading to 0.20.4, our latest GA release.
 0.18.21.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.18.21
 
 # 0.18.20
 0.18.20.updates           = 0.18.22
-0.18.20.notices           = We recommend upgrading to 0.18.22, our latest GA release.
+0.18.20.notices           = We recommend upgrading to 0.20.4, our latest GA release.
 0.18.20.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.18.20
 
 # 0.18.19
 0.18.19.updates           = 0.18.22
-0.18.19.notices           = We recommend upgrading to 0.18.22, our latest GA release.
+0.18.19.notices           = We recommend upgrading to 0.20.4, our latest GA release.
 0.18.19.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.18.19
 
 # 0.18.18
 0.18.18.updates           = 0.18.22
-0.18.18.notices           = We recommend upgrading to 0.18.22, our latest GA release.
+0.18.18.notices           = We recommend upgrading to 0.20.4, our latest GA release.
 0.18.18.release-notes     = https://github.com/killbill/killbill/releases/tag/killbill-0.18.18
 
 # 0.18.17

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

diff --git a/profiles/pom.xml b/profiles/pom.xml
index 1854566..26f2978 100644
--- a/profiles/pom.xml
+++ b/profiles/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.20.4-SNAPSHOT</version>
+        <version>0.20.5-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-profiles</artifactId>
diff --git a/subscription/pom.xml b/subscription/pom.xml
index ea53923..b51df5b 100644
--- a/subscription/pom.xml
+++ b/subscription/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.20.4-SNAPSHOT</version>
+        <version>0.20.5-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 84ed3fc..e116e14 100644
--- a/tenant/pom.xml
+++ b/tenant/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.20.4-SNAPSHOT</version>
+        <version>0.20.5-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 92a7c90..8be45eb 100644
--- a/usage/pom.xml
+++ b/usage/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.20.4-SNAPSHOT</version>
+        <version>0.20.5-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 c8b819c..10bfcd7 100644
--- a/util/pom.xml
+++ b/util/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.20.4-SNAPSHOT</version>
+        <version>0.20.5-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-util</artifactId>
diff --git a/util/src/main/java/org/killbill/billing/util/cache/CacheControllerDispatcherProvider.java b/util/src/main/java/org/killbill/billing/util/cache/CacheControllerDispatcherProvider.java
index ce32de0..a99d0be 100644
--- a/util/src/main/java/org/killbill/billing/util/cache/CacheControllerDispatcherProvider.java
+++ b/util/src/main/java/org/killbill/billing/util/cache/CacheControllerDispatcherProvider.java
@@ -33,7 +33,7 @@ import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Preconditions;
 
-// Build the abstraction layer between EhCache and Kill Bill
+// Build the abstraction layer between JCache and Kill Bill
 public class CacheControllerDispatcherProvider implements Provider<CacheControllerDispatcher> {
 
     private static final Logger logger = LoggerFactory.getLogger(CacheControllerDispatcherProvider.class);
@@ -56,13 +56,13 @@ public class CacheControllerDispatcherProvider implements Provider<CacheControll
 
             final Cache cache = cacheManager.getCache(cacheType.getCacheName(), cacheType.getKeyType(), cacheType.getValueType());
             if (cache == null) {
-                logger.warn("Cache for cacheName='{}' not configured - check your ehcache.xml", cacheLoader.getCacheType().getCacheName());
+                logger.warn("Cache for cacheName='{}' not configured", cacheLoader.getCacheType().getCacheName());
                 continue;
             }
             Preconditions.checkState(!cache.isClosed(), "Cache '%s' should not be closed", cacheType.getCacheName());
 
-            final CacheController<Object, Object> ehCacheBasedCacheController = new KillBillCacheController<Object, Object>(cache, cacheLoader);
-            cacheControllers.put(cacheType, ehCacheBasedCacheController);
+            final CacheController<Object, Object> killBillCacheController = new KillBillCacheController<Object, Object>(cache, cacheLoader);
+            cacheControllers.put(cacheType, killBillCacheController);
         }
 
         return new CacheControllerDispatcher(cacheControllers);