killbill-memoizeit

Changes

.gitignore 6(+3 -3)

account/pom.xml 12(+11 -1)

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

beatrix/pom.xml 12(+11 -1)

bin/start-server 14(+1 -13)

catalog/pom.xml 12(+11 -1)

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

entitlement/pom.xml 12(+11 -1)

index.html 120(+0 -120)

invoice/pom.xml 12(+11 -1)

jaxrs/pom.xml 13(+11 -2)

junction/pom.xml 12(+11 -1)

NEWS 5(+5 -0)

osgi/pom.xml 12(+11 -1)

overdue/pom.xml 12(+11 -1)

payment/pom.xml 12(+11 -1)

pom.xml 2(+1 -1)

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

tenant/pom.xml 12(+11 -1)

usage/pom.xml 12(+11 -1)

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

util/src/test/java/org/killbill/billing/KillbillConfigSource.java 63(+0 -63)

Details

.gitignore 6(+3 -3)

diff --git a/.gitignore b/.gitignore
index c26b0f3..f7f01e8 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,6 +25,6 @@ catalog/src/test/resources/CatalogSchema.xsd
 server/load
 dependency-reduced-pom.xml
 dependency-reduced-pom.xml.bak
-server/killbill.h2.db
-server/killbill.lock.db
-server/killbill.trace.db
+killbill.h2.db
+killbill.lock.db
+killbill.trace.db

account/pom.xml 12(+11 -1)

diff --git a/account/pom.xml b/account/pom.xml
index 9b34bea..31e5cbe 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.9.2-SNAPSHOT</version>
+        <version>0.9.3-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-account</artifactId>
@@ -96,6 +96,16 @@
         </dependency>
         <dependency>
             <groupId>org.kill-bill.commons</groupId>
+            <artifactId>killbill-embeddeddb-h2</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.kill-bill.commons</groupId>
+            <artifactId>killbill-embeddeddb-mysql</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.kill-bill.commons</groupId>
             <artifactId>killbill-queue</artifactId>
         </dependency>
         <dependency>
diff --git a/account/src/test/java/org/killbill/billing/account/dao/TestAccountDao.java b/account/src/test/java/org/killbill/billing/account/dao/TestAccountDao.java
index 12a6687..d7ddc80 100644
--- a/account/src/test/java/org/killbill/billing/account/dao/TestAccountDao.java
+++ b/account/src/test/java/org/killbill/billing/account/dao/TestAccountDao.java
@@ -21,9 +21,6 @@ import java.util.List;
 import java.util.UUID;
 
 import org.joda.time.DateTimeZone;
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
 import org.killbill.billing.ErrorCode;
 import org.killbill.billing.ObjectType;
 import org.killbill.billing.account.AccountTestSuiteWithEmbeddedDB;
@@ -52,6 +49,8 @@ import org.killbill.billing.util.tag.DescriptiveTag;
 import org.killbill.billing.util.tag.Tag;
 import org.killbill.billing.util.tag.dao.TagDefinitionModelDao;
 import org.killbill.billing.util.tag.dao.TagModelDao;
+import org.testng.Assert;
+import org.testng.annotations.Test;
 
 import com.google.common.collect.ImmutableList;
 

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

diff --git a/api/pom.xml b/api/pom.xml
index cec465b..4258082 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.9.2-SNAPSHOT</version>
+        <version>0.9.3-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-internal-api</artifactId>

beatrix/pom.xml 12(+11 -1)

diff --git a/beatrix/pom.xml b/beatrix/pom.xml
index d5be25b..2eaacdd 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.9.2-SNAPSHOT</version>
+        <version>0.9.3-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-beatrix</artifactId>
@@ -188,6 +188,16 @@
         </dependency>
         <dependency>
             <groupId>org.kill-bill.commons</groupId>
+            <artifactId>killbill-embeddeddb-h2</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.kill-bill.commons</groupId>
+            <artifactId>killbill-embeddeddb-mysql</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.kill-bill.commons</groupId>
             <artifactId>killbill-queue</artifactId>
         </dependency>
         <dependency>
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/BeatrixTestSuiteWithEmbeddedDB.java b/beatrix/src/test/java/org/killbill/billing/beatrix/BeatrixTestSuiteWithEmbeddedDB.java
index 10eda00..9f490cb 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/BeatrixTestSuiteWithEmbeddedDB.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/BeatrixTestSuiteWithEmbeddedDB.java
@@ -16,7 +16,17 @@
 
 package org.killbill.billing.beatrix;
 
+import java.io.IOException;
+import java.net.URISyntaxException;
+
 import org.killbill.billing.GuicyKillbillTestSuiteWithEmbeddedDB;
+import org.killbill.billing.TestKillbillConfigSource;
+import org.killbill.billing.util.KillbillConfigSource;
 
 public abstract class BeatrixTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteWithEmbeddedDB {
+
+    @Override
+    protected KillbillConfigSource getConfigSource() throws IOException, URISyntaxException {
+        return new TestKillbillConfigSource("/beatrix.properties");
+    }
 }
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/BeatrixIntegrationModule.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/BeatrixIntegrationModule.java
index 207db47..71571d8 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/BeatrixIntegrationModule.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/BeatrixIntegrationModule.java
@@ -16,8 +16,6 @@
 
 package org.killbill.billing.beatrix.integration;
 
-import java.io.IOException;
-import java.net.URL;
 import java.util.Set;
 
 import org.killbill.billing.DBTestingHelper;
@@ -80,8 +78,6 @@ import com.google.inject.AbstractModule;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
 
-import static org.testng.Assert.assertNotNull;
-
 public class BeatrixIntegrationModule extends AbstractModule {
 
     public static final String NON_OSGI_PLUGIN_NAME = "yoyo";
@@ -97,8 +93,6 @@ public class BeatrixIntegrationModule extends AbstractModule {
 
     @Override
     protected void configure() {
-        loadSystemPropertiesFromClasspath("/beatrix.properties");
-
         install(new GuicyKillbillTestWithEmbeddedDBModule());
         install(new GlobalLockerModule(DBTestingHelper.get().getDBEngine()));
         install(new CacheModule(configSource));
@@ -161,16 +155,6 @@ public class BeatrixIntegrationModule extends AbstractModule {
         }
     }
 
-    private static void loadSystemPropertiesFromClasspath(final String resource) {
-        final URL url = TestIntegration.class.getResource(resource);
-        assertNotNull(url);
-        try {
-            System.getProperties().load(url.openStream());
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
     private static final class SubsetDefaultLifecycle extends DefaultLifecycle {
 
         @Inject
@@ -180,19 +164,17 @@ public class BeatrixIntegrationModule extends AbstractModule {
 
         @Override
         protected Set<? extends KillbillService> findServices() {
-            final ImmutableSet<? extends KillbillService> services = new ImmutableSet.Builder<KillbillService>()
-                    .add(injector.getInstance(AccountService.class))
-                    .add(injector.getInstance(BusService.class))
-                    .add(injector.getInstance(CatalogService.class))
-                    .add(injector.getInstance(SubscriptionBaseService.class))
-                    .add(injector.getInstance(EntitlementService.class))
-                    .add(injector.getInstance(InvoiceService.class))
-                    .add(injector.getInstance(PaymentService.class))
-                    .add(injector.getInstance(OverdueService.class))
-                    .add(injector.getInstance(DefaultBeatrixService.class))
-                    .add(injector.getInstance(DefaultOSGIService.class))
-                    .build();
-            return services;
+            return new ImmutableSet.Builder<KillbillService>().add(injector.getInstance(AccountService.class))
+                                                              .add(injector.getInstance(BusService.class))
+                                                              .add(injector.getInstance(CatalogService.class))
+                                                              .add(injector.getInstance(SubscriptionBaseService.class))
+                                                              .add(injector.getInstance(EntitlementService.class))
+                                                              .add(injector.getInstance(InvoiceService.class))
+                                                              .add(injector.getInstance(PaymentService.class))
+                                                              .add(injector.getInstance(OverdueService.class))
+                                                              .add(injector.getInstance(DefaultBeatrixService.class))
+                                                              .add(injector.getInstance(DefaultOSGIService.class))
+                                                              .build();
         }
     }
 
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/osgi/TestBasicOSGIWithTestBundle.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/osgi/TestBasicOSGIWithTestBundle.java
index e3d24ff..4ff1bce 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/osgi/TestBasicOSGIWithTestBundle.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/osgi/TestBasicOSGIWithTestBundle.java
@@ -26,6 +26,12 @@ import java.util.concurrent.TimeUnit;
 
 import javax.inject.Inject;
 
+import org.killbill.billing.account.api.Account;
+import org.killbill.billing.beatrix.osgi.SetupBundleWithAssertion;
+import org.killbill.billing.catalog.api.Currency;
+import org.killbill.billing.osgi.api.OSGIServiceRegistration;
+import org.killbill.billing.payment.plugin.api.PaymentInfoPlugin;
+import org.killbill.billing.payment.plugin.api.PaymentPluginApi;
 import org.skife.jdbi.v2.Handle;
 import org.skife.jdbi.v2.IDBI;
 import org.skife.jdbi.v2.Query;
@@ -37,15 +43,6 @@ import org.testng.Assert;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
-import org.killbill.billing.DBTestingHelper;
-import org.killbill.billing.account.api.Account;
-import org.killbill.billing.beatrix.osgi.SetupBundleWithAssertion;
-import org.killbill.billing.catalog.api.Currency;
-import org.killbill.billing.osgi.api.OSGIServiceRegistration;
-import org.killbill.billing.osgi.glue.OSGIDataSourceConfig;
-import org.killbill.billing.payment.plugin.api.PaymentInfoPlugin;
-import org.killbill.billing.payment.plugin.api.PaymentPluginApi;
-
 import static com.jayway.awaitility.Awaitility.await;
 
 /**
@@ -67,15 +64,6 @@ public class TestBasicOSGIWithTestBundle extends TestOSGIBase {
 
     @BeforeClass(groups = "slow")
     public void beforeClass() throws Exception {
-        // Can't use the injected helper as Guice hasn't injected anything yet
-        final String jdbcConnection = DBTestingHelper.get().getJdbcConnectionString();
-        final String userName = DBTestingHelper.get().getUsername();
-        final String userPwd = DBTestingHelper.get().getPassword();
-
-        System.setProperty(OSGIDataSourceConfig.DATA_SOURCE_PROP_PREFIX + "jdbc.url", jdbcConnection);
-        System.setProperty(OSGIDataSourceConfig.DATA_SOURCE_PROP_PREFIX + "jdbc.user", userName);
-        System.setProperty(OSGIDataSourceConfig.DATA_SOURCE_PROP_PREFIX + "jdbc.password", userPwd);
-
         // OSGIDataSourceConfig
         super.beforeClass();
 
@@ -83,7 +71,6 @@ public class TestBasicOSGIWithTestBundle extends TestOSGIBase {
         final String killbillVersion = System.getProperty("killbill.version");
         SetupBundleWithAssertion setupTest = new SetupBundleWithAssertion(BUNDLE_TEST_RESOURCE, osgiConfig, killbillVersion);
         setupTest.setupJavaBundle();
-
     }
 
     @Test(groups = "slow")
diff --git a/beatrix/src/test/resources/beatrix.properties b/beatrix/src/test/resources/beatrix.properties
index ffcc302..90f9f65 100644
--- a/beatrix/src/test/resources/beatrix.properties
+++ b/beatrix/src/test/resources/beatrix.properties
@@ -1,28 +1,3 @@
 org.killbill.catalog.uri=file:src/test/resources/catalogTest.xml
-
-org.killbill.notificationq.main.sleep=100
-org.killbill.notificationq.main.nbThreads=1
-org.killbill.notificationq.main.useInFlightQ=false
-org.killbill.notificationq.main.prefetch=1
-org.killbill.notificationq.main.claimed=1
-
-org.killbill.persistent.bus.main.sleep=100
-org.killbill.persistent.bus.main.nbThreads=1
-org.killbill.persistent.bus.main.prefetch=1
-org.killbill.persistent.bus.main.claimed=1
-org.killbill.persistent.bus.main.useInFlightQ=false
-
-org.killbill.persistent.bus.external.sleep=100
-org.killbill.persistent.bus.external.nbThreads=1
-org.killbill.persistent.bus.external.prefetch=1
-org.killbill.persistent.bus.external.claimed=1
-org.killbill.persistent.bus.external.useInFlightQ=false
-
-org.killbill.persistent.bus.external.tableName=bus_ext_events
-org.killbill.persistent.bus.external.historyTableName=bus_ext_events_history
-
-user.timezone=UTC
 org.killbill.payment.retry.days=8,8,8,8,8,8,8,8
 org.killbill.osgi.bundle.install.dir=/var/tmp/beatrix-bundles
-org.slf4j.simpleLogger.showDateTime=true
-

bin/start-server 14(+1 -13)

diff --git a/bin/start-server b/bin/start-server
index 77711fd..438560f 100755
--- a/bin/start-server
+++ b/bin/start-server
@@ -51,22 +51,10 @@ function usage() {
     exit 1
 }
 
-function build_properties() {
-    local opts=
-    local prop=
-    for prop in `cat  $PROPERTIES | grep =`; do
-        local k=`echo $prop | awk 'BEGIN {FS="="} { print $1 }'`
-        local v=`echo $prop | awk 'BEGIN {FS="="} {for (i=2; i<NF; i++) printf $i "="; print $NF}'`
-        opts="$opts -D$k=$v"
-    done
-    echo $opts
-}
-
 function start() {
     mkdir -p $LOG_DIR
 
-    local opts=`build_properties`
-    local start_cmd="mvn $opts -Dlogback.configurationFile=$LOG jetty:run"
+    local start_cmd="mvn -Dorg.killbill.server.properties=file://$PROPERTIES -Dlogback.configurationFile=$LOG jetty:run"
 
     local debug_opts_eclipse=
     if [ ! -z $DEBUG ]; then

catalog/pom.xml 12(+11 -1)

diff --git a/catalog/pom.xml b/catalog/pom.xml
index 1d2f04e..9d94dc3 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.9.2-SNAPSHOT</version>
+        <version>0.9.3-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-catalog</artifactId>
@@ -73,6 +73,16 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>org.kill-bill.commons</groupId>
+            <artifactId>killbill-embeddeddb-h2</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.kill-bill.commons</groupId>
+            <artifactId>killbill-embeddeddb-mysql</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-all</artifactId>
             <scope>test</scope>

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

diff --git a/currency/pom.xml b/currency/pom.xml
index a943b91..6b1e267 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.9.2-SNAPSHOT</version>
+        <version>0.9.3-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 

entitlement/pom.xml 12(+11 -1)

diff --git a/entitlement/pom.xml b/entitlement/pom.xml
index 576930b..429070b 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.9.2-SNAPSHOT</version>
+        <version>0.9.3-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-entitlement</artifactId>
@@ -117,6 +117,16 @@
         </dependency>
         <dependency>
             <groupId>org.kill-bill.commons</groupId>
+            <artifactId>killbill-embeddeddb-h2</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.kill-bill.commons</groupId>
+            <artifactId>killbill-embeddeddb-mysql</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.kill-bill.commons</groupId>
             <artifactId>killbill-queue</artifactId>
         </dependency>
         <dependency>
diff --git a/entitlement/src/test/java/org/killbill/billing/entitlement/EntitlementTestSuiteWithEmbeddedDB.java b/entitlement/src/test/java/org/killbill/billing/entitlement/EntitlementTestSuiteWithEmbeddedDB.java
index ee3f4e8..333d540 100644
--- a/entitlement/src/test/java/org/killbill/billing/entitlement/EntitlementTestSuiteWithEmbeddedDB.java
+++ b/entitlement/src/test/java/org/killbill/billing/entitlement/EntitlementTestSuiteWithEmbeddedDB.java
@@ -16,29 +16,22 @@
 
 package org.killbill.billing.entitlement;
 
-import java.net.URL;
+import java.io.IOException;
+import java.net.URISyntaxException;
 import java.util.UUID;
 
 import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-
 import org.killbill.billing.GuicyKillbillTestSuiteWithEmbeddedDB;
+import org.killbill.billing.TestKillbillConfigSource;
 import org.killbill.billing.account.api.AccountData;
 import org.killbill.billing.account.api.AccountInternalApi;
 import org.killbill.billing.account.api.AccountUserApi;
 import org.killbill.billing.api.TestApiListener;
-import org.killbill.bus.api.PersistentBus;
 import org.killbill.billing.catalog.DefaultCatalogService;
 import org.killbill.billing.catalog.api.Catalog;
 import org.killbill.billing.catalog.api.CatalogService;
 import org.killbill.billing.catalog.api.Currency;
-import org.killbill.clock.ClockMock;
 import org.killbill.billing.entitlement.api.EntitlementApi;
 import org.killbill.billing.entitlement.api.SubscriptionApi;
 import org.killbill.billing.entitlement.dao.BlockingStateDao;
@@ -51,10 +44,18 @@ import org.killbill.billing.subscription.api.SubscriptionBaseInternalApi;
 import org.killbill.billing.subscription.api.SubscriptionBaseService;
 import org.killbill.billing.subscription.engine.core.DefaultSubscriptionBaseService;
 import org.killbill.billing.tag.TagInternalApi;
+import org.killbill.billing.util.KillbillConfigSource;
 import org.killbill.billing.util.api.AuditUserApi;
 import org.killbill.billing.util.callcontext.InternalCallContextFactory;
 import org.killbill.billing.util.svcsapi.bus.BusService;
 import org.killbill.billing.util.tag.dao.TagDao;
+import org.killbill.bus.api.PersistentBus;
+import org.killbill.clock.ClockMock;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
 
 import com.google.inject.Guice;
 import com.google.inject.Inject;
@@ -62,7 +63,6 @@ import com.google.inject.Injector;
 import com.google.inject.Stage;
 
 import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertTrue;
 
 public class EntitlementTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteWithEmbeddedDB {
 
@@ -109,16 +109,13 @@ public class EntitlementTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteWi
 
     protected Catalog catalog;
 
-    private void loadSystemPropertiesFromClasspath(final String resource) {
-        final URL url = EntitlementTestSuiteWithEmbeddedDB.class.getResource(resource);
-        Assert.assertNotNull(url);
-
-        configSource.merge(url);
+    @Override
+    protected KillbillConfigSource getConfigSource() throws IOException, URISyntaxException {
+        return new TestKillbillConfigSource("/entitlement.properties");
     }
 
     @BeforeClass(groups = "slow")
     protected void beforeClass() throws Exception {
-        loadSystemPropertiesFromClasspath("/entitlement.properties");
         final Injector injector = Guice.createInjector(Stage.PRODUCTION, new TestEntitlementModuleWithEmbeddedDB(configSource));
         injector.injectMembers(this);
     }
@@ -149,7 +146,6 @@ public class EntitlementTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteWi
         return catalog;
     }
 
-
     private void startTestFamework(final TestApiListener testListener,
                                    final ClockMock clock,
                                    final BusService busService,
@@ -169,7 +165,6 @@ public class EntitlementTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteWi
         log.debug("STARTED TEST FRAMEWORK");
     }
 
-
     private void stopTestFramework(final TestApiListener testListener,
                                    final BusService busService,
                                    final SubscriptionBaseService subscriptionBaseService,
diff --git a/entitlement/src/test/resources/entitlement.properties b/entitlement/src/test/resources/entitlement.properties
index b0bdca1..6fc7e6d 100644
--- a/entitlement/src/test/resources/entitlement.properties
+++ b/entitlement/src/test/resources/entitlement.properties
@@ -1,5 +1 @@
 org.killbill.catalog.uri=file:src/test/resources/catalogTest.xml
-org.killbill.persistent.bus.main.sleep=100
-org.killbill.persistent.bus.main.nbThreads=1
-org.killbill.persistent.bus.main.claimed=1
-user.timezone=UTC

invoice/pom.xml 12(+11 -1)

diff --git a/invoice/pom.xml b/invoice/pom.xml
index e5081cc..8f29a64 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.9.2-SNAPSHOT</version>
+        <version>0.9.3-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-invoice</artifactId>
@@ -114,6 +114,16 @@
         </dependency>
         <dependency>
             <groupId>org.kill-bill.commons</groupId>
+            <artifactId>killbill-embeddeddb-h2</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.kill-bill.commons</groupId>
+            <artifactId>killbill-embeddeddb-mysql</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.kill-bill.commons</groupId>
             <artifactId>killbill-queue</artifactId>
         </dependency>
         <dependency>
diff --git a/invoice/src/main/java/org/killbill/billing/invoice/template/HtmlInvoiceGenerator.java b/invoice/src/main/java/org/killbill/billing/invoice/template/HtmlInvoiceGenerator.java
index 7ca43a4..cd95a16 100644
--- a/invoice/src/main/java/org/killbill/billing/invoice/template/HtmlInvoiceGenerator.java
+++ b/invoice/src/main/java/org/killbill/billing/invoice/template/HtmlInvoiceGenerator.java
@@ -33,6 +33,7 @@ import org.killbill.billing.util.LocaleUtils;
 import org.killbill.billing.util.email.templates.TemplateEngine;
 import org.killbill.billing.util.template.translation.TranslatorConfig;
 
+import com.google.common.base.Strings;
 import com.google.inject.Inject;
 
 public class HtmlInvoiceGenerator {
@@ -59,7 +60,9 @@ public class HtmlInvoiceGenerator {
 
         final Map<String, Object> data = new HashMap<String, Object>();
         final DefaultInvoiceTranslator invoiceTranslator = new DefaultInvoiceTranslator(config);
-        final Locale locale = LocaleUtils.toLocale(account.getLocale());
+        final String accountLocale = Strings.emptyToNull(account.getLocale());
+        // If no Locale is defined, use the default JVM one
+        final Locale locale = accountLocale == null ? Locale.getDefault() : LocaleUtils.toLocale(accountLocale);
         invoiceTranslator.setLocale(locale);
         data.put("text", invoiceTranslator);
         data.put("account", account);
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/InvoiceTestSuiteNoDB.java b/invoice/src/test/java/org/killbill/billing/invoice/InvoiceTestSuiteNoDB.java
index 3d5a583..c7b34cf 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/InvoiceTestSuiteNoDB.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/InvoiceTestSuiteNoDB.java
@@ -16,34 +16,35 @@
 
 package org.killbill.billing.invoice;
 
-import java.net.URL;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
+import java.io.IOException;
+import java.net.URISyntaxException;
 
 import org.killbill.billing.GuicyKillbillTestSuiteNoDB;
-import org.killbill.bus.api.PersistentBus;
-import org.killbill.commons.locker.GlobalLocker;
+import org.killbill.billing.TestKillbillConfigSource;
+import org.killbill.billing.account.api.AccountInternalApi;
 import org.killbill.billing.currency.api.CurrencyConversionApi;
+import org.killbill.billing.invoice.api.InvoiceInternalApi;
 import org.killbill.billing.invoice.api.InvoiceMigrationApi;
 import org.killbill.billing.invoice.api.InvoicePaymentApi;
 import org.killbill.billing.invoice.api.InvoiceUserApi;
 import org.killbill.billing.invoice.dao.InvoiceDao;
 import org.killbill.billing.invoice.generator.InvoiceGenerator;
 import org.killbill.billing.invoice.glue.TestInvoiceModuleNoDB;
+import org.killbill.billing.junction.BillingInternalApi;
+import org.killbill.billing.subscription.api.SubscriptionBaseInternalApi;
+import org.killbill.billing.util.KillbillConfigSource;
 import org.killbill.billing.util.api.TagUserApi;
 import org.killbill.billing.util.cache.CacheControllerDispatcher;
 import org.killbill.billing.util.callcontext.InternalCallContextFactory;
-import org.killbill.clock.Clock;
-import org.killbill.billing.account.api.AccountInternalApi;
-import org.killbill.billing.subscription.api.SubscriptionBaseInternalApi;
-import org.killbill.billing.invoice.api.InvoiceInternalApi;
-import org.killbill.billing.junction.BillingInternalApi;
 import org.killbill.billing.util.svcsapi.bus.BusService;
+import org.killbill.bus.api.PersistentBus;
+import org.killbill.clock.Clock;
+import org.killbill.commons.locker.GlobalLocker;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
 
 import com.google.inject.Guice;
 import com.google.inject.Inject;
@@ -90,17 +91,13 @@ public abstract class InvoiceTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
     @Inject
     protected CurrencyConversionApi currencyConversionApi;
 
-    private void loadSystemPropertiesFromClasspath(final String resource) {
-        final URL url = InvoiceTestSuiteNoDB.class.getResource(resource);
-        Assert.assertNotNull(url);
-
-        configSource.merge(url);
+    @Override
+    protected KillbillConfigSource getConfigSource() throws IOException, URISyntaxException {
+        return new TestKillbillConfigSource("/resource.properties");
     }
 
     @BeforeClass(groups = "fast")
     protected void beforeClass() throws Exception {
-        loadSystemPropertiesFromClasspath("/resource.properties");
-
         final Injector injector = Guice.createInjector(new TestInvoiceModuleNoDB(configSource));
         injector.injectMembers(this);
     }
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/InvoiceTestSuiteWithEmbeddedDB.java b/invoice/src/test/java/org/killbill/billing/invoice/InvoiceTestSuiteWithEmbeddedDB.java
index 429119d..039ede4 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/InvoiceTestSuiteWithEmbeddedDB.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/InvoiceTestSuiteWithEmbeddedDB.java
@@ -16,21 +16,16 @@
 
 package org.killbill.billing.invoice;
 
-import java.net.URL;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
+import java.io.IOException;
+import java.net.URISyntaxException;
 
 import org.killbill.billing.GuicyKillbillTestSuiteWithEmbeddedDB;
+import org.killbill.billing.TestKillbillConfigSource;
+import org.killbill.billing.account.api.AccountInternalApi;
 import org.killbill.billing.account.api.AccountUserApi;
-import org.killbill.bus.api.PersistentBus;
 import org.killbill.billing.catalog.api.Currency;
-import org.killbill.commons.locker.GlobalLocker;
 import org.killbill.billing.invoice.api.DefaultInvoiceService;
+import org.killbill.billing.invoice.api.InvoiceInternalApi;
 import org.killbill.billing.invoice.api.InvoiceMigrationApi;
 import org.killbill.billing.invoice.api.InvoicePaymentApi;
 import org.killbill.billing.invoice.api.InvoiceService;
@@ -39,17 +34,23 @@ import org.killbill.billing.invoice.dao.InvoiceDao;
 import org.killbill.billing.invoice.generator.InvoiceGenerator;
 import org.killbill.billing.invoice.glue.TestInvoiceModuleWithEmbeddedDb;
 import org.killbill.billing.invoice.notification.NextBillingDateNotifier;
-import org.killbill.notificationq.api.NotificationQueueService;
+import org.killbill.billing.junction.BillingInternalApi;
+import org.killbill.billing.subscription.api.SubscriptionBaseInternalApi;
+import org.killbill.billing.util.KillbillConfigSource;
 import org.killbill.billing.util.api.TagUserApi;
 import org.killbill.billing.util.cache.CacheControllerDispatcher;
 import org.killbill.billing.util.callcontext.InternalCallContextFactory;
-import org.killbill.clock.Clock;
 import org.killbill.billing.util.dao.NonEntityDao;
-import org.killbill.billing.account.api.AccountInternalApi;
-import org.killbill.billing.subscription.api.SubscriptionBaseInternalApi;
-import org.killbill.billing.invoice.api.InvoiceInternalApi;
-import org.killbill.billing.junction.BillingInternalApi;
 import org.killbill.billing.util.svcsapi.bus.BusService;
+import org.killbill.bus.api.PersistentBus;
+import org.killbill.clock.Clock;
+import org.killbill.commons.locker.GlobalLocker;
+import org.killbill.notificationq.api.NotificationQueueService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
 
 import com.google.inject.Guice;
 import com.google.inject.Inject;
@@ -108,17 +109,13 @@ public abstract class InvoiceTestSuiteWithEmbeddedDB extends GuicyKillbillTestSu
     @Inject
     protected TestInvoiceNotificationQListener testInvoiceNotificationQListener;
 
-    private void loadSystemPropertiesFromClasspath(final String resource) {
-        final URL url = InvoiceTestSuiteNoDB.class.getResource(resource);
-        Assert.assertNotNull(url);
-
-        configSource.merge(url);
+    @Override
+    protected KillbillConfigSource getConfigSource() throws IOException, URISyntaxException {
+        return new TestKillbillConfigSource("/resource.properties");
     }
 
     @BeforeClass(groups = "slow")
     protected void beforeClass() throws Exception {
-        loadSystemPropertiesFromClasspath("/resource.properties");
-
         final Injector injector = Guice.createInjector(new TestInvoiceModuleWithEmbeddedDb(configSource));
         injector.injectMembers(this);
     }
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/template/formatters/TestDefaultInvoiceFormatter.java b/invoice/src/test/java/org/killbill/billing/invoice/template/formatters/TestDefaultInvoiceFormatter.java
index 7256586..291af98 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/template/formatters/TestDefaultInvoiceFormatter.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/template/formatters/TestDefaultInvoiceFormatter.java
@@ -24,11 +24,6 @@ import java.util.Map;
 import java.util.UUID;
 
 import org.joda.time.LocalDate;
-import org.skife.config.ConfigurationObjectFactory;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.Test;
-
 import org.killbill.billing.catalog.api.Currency;
 import org.killbill.billing.invoice.InvoiceTestSuiteNoDB;
 import org.killbill.billing.invoice.api.Invoice;
@@ -47,6 +42,10 @@ import org.killbill.billing.invoice.model.RepairAdjInvoiceItem;
 import org.killbill.billing.invoice.template.translator.DefaultInvoiceTranslator;
 import org.killbill.billing.util.email.templates.MustacheTemplateEngine;
 import org.killbill.billing.util.template.translation.TranslatorConfig;
+import org.skife.config.ConfigurationObjectFactory;
+import org.testng.Assert;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
 
 public class TestDefaultInvoiceFormatter extends InvoiceTestSuiteNoDB {
 
@@ -56,7 +55,7 @@ public class TestDefaultInvoiceFormatter extends InvoiceTestSuiteNoDB {
     @BeforeClass(groups = "fast")
     public void beforeClass() throws Exception {
         super.beforeClass();
-        config = new ConfigurationObjectFactory(System.getProperties()).build(TranslatorConfig.class);
+        config = new ConfigurationObjectFactory(configSource).build(TranslatorConfig.class);
         templateEngine = new MustacheTemplateEngine();
     }
 
@@ -183,7 +182,6 @@ public class TestDefaultInvoiceFormatter extends InvoiceTestSuiteNoDB {
                     Locale.FRANCE);
     }
 
-
     @Test(groups = "fast")
     public void testProcessedCurrencyExists() throws Exception {
         final Invoice invoice = new DefaultInvoice(UUID.randomUUID(), clock.getUTCNow(), UUID.randomUUID(), new Integer(234), new LocalDate(), new LocalDate(), Currency.BRL, Currency.USD, false);
@@ -225,98 +223,98 @@ public class TestDefaultInvoiceFormatter extends InvoiceTestSuiteNoDB {
         invoice.addInvoiceItem(fixedItemBRL);
 
         final String template = "<html>\n" +
-                             "    <head>\n" +
-                             "        <style type=\"text/css\">\n" +
-                             "            #header td { width: 250px; }\n" +
-                             "            #header .company_info { width: 450px; }\n" +
-                             "            #header .label { text-align: right; font-weight: bold; }\n" +
-                             "            #header .label_value { padding-left: 10px; }\n" +
-                             "\n" +
-                             "            #invoice_items { margin-top: 50px; }\n" +
-                             "            #invoice_items th { border-bottom: solid 2px black; }\n" +
-                             "            #invoice_items td { width: 250px; }\n" +
-                             "            #invoice_items td.amount { width: 125px; }\n" +
-                             "            #invoice_items td.network { width: 350px; }\n" +
-                             "            #invoice_items .amount { text-align: right; }\n" +
-                             "            #invoice_items .label { text-align: right; font-weight: bold; }\n" +
-                             "        </style>\n" +
-                             "    </head>\n" +
-                             "    <body>\n" +
-                             "        <table id=\"header\">\n" +
-                             "            <tr>\n" +
-                             "                <td class=\"company_info\"/>\n" +
-                             "                <td />\n" +
-                             "                <td><h1>{{text.invoiceTitle}}</h1></td>\n" +
-                             "            </tr>\n" +
-                             "            <tr>\n" +
-                             "                <td colspan=\"3\"><img src=\"http://static.foo.com/www/0/main/gfx/front/logo.png\"/></td>\n" +
-                             "            </tr>\n" +
-                             "            <tr>\n" +
-                             "                <td class=\"company_info\" />\n" +
-                             "                <td class=\"label\">{{text.invoiceDate}}</td>\n" +
-                             "                <td class=\"label_value\">{{invoice.formattedInvoiceDate}}</td>\n" +
-                             "            </tr>\n" +
-                             "            <tr>\n" +
-                             "                <td class=\"company_info\" />\n" +
-                             "                <td class=\"label\">{{text.invoiceNumber}}</td>\n" +
-                             "                <td class=\"label_value\">{{invoice.invoiceNumber}}</td>\n" +
-                             "            </tr>\n" +
-                             "            <tr>\n" +
-                             "                <td class=\"company_info\">{{text.companyCountry}}</td>\n" +
-                             "                <td colspan=\"2\" />\n" +
-                             "            </tr>\n" +
-                             "            <tr>\n" +
-                             "                <td class=\"company_info\">{{text.companyUrl}}</td>\n" +
-                             "                <td colspan=\"2\" />\n" +
-                             "            </tr>\n" +
-                             "        </table>\n" +
-                             "\n" +
-                             "        <table id=\"invoice_items\">\n" +
-                             "            <tr>\n" +
-                             "                <th class=\"network\">{{text.invoiceItemBundleName}}</td>\n" +
-                             "                <th>{{text.invoiceItemDescription}}</td>\n" +
-                             "                <th>{{text.invoiceItemServicePeriod}}</td>\n" +
-                             "                <th>{{text.invoiceItemAmount}}</td>\n" +
-                             "            </tr>\n" +
-                             "            {{#invoice.invoiceItems}}\n" +
-                             "            <tr>\n" +
-                             "                <td class=\"network\">{{description}}</td>\n" +
-                             "                <td>{{planName}}</td>\n" +
-                             "                <td>{{formattedStartDate}}{{#formattedEndDate}} - {{formattedEndDate}}{{/formattedEndDate}}</td>\n" +
-                             "                <td class=\"amount\">{{formattedAmount}}</td>\n" +
-                             "            </tr>\n" +
-                             "            {{/invoice.invoiceItems}}\n" +
-                             "            <tr>\n" +
-                             "                <td colspan=\"4\" height=\"50px\"></td>\n" +
-                             "            </tr>\n" +
-                             "            <tr>\n" +
-                             "                <td colspan=\"2\" />\n" +
-                             "                <td class=\"label\">{{text.invoiceAmount}}</td>\n" +
-                             "                <td class=\"amount\"><strong>{{invoice.formattedChargedAmount}}</strong></td>\n" +
-                             "            </tr>\n" +
-                             "            <tr>\n" +
-                             "                <td colspan=\"2\" />\n" +
-                             "                <td class=\"label\">{{text.invoiceAmountPaid}}" +
-                             "                    {{#invoice.processedCurrency}}" +
-                             " (*)" +
-                             "                    {{/invoice.processedCurrency}}\n" +
-                             "                </td>\n" +
-                             "                <td class=\"amount\"><strong>{{invoice.formattedPaidAmount}}</strong></td>\n" +
-                             "            </tr>\n" +
-                             "            <tr>\n" +
-                             "                <td colspan=\"2\" />\n" +
-                             "                <td class=\"label\">{{text.invoiceBalance}}</td>\n" +
-                             "                <td class=\"amount\"><strong>{{invoice.formattedBalance}}</strong></td>\n" +
-                             "            </tr>\n" +
-                             "        </table>\n" +
-                             "        {{#invoice.processedCurrency}}" +
-                             "        {{text.processedPaymentCurrency}} {{invoice.processedCurrency}}." +
-                             "        {{#invoice.processedPaymentRate}}\n" +
-                             " {{text.processedPaymentRate}} {{invoice.processedPaymentRate}}.\n" +
-                             "        {{/invoice.processedPaymentRate}}" +
-                             "        {{/invoice.processedCurrency}}" +
-                             "    </body>\n" +
-                             "</html>\n";
+                                "    <head>\n" +
+                                "        <style type=\"text/css\">\n" +
+                                "            #header td { width: 250px; }\n" +
+                                "            #header .company_info { width: 450px; }\n" +
+                                "            #header .label { text-align: right; font-weight: bold; }\n" +
+                                "            #header .label_value { padding-left: 10px; }\n" +
+                                "\n" +
+                                "            #invoice_items { margin-top: 50px; }\n" +
+                                "            #invoice_items th { border-bottom: solid 2px black; }\n" +
+                                "            #invoice_items td { width: 250px; }\n" +
+                                "            #invoice_items td.amount { width: 125px; }\n" +
+                                "            #invoice_items td.network { width: 350px; }\n" +
+                                "            #invoice_items .amount { text-align: right; }\n" +
+                                "            #invoice_items .label { text-align: right; font-weight: bold; }\n" +
+                                "        </style>\n" +
+                                "    </head>\n" +
+                                "    <body>\n" +
+                                "        <table id=\"header\">\n" +
+                                "            <tr>\n" +
+                                "                <td class=\"company_info\"/>\n" +
+                                "                <td />\n" +
+                                "                <td><h1>{{text.invoiceTitle}}</h1></td>\n" +
+                                "            </tr>\n" +
+                                "            <tr>\n" +
+                                "                <td colspan=\"3\"><img src=\"http://static.foo.com/www/0/main/gfx/front/logo.png\"/></td>\n" +
+                                "            </tr>\n" +
+                                "            <tr>\n" +
+                                "                <td class=\"company_info\" />\n" +
+                                "                <td class=\"label\">{{text.invoiceDate}}</td>\n" +
+                                "                <td class=\"label_value\">{{invoice.formattedInvoiceDate}}</td>\n" +
+                                "            </tr>\n" +
+                                "            <tr>\n" +
+                                "                <td class=\"company_info\" />\n" +
+                                "                <td class=\"label\">{{text.invoiceNumber}}</td>\n" +
+                                "                <td class=\"label_value\">{{invoice.invoiceNumber}}</td>\n" +
+                                "            </tr>\n" +
+                                "            <tr>\n" +
+                                "                <td class=\"company_info\">{{text.companyCountry}}</td>\n" +
+                                "                <td colspan=\"2\" />\n" +
+                                "            </tr>\n" +
+                                "            <tr>\n" +
+                                "                <td class=\"company_info\">{{text.companyUrl}}</td>\n" +
+                                "                <td colspan=\"2\" />\n" +
+                                "            </tr>\n" +
+                                "        </table>\n" +
+                                "\n" +
+                                "        <table id=\"invoice_items\">\n" +
+                                "            <tr>\n" +
+                                "                <th class=\"network\">{{text.invoiceItemBundleName}}</td>\n" +
+                                "                <th>{{text.invoiceItemDescription}}</td>\n" +
+                                "                <th>{{text.invoiceItemServicePeriod}}</td>\n" +
+                                "                <th>{{text.invoiceItemAmount}}</td>\n" +
+                                "            </tr>\n" +
+                                "            {{#invoice.invoiceItems}}\n" +
+                                "            <tr>\n" +
+                                "                <td class=\"network\">{{description}}</td>\n" +
+                                "                <td>{{planName}}</td>\n" +
+                                "                <td>{{formattedStartDate}}{{#formattedEndDate}} - {{formattedEndDate}}{{/formattedEndDate}}</td>\n" +
+                                "                <td class=\"amount\">{{formattedAmount}}</td>\n" +
+                                "            </tr>\n" +
+                                "            {{/invoice.invoiceItems}}\n" +
+                                "            <tr>\n" +
+                                "                <td colspan=\"4\" height=\"50px\"></td>\n" +
+                                "            </tr>\n" +
+                                "            <tr>\n" +
+                                "                <td colspan=\"2\" />\n" +
+                                "                <td class=\"label\">{{text.invoiceAmount}}</td>\n" +
+                                "                <td class=\"amount\"><strong>{{invoice.formattedChargedAmount}}</strong></td>\n" +
+                                "            </tr>\n" +
+                                "            <tr>\n" +
+                                "                <td colspan=\"2\" />\n" +
+                                "                <td class=\"label\">{{text.invoiceAmountPaid}}" +
+                                "                    {{#invoice.processedCurrency}}" +
+                                " (*)" +
+                                "                    {{/invoice.processedCurrency}}\n" +
+                                "                </td>\n" +
+                                "                <td class=\"amount\"><strong>{{invoice.formattedPaidAmount}}</strong></td>\n" +
+                                "            </tr>\n" +
+                                "            <tr>\n" +
+                                "                <td colspan=\"2\" />\n" +
+                                "                <td class=\"label\">{{text.invoiceBalance}}</td>\n" +
+                                "                <td class=\"amount\"><strong>{{invoice.formattedBalance}}</strong></td>\n" +
+                                "            </tr>\n" +
+                                "        </table>\n" +
+                                "        {{#invoice.processedCurrency}}" +
+                                "        {{text.processedPaymentCurrency}} {{invoice.processedCurrency}}." +
+                                "        {{#invoice.processedPaymentRate}}\n" +
+                                " {{text.processedPaymentRate}} {{invoice.processedPaymentRate}}.\n" +
+                                "        {{/invoice.processedPaymentRate}}" +
+                                "        {{/invoice.processedCurrency}}" +
+                                "    </body>\n" +
+                                "</html>\n";
 
         final Map<String, Object> data = new HashMap<String, Object>();
 
@@ -361,7 +359,6 @@ public class TestDefaultInvoiceFormatter extends InvoiceTestSuiteNoDB {
         System.out.println(formattedText);
     }
 
-
     private void checkOutput(final Invoice invoice, final String template, final String expected, final Locale locale) {
         final Map<String, Object> data = new HashMap<String, Object>();
         data.put("invoice", new DefaultInvoiceFormatter(config, invoice, locale, null));
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/template/formatters/TestDefaultInvoiceItemFormatter.java b/invoice/src/test/java/org/killbill/billing/invoice/template/formatters/TestDefaultInvoiceItemFormatter.java
index fdd398f..4fda588 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/template/formatters/TestDefaultInvoiceItemFormatter.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/template/formatters/TestDefaultInvoiceItemFormatter.java
@@ -24,12 +24,6 @@ import java.util.UUID;
 
 import org.joda.time.LocalDate;
 import org.joda.time.format.DateTimeFormat;
-import org.skife.config.ConfigurationObjectFactory;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeSuite;
-import org.testng.annotations.Test;
-
 import org.killbill.billing.catalog.api.Currency;
 import org.killbill.billing.invoice.InvoiceTestSuiteNoDB;
 import org.killbill.billing.invoice.api.InvoiceItem;
@@ -38,6 +32,10 @@ import org.killbill.billing.invoice.model.RecurringInvoiceItem;
 import org.killbill.billing.util.LocaleUtils;
 import org.killbill.billing.util.email.templates.MustacheTemplateEngine;
 import org.killbill.billing.util.template.translation.TranslatorConfig;
+import org.skife.config.ConfigurationObjectFactory;
+import org.testng.Assert;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
 
 public class TestDefaultInvoiceItemFormatter extends InvoiceTestSuiteNoDB {
 
@@ -48,7 +46,7 @@ public class TestDefaultInvoiceItemFormatter extends InvoiceTestSuiteNoDB {
     @BeforeClass(groups = "fast")
     public void beforeClass() throws Exception {
         super.beforeClass();
-        config = new ConfigurationObjectFactory(System.getProperties()).build(TranslatorConfig.class);
+        config = new ConfigurationObjectFactory(configSource).build(TranslatorConfig.class);
         templateEngine = new MustacheTemplateEngine();
     }
 
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/TestHtmlInvoiceGenerator.java b/invoice/src/test/java/org/killbill/billing/invoice/TestHtmlInvoiceGenerator.java
index d5e59c7..2ad6780 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/TestHtmlInvoiceGenerator.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/TestHtmlInvoiceGenerator.java
@@ -24,13 +24,6 @@ import java.util.Locale;
 import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
 import org.joda.time.LocalDate;
-import org.mockito.Mockito;
-import org.skife.config.ConfigurationObjectFactory;
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeSuite;
-import org.testng.annotations.Test;
-
 import org.killbill.billing.account.api.Account;
 import org.killbill.billing.catalog.api.Currency;
 import org.killbill.billing.invoice.api.Invoice;
@@ -41,6 +34,11 @@ import org.killbill.billing.invoice.template.formatters.DefaultInvoiceFormatterF
 import org.killbill.billing.util.email.templates.MustacheTemplateEngine;
 import org.killbill.billing.util.email.templates.TemplateEngine;
 import org.killbill.billing.util.template.translation.TranslatorConfig;
+import org.mockito.Mockito;
+import org.skife.config.ConfigurationObjectFactory;
+import org.testng.Assert;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
 
 public class TestHtmlInvoiceGenerator extends InvoiceTestSuiteNoDB {
 
@@ -50,7 +48,7 @@ public class TestHtmlInvoiceGenerator extends InvoiceTestSuiteNoDB {
     @BeforeClass(groups = "fast")
     public void beforeClass() throws Exception {
         super.beforeClass();
-        final TranslatorConfig config = new ConfigurationObjectFactory(System.getProperties()).build(TranslatorConfig.class);
+        final TranslatorConfig config = new ConfigurationObjectFactory(configSource).build(TranslatorConfig.class);
         final TemplateEngine templateEngine = new MustacheTemplateEngine();
         final InvoiceFormatterFactory factory = new DefaultInvoiceFormatterFactory();
         g = new HtmlInvoiceGenerator(factory, templateEngine, config, null);
diff --git a/invoice/src/test/resources/resource.properties b/invoice/src/test/resources/resource.properties
index fffad07..ebe435c 100644
--- a/invoice/src/test/resources/resource.properties
+++ b/invoice/src/test/resources/resource.properties
@@ -1 +1 @@
-org.killbill.billing.invoice.maxNumberOfMonthsInFuture = 36
+org.killbill.invoice.maxNumberOfMonthsInFuture=36

jaxrs/pom.xml 13(+11 -2)

diff --git a/jaxrs/pom.xml b/jaxrs/pom.xml
index bb7b693..72d4733 100644
--- a/jaxrs/pom.xml
+++ b/jaxrs/pom.xml
@@ -19,13 +19,12 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.9.2-SNAPSHOT</version>
+        <version>0.9.3-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-jaxrs</artifactId>
     <packaging>jar</packaging>
     <name>killbill-jaxrs</name>
-
     <dependencies>
         <dependency>
             <groupId>com.google.code.findbugs</groupId>
@@ -82,6 +81,16 @@
         </dependency>
         <dependency>
             <groupId>org.kill-bill.commons</groupId>
+            <artifactId>killbill-embeddeddb-h2</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.kill-bill.commons</groupId>
+            <artifactId>killbill-embeddeddb-mysql</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.kill-bill.commons</groupId>
             <artifactId>killbill-queue</artifactId>
         </dependency>
         <dependency>

junction/pom.xml 12(+11 -1)

diff --git a/junction/pom.xml b/junction/pom.xml
index 5db4c5e..d45b017 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.9.2-SNAPSHOT</version>
+        <version>0.9.3-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-junction</artifactId>
@@ -119,6 +119,16 @@
         </dependency>
         <dependency>
             <groupId>org.kill-bill.commons</groupId>
+            <artifactId>killbill-embeddeddb-h2</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.kill-bill.commons</groupId>
+            <artifactId>killbill-embeddeddb-mysql</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.kill-bill.commons</groupId>
             <artifactId>killbill-queue</artifactId>
         </dependency>
         <dependency>
diff --git a/junction/src/test/java/org/killbill/billing/junction/JunctionTestSuiteWithEmbeddedDB.java b/junction/src/test/java/org/killbill/billing/junction/JunctionTestSuiteWithEmbeddedDB.java
index 7f24b1f..8a4835f 100644
--- a/junction/src/test/java/org/killbill/billing/junction/JunctionTestSuiteWithEmbeddedDB.java
+++ b/junction/src/test/java/org/killbill/billing/junction/JunctionTestSuiteWithEmbeddedDB.java
@@ -16,28 +16,21 @@
 
 package org.killbill.billing.junction;
 
-import java.net.URL;
+import java.io.IOException;
+import java.net.URISyntaxException;
 import java.util.UUID;
 
 import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-
 import org.killbill.billing.GuicyKillbillTestSuiteWithEmbeddedDB;
+import org.killbill.billing.TestKillbillConfigSource;
 import org.killbill.billing.account.api.AccountData;
 import org.killbill.billing.account.api.AccountUserApi;
 import org.killbill.billing.api.TestApiListener;
-import org.killbill.bus.api.PersistentBus;
 import org.killbill.billing.catalog.DefaultCatalogService;
 import org.killbill.billing.catalog.api.Catalog;
 import org.killbill.billing.catalog.api.CatalogService;
 import org.killbill.billing.catalog.api.Currency;
-import org.killbill.clock.ClockMock;
 import org.killbill.billing.entitlement.DefaultEntitlementService;
 import org.killbill.billing.entitlement.EntitlementService;
 import org.killbill.billing.entitlement.api.EntitlementApi;
@@ -46,8 +39,16 @@ import org.killbill.billing.mock.MockAccountBuilder;
 import org.killbill.billing.subscription.api.SubscriptionBaseInternalApi;
 import org.killbill.billing.subscription.api.SubscriptionBaseService;
 import org.killbill.billing.subscription.engine.core.DefaultSubscriptionBaseService;
+import org.killbill.billing.util.KillbillConfigSource;
 import org.killbill.billing.util.callcontext.InternalCallContextFactory;
 import org.killbill.billing.util.svcsapi.bus.BusService;
+import org.killbill.bus.api.PersistentBus;
+import org.killbill.clock.ClockMock;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
 
 import com.google.inject.Guice;
 import com.google.inject.Inject;
@@ -55,7 +56,6 @@ import com.google.inject.Injector;
 import com.google.inject.Stage;
 
 import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertTrue;
 
 public abstract class JunctionTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteWithEmbeddedDB {
 
@@ -88,16 +88,13 @@ public abstract class JunctionTestSuiteWithEmbeddedDB extends GuicyKillbillTestS
 
     protected Catalog catalog;
 
-    private void loadSystemPropertiesFromClasspath(final String resource) {
-        final URL url = JunctionTestSuiteWithEmbeddedDB.class.getResource(resource);
-        Assert.assertNotNull(url);
-
-        configSource.merge(url);
+    @Override
+    protected KillbillConfigSource getConfigSource() throws IOException, URISyntaxException {
+        return new TestKillbillConfigSource("/junction.properties");
     }
 
     @BeforeClass(groups = "slow")
     protected void beforeClass() throws Exception {
-        loadSystemPropertiesFromClasspath("/junction.properties");
         final Injector injector = Guice.createInjector(Stage.PRODUCTION, new TestJunctionModuleWithEmbeddedDB(configSource));
         injector.injectMembers(this);
     }
diff --git a/junction/src/test/resources/junction.properties b/junction/src/test/resources/junction.properties
index b0bdca1..6fc7e6d 100644
--- a/junction/src/test/resources/junction.properties
+++ b/junction/src/test/resources/junction.properties
@@ -1,5 +1 @@
 org.killbill.catalog.uri=file:src/test/resources/catalogTest.xml
-org.killbill.persistent.bus.main.sleep=100
-org.killbill.persistent.bus.main.nbThreads=1
-org.killbill.persistent.bus.main.claimed=1
-user.timezone=UTC

NEWS 5(+5 -0)

diff --git a/NEWS b/NEWS
index a3c72f4..196936b 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,8 @@
+0.9.2
+    Add org.killbill.server.properties property
+    Add default invoice HTML template
+    Better first time experience when using the jetty-console war
+
 0.9.1
     Update packages com.ning -> org.killbill
 

osgi/pom.xml 12(+11 -1)

diff --git a/osgi/pom.xml b/osgi/pom.xml
index 7a18c47..73ca219 100644
--- a/osgi/pom.xml
+++ b/osgi/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.9.2-SNAPSHOT</version>
+        <version>0.9.3-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-osgi</artifactId>
@@ -104,6 +104,16 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>org.kill-bill.commons</groupId>
+            <artifactId>killbill-embeddeddb-h2</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.kill-bill.commons</groupId>
+            <artifactId>killbill-embeddeddb-mysql</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.osgi</groupId>
             <artifactId>org.osgi.compendium</artifactId>
         </dependency>
diff --git a/osgi-bundles/bundles/jruby/pom.xml b/osgi-bundles/bundles/jruby/pom.xml
index 02f451a..2a19d82 100644
--- a/osgi-bundles/bundles/jruby/pom.xml
+++ b/osgi-bundles/bundles/jruby/pom.xml
@@ -20,7 +20,7 @@
     <parent>
         <groupId>org.kill-bill.billing</groupId>
         <artifactId>killbill-osgi-bundles</artifactId>
-        <version>0.9.2-SNAPSHOT</version>
+        <version>0.9.3-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 cc6442a..344ffef 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>org.kill-bill.billing</groupId>
-        <version>0.9.2-SNAPSHOT</version>
+        <version>0.9.3-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 1360266..eb8ac0b 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>org.kill-bill.billing</groupId>
-        <version>0.9.2-SNAPSHOT</version>
+        <version>0.9.3-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 e713012..95fcd57 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>org.kill-bill.billing</groupId>
-        <version>0.9.2-SNAPSHOT</version>
+        <version>0.9.3-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 910a099..35f3577 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>org.kill-bill.billing</groupId>
-        <version>0.9.2-SNAPSHOT</version>
+        <version>0.9.3-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 b084407..83726a3 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>org.kill-bill.billing</groupId>
-        <version>0.9.2-SNAPSHOT</version>
+        <version>0.9.3-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 d0d7158..cacb989 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>org.kill-bill.billing</groupId>
-        <version>0.9.2-SNAPSHOT</version>
+        <version>0.9.3-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 4527b4d..08d3230 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>org.kill-bill.billing</groupId>
-        <version>0.9.2-SNAPSHOT</version>
+        <version>0.9.3-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 d0f60ec..c9c5ec8 100644
--- a/osgi-bundles/pom.xml
+++ b/osgi-bundles/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.9.2-SNAPSHOT</version>
+        <version>0.9.3-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 f1bccdf..da84393 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>org.kill-bill.billing</groupId>
-        <version>0.9.2-SNAPSHOT</version>
+        <version>0.9.3-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 2053ff1..4b158f0 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>org.kill-bill.billing</groupId>
-        <version>0.9.2-SNAPSHOT</version>
+        <version>0.9.3-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 18750a0..5f537e3 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>org.kill-bill.billing</groupId>
-        <version>0.9.2-SNAPSHOT</version>
+        <version>0.9.3-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-osgi-test-bundles</artifactId>

overdue/pom.xml 12(+11 -1)

diff --git a/overdue/pom.xml b/overdue/pom.xml
index 7399bc1..ebb9392 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.9.2-SNAPSHOT</version>
+        <version>0.9.3-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-overdue</artifactId>
@@ -99,6 +99,16 @@
         </dependency>
         <dependency>
             <groupId>org.kill-bill.commons</groupId>
+            <artifactId>killbill-embeddeddb-h2</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.kill-bill.commons</groupId>
+            <artifactId>killbill-embeddeddb-mysql</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.kill-bill.commons</groupId>
             <artifactId>killbill-queue</artifactId>
         </dependency>
         <dependency>
diff --git a/overdue/src/main/java/org/killbill/billing/overdue/OverdueProperties.java b/overdue/src/main/java/org/killbill/billing/overdue/OverdueProperties.java
index 43b18b9..0957140 100644
--- a/overdue/src/main/java/org/killbill/billing/overdue/OverdueProperties.java
+++ b/overdue/src/main/java/org/killbill/billing/overdue/OverdueProperties.java
@@ -24,7 +24,7 @@ import org.killbill.billing.util.config.KillbillConfig;
 
 public interface OverdueProperties extends KillbillConfig {
 
-    @Config("killbill.overdue.uri")
+    @Config("org.killbill.overdue.uri")
     @Default("NoOverdueConfig.xml")
     @Description("Overdue configuration location. Either in the classpath or in the filesystem")
     public String getConfigURI();
diff --git a/overdue/src/test/resources/resource.properties b/overdue/src/test/resources/resource.properties
index 23ed0f6..781b3a8 100644
--- a/overdue/src/test/resources/resource.properties
+++ b/overdue/src/test/resources/resource.properties
@@ -1,5 +1 @@
 org.killbill.catalog.uri=file:src/test/resources/catalogSample.xml
-org.killbill.persistent.bus.main.claimed=1
-user.timezone=UTC
-
-

payment/pom.xml 12(+11 -1)

diff --git a/payment/pom.xml b/payment/pom.xml
index 42aae78..4c8af7f 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.9.2-SNAPSHOT</version>
+        <version>0.9.3-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-payment</artifactId>
@@ -107,6 +107,16 @@
         </dependency>
         <dependency>
             <groupId>org.kill-bill.commons</groupId>
+            <artifactId>killbill-embeddeddb-h2</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.kill-bill.commons</groupId>
+            <artifactId>killbill-embeddeddb-mysql</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.kill-bill.commons</groupId>
             <artifactId>killbill-queue</artifactId>
         </dependency>
         <dependency>
diff --git a/payment/src/test/java/org/killbill/billing/payment/PaymentTestSuiteNoDB.java b/payment/src/test/java/org/killbill/billing/payment/PaymentTestSuiteNoDB.java
index ebf6540..2152a4c 100644
--- a/payment/src/test/java/org/killbill/billing/payment/PaymentTestSuiteNoDB.java
+++ b/payment/src/test/java/org/killbill/billing/payment/PaymentTestSuiteNoDB.java
@@ -16,15 +16,13 @@
 
 package org.killbill.billing.payment;
 
-import java.net.URL;
-
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
+import java.io.IOException;
+import java.net.URISyntaxException;
 
 import org.killbill.billing.GuicyKillbillTestSuiteNoDB;
-import org.killbill.bus.api.PersistentBus;
+import org.killbill.billing.TestKillbillConfigSource;
+import org.killbill.billing.account.api.AccountInternalApi;
+import org.killbill.billing.invoice.api.InvoiceInternalApi;
 import org.killbill.billing.osgi.api.OSGIServiceRegistration;
 import org.killbill.billing.payment.api.PaymentApi;
 import org.killbill.billing.payment.core.PaymentMethodProcessor;
@@ -34,10 +32,14 @@ import org.killbill.billing.payment.plugin.api.PaymentPluginApi;
 import org.killbill.billing.payment.provider.MockPaymentProviderPlugin;
 import org.killbill.billing.payment.retry.FailedPaymentRetryService;
 import org.killbill.billing.payment.retry.PluginFailureRetryService;
+import org.killbill.billing.util.KillbillConfigSource;
 import org.killbill.billing.util.config.PaymentConfig;
-import org.killbill.billing.account.api.AccountInternalApi;
-import org.killbill.billing.invoice.api.InvoiceInternalApi;
+import org.killbill.bus.api.PersistentBus;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.inject.Guice;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
@@ -67,19 +69,15 @@ public abstract class PaymentTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
     @Inject
     protected TestPaymentHelper testHelper;
 
-    private void loadSystemPropertiesFromClasspath(final String resource) {
-        final URL url = PaymentTestSuiteNoDB.class.getResource(resource);
-        Assert.assertNotNull(url);
-
-        configSource.merge(url);
-        configSource.setProperty("org.killbill.payment.provider.default", MockPaymentProviderPlugin.PLUGIN_NAME);
-        configSource.setProperty("killbill.payment.engine.events.off", "false");
+    @Override
+    protected KillbillConfigSource getConfigSource() throws IOException, URISyntaxException {
+        return new TestKillbillConfigSource("/payment.properties",
+                                            ImmutableMap.<String, String>of("org.killbill.payment.provider.default", MockPaymentProviderPlugin.PLUGIN_NAME,
+                                                                            "killbill.payment.engine.events.off", "false"));
     }
 
     @BeforeClass(groups = "fast")
     protected void beforeClass() throws Exception {
-        loadSystemPropertiesFromClasspath("/resource.properties");
-
         final Injector injector = Guice.createInjector(new TestPaymentModuleNoDB(configSource, getClock()));
         injector.injectMembers(this);
     }
diff --git a/payment/src/test/java/org/killbill/billing/payment/PaymentTestSuiteWithEmbeddedDB.java b/payment/src/test/java/org/killbill/billing/payment/PaymentTestSuiteWithEmbeddedDB.java
index 3c2330f..7819d0d 100644
--- a/payment/src/test/java/org/killbill/billing/payment/PaymentTestSuiteWithEmbeddedDB.java
+++ b/payment/src/test/java/org/killbill/billing/payment/PaymentTestSuiteWithEmbeddedDB.java
@@ -16,15 +16,13 @@
 
 package org.killbill.billing.payment;
 
-import java.net.URL;
-
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
+import java.io.IOException;
+import java.net.URISyntaxException;
 
 import org.killbill.billing.GuicyKillbillTestSuiteWithEmbeddedDB;
-import org.killbill.bus.api.PersistentBus;
+import org.killbill.billing.TestKillbillConfigSource;
+import org.killbill.billing.account.api.AccountInternalApi;
+import org.killbill.billing.invoice.api.InvoiceInternalApi;
 import org.killbill.billing.osgi.api.OSGIServiceRegistration;
 import org.killbill.billing.payment.api.PaymentApi;
 import org.killbill.billing.payment.core.PaymentMethodProcessor;
@@ -35,10 +33,14 @@ import org.killbill.billing.payment.plugin.api.PaymentPluginApi;
 import org.killbill.billing.payment.provider.MockPaymentProviderPlugin;
 import org.killbill.billing.payment.retry.FailedPaymentRetryService;
 import org.killbill.billing.payment.retry.PluginFailureRetryService;
+import org.killbill.billing.util.KillbillConfigSource;
 import org.killbill.billing.util.config.PaymentConfig;
-import org.killbill.billing.account.api.AccountInternalApi;
-import org.killbill.billing.invoice.api.InvoiceInternalApi;
+import org.killbill.bus.api.PersistentBus;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.inject.Guice;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
@@ -70,19 +72,15 @@ public abstract class PaymentTestSuiteWithEmbeddedDB extends GuicyKillbillTestSu
     @Inject
     protected TestPaymentHelper testHelper;
 
-    private void loadSystemPropertiesFromClasspath(final String resource) {
-        final URL url = PaymentTestSuiteNoDB.class.getResource(resource);
-        Assert.assertNotNull(url);
-
-        configSource.merge(url);
-        configSource.setProperty("org.killbill.payment.provider.default", MockPaymentProviderPlugin.PLUGIN_NAME);
-        configSource.setProperty("killbill.payment.engine.events.off", "false");
+    @Override
+    protected KillbillConfigSource getConfigSource() throws IOException, URISyntaxException {
+        return new TestKillbillConfigSource("/payment.properties",
+                                            ImmutableMap.<String, String>of("org.killbill.payment.provider.default", MockPaymentProviderPlugin.PLUGIN_NAME,
+                                                                            "killbill.payment.engine.events.off", "false"));
     }
 
     @BeforeClass(groups = "slow")
     protected void beforeClass() throws Exception {
-        loadSystemPropertiesFromClasspath("/resource.properties");
-
         final Injector injector = Guice.createInjector(new TestPaymentModuleWithEmbeddedDB(configSource, getClock()));
         injector.injectMembers(this);
     }
diff --git a/payment/src/test/resources/payment.properties b/payment/src/test/resources/payment.properties
index 41775d7..34337a0 100644
--- a/payment/src/test/resources/payment.properties
+++ b/payment/src/test/resources/payment.properties
@@ -1,4 +1,3 @@
-killbill.payment.failure.retry.start.sec=3600
-killbill.payment.failure.retry.multiplier=1
-killbill.payment.failure.retry.max.attempts=3
-org.killbill.persistent.bus.main.claimed=1
+org.killbill.payment.failure.retry.start.sec=3600
+org.killbill.payment.failure.retry.multiplier=1
+org.killbill.payment.failure.retry.max.attempts=3

pom.xml 2(+1 -1)

diff --git a/pom.xml b/pom.xml
index 45ea3bf..eb74d3e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -22,7 +22,7 @@
         <version>0.5.30-usage</version>
     </parent>
     <artifactId>killbill</artifactId>
-    <version>0.9.2-SNAPSHOT</version>
+    <version>0.9.3-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 0ad1aac..7828183 100644
--- a/server/pom.xml
+++ b/server/pom.xml
@@ -19,7 +19,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.9.2-SNAPSHOT</version>
+        <version>0.9.3-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-server</artifactId>
diff --git a/server/src/main/java/org/killbill/billing/server/filters/KillbillGuiceFilter.java b/server/src/main/java/org/killbill/billing/server/filters/KillbillGuiceFilter.java
index b137ff6..8796a52 100644
--- a/server/src/main/java/org/killbill/billing/server/filters/KillbillGuiceFilter.java
+++ b/server/src/main/java/org/killbill/billing/server/filters/KillbillGuiceFilter.java
@@ -19,19 +19,18 @@ package org.killbill.billing.server.filters;
 import javax.servlet.FilterConfig;
 import javax.servlet.ServletException;
 
+import org.killbill.billing.server.updatechecker.UpdateChecker;
+import org.skife.config.ConfigSource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.killbill.billing.server.updatechecker.UpdateChecker;
-
+import com.google.inject.Injector;
 import com.google.inject.servlet.GuiceFilter;
 
 public class KillbillGuiceFilter extends GuiceFilter {
 
     private static final Logger log = LoggerFactory.getLogger(KillbillGuiceFilter.class);
 
-    private final UpdateChecker checker = new UpdateChecker();
-
     @Override
     public void init(final FilterConfig filterConfig) throws ServletException {
         super.init(filterConfig);
@@ -39,6 +38,10 @@ public class KillbillGuiceFilter extends GuiceFilter {
         // At this point, Kill Bill server is fully initialized
         log.info("Kill Bill server has started");
 
+        // The magic happens in KillbillGuiceListener
+        final Injector injector = (Injector) filterConfig.getServletContext().getAttribute(Injector.class.getName());
+        final ConfigSource configSource = injector.getInstance(ConfigSource.class);
+        final UpdateChecker checker = new UpdateChecker(configSource);
         checker.check(filterConfig.getServletContext());
     }
 }
diff --git a/server/src/main/java/org/killbill/billing/server/listeners/KillbillGuiceListener.java b/server/src/main/java/org/killbill/billing/server/listeners/KillbillGuiceListener.java
index 853185d..87fc64b 100644
--- a/server/src/main/java/org/killbill/billing/server/listeners/KillbillGuiceListener.java
+++ b/server/src/main/java/org/killbill/billing/server/listeners/KillbillGuiceListener.java
@@ -26,27 +26,28 @@ import javax.servlet.ServletContextEvent;
 import org.killbill.billing.beatrix.lifecycle.DefaultLifecycle;
 import org.killbill.billing.jaxrs.resources.JaxRsResourceBase;
 import org.killbill.billing.jaxrs.util.KillbillEventHandler;
-import org.killbill.billing.server.config.DaoConfig;
 import org.killbill.billing.server.config.KillbillServerConfig;
 import org.killbill.billing.server.healthchecks.KillbillHealthcheck;
 import org.killbill.billing.server.modules.KillbillServerModule;
 import org.killbill.billing.server.security.TenantFilter;
+import org.killbill.billing.util.KillbillConfigSource;
 import org.killbill.billing.util.jackson.ObjectMapper;
 import org.killbill.billing.util.svcsapi.bus.BusService;
 import org.killbill.bus.api.PersistentBus;
 import org.killbill.commons.embeddeddb.EmbeddedDB;
 import org.killbill.commons.skeleton.listeners.GuiceServletContextListener;
 import org.killbill.commons.skeleton.modules.BaseServerModuleBuilder;
-import org.killbill.commons.skeleton.modules.ConfigModule;
 import org.killbill.commons.skeleton.modules.JMXModule;
 import org.killbill.commons.skeleton.modules.JaxrsJacksonModule;
 import org.killbill.commons.skeleton.modules.StatsModule;
 import org.killbill.notificationq.api.NotificationQueueService;
+import org.skife.config.ConfigSource;
 import org.skife.config.ConfigurationObjectFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.codahale.metrics.MetricRegistry;
+import com.codahale.metrics.health.HealthCheck;
 import com.codahale.metrics.health.HealthCheckRegistry;
 import com.codahale.metrics.servlets.HealthCheckServlet;
 import com.codahale.metrics.servlets.MetricsServlet;
@@ -59,10 +60,12 @@ import net.sf.ehcache.management.ManagementService;
 
 public class KillbillGuiceListener extends GuiceServletContextListener {
 
-    public static final Logger logger = LoggerFactory.getLogger(KillbillGuiceListener.class);
+    private static final Logger logger = LoggerFactory.getLogger(KillbillGuiceListener.class);
+
+    public static final ImmutableList<String> METRICS_SERVLETS_PATHS = ImmutableList.<String>of("/1.0/healthcheck", "/1.0/metrics", "/1.0/ping", "/1.0/threads");
 
     private KillbillServerConfig config;
-    private DaoConfig daoConfig;
+    private ConfigSource configSource;
     private Injector injector;
     private DefaultLifecycle killbillLifecycle;
     private BusService killbillBusService;
@@ -70,7 +73,7 @@ public class KillbillGuiceListener extends GuiceServletContextListener {
     private EmbeddedDB embeddedDB;
 
     protected Module getModule(final ServletContext servletContext) {
-        return new KillbillServerModule(servletContext, daoConfig, config.isTestModeEnabled());
+        return new KillbillServerModule(servletContext, config, configSource);
     }
 
     private void registerMBeansForCache(final CacheManager cacheManager) {
@@ -82,8 +85,8 @@ public class KillbillGuiceListener extends GuiceServletContextListener {
 
     @Override
     public void contextInitialized(final ServletContextEvent event) {
-        config = new ConfigurationObjectFactory(System.getProperties()).build(KillbillServerConfig.class);
-        daoConfig = new ConfigurationObjectFactory(System.getProperties()).build(DaoConfig.class);
+        configSource = new KillbillConfigSource();
+        config = new ConfigurationObjectFactory(configSource).build(KillbillServerConfig.class);
 
         // Don't filter all requests through Jersey, only the JAX-RS APIs (otherwise,
         // things like static resources, favicon, etc. are 404'ed)
@@ -96,10 +99,13 @@ public class KillbillGuiceListener extends GuiceServletContextListener {
         }
 
         guiceModules = ImmutableList.<Module>of(builder.build(),
-                                                new ConfigModule(KillbillServerConfig.class, DaoConfig.class),
                                                 new JaxrsJacksonModule(new ObjectMapper()),
                                                 new JMXModule(KillbillHealthcheck.class, NotificationQueueService.class, PersistentBus.class),
-                                                new StatsModule(KillbillHealthcheck.class),
+                                                new StatsModule(METRICS_SERVLETS_PATHS.get(0),
+                                                                METRICS_SERVLETS_PATHS.get(1),
+                                                                METRICS_SERVLETS_PATHS.get(2),
+                                                                METRICS_SERVLETS_PATHS.get(3),
+                                                                ImmutableList.<Class<? extends HealthCheck>>of(KillbillHealthcheck.class)),
                                                 getModule(event.getServletContext()));
 
         super.contextInitialized(event);
diff --git a/server/src/main/java/org/killbill/billing/server/modules/KillbillServerModule.java b/server/src/main/java/org/killbill/billing/server/modules/KillbillServerModule.java
index d145ce6..7f4e5ed 100644
--- a/server/src/main/java/org/killbill/billing/server/modules/KillbillServerModule.java
+++ b/server/src/main/java/org/killbill/billing/server/modules/KillbillServerModule.java
@@ -48,6 +48,7 @@ import org.killbill.billing.payment.glue.PaymentModule;
 import org.killbill.billing.server.DefaultServerService;
 import org.killbill.billing.server.ServerService;
 import org.killbill.billing.server.config.DaoConfig;
+import org.killbill.billing.server.config.KillbillServerConfig;
 import org.killbill.billing.server.notifications.PushNotificationListener;
 import org.killbill.billing.subscription.glue.DefaultSubscriptionModule;
 import org.killbill.billing.tenant.glue.TenantModule;
@@ -72,7 +73,7 @@ import org.killbill.clock.Clock;
 import org.killbill.clock.ClockMock;
 import org.killbill.commons.embeddeddb.EmbeddedDB;
 import org.skife.config.ConfigSource;
-import org.skife.config.SimplePropertyConfigSource;
+import org.skife.config.ConfigurationObjectFactory;
 import org.skife.jdbi.v2.DBI;
 import org.skife.jdbi.v2.IDBI;
 
@@ -81,13 +82,14 @@ import com.google.inject.AbstractModule;
 public class KillbillServerModule extends AbstractModule {
 
     protected final ServletContext servletContext;
-    private final DaoConfig daoConfig;
-    private final boolean isTestModeEnabled;
 
-    public KillbillServerModule(final ServletContext servletContext, final DaoConfig daoConfig, final boolean testModeEnabled) {
+    private final KillbillServerConfig serverConfig;
+    private final ConfigSource configSource;
+
+    public KillbillServerModule(final ServletContext servletContext, final KillbillServerConfig serverConfig, final ConfigSource configSource) {
         this.servletContext = servletContext;
-        this.daoConfig = daoConfig;
-        this.isTestModeEnabled = testModeEnabled;
+        this.serverConfig = serverConfig;
+        this.configSource = configSource;
     }
 
     @Override
@@ -135,7 +137,7 @@ public class KillbillServerModule extends AbstractModule {
     }
 
     protected void installClock() {
-        if (isTestModeEnabled) {
+        if (serverConfig.isTestModeEnabled()) {
             bind(Clock.class).to(ClockMock.class).asEagerSingleton();
             bind(TestResource.class).asEagerSingleton();
         } else {
@@ -144,7 +146,10 @@ public class KillbillServerModule extends AbstractModule {
     }
 
     protected void installKillbillModules() {
-        final ConfigSource configSource = new SimplePropertyConfigSource(System.getProperties());
+        bind(ConfigSource.class).toInstance(configSource);
+        bind(KillbillServerConfig.class).toInstance(serverConfig);
+        final DaoConfig daoConfig = new ConfigurationObjectFactory(configSource).build(DaoConfig.class);
+        bind(DaoConfig.class).toInstance(daoConfig);
 
         // TODO Pierre Refactor GlobalLockerModule for this to be a real provider?
         final EmbeddedDBProvider embeddedDBProvider = new EmbeddedDBProvider(daoConfig);
@@ -179,7 +184,7 @@ public class KillbillServerModule extends AbstractModule {
         install(new RecordIdModule());
         install(new KillBillShiroWebModule(servletContext, configSource));
         install(new KillBillShiroAopModule());
-        install(new SecurityModule());
+        install(new SecurityModule(configSource));
         installClock();
     }
 }
diff --git a/server/src/main/java/org/killbill/billing/server/security/KillbillJdbcRealm.java b/server/src/main/java/org/killbill/billing/server/security/KillbillJdbcRealm.java
index 406f580..ddaa9eb 100644
--- a/server/src/main/java/org/killbill/billing/server/security/KillbillJdbcRealm.java
+++ b/server/src/main/java/org/killbill/billing/server/security/KillbillJdbcRealm.java
@@ -25,7 +25,6 @@ import org.apache.shiro.realm.jdbc.JdbcRealm;
 import org.apache.shiro.util.ByteSource;
 import org.killbill.billing.server.config.DaoConfig;
 import org.killbill.billing.tenant.security.KillbillCredentialsMatcher;
-import org.skife.config.ConfigurationObjectFactory;
 
 import com.jolbox.bonecp.BoneCPConfig;
 import com.jolbox.bonecp.BoneCPDataSource;
@@ -37,8 +36,13 @@ public class KillbillJdbcRealm extends JdbcRealm {
 
     private static final String KILLBILL_AUTHENTICATION_QUERY = "select api_secret, api_salt from tenants where api_key = ?";
 
-    public KillbillJdbcRealm() {
+    private final DaoConfig config;
+
+    public KillbillJdbcRealm(final DaoConfig config) {
         super();
+
+        this.config = config;
+
         configureSecurity();
         configureQueries();
         configureDataSource();
@@ -65,9 +69,6 @@ public class KillbillJdbcRealm extends JdbcRealm {
     }
 
     private void configureDataSource() {
-        // This class is initialized by Shiro, not Guice - we need to retrieve the config manually
-        final DaoConfig config = new ConfigurationObjectFactory(System.getProperties()).build(DaoConfig.class);
-
         final BoneCPConfig dbConfig = new BoneCPConfig();
         dbConfig.setJdbcUrl(config.getJdbcUrl());
         dbConfig.setUsername(config.getUsername());
diff --git a/server/src/main/java/org/killbill/billing/server/security/TenantFilter.java b/server/src/main/java/org/killbill/billing/server/security/TenantFilter.java
index ed76073..6ff2055 100644
--- a/server/src/main/java/org/killbill/billing/server/security/TenantFilter.java
+++ b/server/src/main/java/org/killbill/billing/server/security/TenantFilter.java
@@ -34,13 +34,14 @@ import org.apache.shiro.authc.AuthenticationToken;
 import org.apache.shiro.authc.UsernamePasswordToken;
 import org.apache.shiro.authc.pam.ModularRealmAuthenticator;
 import org.apache.shiro.realm.Realm;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.killbill.billing.jaxrs.resources.JaxrsResource;
+import org.killbill.billing.server.config.DaoConfig;
+import org.killbill.billing.server.listeners.KillbillGuiceListener;
 import org.killbill.billing.tenant.api.Tenant;
 import org.killbill.billing.tenant.api.TenantApiException;
 import org.killbill.billing.tenant.api.TenantUserApi;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.google.common.collect.ImmutableList;
 
@@ -55,21 +56,20 @@ public class TenantFilter implements Filter {
     @Inject
     private TenantUserApi tenantUserApi;
 
-    private final ModularRealmAuthenticator modularRealmAuthenticator;
+    @Inject
+    private DaoConfig daoConfig;
 
-    public TenantFilter() {
-        final Realm killbillJdbcRealm = new KillbillJdbcRealm();
+    private ModularRealmAuthenticator modularRealmAuthenticator;
 
+    @Override
+    public void init(final FilterConfig filterConfig) throws ServletException {
+        final Realm killbillJdbcRealm = new KillbillJdbcRealm(daoConfig);
         // We use Shiro to verify the api credentials - but the Shiro Subject is only used for RBAC
         modularRealmAuthenticator = new ModularRealmAuthenticator();
         modularRealmAuthenticator.setRealms(ImmutableList.<Realm>of(killbillJdbcRealm));
     }
 
     @Override
-    public void init(final FilterConfig filterConfig) throws ServletException {
-    }
-
-    @Override
     public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
         if (shouldSkipFilter(request)) {
             chain.doFilter(request, response);
@@ -121,11 +121,16 @@ public class TenantFilter implements Filter {
     private boolean shouldSkipFilter(final ServletRequest request) {
         boolean shouldSkip = false;
 
-        // Chicken - egg problem
         if (request instanceof HttpServletRequest) {
             final HttpServletRequest httpServletRequest = (HttpServletRequest) request;
             final String path = httpServletRequest.getRequestURI();
-            if ("/1.0/kb/tenants".equals(path) && "POST".equals(httpServletRequest.getMethod())) {
+            if (    // Chicken - egg problem
+                    ("/1.0/kb/tenants".equals(path) && "POST".equals(httpServletRequest.getMethod())) ||
+                    // Metrics servlets
+                    (KillbillGuiceListener.METRICS_SERVLETS_PATHS.contains(path) && "GET".equals(httpServletRequest.getMethod())) ||
+                    // Welcome screen, static resources, etc.
+                    (!path.startsWith("/1.0") && "GET".equals(httpServletRequest.getMethod()))
+               ) {
                 shouldSkip = true;
             }
         }
diff --git a/server/src/main/java/org/killbill/billing/server/updatechecker/ClientInfo.java b/server/src/main/java/org/killbill/billing/server/updatechecker/ClientInfo.java
index 5e4ff67..8d96e8d 100644
--- a/server/src/main/java/org/killbill/billing/server/updatechecker/ClientInfo.java
+++ b/server/src/main/java/org/killbill/billing/server/updatechecker/ClientInfo.java
@@ -17,10 +17,12 @@
 package org.killbill.billing.server.updatechecker;
 
 import java.net.InetAddress;
-import java.util.Properties;
 
 import javax.servlet.ServletContext;
 
+import org.skife.config.ConfigSource;
+
+import com.google.common.base.Objects;
 import com.google.common.base.StandardSystemProperty;
 import com.google.common.base.Strings;
 
@@ -40,17 +42,17 @@ public class ClientInfo {
     static {
         try {
             CLIENT_ID = InetAddress.getLocalHost().hashCode();
-        } catch (Throwable t) {
+        } catch (final Throwable t) {
             CLIENT_ID = 0;
         }
     }
 
     private final ServletContext servletContext;
-    private final Properties props;
+    private final ConfigSource props;
 
-    public ClientInfo(final ServletContext servletContext) {
+    public ClientInfo(final ConfigSource configSource, final ServletContext servletContext) {
         this.servletContext = servletContext;
-        this.props = System.getProperties();
+        this.props = configSource;
     }
 
     public String getServletMajorVersion() {
@@ -150,7 +152,7 @@ public class ClientInfo {
     }
 
     private String getProperty(final StandardSystemProperty standardKey) {
-        return getSanitizedString(props.getProperty(standardKey.key(), UNKNOWN));
+        return getSanitizedString(Objects.firstNonNull(props.getString(standardKey.key()), UNKNOWN));
     }
 
     private String getSanitizedString(final String string) {
diff --git a/server/src/main/java/org/killbill/billing/server/updatechecker/Tracker.java b/server/src/main/java/org/killbill/billing/server/updatechecker/Tracker.java
index f56f4fd..d49a101 100644
--- a/server/src/main/java/org/killbill/billing/server/updatechecker/Tracker.java
+++ b/server/src/main/java/org/killbill/billing/server/updatechecker/Tracker.java
@@ -18,11 +18,10 @@ package org.killbill.billing.server.updatechecker;
 
 import javax.servlet.ServletContext;
 
+import org.skife.config.ConfigSource;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.killbill.billing.server.config.UpdateCheckConfig;
-
 import com.dmurph.tracking.AnalyticsConfigData;
 import com.dmurph.tracking.JGoogleAnalyticsTracker;
 import com.dmurph.tracking.JGoogleAnalyticsTracker.GoogleAnalyticsVersion;
@@ -38,9 +37,9 @@ public class Tracker {
     private final ClientInfo clientInfo;
     private final JGoogleAnalyticsTracker tracker;
 
-    public Tracker(final ProductInfo productInfo, final ServletContext context) {
+    public Tracker(final ConfigSource configSource, final ProductInfo productInfo, final ServletContext context) {
         this.productInfo = productInfo;
-        this.clientInfo = new ClientInfo(context);
+        this.clientInfo = new ClientInfo(configSource, context);
 
         final AnalyticsConfigData analyticsConfigData = new AnalyticsConfigData(TRACKING_CODE);
         this.tracker = new JGoogleAnalyticsTracker(analyticsConfigData, GoogleAnalyticsVersion.V_4_7_2);
diff --git a/server/src/main/java/org/killbill/billing/server/updatechecker/UpdateChecker.java b/server/src/main/java/org/killbill/billing/server/updatechecker/UpdateChecker.java
index a19326f..b639608 100644
--- a/server/src/main/java/org/killbill/billing/server/updatechecker/UpdateChecker.java
+++ b/server/src/main/java/org/killbill/billing/server/updatechecker/UpdateChecker.java
@@ -20,17 +20,23 @@ import java.io.IOException;
 
 import javax.servlet.ServletContext;
 
+import org.killbill.billing.server.config.UpdateCheckConfig;
+import org.skife.config.ConfigSource;
 import org.skife.config.ConfigurationObjectFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.killbill.billing.server.config.UpdateCheckConfig;
-
 public class UpdateChecker {
 
     private static final Logger log = LoggerFactory.getLogger(UpdateChecker.class);
 
-    final UpdateCheckConfig config = new ConfigurationObjectFactory(System.getProperties()).build(UpdateCheckConfig.class);
+    private final ConfigSource configSource;
+    private final UpdateCheckConfig config;
+
+    public UpdateChecker(final ConfigSource configSource) {
+        this.configSource = configSource;
+        this.config = new ConfigurationObjectFactory(configSource).build(UpdateCheckConfig.class);
+    }
 
     public void check(final ServletContext servletContext) {
         log.info("For Kill Bill Commercial Support, visit http://thebillingproject.com or send an email to support@thebillingproject.com");
@@ -44,7 +50,7 @@ public class UpdateChecker {
             public void run() {
                 try {
                     doCheck(servletContext);
-                } catch (IOException e) {
+                } catch (final IOException e) {
                     // Don't pollute logs, maybe no internet access?
                     log.debug("Unable to perform update check", e);
                 }
@@ -88,11 +94,10 @@ public class UpdateChecker {
         }
 
         // Send anonymous data
-        final Tracker tracker = new Tracker(productInfo, servletContext);
+        final Tracker tracker = new Tracker(configSource, productInfo, servletContext);
         tracker.track();
     }
 
-
     private boolean shouldSkipUpdateCheck() {
         if (config.shouldSkipUpdateCheck()) {
             return true;
@@ -101,7 +106,7 @@ public class UpdateChecker {
         try {
             Class.forName("org.testng.Assert");
             return true;
-        } catch (ClassNotFoundException e) {
+        } catch (final ClassNotFoundException e) {
             return false;
         }
     }
diff --git a/server/src/main/resources/killbill-server.properties b/server/src/main/resources/killbill-server.properties
index 3d85b58..9254ec7 100644
--- a/server/src/main/resources/killbill-server.properties
+++ b/server/src/main/resources/killbill-server.properties
@@ -23,12 +23,6 @@ org.killbill.dao.password=root
 # Use the SpyCarAdvanced.xml catalog
 org.killbill.catalog.uri=SpyCarAdvanced.xml
 
-# Set default timezone to UTC
-user.timezone=UTC
-
-# For bundles that use antlr (string template)
-ANTLR_USE_DIRECT_CLASS_LOADING=true
-
 # To enable test endpoint and have Kill Bill run with a ClockMock
 org.killbill.server.test.mode=true
 
@@ -42,8 +36,6 @@ org.killbill.persistent.bus.main.claimed=1
 org.killbill.persistent.bus.external.sleep=100
 org.killbill.persistent.bus.external.nbThreads=1
 org.killbill.persistent.bus.external.claimed=1
-org.killbill.persistent.bus.external.tableName=bus_ext_events
-org.killbill.persistent.bus.external.historyTableName=bus_ext_events_history
 
 org.killbill.server.multitenant=false
 
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 cec6222..859fa48 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
@@ -3,11 +3,21 @@
 
 ### 0.9.x series ###
 
-## 0.9.1 -- latest release
-0.9.1.updates           =
-0.9.1.notices           = This is an unstable release
+## 0.9.2 -- latest release
+0.9.2.updates           =
+0.9.2.notices           = This is an unstable release
+0.9.2.release-notes     = http://kill-bill.org
+
+## 0.9.1
+0.9.1.updates           = 0.9.2
+0.9.1.notices           = We recommend upgrading to 0.9.2
 0.9.1.release-notes     = http://kill-bill.org
 
+## 0.9.0
+0.9.0.updates           = 0.9.2
+0.9.0.notices           = We recommend upgrading to 0.9.2
+0.9.0.release-notes     = http://kill-bill.org
+
 ### 0.8.x series ###
 
 ## 0.8.13 -- latest stable release
diff --git a/server/src/test/java/org/killbill/billing/jaxrs/TestJaxrsBase.java b/server/src/test/java/org/killbill/billing/jaxrs/TestJaxrsBase.java
index a1845ec..3e4aa16 100644
--- a/server/src/test/java/org/killbill/billing/jaxrs/TestJaxrsBase.java
+++ b/server/src/test/java/org/killbill/billing/jaxrs/TestJaxrsBase.java
@@ -17,7 +17,7 @@
 package org.killbill.billing.jaxrs;
 
 import java.io.IOException;
-import java.net.URL;
+import java.net.URISyntaxException;
 import java.util.EventListener;
 import java.util.Iterator;
 import java.util.Map;
@@ -31,7 +31,7 @@ import org.eclipse.jetty.servlet.FilterHolder;
 import org.joda.time.LocalDate;
 import org.killbill.billing.DBTestingHelper;
 import org.killbill.billing.GuicyKillbillTestWithEmbeddedDBModule;
-import org.killbill.billing.KillbillConfigSource;
+import org.killbill.billing.TestKillbillConfigSource;
 import org.killbill.billing.account.glue.DefaultAccountModule;
 import org.killbill.billing.api.TestApiListener;
 import org.killbill.billing.beatrix.glue.BeatrixModule;
@@ -53,12 +53,14 @@ import org.killbill.billing.overdue.glue.DefaultOverdueModule;
 import org.killbill.billing.payment.glue.PaymentModule;
 import org.killbill.billing.payment.provider.MockPaymentProviderPluginModule;
 import org.killbill.billing.server.config.DaoConfig;
+import org.killbill.billing.server.config.KillbillServerConfig;
 import org.killbill.billing.server.listeners.KillbillGuiceListener;
 import org.killbill.billing.server.modules.KillBillShiroWebModule;
 import org.killbill.billing.server.modules.KillbillServerModule;
 import org.killbill.billing.subscription.glue.DefaultSubscriptionModule;
 import org.killbill.billing.tenant.glue.TenantModule;
 import org.killbill.billing.usage.glue.UsageModule;
+import org.killbill.billing.util.KillbillConfigSource;
 import org.killbill.billing.util.cache.CacheControllerDispatcher;
 import org.killbill.billing.util.config.PaymentConfig;
 import org.killbill.billing.util.email.EmailModule;
@@ -89,8 +91,6 @@ import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.inject.Module;
 
-import static org.testng.Assert.assertNotNull;
-
 public class TestJaxrsBase extends KillbillClient {
 
     protected static final String PLUGIN_NAME = "noop";
@@ -102,8 +102,7 @@ public class TestJaxrsBase extends KillbillClient {
     protected CacheControllerDispatcher cacheControllerDispatcher;
 
     @Inject
-    protected @javax.inject.Named(BeatrixModule.EXTERNAL_BUS)
-    PersistentBus externalBus;
+    protected @javax.inject.Named(BeatrixModule.EXTERNAL_BUS) PersistentBus externalBus;
 
     @Inject
     protected PersistentBus internalBus;
@@ -111,33 +110,33 @@ public class TestJaxrsBase extends KillbillClient {
     @Inject
     protected TestApiListener busHandler;
 
+    protected DaoConfig daoConfig;
+    protected KillbillServerConfig serverConfig;
+
     protected static TestKillbillGuiceListener listener;
 
     protected HttpServerConfig config;
     private HttpServer server;
 
-    public static void loadSystemPropertiesFromClasspath(final String resource) {
-        final URL url = TestJaxrsBase.class.getResource(resource);
-        assertNotNull(url);
-        try {
-            System.getProperties().load(url.openStream());
-        } catch (final IOException e) {
-            throw new RuntimeException(e);
-        }
+    @Override
+    protected KillbillConfigSource getConfigSource() throws IOException, URISyntaxException {
+        return new TestKillbillConfigSource("/killbill.properties");
     }
 
-    public static class TestKillbillGuiceListener extends KillbillGuiceListener {
+    public class TestKillbillGuiceListener extends KillbillGuiceListener {
 
-        private final DaoConfig daoConfig;
+        private final KillbillServerConfig serverConfig;
+        private final ConfigSource configSource;
 
-        public TestKillbillGuiceListener(final DaoConfig daoConfig) {
+        public TestKillbillGuiceListener(final KillbillServerConfig serverConfig, final ConfigSource configSource) {
             super();
-            this.daoConfig = daoConfig;
+            this.serverConfig = serverConfig;
+            this.configSource = configSource;
         }
 
         @Override
         protected Module getModule(final ServletContext servletContext) {
-            return new TestKillbillServerModule(daoConfig, servletContext);
+            return new TestKillbillServerModule(servletContext, serverConfig, configSource);
         }
 
     }
@@ -154,10 +153,10 @@ public class TestJaxrsBase extends KillbillClient {
         }
     }
 
-    public static class TestKillbillServerModule extends KillbillServerModule {
+    public class TestKillbillServerModule extends KillbillServerModule {
 
-        public TestKillbillServerModule(final DaoConfig daoConfig, final ServletContext servletContext) {
-            super(servletContext, daoConfig, false);
+        public TestKillbillServerModule(final ServletContext servletContext, final KillbillServerConfig serverConfig, final ConfigSource configSource) {
+            super(servletContext, serverConfig, configSource);
         }
 
         @Override
@@ -170,7 +169,7 @@ public class TestJaxrsBase extends KillbillClient {
             // Already done By Top test class
         }
 
-        private static final class PaymentMockModule extends PaymentModule {
+        private final class PaymentMockModule extends PaymentModule {
 
             public PaymentMockModule(final ConfigSource configSource) {
                 super(configSource);
@@ -184,8 +183,6 @@ public class TestJaxrsBase extends KillbillClient {
 
         @Override
         protected void installKillbillModules() {
-            final KillbillConfigSource configSource = new KillbillConfigSource(System.getProperties());
-
             /*
              * For a lack of getting module override working, copy all install modules from parent class...
              *
@@ -193,6 +190,10 @@ public class TestJaxrsBase extends KillbillClient {
             Modules.override(new org.killbill.billing.payment.setup.PaymentModule()).with(new PaymentMockModule());
             */
 
+            bind(ConfigSource.class).toInstance(configSource);
+            bind(KillbillServerConfig.class).toInstance(serverConfig);
+            bind(DaoConfig.class).toInstance(daoConfig);
+
             install(new GuicyKillbillTestWithEmbeddedDBModule());
 
             install(new EmailModule(configSource));
@@ -224,7 +225,7 @@ public class TestJaxrsBase extends KillbillClient {
             installClock();
             install(new KillBillShiroWebModule(servletContext, configSource));
             install(new KillBillShiroAopModule());
-            install(new SecurityModule());
+            install(new SecurityModule(configSource));
         }
     }
 
@@ -285,29 +286,29 @@ public class TestJaxrsBase extends KillbillClient {
 
     @BeforeClass(groups = "slow")
     public void beforeClass() throws Exception {
-        loadConfig();
-
-        listener.getInstantiatedInjector().injectMembers(this);
-    }
-
-    protected void loadConfig() {
+        // TODO PIERRE Unclear why both are needed in beforeClass and beforeSuite
         if (config == null) {
             config = new ConfigurationObjectFactory(System.getProperties()).build(HttpServerConfig.class);
         }
-
-        // For shiro (outside of Guice control)
-        System.setProperty("org.killbill.dao.url", DBTestingHelper.get().getJdbcConnectionString());
-        System.setProperty("org.killbill.dao.user", DBTestingHelper.get().getUsername());
-        System.setProperty("org.killbill.dao.password", DBTestingHelper.get().getPassword());
+        if (daoConfig == null) {
+            daoConfig = new ConfigurationObjectFactory(configSource).build(DaoConfig.class);
+        }
+        listener.getInstantiatedInjector().injectMembers(this);
     }
 
     @BeforeSuite(groups = "slow")
     public void beforeSuite() throws Exception {
         super.beforeSuite();
-        loadSystemPropertiesFromClasspath("/killbill.properties");
-        loadConfig();
 
-        listener = new TestKillbillGuiceListener(new ConfigurationObjectFactory(System.getProperties()).build(DaoConfig.class));
+        if (config == null) {
+            config = new ConfigurationObjectFactory(System.getProperties()).build(HttpServerConfig.class);
+        }
+        if (daoConfig == null) {
+            daoConfig = new ConfigurationObjectFactory(configSource).build(DaoConfig.class);
+        }
+
+        serverConfig = new ConfigurationObjectFactory(configSource).build(KillbillServerConfig.class);
+        listener = new TestKillbillGuiceListener(serverConfig, configSource);
 
         server = new HttpServer();
         server.configure(config, getListeners(), getFilters());
diff --git a/server/src/test/java/org/killbill/billing/jaxrs/TestOverdue.java b/server/src/test/java/org/killbill/billing/jaxrs/TestOverdue.java
index a473a9d..87e9b83 100644
--- a/server/src/test/java/org/killbill/billing/jaxrs/TestOverdue.java
+++ b/server/src/test/java/org/killbill/billing/jaxrs/TestOverdue.java
@@ -17,14 +17,17 @@
 package org.killbill.billing.jaxrs;
 
 import java.math.BigDecimal;
+import java.util.Comparator;
 import java.util.List;
 
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
 import org.killbill.billing.client.model.Account;
 import org.killbill.billing.client.model.Invoice;
+import org.killbill.billing.client.model.Invoices;
 import org.killbill.billing.client.model.Payment;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.Ordering;
 
 import static org.testng.Assert.assertEquals;
 
@@ -55,8 +58,17 @@ public class TestOverdue extends TestJaxrsBase {
         crappyWaitForLackOfProperSynchonization();
         Assert.assertEquals(killBillClient.getOverdueStateForAccount(accountJson.getAccountId()).getName(), "OD3");
 
-        // Post external payments
-        for (final Invoice invoice : killBillClient.getInvoicesForAccount(accountJson.getAccountId())) {
+        // Post external payments, paying the most recent invoice first: this is to avoid a race condition where
+        // a refresh overdue notification kicks in after the first payment, which makes the account goes CLEAR and
+        // triggers an AUTO_INVOICE_OFF tag removal (hence adjustment of the other invoices balance).
+        final Invoices invoicesForAccount = killBillClient.getInvoicesForAccount(accountJson.getAccountId());
+        final List<Invoice> mostRecentInvoiceFirst = Ordering.<Invoice>from(new Comparator<Invoice>() {
+            @Override
+            public int compare(final Invoice invoice1, final Invoice invoice2) {
+                return invoice1.getInvoiceDate().compareTo(invoice2.getInvoiceDate());
+            }
+        }).reverse().sortedCopy(invoicesForAccount);
+        for (final Invoice invoice : mostRecentInvoiceFirst) {
             if (invoice.getBalance().compareTo(BigDecimal.ZERO) > 0) {
                 final Payment payment = new Payment();
                 payment.setAccountId(accountJson.getAccountId());
diff --git a/server/src/test/java/org/killbill/billing/server/security/TestKillbillJdbcRealm.java b/server/src/test/java/org/killbill/billing/server/security/TestKillbillJdbcRealm.java
index 5e5e918..d2cbbe2 100644
--- a/server/src/test/java/org/killbill/billing/server/security/TestKillbillJdbcRealm.java
+++ b/server/src/test/java/org/killbill/billing/server/security/TestKillbillJdbcRealm.java
@@ -24,15 +24,14 @@ import org.apache.shiro.authc.UsernamePasswordToken;
 import org.apache.shiro.mgt.DefaultSecurityManager;
 import org.apache.shiro.mgt.SecurityManager;
 import org.apache.shiro.subject.support.DelegatingSubject;
-import org.testng.Assert;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
 import org.killbill.billing.jaxrs.TestJaxrsBase;
 import org.killbill.billing.tenant.api.DefaultTenant;
 import org.killbill.billing.tenant.dao.DefaultTenantDao;
 import org.killbill.billing.tenant.dao.TenantModelDao;
 import org.killbill.billing.util.dao.DefaultNonEntityDao;
+import org.testng.Assert;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
 
 import com.jolbox.bonecp.BoneCPConfig;
 import com.jolbox.bonecp.BoneCPDataSource;
@@ -45,7 +44,6 @@ public class TestKillbillJdbcRealm extends TestJaxrsBase {
     @Override
     @BeforeMethod(groups = "slow")
     public void beforeMethod() throws Exception {
-
         super.beforeMethod();
 
         // Create the tenant
@@ -61,7 +59,7 @@ public class TestKillbillJdbcRealm extends TestJaxrsBase {
         dbConfig.setPassword(helper.getPassword());
 
         final KillbillJdbcRealm jdbcRealm;
-        jdbcRealm = new KillbillJdbcRealm();
+        jdbcRealm = new KillbillJdbcRealm(daoConfig);
         jdbcRealm.setDataSource(new BoneCPDataSource(dbConfig));
 
         securityManager = new DefaultSecurityManager(jdbcRealm);
diff --git a/server/src/test/resources/killbill.properties b/server/src/test/resources/killbill.properties
index 52e5ca9..1949e5a 100644
--- a/server/src/test/resources/killbill.properties
+++ b/server/src/test/resources/killbill.properties
@@ -14,27 +14,11 @@
 # under the License.
 #
 
-# Use killbill util test properties (DbiProvider/MysqltestingHelper) on the test side configured with killbill
-org.killbill.billing.dbi.jdbc.url=jdbc:mysql://127.0.0.1:3306/killbill
-
 org.killbill.catalog.uri=file:src/test/resources/catalogTest.xml
-killbill.overdue.uri=overdue.xml
+org.killbill.overdue.uri=overdue.xml
 
-org.killbill.payment.engine.events.off=false
 org.killbill.payment.retry.days=8,8,8
 
-user.timezone=UTC
-
-org.killbill.core.server.jetty.logPath=/var/tmp/.logs
-
-org.killbill.persistent.bus.main.sleep=100
-org.killbill.persistent.bus.main.nbThreads=1
-org.killbill.persistent.bus.main.claimed=1
-org.killbill.persistent.bus.external.sleep=100
-org.killbill.persistent.bus.external.nbThreads=1
-org.killbill.persistent.bus.external.claimed=1
-org.killbill.persistent.bus.external.tableName=bus_ext_events
-org.killbill.persistent.bus.external.historyTableName=bus_ext_events_history
 # Local DB
 #org.killbill.billing.dbi.test.useLocalDb=true
 
@@ -42,6 +26,3 @@ org.killbill.osgi.bundle.install.dir=/var/tmp/somethingthatdoesnotexist
 
 # Speed up from the (more secure) default
 org.killbill.server.multitenant.hash_iterations=10
-
-ANTLR_USE_DIRECT_CLASS_LOADING=true
-
diff --git a/subscription/pom.xml b/subscription/pom.xml
index cd1b2c8..5cb4726 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.9.2-SNAPSHOT</version>
+        <version>0.9.3-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-subscription</artifactId>
@@ -108,6 +108,16 @@
         </dependency>
         <dependency>
             <groupId>org.kill-bill.commons</groupId>
+            <artifactId>killbill-embeddeddb-h2</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.kill-bill.commons</groupId>
+            <artifactId>killbill-embeddeddb-mysql</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.kill-bill.commons</groupId>
             <artifactId>killbill-queue</artifactId>
         </dependency>
         <dependency>
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteNoDB.java b/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteNoDB.java
index 5a96a8c..2d88272 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteNoDB.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteNoDB.java
@@ -16,26 +16,18 @@
 
 package org.killbill.billing.subscription;
 
-import java.net.URL;
+import java.io.IOException;
+import java.net.URISyntaxException;
 
 import javax.inject.Inject;
 
-import org.mockito.Mockito;
-import org.skife.jdbi.v2.IDBI;
-import org.skife.jdbi.v2.tweak.HandleCallback;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-
 import org.killbill.billing.GuicyKillbillTestSuiteNoDB;
+import org.killbill.billing.TestKillbillConfigSource;
 import org.killbill.billing.account.api.AccountData;
 import org.killbill.billing.api.TestApiListener;
 import org.killbill.billing.catalog.api.Catalog;
 import org.killbill.billing.catalog.api.CatalogService;
-import org.killbill.clock.ClockMock;
+import org.killbill.billing.subscription.api.SubscriptionBaseInternalApi;
 import org.killbill.billing.subscription.api.SubscriptionBaseService;
 import org.killbill.billing.subscription.api.migration.SubscriptionBaseMigrationApi;
 import org.killbill.billing.subscription.api.timeline.SubscriptionBaseTimelineApi;
@@ -45,9 +37,18 @@ import org.killbill.billing.subscription.api.user.TestSubscriptionHelper;
 import org.killbill.billing.subscription.engine.dao.MockSubscriptionDaoMemory;
 import org.killbill.billing.subscription.engine.dao.SubscriptionDao;
 import org.killbill.billing.subscription.glue.TestDefaultSubscriptionModuleNoDB;
+import org.killbill.billing.util.KillbillConfigSource;
 import org.killbill.billing.util.config.SubscriptionConfig;
-import org.killbill.billing.subscription.api.SubscriptionBaseInternalApi;
 import org.killbill.billing.util.svcsapi.bus.BusService;
+import org.killbill.clock.ClockMock;
+import org.mockito.Mockito;
+import org.skife.jdbi.v2.IDBI;
+import org.skife.jdbi.v2.tweak.HandleCallback;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
 
 import com.google.inject.Guice;
 import com.google.inject.Injector;
@@ -95,17 +96,13 @@ public class SubscriptionTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
     protected AccountData accountData;
     protected SubscriptionBaseBundle bundle;
 
-    private void loadSystemPropertiesFromClasspath(final String resource) {
-        final URL url = DefaultSubscriptionTestInitializer.class.getResource(resource);
-        Assert.assertNotNull(url);
-
-        configSource.merge(url);
+    @Override
+    protected KillbillConfigSource getConfigSource() throws IOException, URISyntaxException {
+        return new TestKillbillConfigSource("/subscription.properties");
     }
 
     @BeforeClass(groups = "fast")
     public void beforeClass() throws Exception {
-        loadSystemPropertiesFromClasspath("/subscription.properties");
-
         final Injector g = Guice.createInjector(Stage.PRODUCTION, new TestDefaultSubscriptionModuleNoDB(configSource));
         g.injectMembers(this);
 
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteWithEmbeddedDB.java b/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteWithEmbeddedDB.java
index 148aa1c..0be56d3 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteWithEmbeddedDB.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteWithEmbeddedDB.java
@@ -16,23 +16,17 @@
 
 package org.killbill.billing.subscription;
 
-import java.net.URL;
+import java.io.IOException;
+import java.net.URISyntaxException;
 
 import javax.inject.Inject;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.testng.Assert;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-
 import org.killbill.billing.GuicyKillbillTestSuiteWithEmbeddedDB;
+import org.killbill.billing.TestKillbillConfigSource;
 import org.killbill.billing.account.api.AccountData;
 import org.killbill.billing.api.TestApiListener;
 import org.killbill.billing.catalog.api.Catalog;
 import org.killbill.billing.catalog.api.CatalogService;
-import org.killbill.clock.ClockMock;
 import org.killbill.billing.subscription.api.SubscriptionBaseInternalApi;
 import org.killbill.billing.subscription.api.SubscriptionBaseService;
 import org.killbill.billing.subscription.api.migration.SubscriptionBaseMigrationApi;
@@ -42,8 +36,15 @@ import org.killbill.billing.subscription.api.user.SubscriptionBaseBundle;
 import org.killbill.billing.subscription.api.user.TestSubscriptionHelper;
 import org.killbill.billing.subscription.engine.dao.SubscriptionDao;
 import org.killbill.billing.subscription.glue.TestDefaultSubscriptionModuleWithEmbeddedDB;
+import org.killbill.billing.util.KillbillConfigSource;
 import org.killbill.billing.util.config.SubscriptionConfig;
 import org.killbill.billing.util.svcsapi.bus.BusService;
+import org.killbill.clock.ClockMock;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
 
 import com.google.inject.Guice;
 import com.google.inject.Injector;
@@ -89,17 +90,13 @@ public class SubscriptionTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteW
     protected AccountData accountData;
     protected SubscriptionBaseBundle bundle;
 
-    private void loadSystemPropertiesFromClasspath(final String resource) {
-        final URL url = DefaultSubscriptionTestInitializer.class.getResource(resource);
-        Assert.assertNotNull(url);
-
-        configSource.merge(url);
+    @Override
+    protected KillbillConfigSource getConfigSource() throws IOException, URISyntaxException {
+        return new TestKillbillConfigSource("/subscription.properties");
     }
 
     @BeforeClass(groups = "slow")
     public void beforeClass() throws Exception {
-        loadSystemPropertiesFromClasspath("/subscription.properties");
-
         final Injector g = Guice.createInjector(Stage.PRODUCTION, new TestDefaultSubscriptionModuleWithEmbeddedDB(configSource));
         g.injectMembers(this);
     }
diff --git a/subscription/src/test/resources/subscription.properties b/subscription/src/test/resources/subscription.properties
index b0bdca1..6fc7e6d 100644
--- a/subscription/src/test/resources/subscription.properties
+++ b/subscription/src/test/resources/subscription.properties
@@ -1,5 +1 @@
 org.killbill.catalog.uri=file:src/test/resources/catalogTest.xml
-org.killbill.persistent.bus.main.sleep=100
-org.killbill.persistent.bus.main.nbThreads=1
-org.killbill.persistent.bus.main.claimed=1
-user.timezone=UTC

tenant/pom.xml 12(+11 -1)

diff --git a/tenant/pom.xml b/tenant/pom.xml
index 4cfdf52..0320936 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.9.2-SNAPSHOT</version>
+        <version>0.9.3-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-tenant</artifactId>
@@ -86,6 +86,16 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>org.kill-bill.commons</groupId>
+            <artifactId>killbill-embeddeddb-h2</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.kill-bill.commons</groupId>
+            <artifactId>killbill-embeddeddb-mysql</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-all</artifactId>
             <scope>test</scope>

usage/pom.xml 12(+11 -1)

diff --git a/usage/pom.xml b/usage/pom.xml
index c6b50ea..83e2d17 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.9.2-SNAPSHOT</version>
+        <version>0.9.3-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-usage</artifactId>
@@ -77,6 +77,16 @@
             <scope>test</scope>
         </dependency>
         <dependency>
+            <groupId>org.kill-bill.commons</groupId>
+            <artifactId>killbill-embeddeddb-h2</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.kill-bill.commons</groupId>
+            <artifactId>killbill-embeddeddb-mysql</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
             <groupId>org.mockito</groupId>
             <artifactId>mockito-all</artifactId>
             <scope>test</scope>

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

diff --git a/util/pom.xml b/util/pom.xml
index d9ddbf4..de245df 100644
--- a/util/pom.xml
+++ b/util/pom.xml
@@ -12,7 +12,7 @@
     <parent>
         <artifactId>killbill</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.9.2-SNAPSHOT</version>
+        <version>0.9.3-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>killbill-util</artifactId>
diff --git a/util/src/main/java/org/killbill/billing/util/config/catalog/UriAccessor.java b/util/src/main/java/org/killbill/billing/util/config/catalog/UriAccessor.java
index b3aad01..5b200a3 100644
--- a/util/src/main/java/org/killbill/billing/util/config/catalog/UriAccessor.java
+++ b/util/src/main/java/org/killbill/billing/util/config/catalog/UriAccessor.java
@@ -24,43 +24,39 @@ import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.Scanner;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import com.google.common.io.Resources;
 
 public class UriAccessor {
 
-    private final static Logger log = LoggerFactory.getLogger(UriAccessor.class);
-
     private static final String URI_SCHEME_FOR_CLASSPATH = "jar";
     private static final String URI_SCHEME_FOR_FILE = "file";
 
-    public static InputStream accessUri(String uri)  throws IOException, URISyntaxException {
+    public static InputStream accessUri(final String uri) throws IOException, URISyntaxException {
         return accessUri(new URI(uri));
     }
 
     public static InputStream accessUri(URI uri) throws IOException, URISyntaxException {
-        String scheme = uri.getScheme();
-        URL url = null;
+        final String scheme = uri.getScheme();
+
+        final URL url;
         if (scheme == null) {
             uri = new URI(Resources.getResource(uri.toString()).toExternalForm());
         } else if (scheme.equals(URI_SCHEME_FOR_CLASSPATH)) {
             return UriAccessor.class.getResourceAsStream(uri.getPath());
         } else if (scheme.equals(URI_SCHEME_FOR_FILE) &&
-                !uri.getSchemeSpecificPart().startsWith("/")) { // interpret URIs of this form as relative path uris
-            url = new File(uri.getSchemeSpecificPart()).toURI().toURL();
+                   !uri.getSchemeSpecificPart().startsWith("/")) { // interpret URIs of this form as relative path uris
+            uri = new File(uri.getSchemeSpecificPart()).toURI();
         }
         url = uri.toURL();
         return url.openConnection().getInputStream();
     }
 
-    public static String accessUriAsString(String uri)  throws IOException, URISyntaxException {
+    public static String accessUriAsString(final String uri) throws IOException, URISyntaxException {
         return accessUriAsString(new URI(uri));
     }
 
-    public static String accessUriAsString(URI uri) throws IOException,  URISyntaxException {
-        InputStream stream = accessUri(uri);
+    public static String accessUriAsString(final URI uri) throws IOException, URISyntaxException {
+        final InputStream stream = accessUri(uri);
         return new Scanner(stream).useDelimiter("\\A").next();
     }
 }
diff --git a/util/src/main/java/org/killbill/billing/util/config/PaymentConfig.java b/util/src/main/java/org/killbill/billing/util/config/PaymentConfig.java
index da7f219..1ab5c35 100644
--- a/util/src/main/java/org/killbill/billing/util/config/PaymentConfig.java
+++ b/util/src/main/java/org/killbill/billing/util/config/PaymentConfig.java
@@ -36,7 +36,7 @@ public interface PaymentConfig extends KillbillConfig {
     @Description("Interval in days between payment retries")
     public List<Integer> getPaymentRetryDays();
 
-    @Config("orgkillbill.payment.failure.retry.start.sec")
+    @Config("org.killbill.payment.failure.retry.start.sec")
     @Default("300")
     public int getPluginFailureRetryStart();
 
diff --git a/util/src/main/java/org/killbill/billing/util/glue/SecurityModule.java b/util/src/main/java/org/killbill/billing/util/glue/SecurityModule.java
index 46482ab..7a352ba 100644
--- a/util/src/main/java/org/killbill/billing/util/glue/SecurityModule.java
+++ b/util/src/main/java/org/killbill/billing/util/glue/SecurityModule.java
@@ -18,7 +18,6 @@ package org.killbill.billing.util.glue;
 
 import org.skife.config.ConfigSource;
 import org.skife.config.ConfigurationObjectFactory;
-import org.skife.config.SimplePropertyConfigSource;
 
 import org.killbill.billing.security.api.SecurityApi;
 import org.killbill.billing.util.config.SecurityConfig;
@@ -32,10 +31,6 @@ public class SecurityModule extends AbstractModule {
 
     private final ConfigSource configSource;
 
-    public SecurityModule() {
-        this(new SimplePropertyConfigSource(System.getProperties()));
-    }
-
     public SecurityModule(final ConfigSource configSource) {
         this.configSource = configSource;
     }
diff --git a/util/src/main/java/org/killbill/billing/util/KillbillConfigSource.java b/util/src/main/java/org/killbill/billing/util/KillbillConfigSource.java
new file mode 100644
index 0000000..8c04424
--- /dev/null
+++ b/util/src/main/java/org/killbill/billing/util/KillbillConfigSource.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright 2010-2013 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.killbill.billing.util;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.util.Properties;
+
+import org.killbill.billing.util.config.catalog.UriAccessor;
+import org.skife.config.ConfigSource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.common.annotations.VisibleForTesting;
+
+public class KillbillConfigSource implements ConfigSource {
+
+    private static final Logger logger = LoggerFactory.getLogger(KillbillConfigSource.class);
+    private static final String PROPERTIES_FILE = "org.killbill.server.properties";
+
+    private final Properties properties;
+
+    public KillbillConfigSource() {
+        this.properties = loadPropertiesFromFileOrSystemProperties();
+        populateDefaultProperties();
+    }
+
+    @VisibleForTesting
+    public KillbillConfigSource(final String file) throws URISyntaxException, IOException {
+        this.properties = new Properties();
+        this.properties.load(UriAccessor.accessUri(this.getClass().getResource(file).toURI()));
+        populateDefaultProperties();
+    }
+
+    @Override
+    public String getString(final String propertyName) {
+        return properties.getProperty(propertyName);
+    }
+
+    private Properties loadPropertiesFromFileOrSystemProperties() {
+        // Chicken-egg problem. It would be nice to have the property in e.g. KillbillServerConfig,
+        // but we need to build the ConfigSource first...
+        final String propertiesFileLocation = System.getProperty(PROPERTIES_FILE);
+        if (propertiesFileLocation != null) {
+            try {
+                // Ignore System Properties if we're loading from a file
+                final Properties properties = new Properties();
+                properties.load(UriAccessor.accessUri(propertiesFileLocation));
+                return properties;
+            } catch (final IOException e) {
+                logger.warn("Unable to access properties file, defaulting to system properties", e);
+            } catch (final URISyntaxException e) {
+                logger.warn("Unable to access properties file, defaulting to system properties", e);
+            }
+        }
+
+        return System.getProperties();
+    }
+
+    @VisibleForTesting
+    protected void populateDefaultProperties() {
+        final Properties defaultProperties = getDefaultProperties();
+        for (final String propertyName : defaultProperties.stringPropertyNames()) {
+            // Let the user override these properties
+            if (properties.get(propertyName) == null) {
+                properties.put(propertyName, defaultProperties.get(propertyName));
+            }
+        }
+
+        final Properties defaultSystemProperties = getDefaultSystemProperties();
+        for (final String propertyName : defaultSystemProperties.stringPropertyNames()) {
+            // Let the user override these properties
+            if (System.getProperty(propertyName) == null) {
+                System.setProperty(propertyName, defaultSystemProperties.get(propertyName).toString());
+            }
+        }
+    }
+
+    @VisibleForTesting
+    public void setProperty(final String propertyName, final Object propertyValue) {
+        properties.put(propertyName, propertyValue);
+    }
+
+    @VisibleForTesting
+    protected Properties getDefaultProperties() {
+        final Properties properties = new Properties();
+        properties.put("org.killbill.persistent.bus.external.tableName", "bus_ext_events");
+        properties.put("org.killbill.persistent.bus.external.historyTableName", "bus_ext_events_history");
+        return properties;
+    }
+
+    @VisibleForTesting
+    protected Properties getDefaultSystemProperties() {
+        final Properties properties = new Properties();
+        properties.put("user.timezone", "UTC");
+        properties.put("ANTLR_USE_DIRECT_CLASS_LOADING", "true");
+        return properties;
+    }
+}
diff --git a/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuite.java b/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuite.java
index d9ebc99..4eba0b3 100644
--- a/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuite.java
+++ b/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuite.java
@@ -20,19 +20,18 @@ import java.lang.reflect.Method;
 
 import javax.inject.Inject;
 
+import org.killbill.billing.callcontext.InternalCallContext;
+import org.killbill.billing.util.KillbillConfigSource;
+import org.killbill.billing.util.callcontext.CallContext;
+import org.killbill.clock.ClockMock;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.testng.ITestResult;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 
-import org.killbill.billing.util.callcontext.CallContext;
-import org.killbill.billing.callcontext.InternalCallContext;
-import org.killbill.clock.ClockMock;
-
 public class GuicyKillbillTestSuite {
 
-
     // Use the simple name here to save screen real estate
     protected static final Logger log = LoggerFactory.getLogger(KillbillTestSuite.class.getSimpleName());
 
@@ -47,14 +46,22 @@ public class GuicyKillbillTestSuite {
     @Inject
     protected ClockMock clock;
 
-
     private static final ClockMock theStaticClock = new ClockMock();
 
-    protected final KillbillConfigSource configSource = new KillbillConfigSource();
+    protected final KillbillConfigSource configSource;
 
     public GuicyKillbillTestSuite() {
-        // Ignore ehcache checks. Unfortunately, ehcache looks at system properties directly...
-        System.setProperty("net.sf.ehcache.skipUpdateCheck", "true");
+        try {
+            this.configSource = getConfigSource();
+        } catch (final Exception e) {
+            final AssertionError assertionError = new AssertionError("Initialization error");
+            assertionError.initCause(e);
+            throw assertionError;
+        }
+    }
+
+    protected KillbillConfigSource getConfigSource() throws Exception {
+        return new TestKillbillConfigSource();
     }
 
     public static ClockMock getClock() {
@@ -72,8 +79,8 @@ public class GuicyKillbillTestSuite {
     public void afterMethodAlwaysRun(final Method method, final ITestResult result) throws Exception {
         log.info("***************************************************************************************************");
         log.info("***   Ending test {}:{} {} ({} s.)", new Object[]{method.getDeclaringClass().getName(), method.getName(),
-                result.isSuccess() ? "SUCCESS" : "!!! FAILURE !!!",
-                (result.getEndMillis() - result.getStartMillis()) / 1000});
+                                                                    result.isSuccess() ? "SUCCESS" : "!!! FAILURE !!!",
+                                                                    (result.getEndMillis() - result.getStartMillis()) / 1000});
         log.info("***************************************************************************************************");
         if (!hasFailed && !result.isSuccess()) {
             hasFailed = true;
diff --git a/util/src/test/java/org/killbill/billing/TestKillbillConfigSource.java b/util/src/test/java/org/killbill/billing/TestKillbillConfigSource.java
new file mode 100644
index 0000000..08a24d1
--- /dev/null
+++ b/util/src/test/java/org/killbill/billing/TestKillbillConfigSource.java
@@ -0,0 +1,94 @@
+/*
+ * 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 org.killbill.billing;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.util.Map;
+import java.util.Properties;
+
+import org.killbill.billing.util.KillbillConfigSource;
+
+import com.google.common.collect.ImmutableMap;
+
+public class TestKillbillConfigSource extends KillbillConfigSource {
+
+    private final Map<String, String> extraDefaults;
+
+    public TestKillbillConfigSource() {
+        super();
+        this.extraDefaults = ImmutableMap.<String, String>of();
+    }
+
+    public TestKillbillConfigSource(final String file) throws URISyntaxException, IOException {
+        this(file, ImmutableMap.<String, String>of());
+    }
+
+    public TestKillbillConfigSource(final String file, final Map<String, String> extraDefaults) throws URISyntaxException, IOException {
+        super(file);
+        this.extraDefaults = extraDefaults;
+        // extraDefaults changed, need to reload defaults
+        populateDefaultProperties();
+    }
+
+    @Override
+    protected Properties getDefaultProperties() {
+        final Properties properties = super.getDefaultProperties();
+
+        // Setup up DAO properties (this will be a no-op for fast tests)
+        properties.put("org.killbill.dao.url", DBTestingHelper.get().getJdbcConnectionString());
+        properties.put("org.killbill.dao.user", DBTestingHelper.get().getUsername());
+        properties.put("org.killbill.dao.password", DBTestingHelper.get().getPassword());
+        properties.put("org.killbill.billing.osgi.jdbc.url", DBTestingHelper.get().getJdbcConnectionString());
+        properties.put("org.killbill.billing.osgi.jdbc.user", DBTestingHelper.get().getUsername());
+        properties.put("org.killbill.billing.osgi.jdbc.password", DBTestingHelper.get().getPassword());
+
+        // Speed up the notification queue
+        properties.put("org.killbill.notificationq.main.sleep", "100");
+        properties.put("org.killbill.notificationq.main.nbThreads", "1");
+        properties.put("org.killbill.notificationq.main.prefetch", "1");
+        properties.put("org.killbill.notificationq.main.claimed", "1");
+        properties.put("org.killbill.notificationq.main.useInFlightQ", "false");
+        // Speed up the buses
+        properties.put("org.killbill.persistent.bus.main.sleep", "100");
+        properties.put("org.killbill.persistent.bus.main.nbThreads", "1");
+        properties.put("org.killbill.persistent.bus.main.prefetch", "1");
+        properties.put("org.killbill.persistent.bus.main.claimed", "1");
+        properties.put("org.killbill.persistent.bus.main.useInFlightQ", "false");
+        properties.put("org.killbill.persistent.bus.external.sleep", "100");
+        properties.put("org.killbill.persistent.bus.external.nbThreads", "1");
+        properties.put("org.killbill.persistent.bus.external.prefetch", "1");
+        properties.put("org.killbill.persistent.bus.external.claimed", "1");
+        properties.put("org.killbill.persistent.bus.external.useInFlightQ", "false");
+
+        if (extraDefaults != null) {
+            for (final String key : extraDefaults.keySet()) {
+                properties.put(key, extraDefaults.get(key));
+            }
+        }
+
+        return properties;
+    }
+
+    @Override
+    protected Properties getDefaultSystemProperties() {
+        final Properties properties = super.getDefaultSystemProperties();
+        properties.put("net.sf.ehcache.skipUpdateCheck", "true");
+        properties.put("org.slf4j.simpleLogger.showDateTime", "true");
+        return properties;
+    }
+}
diff --git a/util/src/test/java/org/killbill/billing/util/email/EmailSenderTest.java b/util/src/test/java/org/killbill/billing/util/email/EmailSenderTest.java
index f73094b..d706daa 100644
--- a/util/src/test/java/org/killbill/billing/util/email/EmailSenderTest.java
+++ b/util/src/test/java/org/killbill/billing/util/email/EmailSenderTest.java
@@ -17,12 +17,11 @@ package org.killbill.billing.util.email;/*
 import java.util.ArrayList;
 import java.util.List;
 
+import org.killbill.billing.util.UtilTestSuiteNoDB;
 import org.skife.config.ConfigurationObjectFactory;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
-import org.killbill.billing.util.UtilTestSuiteNoDB;
-
 @Test(groups = "slow")
 public class EmailSenderTest extends UtilTestSuiteNoDB {
 
@@ -31,7 +30,7 @@ public class EmailSenderTest extends UtilTestSuiteNoDB {
     @BeforeClass
     public void beforeClass() throws Exception {
         super.beforeClass();
-        config = new ConfigurationObjectFactory(System.getProperties()).build(EmailConfig.class);
+        config = new ConfigurationObjectFactory(configSource).build(EmailConfig.class);
     }
 
     @Test(enabled = false)
diff --git a/util/src/test/java/org/killbill/billing/util/glue/TestUtilModuleNoDB.java b/util/src/test/java/org/killbill/billing/util/glue/TestUtilModuleNoDB.java
index 7d6852d..adb872f 100644
--- a/util/src/test/java/org/killbill/billing/util/glue/TestUtilModuleNoDB.java
+++ b/util/src/test/java/org/killbill/billing/util/glue/TestUtilModuleNoDB.java
@@ -53,6 +53,6 @@ public class TestUtilModuleNoDB extends TestUtilModule {
 
         install(new KillBillShiroModule(configSource));
         install(new KillBillShiroAopModule());
-        install(new SecurityModule());
+        install(new SecurityModule(configSource));
     }
 }
diff --git a/util/src/test/java/org/killbill/billing/util/security/TestPermissionAnnotationMethodInterceptor.java b/util/src/test/java/org/killbill/billing/util/security/TestPermissionAnnotationMethodInterceptor.java
index 889a7a6..60461c9 100644
--- a/util/src/test/java/org/killbill/billing/util/security/TestPermissionAnnotationMethodInterceptor.java
+++ b/util/src/test/java/org/killbill/billing/util/security/TestPermissionAnnotationMethodInterceptor.java
@@ -76,7 +76,7 @@ public class TestPermissionAnnotationMethodInterceptor extends UtilTestSuiteNoDB
         final Injector injector = Guice.createInjector(Stage.PRODUCTION,
                                                        new KillBillShiroModule(configSource),
                                                        new KillBillShiroAopModule(),
-                                                       new SecurityModule(),
+                                                       new SecurityModule(configSource),
                                                        new AbstractModule() {
                                                            @Override
                                                            protected void configure() {
@@ -104,7 +104,7 @@ public class TestPermissionAnnotationMethodInterceptor extends UtilTestSuiteNoDB
         final Injector injector = Guice.createInjector(Stage.PRODUCTION,
                                                        new KillBillShiroModule(configSource),
                                                        new KillBillShiroAopModule(),
-                                                       new SecurityModule(),
+                                                       new SecurityModule(configSource),
                                                        new AbstractModule() {
                                                            @Override
                                                            public void configure() {