killbill-uncached

Merge pull request #1050 from killbill/tests-setup tests:

10/18/2018 3:56:10 AM

Changes

Details

diff --git a/account/src/test/java/org/killbill/billing/account/AccountTestSuiteNoDB.java b/account/src/test/java/org/killbill/billing/account/AccountTestSuiteNoDB.java
index d892e83..76beffd 100644
--- a/account/src/test/java/org/killbill/billing/account/AccountTestSuiteNoDB.java
+++ b/account/src/test/java/org/killbill/billing/account/AccountTestSuiteNoDB.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2017 Groupon, Inc
- * Copyright 2014-2017 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -31,7 +31,6 @@ import org.killbill.billing.util.tag.api.user.TagEventBuilder;
 import org.killbill.billing.util.tag.dao.TagDao;
 import org.killbill.billing.util.tag.dao.TagDefinitionDao;
 import org.killbill.bus.api.PersistentBus;
-import org.killbill.clock.Clock;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
@@ -53,8 +52,6 @@ public abstract class AccountTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
     @Inject
     protected CacheControllerDispatcher controllerDispatcher;
     @Inject
-    protected Clock clock;
-    @Inject
     protected CustomFieldDao customFieldDao;
     @Inject
     protected PersistentBus bus;
@@ -73,7 +70,7 @@ public abstract class AccountTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
             return;
         }
 
-        final Injector injector = Guice.createInjector(new TestAccountModuleNoDB(configSource));
+        final Injector injector = Guice.createInjector(new TestAccountModuleNoDB(configSource, clock));
         injector.injectMembers(this);
     }
 
diff --git a/account/src/test/java/org/killbill/billing/account/AccountTestSuiteWithEmbeddedDB.java b/account/src/test/java/org/killbill/billing/account/AccountTestSuiteWithEmbeddedDB.java
index 2f20eda..1957d3e 100644
--- a/account/src/test/java/org/killbill/billing/account/AccountTestSuiteWithEmbeddedDB.java
+++ b/account/src/test/java/org/killbill/billing/account/AccountTestSuiteWithEmbeddedDB.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2016 Groupon, Inc
- * Copyright 2014-2016 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -33,7 +33,6 @@ import org.killbill.billing.util.tag.api.user.TagEventBuilder;
 import org.killbill.billing.util.tag.dao.TagDao;
 import org.killbill.billing.util.tag.dao.TagDefinitionDao;
 import org.killbill.bus.api.PersistentBus;
-import org.killbill.clock.Clock;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
@@ -53,8 +52,6 @@ public abstract class AccountTestSuiteWithEmbeddedDB extends GuicyKillbillTestSu
     @Inject
     protected CacheControllerDispatcher controllerDispatcher;
     @Inject
-    protected Clock clock;
-    @Inject
     protected CustomFieldDao customFieldDao;
     @Inject
     protected PersistentBus bus;
@@ -73,7 +70,7 @@ public abstract class AccountTestSuiteWithEmbeddedDB extends GuicyKillbillTestSu
             return;
         }
 
-        final Injector injector = Guice.createInjector(new TestAccountModuleWithEmbeddedDB(configSource));
+        final Injector injector = Guice.createInjector(new TestAccountModuleWithEmbeddedDB(configSource, clock));
         injector.injectMembers(this);
     }
 
diff --git a/account/src/test/java/org/killbill/billing/account/glue/TestAccountModuleNoDB.java b/account/src/test/java/org/killbill/billing/account/glue/TestAccountModuleNoDB.java
index 5a245bb..7b0d68e 100644
--- a/account/src/test/java/org/killbill/billing/account/glue/TestAccountModuleNoDB.java
+++ b/account/src/test/java/org/killbill/billing/account/glue/TestAccountModuleNoDB.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -23,11 +23,15 @@ import org.killbill.billing.account.dao.AccountDao;
 import org.killbill.billing.account.dao.MockAccountDao;
 import org.killbill.billing.mock.glue.MockNonEntityDaoModule;
 import org.killbill.billing.platform.api.KillbillConfigSource;
+import org.killbill.clock.ClockMock;
 
 public class TestAccountModuleNoDB extends TestAccountModule {
 
-    public TestAccountModuleNoDB(final KillbillConfigSource configSource) {
+    private final ClockMock clock;
+
+    public TestAccountModuleNoDB(final KillbillConfigSource configSource, final ClockMock clock) {
         super(configSource);
+        this.clock = clock;
     }
 
     @Override
@@ -39,7 +43,7 @@ public class TestAccountModuleNoDB extends TestAccountModule {
     public void configure() {
         super.configure();
 
-        install(new GuicyKillbillTestNoDBModule(configSource));
+        install(new GuicyKillbillTestNoDBModule(configSource, clock));
         install(new MockNonEntityDaoModule(configSource));
     }
 }
diff --git a/account/src/test/java/org/killbill/billing/account/glue/TestAccountModuleWithEmbeddedDB.java b/account/src/test/java/org/killbill/billing/account/glue/TestAccountModuleWithEmbeddedDB.java
index 4c52d4a..4dc1fa7 100644
--- a/account/src/test/java/org/killbill/billing/account/glue/TestAccountModuleWithEmbeddedDB.java
+++ b/account/src/test/java/org/killbill/billing/account/glue/TestAccountModuleWithEmbeddedDB.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -21,18 +21,22 @@ package org.killbill.billing.account.glue;
 import org.killbill.billing.GuicyKillbillTestWithEmbeddedDBModule;
 import org.killbill.billing.platform.api.KillbillConfigSource;
 import org.killbill.billing.util.glue.NonEntityDaoModule;
+import org.killbill.clock.ClockMock;
 
 public class TestAccountModuleWithEmbeddedDB extends TestAccountModule {
 
-    public TestAccountModuleWithEmbeddedDB(final KillbillConfigSource configSource) {
+    private final ClockMock clock;
+
+    public TestAccountModuleWithEmbeddedDB(final KillbillConfigSource configSource, final ClockMock clock) {
         super(configSource);
+        this.clock = clock;
     }
 
     @Override
     public void configure() {
         super.configure();
 
-        install(new GuicyKillbillTestWithEmbeddedDBModule(configSource));
+        install(new GuicyKillbillTestWithEmbeddedDBModule(configSource, clock));
         install(new NonEntityDaoModule(configSource));
     }
 }
diff --git a/api/src/main/java/org/killbill/billing/callcontext/DefaultCallContext.java b/api/src/main/java/org/killbill/billing/callcontext/DefaultCallContext.java
index 2d43bcd..c12b759 100644
--- a/api/src/main/java/org/killbill/billing/callcontext/DefaultCallContext.java
+++ b/api/src/main/java/org/killbill/billing/callcontext/DefaultCallContext.java
@@ -20,6 +20,7 @@ import java.util.UUID;
 
 import org.joda.time.DateTime;
 
+import org.killbill.billing.util.callcontext.CallContext;
 import org.killbill.billing.util.callcontext.CallOrigin;
 import org.killbill.billing.util.callcontext.UserType;
 import org.killbill.clock.Clock;
@@ -58,6 +59,13 @@ public class DefaultCallContext extends CallContextBase {
         this.updateDate = updatedDate;
     }
 
+    // For testing
+    public DefaultCallContext(final CallContext callContext) {
+        super(callContext.getAccountId(), callContext.getTenantId(), callContext.getUserName(), callContext.getCallOrigin(), callContext.getUserType(), callContext.getReasonCode(), callContext.getComments(),  callContext.getUserToken());
+        this.createdDate = callContext.getCreatedDate();
+        this.updateDate = callContext.getUpdatedDate();
+    }
+
     @Override
     public DateTime getCreatedDate() {
         return createdDate;
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/BeatrixTestSuiteNoDB.java b/beatrix/src/test/java/org/killbill/billing/beatrix/BeatrixTestSuiteNoDB.java
index 9e1af49..e6ba2e1 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/BeatrixTestSuiteNoDB.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/BeatrixTestSuiteNoDB.java
@@ -31,7 +31,7 @@ public abstract class BeatrixTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
             return;
         }
 
-        final Injector injector = Guice.createInjector(new BeatrixIntegrationModuleNoDB(configSource));
+        final Injector injector = Guice.createInjector(new BeatrixIntegrationModuleNoDB(configSource, clock));
         injector.injectMembers(this);
     }
 }
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 82bf4fe..53506d1 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/BeatrixTestSuiteWithEmbeddedDB.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/BeatrixTestSuiteWithEmbeddedDB.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -18,6 +18,9 @@
 
 package org.killbill.billing.beatrix;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import org.killbill.billing.GuicyKillbillTestSuiteWithEmbeddedDB;
 import org.killbill.billing.platform.api.KillbillConfigSource;
 
@@ -25,20 +28,21 @@ import com.google.common.collect.ImmutableMap;
 
 public abstract class BeatrixTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteWithEmbeddedDB {
 
-    final static protected ImmutableMap DEFAULT_BEATRIX_PROPERTIES = ImmutableMap.builder()
-                                                                                 .put("org.killbill.catalog.uri", "catalogs/default/catalogTest.xml")
-                                                                                 .put("org.killbill.invoice.maxDailyNumberOfItemsSafetyBound", "30")
-                                                                                 .put("org.killbill.payment.retry.days", "8,8,8,8,8,8,8,8")
-                                                                                 .put("org.killbill.osgi.bundle.install.dir", "/var/tmp/beatrix-bundles")
-                                                                                 // The default value is 50, i.e. wait 50 x 100ms = 5s to get the lock. This isn't always enough and can lead to random tests failures
-                                                                                 // in the listener status: after moving the clock, if there are two notifications triggering an invoice run, we typically expect
-                                                                                 // both an INVOICE and a NULL_INVOICE event. If the invoice generation takes too long, the NULL_INVOICE event is never generated
-                                                                                 // (LockFailedException): the test itself doesn't fail (the correct invoice is generated), but assertListenerStatus() would.
-                                                                                 .put("org.killbill.invoice.globalLock.retries", 150)
-                                                                                 .build();
+    protected static final Map<String, String> DEFAULT_BEATRIX_PROPERTIES = ImmutableMap.<String, String>builder().put("org.killbill.catalog.uri", "catalogs/default/catalogTest.xml")
+                                                                                                                  .put("org.killbill.invoice.maxDailyNumberOfItemsSafetyBound", "30")
+                                                                                                                  .put("org.killbill.payment.retry.days", "8,8,8,8,8,8,8,8")
+                                                                                                                  .put("org.killbill.osgi.bundle.install.dir", "/var/tmp/beatrix-bundles")
+                                                                                                                  // The default value is 50, i.e. wait 50 x 100ms = 5s to get the lock. This isn't always enough and can lead to random tests failures
+                                                                                                                  // in the listener status: after moving the clock, if there are two notifications triggering an invoice run, we typically expect
+                                                                                                                  // both an INVOICE and a NULL_INVOICE event. If the invoice generation takes too long, the NULL_INVOICE event is never generated
+                                                                                                                  // (LockFailedException): the test itself doesn't fail (the correct invoice is generated), but assertListenerStatus() would.
+                                                                                                                  .put("org.killbill.invoice.globalLock.retries", "300")
+                                                                                                                  .build();
 
     @Override
-    protected KillbillConfigSource getConfigSource() {
-        return getConfigSource(null, DEFAULT_BEATRIX_PROPERTIES);
+    protected KillbillConfigSource getConfigSource(final Map<String, String> extraProperties) {
+        final Map<String, String> allExtraProperties = new HashMap<String, String>(extraProperties);
+        allExtraProperties.putAll(DEFAULT_BEATRIX_PROPERTIES);
+        return getConfigSource(null, allExtraProperties);
     }
 }
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 6bdf4e5..de12171 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
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -55,7 +55,6 @@ import org.killbill.billing.util.glue.CallContextModule;
 import org.killbill.billing.util.glue.ConfigModule;
 import org.killbill.billing.util.glue.CustomFieldModule;
 import org.killbill.billing.util.glue.ExportModule;
-import org.killbill.billing.util.glue.GlobalLockerModule;
 import org.killbill.billing.util.glue.KillBillModule;
 import org.killbill.billing.util.glue.KillBillShiroModule;
 import org.killbill.billing.util.glue.KillbillApiAopModule;
@@ -64,6 +63,8 @@ import org.killbill.billing.util.glue.NonEntityDaoModule;
 import org.killbill.billing.util.glue.RecordIdModule;
 import org.killbill.billing.util.glue.SecurityModule;
 import org.killbill.billing.util.glue.TagStoreModule;
+import org.killbill.clock.Clock;
+import org.killbill.clock.ClockMock;
 
 public class BeatrixIntegrationModule extends KillBillModule {
 
@@ -72,21 +73,22 @@ public class BeatrixIntegrationModule extends KillBillModule {
     // Same name the osgi-payment-test plugin uses to register its service
     public static final String OSGI_PLUGIN_NAME = "osgi-payment-plugin";
 
+    private final ClockMock clock;
     private final InvoiceConfig invoiceConfig;
 
-    public BeatrixIntegrationModule(final KillbillConfigSource configSource) {
-        this(configSource, null);
+    public BeatrixIntegrationModule(final KillbillConfigSource configSource, final ClockMock clock) {
+        this(configSource, clock, null);
     }
 
-    public BeatrixIntegrationModule(final KillbillConfigSource configSource, @Nullable final InvoiceConfig invoiceConfig) {
+    public BeatrixIntegrationModule(final KillbillConfigSource configSource, final ClockMock clock, @Nullable final InvoiceConfig invoiceConfig) {
         super(configSource);
+        this.clock = clock;
         this.invoiceConfig = invoiceConfig;
     }
 
     @Override
     protected void configure() {
-        install(new GuicyKillbillTestWithEmbeddedDBModule(true, configSource));
-        install(new GlobalLockerModule(configSource));
+        install(new GuicyKillbillTestWithEmbeddedDBModule(true, configSource, clock));
         install(new CacheModule(configSource));
         install(new ConfigModule(configSource));
         install(new CallContextModule(configSource));
@@ -98,7 +100,7 @@ public class BeatrixIntegrationModule extends KillBillModule {
         install(new DefaultEntitlementModule(configSource));
         install(new DefaultInvoiceModuleWithSwitchRepairLogic(configSource));
         install(new TemplateModule(configSource));
-        install(new PaymentPluginMockModule(configSource));
+        install(new PaymentPluginMockModule(configSource, clock));
         install(new DefaultJunctionModule(configSource));
         install(new IntegrationTestOverdueModule(configSource));
         install(new AuditModule(configSource));
@@ -147,13 +149,16 @@ public class BeatrixIntegrationModule extends KillBillModule {
 
     private static final class PaymentPluginMockModule extends PaymentModule {
 
-        private PaymentPluginMockModule(final KillbillConfigSource configSource) {
+        private final Clock clock;
+
+        private PaymentPluginMockModule(final KillbillConfigSource configSource, final Clock clock) {
             super(configSource);
+            this.clock = clock;
         }
 
         @Override
         protected void installPaymentProviderPlugins(final PaymentConfig config) {
-            install(new MockPaymentProviderPluginModule(NON_OSGI_PLUGIN_NAME, TestIntegrationBase.getClock(), configSource));
+            install(new MockPaymentProviderPluginModule(NON_OSGI_PLUGIN_NAME, clock, configSource));
         }
     }
 
@@ -162,10 +167,11 @@ public class BeatrixIntegrationModule extends KillBillModule {
         public KillBillShiroModuleOnlyIniRealm(final KillbillConfigSource configSource) {
             super(configSource);
         }
+
         protected void configureJDBCRealm() {
         }
+
         protected void configureLDAPRealm() {
         }
-
     }
 }
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/BeatrixIntegrationModuleNoDB.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/BeatrixIntegrationModuleNoDB.java
index d4e84f4..f7dd2aa 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/BeatrixIntegrationModuleNoDB.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/BeatrixIntegrationModuleNoDB.java
@@ -1,6 +1,6 @@
 /*
- * Copyright 2014-2016 Groupon, Inc
- * Copyright 2014-2016 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -23,18 +23,22 @@ import org.killbill.billing.mock.glue.MockNonEntityDaoModule;
 import org.killbill.billing.platform.api.KillbillConfigSource;
 import org.killbill.billing.util.cache.CacheControllerDispatcher;
 import org.killbill.billing.util.glue.KillBillModule;
+import org.killbill.clock.ClockMock;
 
 import com.google.inject.util.Providers;
 
 public class BeatrixIntegrationModuleNoDB extends KillBillModule {
 
-    public BeatrixIntegrationModuleNoDB(final KillbillConfigSource configSource) {
+    private final ClockMock clock;
+
+    public BeatrixIntegrationModuleNoDB(final KillbillConfigSource configSource, final ClockMock clock) {
         super(configSource);
+        this.clock = clock;
     }
 
     @Override
     protected void configure() {
-        install(new GuicyKillbillTestNoDBModule(configSource));
+        install(new GuicyKillbillTestNoDBModule(configSource, clock));
 
         install(new MockNonEntityDaoModule(configSource));
         install(new MockAccountModule(configSource));
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueIntegration.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueIntegration.java
index 5c5b4aa..98b2f8f 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueIntegration.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/overdue/TestOverdueIntegration.java
@@ -69,7 +69,7 @@ import static org.testng.Assert.assertTrue;
 // - The payment retries
 // - The overdue notifications
 //
-
+// Flaky, see https://github.com/killbill/killbill/issues/782
 @Test(groups = "slow")
 public class TestOverdueIntegration extends TestOverdueBase {
 
@@ -122,7 +122,7 @@ public class TestOverdueIntegration extends TestOverdueBase {
         return configXml;
     }
 
-    @Test(groups = "slow", description = "Test overdue stages and return to clear prior to CTD")
+    @Test(groups = "slow", description = "Test overdue stages and return to clear prior to CTD", retryAnalyzer = FlakyRetryAnalyzer.class)
     public void testOverdueStages1() throws Exception {
         // 2012-05-01T00:03:42.000Z
         clock.setTime(new DateTime(2012, 5, 1, 0, 3, 42, 0));
@@ -211,7 +211,7 @@ public class TestOverdueIntegration extends TestOverdueBase {
         assertEquals(invoiceUserApi.getAccountBalance(account.getId(), callContext).compareTo(BigDecimal.ZERO), 0);
     }
 
-    @Test(groups = "slow", description = "Test overdue stages and return to clear on CTD")
+    @Test(groups = "slow", description = "Test overdue stages and return to clear on CTD", retryAnalyzer = FlakyRetryAnalyzer.class)
     public void testOverdueStages2() throws Exception {
         // 2012-05-01T00:03:42.000Z
         clock.setTime(new DateTime(2012, 5, 1, 0, 3, 42, 0));
@@ -311,7 +311,7 @@ public class TestOverdueIntegration extends TestOverdueBase {
         assertEquals(invoiceUserApi.getAccountBalance(account.getId(), callContext).compareTo(BigDecimal.ZERO), 0);
     }
 
-    @Test(groups = "slow", description = "Test overdue stages and return to clear after CTD")
+    @Test(groups = "slow", description = "Test overdue stages and return to clear after CTD", retryAnalyzer = FlakyRetryAnalyzer.class)
     public void testOverdueStages3() throws Exception {
         // 2012-05-01T00:03:42.000Z
         clock.setTime(new DateTime(2012, 5, 1, 0, 3, 42, 0));
@@ -414,7 +414,7 @@ public class TestOverdueIntegration extends TestOverdueBase {
     // This test is similar to the previous one except that instead of moving the clock to check we will get the next invoice
     // at the end, we carry a change of plan.
     //
-    @Test(groups = "slow", description = "Test overdue stages and follow with an immediate change of plan")
+    @Test(groups = "slow", description = "Test overdue stages and follow with an immediate change of plan", retryAnalyzer = FlakyRetryAnalyzer.class)
     public void testOverdueStagesFollowedWithImmediateChange1() throws Exception {
         // 2012-05-01T00:03:42.000Z
         clock.setTime(new DateTime(2012, 5, 1, 0, 3, 42, 0));
@@ -504,7 +504,7 @@ public class TestOverdueIntegration extends TestOverdueBase {
         assertEquals(invoiceUserApi.getAccountBalance(account.getId(), callContext).compareTo(BigDecimal.ZERO), 0);
     }
 
-    @Test(groups = "slow", description = "Test overdue stages and follow with an immediate change of plan and use of credit")
+    @Test(groups = "slow", description = "Test overdue stages and follow with an immediate change of plan and use of credit", retryAnalyzer = FlakyRetryAnalyzer.class)
     public void testOverdueStagesFollowedWithImmediateChange2() throws Exception {
         // 2012-05-01T00:03:42.000Z
         clock.setTime(new DateTime(2012, 5, 1, 0, 3, 42, 0));
@@ -581,7 +581,7 @@ public class TestOverdueIntegration extends TestOverdueBase {
         assertEquals(invoiceUserApi.getAccountBalance(account.getId(), callContext).compareTo(new BigDecimal("-1464.66")), 0);
     }
 
-    @Test(groups = "slow", description = "Test overdue stages with missing payment method")
+    @Test(groups = "slow", description = "Test overdue stages with missing payment method", retryAnalyzer = FlakyRetryAnalyzer.class)
     public void testOverdueStateIfNoPaymentMethod() throws Exception {
         // This test is similar to the previous one - but there is no default payment method on the account, so there
         // won't be any payment retry
@@ -680,7 +680,7 @@ public class TestOverdueIntegration extends TestOverdueBase {
         assertEquals(invoiceUserApi.getAccountBalance(account.getId(), callContext).compareTo(BigDecimal.ZERO), 0);
     }
 
-    @Test(groups = "slow", description = "Test overdue for draft external charge")
+    @Test(groups = "slow", description = "Test overdue for draft external charge", retryAnalyzer = FlakyRetryAnalyzer.class)
     public void testShouldNotBeInOverdueAfterDraftExternalCharge() throws Exception {
         // 2012-05-01T00:03:42.000Z
         clock.setTime(new DateTime(2012, 5, 1, 0, 3, 42, 0));
@@ -719,7 +719,7 @@ public class TestOverdueIntegration extends TestOverdueBase {
         Assert.assertEquals(invoiceUserApi.getUnpaidInvoicesByAccountId(account.getId(), clock.getUTCToday(), callContext).size(), 0);
     }
 
-    @Test(groups = "slow", description = "Test overdue after refund with no adjustment")
+    @Test(groups = "slow", description = "Test overdue after refund with no adjustment", retryAnalyzer = FlakyRetryAnalyzer.class)
     public void testShouldBeInOverdueAfterRefundWithoutAdjustment() throws Exception {
         // 2012-05-01T00:03:42.000Z
         clock.setTime(new DateTime(2012, 5, 1, 0, 3, 42, 0));
@@ -765,7 +765,7 @@ public class TestOverdueIntegration extends TestOverdueBase {
         checkChangePlanWithOverdueState(baseEntitlement, true, true);
     }
 
-    @Test(groups = "slow", description = "Test overdue after chargeback")
+    @Test(groups = "slow", description = "Test overdue after chargeback", retryAnalyzer = FlakyRetryAnalyzer.class)
     public void testShouldBeInOverdueAfterChargeback() throws Exception {
         // 2012-05-01T00:03:42.000Z
         clock.setTime(new DateTime(2012, 5, 1, 0, 3, 42, 0));
@@ -816,7 +816,7 @@ public class TestOverdueIntegration extends TestOverdueBase {
         checkODState(OverdueWrapper.CLEAR_STATE_NAME);
     }
 
-    @Test(groups = "slow", description = "Test overdue clear after external payment")
+    @Test(groups = "slow", description = "Test overdue clear after external payment", retryAnalyzer = FlakyRetryAnalyzer.class)
     public void testOverdueStateShouldClearAfterExternalPayment() throws Exception {
         // 2012-05-01T00:03:42.000Z
         clock.setTime(new DateTime(2012, 5, 1, 0, 3, 42, 0));
@@ -866,7 +866,7 @@ public class TestOverdueIntegration extends TestOverdueBase {
         checkODState(OverdueWrapper.CLEAR_STATE_NAME);
     }
 
-    @Test(groups = "slow", description = "Test overdue clear after item adjustment")
+    @Test(groups = "slow", description = "Test overdue clear after item adjustment", retryAnalyzer = FlakyRetryAnalyzer.class)
     public void testOverdueStateShouldClearAfterCreditOrInvoiceItemAdjustment() throws Exception {
         // 2012-05-01T00:03:42.000Z
         clock.setTime(new DateTime(2012, 5, 1, 0, 3, 42, 0));
@@ -954,7 +954,6 @@ public class TestOverdueIntegration extends TestOverdueBase {
         checkODState(OverdueWrapper.CLEAR_STATE_NAME);
     }
 
-    // Flaky, see https://github.com/killbill/killbill/issues/782
     @Test(groups = "slow", description = "Test overdue state with number of unpaid invoices condition", retryAnalyzer = FlakyRetryAnalyzer.class)
     public void testOverdueStateWithNumberOfUnpaidInvoicesCondition() throws Exception {
         // 2012-05-01T00:03:42.000Z
@@ -1027,7 +1026,6 @@ public class TestOverdueIntegration extends TestOverdueBase {
         checkODState(OverdueWrapper.CLEAR_STATE_NAME);
     }
 
-    // Flaky, see https://github.com/killbill/killbill/issues/782
     @Test(groups = "slow", description = "Test overdue state with total unpaid invoice balance condition", retryAnalyzer = FlakyRetryAnalyzer.class)
     public void testOverdueStateWithTotalUnpaidInvoiceBalanceCondition() throws Exception {
         // 2012-05-01T00:03:42.000Z
@@ -1101,9 +1099,7 @@ public class TestOverdueIntegration extends TestOverdueBase {
         checkODState(OverdueWrapper.CLEAR_STATE_NAME);
     }
 
-
-
-    @Test(groups = "slow", description = "Test clearing balance with credit also clears overdue state")
+    @Test(groups = "slow", description = "Test clearing balance with credit also clears overdue state", retryAnalyzer = FlakyRetryAnalyzer.class)
     public void testOverdueClearWithCredit() throws Exception {
         // 2012-05-01T00:03:42.000Z
         clock.setTime(new DateTime(2012, 5, 1, 0, 3, 42, 0));
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestCatalogRetireElements.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestCatalogRetireElements.java
index 40d0ff6..47eceb3 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestCatalogRetireElements.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestCatalogRetireElements.java
@@ -17,13 +17,14 @@
 
 package org.killbill.billing.beatrix.integration;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import java.util.UUID;
 
 import org.joda.time.LocalDate;
 import org.killbill.billing.ErrorCode;
 import org.killbill.billing.account.api.Account;
-import org.killbill.billing.api.FlakyRetryAnalyzer;
 import org.killbill.billing.api.TestApiListener.NextEvent;
 import org.killbill.billing.catalog.api.BillingPeriod;
 import org.killbill.billing.catalog.api.PhaseType;
@@ -41,7 +42,6 @@ import org.killbill.billing.platform.api.KillbillConfigSource;
 import org.testng.annotations.Test;
 
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
 
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
@@ -51,8 +51,10 @@ import static org.testng.Assert.fail;
 public class TestCatalogRetireElements extends TestIntegrationBase {
 
     @Override
-    protected KillbillConfigSource getConfigSource() {
-        return super.getConfigSource(null, ImmutableMap.of("org.killbill.catalog.uri", "catalogs/testCatalogRetireElements"));
+    protected KillbillConfigSource getConfigSource(final Map<String, String> extraProperties) {
+        final Map<String, String> allExtraProperties = new HashMap<String, String>(extraProperties);
+        allExtraProperties.put("org.killbill.catalog.uri", "catalogs/testCatalogRetireElements");
+        return super.getConfigSource(null, allExtraProperties);
     }
 
     @Test(groups = "slow")
@@ -94,19 +96,16 @@ public class TestCatalogRetireElements extends TestIntegrationBase {
             assertEquals(e.getCode(), ErrorCode.CAT_PLAN_NOT_FOUND.getCode());
         }
 
-
         final DefaultEntitlement bpEntitlement2 =
                 createBaseEntitlementAndCheckForCompletion(account.getId(), "externalKey2", "Bazooka",
                                                            ProductCategory.BASE, term, NextEvent.CREATE, NextEvent.BLOCK, NextEvent.INVOICE, NextEvent.PAYMENT, NextEvent.INVOICE_PAYMENT);
         assertNotNull(bpEntitlement2);
 
-
         // Move out a month and verify 'Pistol' plan continue working as expected.
         busHandler.pushExpectedEvents(NextEvent.INVOICE, NextEvent.PAYMENT, NextEvent.INVOICE_PAYMENT);
         clock.addMonths(1);
         assertListenerStatus();
 
-
         final List<Invoice> invoices = invoiceUserApi.getInvoicesByAccount(account.getId(), false, false, callContext);
         assertEquals(invoices.size(), 4);
 
@@ -153,7 +152,7 @@ public class TestCatalogRetireElements extends TestIntegrationBase {
 
         final PlanPhaseSpecifier spec = new PlanPhaseSpecifier(productName, term, PriceListSet.DEFAULT_PRICELIST_NAME, null);
         try {
-            entitlementApi.createBaseEntitlement(account.getId(),  new DefaultEntitlementSpecifier(spec), "externalKey2", null, null, false, true, ImmutableList.<PluginProperty>of(), callContext);
+            entitlementApi.createBaseEntitlement(account.getId(), new DefaultEntitlementSpecifier(spec), "externalKey2", null, null, false, true, ImmutableList.<PluginProperty>of(), callContext);
             fail(); // force to fail is there is not an exception
         } catch (final EntitlementApiException e) {
             assertEquals(e.getCode(), ErrorCode.CAT_PLAN_NOT_FOUND.getCode());
@@ -192,7 +191,7 @@ public class TestCatalogRetireElements extends TestIntegrationBase {
         final PlanPhaseSpecifier spec1 = new PlanPhaseSpecifier(productName, term, "DEFAULT", null);
 
         busHandler.pushExpectedEvents(NextEvent.CREATE, NextEvent.BLOCK, NextEvent.INVOICE);
-        final UUID bpEntitlementId = entitlementApi.createBaseEntitlement(account.getId(),  new DefaultEntitlementSpecifier(spec1), "externalKey", null,  null, false, true, ImmutableList.<PluginProperty>of(), callContext);
+        final UUID bpEntitlementId = entitlementApi.createBaseEntitlement(account.getId(), new DefaultEntitlementSpecifier(spec1), "externalKey", null, null, false, true, ImmutableList.<PluginProperty>of(), callContext);
         assertListenerStatus();
         Entitlement bpEntitlement = entitlementApi.getEntitlementForId(bpEntitlementId, callContext);
 
@@ -216,7 +215,7 @@ public class TestCatalogRetireElements extends TestIntegrationBase {
         // Note that we need to trigger a CHANGE outside a TRIAL phase to generate a CHANGE event (otherwise, a CREATE is generated)
         final PlanPhaseSpecifier spec2 = new PlanPhaseSpecifier(productName, term, "SpecialDiscount", null);
         busHandler.pushExpectedEvents(NextEvent.CHANGE, NextEvent.INVOICE);
-        bpEntitlement = bpEntitlement.changePlanWithDate( new DefaultEntitlementSpecifier(spec2), clock.getUTCToday(), ImmutableList.<PluginProperty>of(), callContext);
+        bpEntitlement = bpEntitlement.changePlanWithDate(new DefaultEntitlementSpecifier(spec2), clock.getUTCToday(), ImmutableList.<PluginProperty>of(), callContext);
         assertListenerStatus();
 
         assertEquals(entitlementApi.getEntitlementForId(bpEntitlement.getId(), callContext).getLastActivePhase().getPhaseType(), PhaseType.DISCOUNT);
@@ -252,7 +251,7 @@ public class TestCatalogRetireElements extends TestIntegrationBase {
         // Catalog v3 should start now.
 
         try {
-            entitlementApi.createBaseEntitlement(account.getId(),  new DefaultEntitlementSpecifier(spec2), "externalKey2", null, null, false, true, ImmutableList.<PluginProperty>of(), callContext);
+            entitlementApi.createBaseEntitlement(account.getId(), new DefaultEntitlementSpecifier(spec2), "externalKey2", null, null, false, true, ImmutableList.<PluginProperty>of(), callContext);
             fail(); // force to fail is there is not an exception
         } catch (final EntitlementApiException e) {
             assertEquals(e.getCode(), ErrorCode.CAT_NO_SUCH_PRODUCT.getCode());
@@ -283,7 +282,7 @@ public class TestCatalogRetireElements extends TestIntegrationBase {
         final PlanPhaseSpecifier spec1 = new PlanPhaseSpecifier(productName, term, "DEFAULT", null);
 
         busHandler.pushExpectedEvents(NextEvent.CREATE, NextEvent.BLOCK, NextEvent.INVOICE);
-        final UUID bpEntitlementId = entitlementApi.createBaseEntitlement(account.getId(),  new DefaultEntitlementSpecifier(spec1), "externalKey", null, null, false, true, ImmutableList.<PluginProperty>of(), callContext);
+        final UUID bpEntitlementId = entitlementApi.createBaseEntitlement(account.getId(), new DefaultEntitlementSpecifier(spec1), "externalKey", null, null, false, true, ImmutableList.<PluginProperty>of(), callContext);
         assertListenerStatus();
         Entitlement bpEntitlement = entitlementApi.getEntitlementForId(bpEntitlementId, callContext);
 
@@ -307,7 +306,7 @@ public class TestCatalogRetireElements extends TestIntegrationBase {
         // Note that we need to trigger a CHANGE outside a TRIAL phase to generate a CHANGE event (otherwise, a CREATE is generated)
         final PlanPhaseSpecifier spec2 = new PlanPhaseSpecifier(productName, term, "SpecialDiscount", null);
         busHandler.pushExpectedEvents(NextEvent.CHANGE, NextEvent.INVOICE);
-        bpEntitlement = bpEntitlement.changePlanWithDate( new DefaultEntitlementSpecifier(spec2), clock.getUTCToday(), ImmutableList.<PluginProperty>of(), callContext);
+        bpEntitlement = bpEntitlement.changePlanWithDate(new DefaultEntitlementSpecifier(spec2), clock.getUTCToday(), ImmutableList.<PluginProperty>of(), callContext);
         assertListenerStatus();
 
         assertEquals(entitlementApi.getEntitlementForId(bpEntitlement.getId(), callContext).getLastActivePhase().getPhaseType(), PhaseType.DISCOUNT);
@@ -353,7 +352,7 @@ public class TestCatalogRetireElements extends TestIntegrationBase {
         // Catalog v3 should start now.
 
         try {
-            entitlementApi.createBaseEntitlement(account.getId(),  new DefaultEntitlementSpecifier(spec2), "externalKey2", null, null, false, true, ImmutableList.<PluginProperty>of(), callContext);
+            entitlementApi.createBaseEntitlement(account.getId(), new DefaultEntitlementSpecifier(spec2), "externalKey2", null, null, false, true, ImmutableList.<PluginProperty>of(), callContext);
             fail(); // force to fail is there is not an exception
         } catch (final EntitlementApiException e) {
             assertEquals(e.getCode(), ErrorCode.CAT_NO_SUCH_PRODUCT.getCode());
@@ -406,7 +405,7 @@ public class TestCatalogRetireElements extends TestIntegrationBase {
 
         final PlanPhaseSpecifier spec = new PlanPhaseSpecifier(productName, term, PriceListSet.DEFAULT_PRICELIST_NAME, null);
         try {
-            entitlementApi.createBaseEntitlement(account.getId(),  new DefaultEntitlementSpecifier(spec), "externalKey2", null, null, false, true, ImmutableList.<PluginProperty>of(), callContext);
+            entitlementApi.createBaseEntitlement(account.getId(), new DefaultEntitlementSpecifier(spec), "externalKey2", null, null, false, true, ImmutableList.<PluginProperty>of(), callContext);
             fail(); // force to fail is there is not an exception
         } catch (final EntitlementApiException e) {
             assertTrue(e.getLocalizedMessage().startsWith("Could not find any product named 'Pistol'"));
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationBase.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationBase.java
index 1326ecc..a405fbe 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationBase.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestIntegrationBase.java
@@ -323,7 +323,7 @@ public class TestIntegrationBase extends BeatrixTestSuiteWithEmbeddedDB implemen
 
         final InvoiceConfig defaultInvoiceConfig = new ConfigurationObjectFactory(skifeConfigSource).build(InvoiceConfig.class);
         invoiceConfig = new ConfigurableInvoiceConfig(defaultInvoiceConfig);
-        final Injector g = Guice.createInjector(Stage.PRODUCTION, new BeatrixIntegrationModule(configSource, invoiceConfig));
+        final Injector g = Guice.createInjector(Stage.PRODUCTION, new BeatrixIntegrationModule(configSource, clock, invoiceConfig));
         g.injectMembers(this);
     }
 
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestInvoiceNotifications.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestInvoiceNotifications.java
index c2e73aa..4bf9672 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestInvoiceNotifications.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestInvoiceNotifications.java
@@ -17,6 +17,8 @@
 
 package org.killbill.billing.beatrix.integration;
 
+import java.util.HashMap;
+import java.util.Map;
 import java.util.UUID;
 
 import org.joda.time.LocalDate;
@@ -34,17 +36,15 @@ import org.killbill.billing.platform.api.KillbillConfigSource;
 import org.testng.annotations.Test;
 
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
 
 public class TestInvoiceNotifications extends TestIntegrationBase {
 
     @Override
-    protected KillbillConfigSource getConfigSource() {
-
-        return getConfigSource(null, new ImmutableMap.Builder()
-                .putAll(DEFAULT_BEATRIX_PROPERTIES)
-                .put("org.killbill.invoice.dryRunNotificationSchedule", "7d")
-                .build());
+    protected KillbillConfigSource getConfigSource(final Map<String, String> extraProperties) {
+        final Map<String, String> allExtraProperties = new HashMap<String, String>(extraProperties);
+        allExtraProperties.putAll(DEFAULT_BEATRIX_PROPERTIES);
+        allExtraProperties.put("org.killbill.invoice.dryRunNotificationSchedule", "7d");
+        return getConfigSource(null, allExtraProperties);
     }
 
     @Test(groups = "slow")
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestPublicBus.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestPublicBus.java
index 8cd0266..fdeb009 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestPublicBus.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestPublicBus.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2017 Groupon, Inc
- * Copyright 2014-2017 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -20,6 +20,8 @@ package org.killbill.billing.beatrix.integration;
 
 import java.io.IOException;
 import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.Callable;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -53,7 +55,6 @@ import org.testng.annotations.Test;
 
 import com.fasterxml.jackson.core.JsonParseException;
 import com.fasterxml.jackson.databind.JsonMappingException;
-import com.google.common.collect.ImmutableMap;
 import com.google.common.eventbus.Subscribe;
 
 import static java.util.concurrent.TimeUnit.SECONDS;
@@ -68,12 +69,12 @@ public class TestPublicBus extends TestIntegrationBase {
     private AtomicInteger externalBusCount;
 
     @Override
-    protected KillbillConfigSource getConfigSource() {
-        return getConfigSource(null, new ImmutableMap.Builder()
-                .putAll(DEFAULT_BEATRIX_PROPERTIES)
-                .put("org.killbill.billing.util.broadcast.rate", "500ms")
-                .put("org.killbill.invoice.dryRunNotificationSchedule", "1d")
-                .build());
+    protected KillbillConfigSource getConfigSource(final Map<String, String> extraProperties) {
+        final Map<String, String> allExtraProperties = new HashMap<String, String>(extraProperties);
+        allExtraProperties.putAll(DEFAULT_BEATRIX_PROPERTIES);
+        allExtraProperties.put("org.killbill.billing.util.broadcast.rate", "500ms");
+        allExtraProperties.put("org.killbill.invoice.dryRunNotificationSchedule", "1d");
+        return getConfigSource(null, allExtraProperties);
     }
 
     @Override
@@ -136,7 +137,6 @@ public class TestPublicBus extends TestIntegrationBase {
         final Account account = createAccountWithNonOsgiPaymentMethod(getAccountData(billingDay));
         assertNotNull(account);
 
-
         //
         // CREATE SUBSCRIPTION AND EXPECT BOTH EVENTS: NextEvent.CREATE, NextEvent.BLOCK NextEvent.INVOICE
         //
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithCatalogPlugin.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithCatalogPlugin.java
index ad84112..f8cf109 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithCatalogPlugin.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithCatalogPlugin.java
@@ -1,6 +1,6 @@
 /*
- * Copyright 2014-2016 Groupon, Inc
- * Copyright 2014-2016 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -55,6 +55,7 @@ import org.killbill.billing.osgi.api.OSGIServiceRegistration;
 import org.killbill.billing.payment.api.PluginProperty;
 import org.killbill.billing.util.callcontext.InternalCallContextFactory;
 import org.killbill.billing.util.callcontext.TenantContext;
+import org.killbill.clock.Clock;
 import org.killbill.xmlloader.XMLLoader;
 import org.testng.Assert;
 import org.testng.annotations.BeforeClass;
@@ -90,7 +91,7 @@ public class TestWithCatalogPlugin extends TestIntegrationBase {
 
         super.beforeClass();
 
-        this.testCatalogPluginApi = new TestCatalogPluginApi(priceOverride, internalCallContext, internalCallContextFactory);
+        this.testCatalogPluginApi = new TestCatalogPluginApi(priceOverride, clock, internalCallContext, internalCallContextFactory);
         pluginRegistry.registerService(new OSGIServiceDescriptor() {
             @Override
             public String getPluginSymbolicName() {
@@ -190,17 +191,19 @@ public class TestWithCatalogPlugin extends TestIntegrationBase {
 
     public static class TestCatalogPluginApi implements CatalogPluginApi {
 
-        final PriceOverride priceOverride;
-        final InternalTenantContext internalTenantContext;
-        final InternalCallContextFactory internalCallContextFactory;
+        private final PriceOverride priceOverride;
+        private final Clock clock;
+        private final InternalTenantContext internalTenantContext;
+        private final InternalCallContextFactory internalCallContextFactory;
 
         private DefaultVersionedCatalog versionedCatalog;
         private DateTime latestCatalogUpdate;
         private int nbLatestCatalogVersionApiCalls;
         private int nbVersionedPluginCatalogApiCalls;
 
-        public TestCatalogPluginApi(final PriceOverride priceOverride, final InternalTenantContext internalTenantContext, final InternalCallContextFactory internalCallContextFactory) throws Exception {
+        public TestCatalogPluginApi(final PriceOverride priceOverride, final Clock clock, final InternalTenantContext internalTenantContext, final InternalCallContextFactory internalCallContextFactory) throws Exception {
             this.priceOverride = priceOverride;
+            this.clock = clock;
             this.internalTenantContext = internalTenantContext;
             this.internalCallContextFactory = internalCallContextFactory;
             reset();
@@ -226,7 +229,7 @@ public class TestWithCatalogPlugin extends TestIntegrationBase {
 
             this.latestCatalogUpdate = new DateTime(inputCatalogVersion.getEffectiveDate());
             if (versionedCatalog == null) {
-                versionedCatalog = new DefaultVersionedCatalog(getClock());
+                versionedCatalog = new DefaultVersionedCatalog(clock);
             }
             versionedCatalog.add(inputCatalogVersionWithOverride);
         }
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithFakeKPMPlugin.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithFakeKPMPlugin.java
index 44476e3..526a667 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithFakeKPMPlugin.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithFakeKPMPlugin.java
@@ -1,6 +1,6 @@
 /*
- * Copyright 2014-2017 Groupon, Inc
- * Copyright 2014-2017 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -21,6 +21,7 @@ import java.io.File;
 import java.io.IOException;
 import java.lang.reflect.Field;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -29,7 +30,6 @@ import java.util.concurrent.Callable;
 import javax.annotation.Nullable;
 import javax.inject.Inject;
 
-import org.killbill.billing.DBTestingHelper;
 import org.killbill.billing.api.TestApiListener.NextEvent;
 import org.killbill.billing.notification.plugin.api.BroadcastMetadata;
 import org.killbill.billing.notification.plugin.api.ExtBusEvent;
@@ -67,7 +67,6 @@ import com.fasterxml.jackson.databind.SerializationFeature;
 import com.fasterxml.jackson.datatype.joda.JodaModule;
 import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 import com.google.common.eventbus.Subscribe;
 import com.google.inject.Binder;
@@ -94,11 +93,11 @@ public class TestWithFakeKPMPlugin extends TestIntegrationBase {
     private PluginFinder pluginFinder;
 
     @Override
-    protected KillbillConfigSource getConfigSource() {
-        return getConfigSource(null, new ImmutableMap.Builder()
-                .putAll(DEFAULT_BEATRIX_PROPERTIES)
-                .put("org.killbill.billing.util.broadcast.rate", "100ms")
-                .build());
+    protected KillbillConfigSource getConfigSource(final Map<String, String> extraProperties) {
+        final Map<String, String> allExtraProperties = new HashMap<String, String>(extraProperties);
+        allExtraProperties.putAll(DEFAULT_BEATRIX_PROPERTIES);
+        allExtraProperties.put("org.killbill.billing.util.broadcast.rate", "100ms");
+        return getConfigSource(null, allExtraProperties);
     }
 
     public class FakeKPMPlugin {
@@ -316,7 +315,7 @@ public class TestWithFakeKPMPlugin extends TestIntegrationBase {
             return;
         }
 
-        final Injector g = Guice.createInjector(Stage.PRODUCTION, Modules.override(new BeatrixIntegrationModule(configSource)).with(new OverrideModuleForOSGI()));
+        final Injector g = Guice.createInjector(Stage.PRODUCTION, Modules.override(new BeatrixIntegrationModule(configSource, clock)).with(new OverrideModuleForOSGI()));
         g.injectMembers(this);
     }
 
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/usage/TestInArrearWithCatalogVersions.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/usage/TestInArrearWithCatalogVersions.java
index 42cd3dd..fd6c4dc 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/usage/TestInArrearWithCatalogVersions.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/usage/TestInArrearWithCatalogVersions.java
@@ -18,6 +18,8 @@
 package org.killbill.billing.beatrix.integration.usage;
 
 import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.UUID;
 
 import org.joda.time.LocalDate;
@@ -35,14 +37,16 @@ import org.killbill.billing.platform.api.KillbillConfigSource;
 import org.testng.annotations.Test;
 
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
 
 public class TestInArrearWithCatalogVersions extends TestIntegrationBase {
 
     @Override
-    protected KillbillConfigSource getConfigSource() {
-        return super.getConfigSource(null, ImmutableMap.of("org.killbill.catalog.uri", "catalogs/testInArrearWithCatalogVersions",
-                                                           "org.killbill.invoice.readMaxRawUsagePreviousPeriod", "0"));
+    protected KillbillConfigSource getConfigSource(final Map<String, String> extraProperties) {
+        final Map<String, String> allExtraProperties = new HashMap<String, String>(extraProperties);
+        allExtraProperties.putAll(DEFAULT_BEATRIX_PROPERTIES);
+        allExtraProperties.put("org.killbill.catalog.uri", "catalogs/testInArrearWithCatalogVersions");
+        allExtraProperties.put("org.killbill.invoice.readMaxRawUsagePreviousPeriod", "0");
+        return getConfigSource(null, allExtraProperties);
     }
 
     @Test(groups = "slow")
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/CatalogTestSuiteNoDB.java b/catalog/src/test/java/org/killbill/billing/catalog/CatalogTestSuiteNoDB.java
index 1301e8e..3f66123 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/CatalogTestSuiteNoDB.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/CatalogTestSuiteNoDB.java
@@ -56,7 +56,7 @@ public abstract class CatalogTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
             return;
         }
 
-        final Injector injector = Guice.createInjector(new TestCatalogModuleNoDB(configSource));
+        final Injector injector = Guice.createInjector(new TestCatalogModuleNoDB(configSource, clock));
         injector.injectMembers(this);
     }
 }
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/CatalogTestSuiteWithEmbeddedDB.java b/catalog/src/test/java/org/killbill/billing/catalog/CatalogTestSuiteWithEmbeddedDB.java
index 2767ce8..3575513 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/CatalogTestSuiteWithEmbeddedDB.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/CatalogTestSuiteWithEmbeddedDB.java
@@ -1,6 +1,6 @@
 /*
- * Copyright 2014-2015 Groupon, Inc
- * Copyright 2014-2015 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -17,6 +17,8 @@
 
 package org.killbill.billing.catalog;
 
+import java.util.Map;
+
 import org.killbill.billing.GuicyKillbillTestSuiteWithEmbeddedDB;
 import org.killbill.billing.catalog.dao.CatalogOverrideDao;
 import org.killbill.billing.catalog.glue.TestCatalogModuleWithEmbeddedDB;
@@ -41,8 +43,8 @@ public class CatalogTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteWithEm
     protected PriceOverride priceOverride;
 
     @Override
-    protected KillbillConfigSource getConfigSource() {
-        return getConfigSource("/resource.properties");
+    protected KillbillConfigSource getConfigSource(final Map<String, String> extraProperties) {
+        return getConfigSource("/resource.properties", extraProperties);
     }
 
     @BeforeClass(groups = "slow")
@@ -51,7 +53,7 @@ public class CatalogTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteWithEm
             return;
         }
 
-        final Injector injector = Guice.createInjector(new TestCatalogModuleWithEmbeddedDB(configSource));
+        final Injector injector = Guice.createInjector(new TestCatalogModuleWithEmbeddedDB(configSource, clock));
         injector.injectMembers(this);
     }
 
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/glue/TestCatalogModuleNoDB.java b/catalog/src/test/java/org/killbill/billing/catalog/glue/TestCatalogModuleNoDB.java
index d85629c..742f717 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/glue/TestCatalogModuleNoDB.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/glue/TestCatalogModuleNoDB.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -21,22 +21,26 @@ package org.killbill.billing.catalog.glue;
 import org.killbill.billing.GuicyKillbillTestNoDBModule;
 import org.killbill.billing.catalog.dao.CatalogOverrideDao;
 import org.killbill.billing.platform.api.KillbillConfigSource;
+import org.killbill.clock.ClockMock;
 import org.mockito.Mockito;
 
 public class TestCatalogModuleNoDB extends TestCatalogModule {
 
+    private final ClockMock clock;
+
     protected void installCatalogDao() {
         final CatalogOverrideDao mockCatalogOverrideDao = Mockito.mock(CatalogOverrideDao.class);
         bind(CatalogOverrideDao.class).toInstance(mockCatalogOverrideDao);
     }
 
-    public TestCatalogModuleNoDB(final KillbillConfigSource configSource) {
+    public TestCatalogModuleNoDB(final KillbillConfigSource configSource, final ClockMock clock) {
         super(configSource);
+        this.clock = clock;
     }
 
     @Override
     public void configure() {
         super.configure();
-        install(new GuicyKillbillTestNoDBModule(configSource));
+        install(new GuicyKillbillTestNoDBModule(configSource, clock));
     }
 }
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/glue/TestCatalogModuleWithEmbeddedDB.java b/catalog/src/test/java/org/killbill/billing/catalog/glue/TestCatalogModuleWithEmbeddedDB.java
index a8fa91f..2ad1230 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/glue/TestCatalogModuleWithEmbeddedDB.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/glue/TestCatalogModuleWithEmbeddedDB.java
@@ -1,6 +1,6 @@
 /*
- * Copyright 2014-2015 Groupon, Inc
- * Copyright 2014-2015 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -19,17 +19,21 @@ package org.killbill.billing.catalog.glue;
 
 import org.killbill.billing.GuicyKillbillTestWithEmbeddedDBModule;
 import org.killbill.billing.platform.api.KillbillConfigSource;
+import org.killbill.clock.ClockMock;
 
 public class TestCatalogModuleWithEmbeddedDB extends TestCatalogModule {
 
-    public TestCatalogModuleWithEmbeddedDB(final KillbillConfigSource configSource) {
+    private final ClockMock clock;
+
+    public TestCatalogModuleWithEmbeddedDB(final KillbillConfigSource configSource, final ClockMock clock) {
         super(configSource);
+        this.clock = clock;
     }
 
     @Override
     public void configure() {
         super.configure();
-        install(new GuicyKillbillTestWithEmbeddedDBModule(configSource));
+        install(new GuicyKillbillTestWithEmbeddedDBModule(configSource, clock));
     }
 
 }
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/TestDefaultPriceOverride.java b/catalog/src/test/java/org/killbill/billing/catalog/TestDefaultPriceOverride.java
index 75cdd21..46ba4da 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/TestDefaultPriceOverride.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/TestDefaultPriceOverride.java
@@ -56,9 +56,9 @@ public class TestDefaultPriceOverride extends CatalogTestSuiteWithEmbeddedDB {
         final Plan plan = catalog.findCurrentPlan("discount-standard-monthly");
 
         final List<PlanPhasePriceOverride> overrides = new ArrayList<PlanPhasePriceOverride>();
-        final PlanPhasePriceOverride phase1 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[0].getName(), Currency.USD, BigDecimal.ONE, null,null);
+        final PlanPhasePriceOverride phase1 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[0].getName(), Currency.USD, BigDecimal.ONE, null, null);
         overrides.add(phase1);
-        final PlanPhasePriceOverride phase3 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[2].getName(), Currency.USD, null, new BigDecimal("142.41"),null);
+        final PlanPhasePriceOverride phase3 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[2].getName(), Currency.USD, null, new BigDecimal("142.41"), null);
         overrides.add(phase3);
 
         final DefaultPlan overriddenPlan = priceOverride.getOrCreateOverriddenPlan(catalog, plan, new DateTime(catalog.getEffectiveDate()), overrides, internalCallContext);
@@ -111,7 +111,7 @@ public class TestDefaultPriceOverride extends CatalogTestSuiteWithEmbeddedDB {
         final Plan plan = catalog.findCurrentPlan("discount-standard-monthly");
 
         final List<PlanPhasePriceOverride> overrides = new ArrayList<PlanPhasePriceOverride>();
-        final PlanPhasePriceOverride phase1 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[0].getName(), Currency.USD, null, BigDecimal.ONE,null);
+        final PlanPhasePriceOverride phase1 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[0].getName(), Currency.USD, null, BigDecimal.ONE, null);
         overrides.add(phase1);
 
         priceOverride.getOrCreateOverriddenPlan(catalog, plan, new DateTime(catalog.getEffectiveDate()), overrides, internalCallContext);
@@ -129,7 +129,7 @@ public class TestDefaultPriceOverride extends CatalogTestSuiteWithEmbeddedDB {
         final List<PlanPhasePriceOverride> overrides = new ArrayList<PlanPhasePriceOverride>();
         final PlanPhasePriceOverride phase1 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[0].getName(), Currency.USD, BigDecimal.ONE, null, null);
         overrides.add(phase1);
-        final PlanPhasePriceOverride phase3 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[2].getName(), Currency.USD, null, new BigDecimal("142.41"),null);
+        final PlanPhasePriceOverride phase3 = new DefaultPlanPhasePriceOverride(plan.getAllPhases()[2].getName(), Currency.USD, null, new BigDecimal("142.41"), null);
         overrides.add(phase3);
 
         final DefaultPlan overriddenPlanCreated = priceOverride.getOrCreateOverriddenPlan(catalog, plan, new DateTime(catalog.getEffectiveDate()), overrides, internalCallContext);
@@ -160,7 +160,7 @@ public class TestDefaultPriceOverride extends CatalogTestSuiteWithEmbeddedDB {
             }).orNull();
 
             assertNotEquals(newPhase.getName(), initialPhase.getName());
-            assertEquals(newPhase.getName(), overriddenPlan.getName() + "-" +  initialPhase.getName().split("-")[initialPhase.getName().split("-").length -1]);
+            assertEquals(newPhase.getName(), overriddenPlan.getName() + "-" + initialPhase.getName().split("-")[initialPhase.getName().split("-").length - 1]);
             assertEquals(newPhase.getDuration(), initialPhase.getDuration());
             assertEquals(newPhase.getPhaseType(), initialPhase.getPhaseType());
             assertEquals(newPhase.getUsages().length, initialPhase.getUsages().length);
@@ -215,7 +215,7 @@ public class TestDefaultPriceOverride extends CatalogTestSuiteWithEmbeddedDB {
         final List<UsagePriceOverride> usagePriceOverrides = new ArrayList<UsagePriceOverride>();
         usagePriceOverrides.add(new DefaultUsagePriceOverride("chocolate-monthly-videos", UsageType.CONSUMABLE, tierPriceOverrides));
 
-        final PlanPhasePriceOverride phase = new DefaultPlanPhasePriceOverride(plan.getFinalPhase().getName(),Currency.USD, null, null, usagePriceOverrides);
+        final PlanPhasePriceOverride phase = new DefaultPlanPhasePriceOverride(plan.getFinalPhase().getName(), Currency.USD, null, null, usagePriceOverrides);
         overrides.add(phase);
 
         //Overriding only the tieredblockprice for unit - 'chocolate-videos' with size = 1 and max = 10000 from $1 to $0.75
@@ -232,7 +232,7 @@ public class TestDefaultPriceOverride extends CatalogTestSuiteWithEmbeddedDB {
         }
         assertNotEquals(overriddenPlan.getFinalPhase().getName(), plan.getFinalPhase().getName());
 
-        for(int i = 0 ; i < overriddenPlan.getFinalPhase().getUsages().length; i++) {
+        for (int i = 0; i < overriddenPlan.getFinalPhase().getUsages().length; i++) {
             final DefaultUsage initialUsage = (DefaultUsage) plan.getFinalPhase().getUsages()[i];
             final DefaultUsage newUsage = (DefaultUsage) overriddenPlan.getFinalPhase().getUsages()[i];
 
@@ -242,12 +242,12 @@ public class TestDefaultPriceOverride extends CatalogTestSuiteWithEmbeddedDB {
             assertEquals(newUsage.getBillingPeriod(), initialUsage.getBillingPeriod());
             assertEquals(newUsage.getTiers().length, initialUsage.getTiers().length);
 
-            for(int j = 0 ; j < newUsage.getTiers().length; j++){
+            for (int j = 0; j < newUsage.getTiers().length; j++) {
                 final DefaultTier initialTier = (DefaultTier) initialUsage.getTiers()[j];
                 final DefaultTier newTier = (DefaultTier) newUsage.getTiers()[j];
                 assertEquals(newTier.getTieredBlocks().length, initialTier.getTieredBlocks().length);
 
-                for(int k = 0; k < newTier.getTieredBlocks().length; k++){
+                for (int k = 0; k < newTier.getTieredBlocks().length; k++) {
                     final DefaultTieredBlock initialTieredBlock = (DefaultTieredBlock) initialTier.getTieredBlocks()[k];
                     final DefaultTieredBlock newTieredBlock = (DefaultTieredBlock) newTier.getTieredBlocks()[k];
                     final TieredBlockPriceOverride override = Iterables.tryFind(tieredBlockPriceOverrides, new Predicate<TieredBlockPriceOverride>() {
@@ -255,13 +255,13 @@ public class TestDefaultPriceOverride extends CatalogTestSuiteWithEmbeddedDB {
                         public boolean apply(final TieredBlockPriceOverride input) {
 
                             return input.getUnitName().equals(initialTieredBlock.getUnit().getName()) &&
-                                    Double.compare(input.getSize(), initialTieredBlock.getSize()) == 0 &&
-                                    Double.compare(input.getMax(), initialTieredBlock.getMax()) == 0;
+                                   Double.compare(input.getSize(), initialTieredBlock.getSize()) == 0 &&
+                                   Double.compare(input.getMax(), initialTieredBlock.getMax()) == 0;
                         }
                     }).orNull();
 
                     assertEquals(newTieredBlock.getUnit().getName(), initialTieredBlock.getUnit().getName());
-                    assertEquals(newTieredBlock.getMax(),initialTieredBlock.getMax());
+                    assertEquals(newTieredBlock.getMax(), initialTieredBlock.getMax());
                     assertEquals(newTieredBlock.getSize(), initialTieredBlock.getSize());
                     assertTieredBlockInternationalPrice(newTieredBlock.getPrice(), initialTieredBlock.getPrice(), override);
                 }
@@ -290,7 +290,7 @@ public class TestDefaultPriceOverride extends CatalogTestSuiteWithEmbeddedDB {
         final List<UsagePriceOverride> usagePriceOverrides = new ArrayList<UsagePriceOverride>();
         usagePriceOverrides.add(new DefaultUsagePriceOverride("chocolate-monthly-videos", UsageType.CONSUMABLE, tierPriceOverrides));
 
-        final PlanPhasePriceOverride phase = new DefaultPlanPhasePriceOverride(plan.getFinalPhase().getName(),Currency.USD, null, new BigDecimal("35"), usagePriceOverrides);
+        final PlanPhasePriceOverride phase = new DefaultPlanPhasePriceOverride(plan.getFinalPhase().getName(), Currency.USD, null, new BigDecimal("35"), usagePriceOverrides);
         overrides.add(phase);
 
         /* Overriding phase recurring price from $30 to $35, tieredblockprice from $2 to $1.5 for unit- 'chocolate-videos' with size = 1 and max = 5 and
@@ -319,7 +319,7 @@ public class TestDefaultPriceOverride extends CatalogTestSuiteWithEmbeddedDB {
         }).orNull();
 
         assertNotEquals(newPhase.getName(), initialPhase.getName());
-        assertEquals(newPhase.getName(), overriddenPlan.getName() + "-" +  initialPhase.getName().split("-")[initialPhase.getName().split("-").length -1]);
+        assertEquals(newPhase.getName(), overriddenPlan.getName() + "-" + initialPhase.getName().split("-")[initialPhase.getName().split("-").length - 1]);
         assertEquals(newPhase.getDuration(), initialPhase.getDuration());
         assertEquals(newPhase.getPhaseType(), initialPhase.getPhaseType());
         assertEquals(newPhase.getUsages().length, initialPhase.getUsages().length);
@@ -331,7 +331,7 @@ public class TestDefaultPriceOverride extends CatalogTestSuiteWithEmbeddedDB {
             assertInternationalPrice(newPhase.getRecurring().getRecurringPrice(), initialPhase.getRecurring().getRecurringPrice(), override, false);
         }
 
-        for(int i = 0 ; i < overriddenPlan.getFinalPhase().getUsages().length; i++) {
+        for (int i = 0; i < overriddenPlan.getFinalPhase().getUsages().length; i++) {
             final DefaultUsage initialUsage = (DefaultUsage) plan.getFinalPhase().getUsages()[i];
             final DefaultUsage newUsage = (DefaultUsage) overriddenPlan.getFinalPhase().getUsages()[i];
 
@@ -341,12 +341,12 @@ public class TestDefaultPriceOverride extends CatalogTestSuiteWithEmbeddedDB {
             assertEquals(newUsage.getBillingPeriod(), initialUsage.getBillingPeriod());
             assertEquals(newUsage.getTiers().length, initialUsage.getTiers().length);
 
-            for(int j = 0 ; j < newUsage.getTiers().length; j++){
+            for (int j = 0; j < newUsage.getTiers().length; j++) {
                 final DefaultTier initialTier = (DefaultTier) initialUsage.getTiers()[j];
                 final DefaultTier newTier = (DefaultTier) newUsage.getTiers()[j];
                 assertEquals(newTier.getTieredBlocks().length, initialTier.getTieredBlocks().length);
 
-                for(int k = 0; k < newTier.getTieredBlocks().length; k++){
+                for (int k = 0; k < newTier.getTieredBlocks().length; k++) {
                     final DefaultTieredBlock initialTieredBlock = (DefaultTieredBlock) initialTier.getTieredBlocks()[k];
                     final DefaultTieredBlock newTieredBlock = (DefaultTieredBlock) newTier.getTieredBlocks()[k];
                     List<TieredBlockPriceOverride> tieredBlockPriceOverrides = new ArrayList<TieredBlockPriceOverride>();
@@ -357,13 +357,13 @@ public class TestDefaultPriceOverride extends CatalogTestSuiteWithEmbeddedDB {
                         public boolean apply(final TieredBlockPriceOverride input) {
 
                             return input.getUnitName().equals(initialTieredBlock.getUnit().getName()) &&
-                                    Double.compare(input.getSize(), initialTieredBlock.getSize()) == 0 &&
-                                    Double.compare(input.getMax(), initialTieredBlock.getMax()) == 0;
+                                   Double.compare(input.getSize(), initialTieredBlock.getSize()) == 0 &&
+                                   Double.compare(input.getMax(), initialTieredBlock.getMax()) == 0;
                         }
                     }).orNull();
 
                     assertEquals(newTieredBlock.getUnit().getName(), initialTieredBlock.getUnit().getName());
-                    assertEquals(newTieredBlock.getMax(),initialTieredBlock.getMax());
+                    assertEquals(newTieredBlock.getMax(), initialTieredBlock.getMax());
                     assertEquals(newTieredBlock.getSize(), initialTieredBlock.getSize());
                     assertTieredBlockInternationalPrice(newTieredBlock.getPrice(), initialTieredBlock.getPrice(), tieredBlockPriceOverride);
                 }
diff --git a/catalog/src/test/java/org/killbill/billing/catalog/TestVersionedCatalog.java b/catalog/src/test/java/org/killbill/billing/catalog/TestVersionedCatalog.java
index 6ed50a6..8e4b9c9 100644
--- a/catalog/src/test/java/org/killbill/billing/catalog/TestVersionedCatalog.java
+++ b/catalog/src/test/java/org/killbill/billing/catalog/TestVersionedCatalog.java
@@ -18,7 +18,9 @@
 
 package org.killbill.billing.catalog;
 
+import java.io.IOException;
 import java.math.BigDecimal;
+import java.util.Collection;
 
 import org.joda.time.DateTime;
 import org.killbill.billing.ErrorCode;
diff --git a/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultSubscriptionApi.java b/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultSubscriptionApi.java
index a76aef8..ffc9fa3 100644
--- a/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultSubscriptionApi.java
+++ b/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestDefaultSubscriptionApi.java
@@ -65,11 +65,8 @@ public class TestDefaultSubscriptionApi extends EntitlementTestSuiteWithEmbedded
         testListener.pushExpectedEvents(NextEvent.CREATE, NextEvent.BLOCK);
         final UUID entitlement1Id = entitlementApi.createBaseEntitlement(account.getId(), new DefaultEntitlementSpecifier(spec), UUID.randomUUID().toString(), null, null, false, true, ImmutableList.<PluginProperty>of(), callContext);
         final Entitlement entitlement1 = entitlementApi.getEntitlementForId(entitlement1Id, callContext);
-        // Sleep 1 sec so created date are apart from each other and ordering in the bundle does not default on the UUID which is random.
-        try {
-            Thread.sleep(1000);
-        } catch (InterruptedException ignore) {
-        }
+        // Move the clock 1.5 sec so the (truncated) created date are apart from each other and ordering in the bundle does not default on the UUID which is random.
+        clock.addDeltaFromReality(1500);
         testListener.pushExpectedEvents(NextEvent.CREATE, NextEvent.BLOCK);
         final UUID entitlement2Id = entitlementApi.createBaseEntitlement(account.getId(), new DefaultEntitlementSpecifier(spec), UUID.randomUUID().toString(), null, null, false, true, ImmutableList.<PluginProperty>of(), callContext);
         assertListenerStatus();
diff --git a/entitlement/src/test/java/org/killbill/billing/entitlement/block/TestBlockingApi.java b/entitlement/src/test/java/org/killbill/billing/entitlement/block/TestBlockingApi.java
index e1391aa..66f3518 100644
--- a/entitlement/src/test/java/org/killbill/billing/entitlement/block/TestBlockingApi.java
+++ b/entitlement/src/test/java/org/killbill/billing/entitlement/block/TestBlockingApi.java
@@ -52,16 +52,6 @@ import static org.testng.Assert.fail;
 
 public class TestBlockingApi extends EntitlementTestSuiteWithEmbeddedDB {
 
-    @BeforeMethod(groups = "slow")
-    public void beforeMethod() throws Exception {
-        if (hasFailed()) {
-            return;
-        }
-
-        super.beforeMethod();
-        clock.resetDeltaFromReality();
-    }
-
     @Test(groups = "slow")
     public void testApi() {
         final UUID uuid = UUID.randomUUID();
diff --git a/entitlement/src/test/java/org/killbill/billing/entitlement/EntitlementTestSuiteNoDB.java b/entitlement/src/test/java/org/killbill/billing/entitlement/EntitlementTestSuiteNoDB.java
index cd116fc..c0c5dc8 100644
--- a/entitlement/src/test/java/org/killbill/billing/entitlement/EntitlementTestSuiteNoDB.java
+++ b/entitlement/src/test/java/org/killbill/billing/entitlement/EntitlementTestSuiteNoDB.java
@@ -73,7 +73,7 @@ public abstract class EntitlementTestSuiteNoDB extends GuicyKillbillTestSuiteNoD
             return;
         }
 
-        final Injector injector = Guice.createInjector(new TestEntitlementModuleNoDB(configSource));
+        final Injector injector = Guice.createInjector(new TestEntitlementModuleNoDB(configSource, clock));
         injector.injectMembers(this);
     }
 
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 ae6400d..009a916 100644
--- a/entitlement/src/test/java/org/killbill/billing/entitlement/EntitlementTestSuiteWithEmbeddedDB.java
+++ b/entitlement/src/test/java/org/killbill/billing/entitlement/EntitlementTestSuiteWithEmbeddedDB.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2016 Groupon, Inc
- * Copyright 2014-2016 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -18,6 +18,7 @@
 
 package org.killbill.billing.entitlement;
 
+import java.util.Map;
 import java.util.UUID;
 
 import org.apache.shiro.SecurityUtils;
@@ -124,8 +125,8 @@ public class EntitlementTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteWi
     protected Catalog catalog;
 
     @Override
-    protected KillbillConfigSource getConfigSource() {
-        return getConfigSource("/entitlement.properties");
+    protected KillbillConfigSource getConfigSource(final Map<String, String> extraProperties) {
+        return getConfigSource("/entitlement.properties", extraProperties);
     }
 
     @BeforeClass(groups = "slow")
@@ -134,7 +135,7 @@ public class EntitlementTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteWi
             return;
         }
 
-        final Injector injector = Guice.createInjector(Stage.PRODUCTION, new TestEntitlementModuleWithEmbeddedDB(configSource));
+        final Injector injector = Guice.createInjector(Stage.PRODUCTION, new TestEntitlementModuleWithEmbeddedDB(configSource, clock));
         injector.injectMembers(this);
     }
 
@@ -234,8 +235,6 @@ public class EntitlementTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteWi
     }
 
     private void resetClockToStartOfTest(final ClockMock clock) {
-        clock.resetDeltaFromReality();
-
         // Date at which all tests start-- we create the date object here after the system properties which set the JVM in UTC have been set.
         final DateTime testStartDate = new DateTime(2012, 5, 7, 0, 3, 42, 0);
         clock.setDeltaFromReality(testStartDate.getMillis() - clock.getUTCNow().getMillis());
diff --git a/entitlement/src/test/java/org/killbill/billing/entitlement/glue/TestEntitlementModuleNoDB.java b/entitlement/src/test/java/org/killbill/billing/entitlement/glue/TestEntitlementModuleNoDB.java
index 63fc5b7..669e2ca 100644
--- a/entitlement/src/test/java/org/killbill/billing/entitlement/glue/TestEntitlementModuleNoDB.java
+++ b/entitlement/src/test/java/org/killbill/billing/entitlement/glue/TestEntitlementModuleNoDB.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -27,17 +27,21 @@ import org.killbill.billing.mock.glue.MockNonEntityDaoModule;
 import org.killbill.billing.mock.glue.MockSubscriptionModule;
 import org.killbill.billing.mock.glue.MockTagModule;
 import org.killbill.billing.platform.api.KillbillConfigSource;
+import org.killbill.clock.ClockMock;
 
 public class TestEntitlementModuleNoDB extends TestEntitlementModule {
 
-    public TestEntitlementModuleNoDB(final KillbillConfigSource configSource) {
+    private final ClockMock clock;
+
+    public TestEntitlementModuleNoDB(final KillbillConfigSource configSource, final ClockMock clock) {
         super(configSource);
+        this.clock = clock;
     }
 
     @Override
     protected void configure() {
         super.configure();
-        install(new GuicyKillbillTestNoDBModule(configSource));
+        install(new GuicyKillbillTestNoDBModule(configSource, clock));
         install(new MockNonEntityDaoModule(configSource));
         install(new MockTagModule(configSource));
         install(new MockSubscriptionModule(configSource));
diff --git a/entitlement/src/test/java/org/killbill/billing/entitlement/glue/TestEntitlementModuleWithEmbeddedDB.java b/entitlement/src/test/java/org/killbill/billing/entitlement/glue/TestEntitlementModuleWithEmbeddedDB.java
index 3188699..17ea102 100644
--- a/entitlement/src/test/java/org/killbill/billing/entitlement/glue/TestEntitlementModuleWithEmbeddedDB.java
+++ b/entitlement/src/test/java/org/killbill/billing/entitlement/glue/TestEntitlementModuleWithEmbeddedDB.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -27,18 +27,22 @@ import org.killbill.billing.subscription.glue.DefaultSubscriptionModule;
 import org.killbill.billing.util.glue.AuditModule;
 import org.killbill.billing.util.glue.NonEntityDaoModule;
 import org.killbill.billing.util.glue.TagStoreModule;
+import org.killbill.clock.ClockMock;
 
 public class TestEntitlementModuleWithEmbeddedDB extends TestEntitlementModule {
 
-    public TestEntitlementModuleWithEmbeddedDB(final KillbillConfigSource configSource) {
+    private final ClockMock clock;
+
+    public TestEntitlementModuleWithEmbeddedDB(final KillbillConfigSource configSource, final ClockMock clock) {
         super(configSource);
+        this.clock = clock;
     }
 
     @Override
     protected void configure() {
         super.configure();
         install(new DefaultAccountModule(configSource));
-        install(new GuicyKillbillTestWithEmbeddedDBModule(configSource));
+        install(new GuicyKillbillTestWithEmbeddedDBModule(configSource, clock));
         install(new NonEntityDaoModule(configSource));
         install(new TagStoreModule(configSource));
         install(new CatalogModule(configSource));
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceDao.java b/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceDao.java
index f73989a..bc02e39 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceDao.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceDao.java
@@ -97,6 +97,9 @@ public class TestInvoiceDao extends InvoiceTestSuiteWithEmbeddedDB {
 
     @BeforeMethod(groups = "slow")
     public void setUp() throws Exception {
+        if (hasFailed()) {
+            return;
+        }
         account = invoiceUtil.createAccount(callContext);
         context = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
     }
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceItemDao.java b/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceItemDao.java
index fa52a80..9dff772 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceItemDao.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/dao/TestInvoiceItemDao.java
@@ -52,6 +52,10 @@ public class TestInvoiceItemDao extends InvoiceTestSuiteWithEmbeddedDB {
 
     @BeforeMethod(groups = "slow")
     public void setUp() throws Exception {
+        if (hasFailed()) {
+            return;
+        }
+
         account = invoiceUtil.createAccount(callContext);
         context = internalCallContextFactory.createInternalCallContext(account.getId(), callContext);
     }
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/generator/TestFixedAndRecurringInvoiceItemGenerator.java b/invoice/src/test/java/org/killbill/billing/invoice/generator/TestFixedAndRecurringInvoiceItemGenerator.java
index 87d8535..68fcade 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/generator/TestFixedAndRecurringInvoiceItemGenerator.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/generator/TestFixedAndRecurringInvoiceItemGenerator.java
@@ -74,6 +74,9 @@ public class TestFixedAndRecurringInvoiceItemGenerator extends InvoiceTestSuiteN
     @Override
     @BeforeMethod(groups = "fast")
     public void beforeMethod() {
+        if (hasFailed()) {
+            return;
+        }
         super.beforeMethod();
 
         try {
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/generator/TestInvoiceWithMetadata.java b/invoice/src/test/java/org/killbill/billing/invoice/generator/TestInvoiceWithMetadata.java
index ac52c6d..ef9d691 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/generator/TestInvoiceWithMetadata.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/generator/TestInvoiceWithMetadata.java
@@ -56,6 +56,10 @@ public class TestInvoiceWithMetadata extends InvoiceTestSuiteNoDB {
     @Override
     @BeforeMethod(groups = "fast")
     public void beforeMethod() {
+        if (hasFailed()) {
+            return;
+        }
+
         super.beforeMethod();
 
         try {
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/glue/TestInvoiceModule.java b/invoice/src/test/java/org/killbill/billing/invoice/glue/TestInvoiceModule.java
index 5a8fdd3..1033187 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/glue/TestInvoiceModule.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/glue/TestInvoiceModule.java
@@ -30,7 +30,6 @@ import org.killbill.billing.util.glue.CacheModule;
 import org.killbill.billing.util.glue.CallContextModule;
 import org.killbill.billing.util.glue.ConfigModule;
 import org.killbill.billing.util.glue.CustomFieldModule;
-import org.killbill.billing.util.glue.MemoryGlobalLockerModule;
 import org.mockito.Mockito;
 
 public class TestInvoiceModule extends DefaultInvoiceModule {
@@ -48,7 +47,6 @@ public class TestInvoiceModule extends DefaultInvoiceModule {
     protected void configure() {
         super.configure();
         install(new CallContextModule(configSource));
-        install(new MemoryGlobalLockerModule(configSource));
 
         install(new CatalogModule(configSource));
         install(new CacheModule(configSource));
@@ -56,7 +54,6 @@ public class TestInvoiceModule extends DefaultInvoiceModule {
         install(new TemplateModule(configSource));
         install(new MockTenantModule(configSource));
 
-
         install(new CustomFieldModule(configSource));
         install(new UsageModule(configSource));
         installExternalApis();
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/glue/TestInvoiceModuleNoDB.java b/invoice/src/test/java/org/killbill/billing/invoice/glue/TestInvoiceModuleNoDB.java
index 8390365..cecf50d 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/glue/TestInvoiceModuleNoDB.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/glue/TestInvoiceModuleNoDB.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -25,8 +25,6 @@ import java.util.Set;
 import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
 import org.killbill.billing.GuicyKillbillTestNoDBModule;
-import org.killbill.billing.account.api.AccountInternalApi;
-import org.killbill.billing.account.api.AccountUserApi;
 import org.killbill.billing.catalog.api.Currency;
 import org.killbill.billing.currency.api.CurrencyConversion;
 import org.killbill.billing.currency.api.CurrencyConversionApi;
@@ -34,19 +32,22 @@ import org.killbill.billing.currency.api.CurrencyConversionException;
 import org.killbill.billing.currency.api.Rate;
 import org.killbill.billing.invoice.dao.InvoiceDao;
 import org.killbill.billing.invoice.dao.MockInvoiceDao;
-import org.killbill.billing.mock.api.MockAccountUserApi;
 import org.killbill.billing.mock.glue.MockAccountModule;
 import org.killbill.billing.mock.glue.MockNonEntityDaoModule;
 import org.killbill.billing.mock.glue.MockTagModule;
 import org.killbill.billing.platform.api.KillbillConfigSource;
 import org.killbill.billing.util.audit.dao.AuditDao;
 import org.killbill.billing.util.audit.dao.MockAuditDao;
+import org.killbill.clock.ClockMock;
 import org.mockito.Mockito;
 
 public class TestInvoiceModuleNoDB extends TestInvoiceModule {
 
-    public TestInvoiceModuleNoDB(final KillbillConfigSource configSource) {
+    private final ClockMock clock;
+
+    public TestInvoiceModuleNoDB(final KillbillConfigSource configSource, final ClockMock clock) {
         super(configSource);
+        this.clock = clock;
     }
 
     protected void installInvoiceDao() {
@@ -56,7 +57,7 @@ public class TestInvoiceModuleNoDB extends TestInvoiceModule {
     @Override
     public void configure() {
         super.configure();
-        install(new GuicyKillbillTestNoDBModule(configSource));
+        install(new GuicyKillbillTestNoDBModule(configSource, clock));
         install(new MockNonEntityDaoModule(configSource));
         install(new MockTagModule(configSource));
         install(new MockAccountModule(configSource));
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/glue/TestInvoiceModuleWithEmbeddedDb.java b/invoice/src/test/java/org/killbill/billing/invoice/glue/TestInvoiceModuleWithEmbeddedDb.java
index c64ea1f..a8acef8 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/glue/TestInvoiceModuleWithEmbeddedDb.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/glue/TestInvoiceModuleWithEmbeddedDb.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -27,12 +27,16 @@ import org.killbill.billing.platform.api.KillbillConfigSource;
 import org.killbill.billing.util.glue.AuditModule;
 import org.killbill.billing.util.glue.NonEntityDaoModule;
 import org.killbill.billing.util.glue.TagStoreModule;
+import org.killbill.clock.ClockMock;
 import org.mockito.Mockito;
 
 public class TestInvoiceModuleWithEmbeddedDb extends TestInvoiceModule {
 
-    public TestInvoiceModuleWithEmbeddedDb(final KillbillConfigSource configSource) {
+    private final ClockMock clock;
+
+    public TestInvoiceModuleWithEmbeddedDb(final KillbillConfigSource configSource, final ClockMock clock) {
         super(configSource);
+        this.clock = clock;
     }
 
     @Override
@@ -45,7 +49,7 @@ public class TestInvoiceModuleWithEmbeddedDb extends TestInvoiceModule {
     public void configure() {
         super.configure();
         install(new DefaultAccountModule(configSource));
-        install(new GuicyKillbillTestWithEmbeddedDBModule(configSource));
+        install(new GuicyKillbillTestWithEmbeddedDBModule(configSource, clock));
         install(new NonEntityDaoModule(configSource));
         install(new TagStoreModule(configSource));
         install(new AuditModule(configSource));
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 6c064ab..e57b176 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/InvoiceTestSuiteNoDB.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/InvoiceTestSuiteNoDB.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -18,6 +18,8 @@
 
 package org.killbill.billing.invoice;
 
+import java.util.Map;
+
 import org.killbill.billing.GuicyKillbillTestSuiteNoDB;
 import org.killbill.billing.account.api.AccountInternalApi;
 import org.killbill.billing.currency.api.CurrencyConversionApi;
@@ -32,7 +34,6 @@ import org.killbill.billing.invoice.glue.TestInvoiceModuleNoDB;
 import org.killbill.billing.invoice.usage.RawUsageOptimizer;
 import org.killbill.billing.junction.BillingInternalApi;
 import org.killbill.billing.lifecycle.api.BusService;
-import org.killbill.billing.payment.api.InvoicePaymentApi;
 import org.killbill.billing.platform.api.KillbillConfigSource;
 import org.killbill.billing.subscription.api.SubscriptionBaseInternalApi;
 import org.killbill.billing.usage.api.UsageUserApi;
@@ -42,7 +43,6 @@ import org.killbill.billing.util.callcontext.InternalCallContextFactory;
 import org.killbill.billing.util.config.definition.InvoiceConfig;
 import org.killbill.billing.util.config.definition.InvoiceConfig.UsageDetailMode;
 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;
@@ -81,8 +81,6 @@ public abstract class InvoiceTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
     @Inject
     protected GlobalLocker locker;
     @Inject
-    protected Clock clock;
-    @Inject
     protected InternalCallContextFactory internalCallContextFactory;
     @Inject
     protected InvoiceInternalApi invoiceInternalApi;
@@ -102,10 +100,12 @@ public abstract class InvoiceTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
     protected InvoiceDaoHelper invoiceDaoHelper;
     @Inject
     protected FixedAndRecurringInvoiceItemGenerator fixedAndRecurringInvoiceItemGenerator;
+
     @Override
-    protected KillbillConfigSource getConfigSource() {
-        return getConfigSource("/resource.properties");
+    protected KillbillConfigSource getConfigSource(final Map<String, String> extraProperties) {
+        return getConfigSource("/resource.properties", extraProperties);
     }
+
     protected UsageDetailMode usageDetailMode;
 
     @BeforeClass(groups = "fast")
@@ -114,7 +114,7 @@ public abstract class InvoiceTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
             return;
         }
 
-        final Injector injector = Guice.createInjector(new TestInvoiceModuleNoDB(configSource));
+        final Injector injector = Guice.createInjector(new TestInvoiceModuleNoDB(configSource, clock));
         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 1ecaa5f..6bb61fc 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/InvoiceTestSuiteWithEmbeddedDB.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/InvoiceTestSuiteWithEmbeddedDB.java
@@ -18,6 +18,8 @@
 
 package org.killbill.billing.invoice;
 
+import java.util.Map;
+
 import org.killbill.billing.GuicyKillbillTestSuiteWithEmbeddedDB;
 import org.killbill.billing.account.api.AccountInternalApi;
 import org.killbill.billing.account.api.AccountUserApi;
@@ -32,7 +34,6 @@ import org.killbill.billing.invoice.glue.TestInvoiceModuleWithEmbeddedDb;
 import org.killbill.billing.invoice.notification.NextBillingDateNotifier;
 import org.killbill.billing.junction.BillingInternalApi;
 import org.killbill.billing.lifecycle.api.BusService;
-import org.killbill.billing.payment.api.InvoicePaymentApi;
 import org.killbill.billing.platform.api.KillbillConfigSource;
 import org.killbill.billing.subscription.api.SubscriptionBaseInternalApi;
 import org.killbill.billing.util.api.TagUserApi;
@@ -41,8 +42,6 @@ import org.killbill.billing.util.callcontext.InternalCallContextFactory;
 import org.killbill.billing.util.config.definition.InvoiceConfig;
 import org.killbill.billing.util.dao.NonEntityDao;
 import org.killbill.bus.api.PersistentBus;
-import org.killbill.clock.Clock;
-import org.killbill.clock.ClockMock;
 import org.killbill.commons.locker.GlobalLocker;
 import org.killbill.notificationq.api.NotificationQueueService;
 import org.slf4j.Logger;
@@ -109,8 +108,8 @@ public abstract class InvoiceTestSuiteWithEmbeddedDB extends GuicyKillbillTestSu
     protected ParkedAccountsManager parkedAccountsManager;
 
     @Override
-    protected KillbillConfigSource getConfigSource() {
-        return getConfigSource("/resource.properties");
+    protected KillbillConfigSource getConfigSource(final Map<String, String> extraProperties) {
+        return getConfigSource("/resource.properties", extraProperties);
     }
 
     @BeforeClass(groups = "slow")
@@ -119,7 +118,7 @@ public abstract class InvoiceTestSuiteWithEmbeddedDB extends GuicyKillbillTestSu
             return;
         }
 
-        final Injector injector = Guice.createInjector(new TestInvoiceModuleWithEmbeddedDb(configSource));
+        final Injector injector = Guice.createInjector(new TestInvoiceModuleWithEmbeddedDb(configSource, clock));
         injector.injectMembers(this);
     }
 
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/notification/TestNextBillingDatePoster.java b/invoice/src/test/java/org/killbill/billing/invoice/notification/TestNextBillingDatePoster.java
index 841567c..5a4522e 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/notification/TestNextBillingDatePoster.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/notification/TestNextBillingDatePoster.java
@@ -29,7 +29,6 @@ import org.killbill.billing.account.api.Account;
 import org.killbill.billing.invoice.InvoiceDispatcher.FutureAccountNotifications;
 import org.killbill.billing.invoice.InvoiceDispatcher.FutureAccountNotifications.FutureAccountNotificationsBuilder;
 import org.killbill.billing.invoice.InvoiceTestSuiteWithEmbeddedDB;
-import org.killbill.billing.invoice.api.DefaultInvoiceService;
 import org.killbill.billing.platform.api.KillbillConfigSource;
 import org.killbill.billing.platform.api.KillbillService.KILLBILL_SERVICES;
 import org.killbill.billing.subscription.api.SubscriptionBase;
@@ -39,17 +38,15 @@ import org.testng.Assert;
 import org.testng.annotations.Test;
 
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 
 public class TestNextBillingDatePoster extends InvoiceTestSuiteWithEmbeddedDB {
 
-    protected KillbillConfigSource getConfigSource() {
-        final ImmutableMap<String, String> extraProperties = ImmutableMap.<String, String>builder()
-                .put("org.killbill.invoice.dryRunNotificationSchedule", "48h")
-                .build();
-        return getConfigSource("/resource.properties", extraProperties);
+    protected KillbillConfigSource getConfigSource(final Map<String, String> extraProperties) {
+        final Map<String, String> allExtraProperties = new HashMap<String, String>(extraProperties);
+        allExtraProperties.put("org.killbill.invoice.dryRunNotificationSchedule", "48h");
+        return getConfigSource("/resource.properties", allExtraProperties);
     }
 
     @Test(groups = "slow")
@@ -103,7 +100,6 @@ public class TestNextBillingDatePoster extends InvoiceTestSuiteWithEmbeddedDB {
         final FutureAccountNotifications futureAccountNotifications2 = createFutureAccountNotifications(subscriptionId2, notificationDate);
         invoiceDao.setFutureAccountNotificationsForEmptyInvoice(account.getId(), futureAccountNotifications2, internalCallContext);
 
-
         final NotificationQueue nextBillingQueue = notificationQueueService.getNotificationQueue(KILLBILL_SERVICES.INVOICE_SERVICE.getServiceName(),
                                                                                                  DefaultNextBillingDateNotifier.NEXT_BILLING_DATE_NOTIFIER_QUEUE);
 
@@ -123,7 +119,6 @@ public class TestNextBillingDatePoster extends InvoiceTestSuiteWithEmbeddedDB {
         Assert.assertEquals(uuidKeysList.get(1), subscriptionId2);
     }
 
-
     @Test(groups = "slow")
     public void testDryRunWithSameSubscriptionLater() throws Exception {
         final Account account = invoiceUtil.createAccount(callContext);
@@ -146,7 +141,6 @@ public class TestNextBillingDatePoster extends InvoiceTestSuiteWithEmbeddedDB {
 
         final FutureAccountNotifications futureAccountNotifications2 = createFutureAccountNotifications(subscriptionId, notificationDate2);
 
-
         invoiceDao.setFutureAccountNotificationsForEmptyInvoice(account.getId(), futureAccountNotifications2, internalCallContext);
 
         final NotificationQueue nextBillingQueue = notificationQueueService.getNotificationQueue(KILLBILL_SERVICES.INVOICE_SERVICE.getServiceName(),
@@ -165,7 +159,6 @@ public class TestNextBillingDatePoster extends InvoiceTestSuiteWithEmbeddedDB {
         Assert.assertEquals(uuidKeysList1.size(), 1);
         Assert.assertEquals(uuidKeysList1.get(0), subscriptionId);
 
-
         final NotificationEventWithMetadata<NextBillingDateNotificationKey> notification2 = futureNotificationsList.get(1);
         Assert.assertEquals(notification2.getEffectiveDate(), internalCallContext.toUTCDateTime(notificationDate2));
 
diff --git a/invoice/src/test/java/org/killbill/billing/invoice/TestInvoicePluginDispatcher.java b/invoice/src/test/java/org/killbill/billing/invoice/TestInvoicePluginDispatcher.java
index 6c3922e..ba26dba 100644
--- a/invoice/src/test/java/org/killbill/billing/invoice/TestInvoicePluginDispatcher.java
+++ b/invoice/src/test/java/org/killbill/billing/invoice/TestInvoicePluginDispatcher.java
@@ -18,7 +18,9 @@
 package org.killbill.billing.invoice;
 
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.Iterator;
+import java.util.Map;
 
 import org.killbill.billing.callcontext.InternalCallContext;
 import org.killbill.billing.invoice.plugin.api.InvoicePluginApi;
@@ -32,7 +34,6 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.google.common.base.Joiner;
-import com.google.common.collect.ImmutableMap;
 import com.google.inject.Inject;
 
 import static org.testng.Assert.assertEquals;
@@ -53,15 +54,19 @@ public class TestInvoicePluginDispatcher extends InvoiceTestSuiteNoDB {
     TenantInternalApi tenantInternalApi;
 
     @Override
-    protected KillbillConfigSource getConfigSource() {
-        return getConfigSource("/resource.properties", ImmutableMap.<String, String>builder()
-                .put("org.killbill.invoice.plugin", Joiner.on(",").join(PLUGIN_1, PLUGIN_2))
-                .build());
+    protected KillbillConfigSource getConfigSource(final Map<String, String> extraProperties) {
+        final Map<String, String> allExtraProperties = new HashMap<String, String>(extraProperties);
+        allExtraProperties.put("org.killbill.invoice.plugin", Joiner.on(",").join(PLUGIN_1, PLUGIN_2));
+        return getConfigSource("/resource.properties", allExtraProperties);
     }
 
     @Override
     @BeforeMethod(groups = "fast")
     public void beforeMethod() {
+        if (hasFailed()) {
+            return;
+        }
+
         super.beforeMethod();
         for (final String name : pluginRegistry.getAllServices()) {
             pluginRegistry.unregisterService(name);
diff --git a/jaxrs/src/test/java/org/killbill/billing/jaxrs/glue/TestJaxrsModuleNoDB.java b/jaxrs/src/test/java/org/killbill/billing/jaxrs/glue/TestJaxrsModuleNoDB.java
index 6fa4edb..ef2506a 100644
--- a/jaxrs/src/test/java/org/killbill/billing/jaxrs/glue/TestJaxrsModuleNoDB.java
+++ b/jaxrs/src/test/java/org/killbill/billing/jaxrs/glue/TestJaxrsModuleNoDB.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2016 Groupon, Inc
- * Copyright 2014-2016 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -26,18 +26,22 @@ import org.killbill.billing.platform.api.KillbillConfigSource;
 import org.killbill.billing.tenant.api.TenantInternalApi;
 import org.killbill.billing.util.glue.CacheModule;
 import org.killbill.billing.util.glue.ConfigModule;
+import org.killbill.clock.ClockMock;
 import org.mockito.Mockito;
 
 public class TestJaxrsModuleNoDB extends TestJaxrsModule {
 
-    public TestJaxrsModuleNoDB(final KillbillConfigSource configSource) {
+    private final ClockMock clock;
+
+    public TestJaxrsModuleNoDB(final KillbillConfigSource configSource, final ClockMock clock) {
         super(configSource);
+        this.clock = clock;
     }
 
     @Override
     public void configure() {
         super.configure();
-        install(new GuicyKillbillTestNoDBModule(configSource));
+        install(new GuicyKillbillTestNoDBModule(configSource, clock));
 
         install(new MockNonEntityDaoModule(configSource));
         install(new MockAccountModule(configSource));
diff --git a/jaxrs/src/test/java/org/killbill/billing/jaxrs/JaxrsTestSuiteNoDB.java b/jaxrs/src/test/java/org/killbill/billing/jaxrs/JaxrsTestSuiteNoDB.java
index 4d4eb02..b646e04 100644
--- a/jaxrs/src/test/java/org/killbill/billing/jaxrs/JaxrsTestSuiteNoDB.java
+++ b/jaxrs/src/test/java/org/killbill/billing/jaxrs/JaxrsTestSuiteNoDB.java
@@ -38,7 +38,7 @@ public abstract class JaxrsTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
             return;
         }
 
-        final Injector injector = Guice.createInjector(new TestJaxrsModuleNoDB(configSource));
+        final Injector injector = Guice.createInjector(new TestJaxrsModuleNoDB(configSource, clock));
         injector.injectMembers(this);
     }
 }
diff --git a/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestAuditLogJson.java b/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestAuditLogJson.java
index 92b77c5..b5d0dff 100644
--- a/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestAuditLogJson.java
+++ b/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestAuditLogJson.java
@@ -19,6 +19,7 @@ package org.killbill.billing.jaxrs.json;
 import java.util.UUID;
 
 import org.joda.time.DateTime;
+import org.killbill.billing.callcontext.DefaultCallContext;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
@@ -77,15 +78,16 @@ public class TestAuditLogJson extends JaxrsTestSuiteNoDB {
         final ChangeType changeType = ChangeType.DELETE;
         final EntityAudit entityAudit = new EntityAudit(tableName, recordId, changeType, null);
 
-        final AuditLog auditLog = new DefaultAuditLog(new AuditLogModelDao(entityAudit, callContext), ObjectType.ACCOUNT_EMAIL, UUID.randomUUID());
+        final DefaultCallContext defaultCallContext = new DefaultCallContext(callContext);
+        final AuditLog auditLog = new DefaultAuditLog(new AuditLogModelDao(entityAudit, defaultCallContext), ObjectType.ACCOUNT_EMAIL, UUID.randomUUID());
 
         final AuditLogJson auditLogJson = new AuditLogJson(auditLog);
         Assert.assertEquals(auditLogJson.getChangeType(), changeType.toString());
         Assert.assertNotNull(auditLogJson.getChangeDate());
-        Assert.assertEquals(auditLogJson.getChangedBy(), callContext.getUserName());
-        Assert.assertEquals(auditLogJson.getReasonCode(), callContext.getReasonCode());
-        Assert.assertEquals(auditLogJson.getComments(), callContext.getComments());
-        Assert.assertEquals(auditLogJson.getUserToken(), callContext.getUserToken().toString());
+        Assert.assertEquals(auditLogJson.getChangedBy(), this.callContext.getUserName());
+        Assert.assertEquals(auditLogJson.getReasonCode(), this.callContext.getReasonCode());
+        Assert.assertEquals(auditLogJson.getComments(), this.callContext.getComments());
+        Assert.assertEquals(auditLogJson.getUserToken(), this.callContext.getUserToken().toString());
         Assert.assertEquals(auditLogJson.getObjectType(), ObjectType.ACCOUNT_EMAIL);
     }
 }
diff --git a/junction/src/test/java/org/killbill/billing/junction/glue/TestJunctionModuleNoDB.java b/junction/src/test/java/org/killbill/billing/junction/glue/TestJunctionModuleNoDB.java
index 79d60e3..2548489 100644
--- a/junction/src/test/java/org/killbill/billing/junction/glue/TestJunctionModuleNoDB.java
+++ b/junction/src/test/java/org/killbill/billing/junction/glue/TestJunctionModuleNoDB.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -25,18 +25,22 @@ import org.killbill.billing.mock.glue.MockNonEntityDaoModule;
 import org.killbill.billing.mock.glue.MockSubscriptionModule;
 import org.killbill.billing.mock.glue.MockTagModule;
 import org.killbill.billing.platform.api.KillbillConfigSource;
+import org.killbill.clock.ClockMock;
 
 public class TestJunctionModuleNoDB extends TestJunctionModule {
 
-    public TestJunctionModuleNoDB(final KillbillConfigSource configSource) {
+    private final ClockMock clock;
+
+    public TestJunctionModuleNoDB(final KillbillConfigSource configSource, final ClockMock clock) {
         super(configSource);
+        this.clock = clock;
     }
 
     @Override
     protected void configure() {
         super.configure();
 
-        install(new GuicyKillbillTestNoDBModule(configSource));
+        install(new GuicyKillbillTestNoDBModule(configSource, clock));
         install(new MockNonEntityDaoModule(configSource));
         install(new MockAccountModule(configSource));
         install(new MockCatalogModule(configSource));
diff --git a/junction/src/test/java/org/killbill/billing/junction/glue/TestJunctionModuleWithEmbeddedDB.java b/junction/src/test/java/org/killbill/billing/junction/glue/TestJunctionModuleWithEmbeddedDB.java
index 32b2ffc..5ad660e 100644
--- a/junction/src/test/java/org/killbill/billing/junction/glue/TestJunctionModuleWithEmbeddedDB.java
+++ b/junction/src/test/java/org/killbill/billing/junction/glue/TestJunctionModuleWithEmbeddedDB.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -28,18 +28,22 @@ import org.killbill.billing.subscription.glue.DefaultSubscriptionModule;
 import org.killbill.billing.util.glue.AuditModule;
 import org.killbill.billing.util.glue.NonEntityDaoModule;
 import org.killbill.billing.util.glue.TagStoreModule;
+import org.killbill.clock.ClockMock;
 
 public class TestJunctionModuleWithEmbeddedDB extends TestJunctionModule {
 
-    public TestJunctionModuleWithEmbeddedDB(final KillbillConfigSource configSource) {
+    private final ClockMock clock;
+
+    public TestJunctionModuleWithEmbeddedDB(final KillbillConfigSource configSource, final ClockMock clock) {
         super(configSource);
+        this.clock = clock;
     }
 
     @Override
     protected void configure() {
         super.configure();
 
-        install(new GuicyKillbillTestWithEmbeddedDBModule(configSource));
+        install(new GuicyKillbillTestWithEmbeddedDBModule(configSource, clock));
         install(new NonEntityDaoModule(configSource));
         install(new CatalogModule(configSource));
         install(new DefaultAccountModule(configSource));
diff --git a/junction/src/test/java/org/killbill/billing/junction/JunctionTestSuiteNoDB.java b/junction/src/test/java/org/killbill/billing/junction/JunctionTestSuiteNoDB.java
index eaa44c9..70085aa 100644
--- a/junction/src/test/java/org/killbill/billing/junction/JunctionTestSuiteNoDB.java
+++ b/junction/src/test/java/org/killbill/billing/junction/JunctionTestSuiteNoDB.java
@@ -64,7 +64,7 @@ public abstract class JunctionTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
             return;
         }
 
-        final Injector injector = Guice.createInjector(new TestJunctionModuleNoDB(configSource));
+        final Injector injector = Guice.createInjector(new TestJunctionModuleNoDB(configSource, clock));
         injector.injectMembers(this);
     }
 
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 3df051e..21f8d3a 100644
--- a/junction/src/test/java/org/killbill/billing/junction/JunctionTestSuiteWithEmbeddedDB.java
+++ b/junction/src/test/java/org/killbill/billing/junction/JunctionTestSuiteWithEmbeddedDB.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -18,6 +18,7 @@
 
 package org.killbill.billing.junction;
 
+import java.util.Map;
 import java.util.UUID;
 
 import org.joda.time.DateTime;
@@ -93,8 +94,8 @@ public abstract class JunctionTestSuiteWithEmbeddedDB extends GuicyKillbillTestS
     protected Catalog catalog;
 
     @Override
-    protected KillbillConfigSource getConfigSource() {
-        return getConfigSource("/junction.properties");
+    protected KillbillConfigSource getConfigSource(final Map<String, String> extraProperties) {
+        return getConfigSource("/junction.properties", extraProperties);
     }
 
     @BeforeClass(groups = "slow")
@@ -103,7 +104,7 @@ public abstract class JunctionTestSuiteWithEmbeddedDB extends GuicyKillbillTestS
             return;
         }
 
-        final Injector injector = Guice.createInjector(Stage.PRODUCTION, new TestJunctionModuleWithEmbeddedDB(configSource));
+        final Injector injector = Guice.createInjector(Stage.PRODUCTION, new TestJunctionModuleWithEmbeddedDB(configSource, clock));
         injector.injectMembers(this);
     }
 
diff --git a/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestBillingApi.java b/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestBillingApi.java
index 481343e..f65d823 100644
--- a/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestBillingApi.java
+++ b/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestBillingApi.java
@@ -89,6 +89,10 @@ public class TestBillingApi extends JunctionTestSuiteNoDB {
 
     @BeforeMethod(groups = "fast")
     public void beforeMethod() throws Exception {
+        if (hasFailed()) {
+            return;
+        }
+
         super.beforeMethod();
         final SubscriptionBaseBundle bundle = Mockito.mock(SubscriptionBaseBundle.class);
         Mockito.when(bundle.getId()).thenReturn(bunId);
diff --git a/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestDefaultInternalBillingApi.java b/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestDefaultInternalBillingApi.java
index 8c7a0b5..a0e95c5 100644
--- a/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestDefaultInternalBillingApi.java
+++ b/junction/src/test/java/org/killbill/billing/junction/plumbing/billing/TestDefaultInternalBillingApi.java
@@ -185,9 +185,9 @@ public class TestDefaultInternalBillingApi extends JunctionTestSuiteWithEmbedded
         Assert.assertEquals(events.get(0).getTransitionType(), SubscriptionBaseTransitionType.CREATE);
         Assert.assertEquals(events.get(0).getEffectiveDate(), subscription.getStartDate());
         Assert.assertEquals(events.get(1).getTransitionType(), SubscriptionBaseTransitionType.START_BILLING_DISABLED);
-        Assert.assertEquals(events.get(1).getEffectiveDate(), block3Date);
+        Assert.assertEquals(events.get(1).getEffectiveDate().compareTo(block3Date), 0);
         Assert.assertEquals(events.get(2).getTransitionType(), SubscriptionBaseTransitionType.END_BILLING_DISABLED);
-        Assert.assertEquals(events.get(2).getEffectiveDate(), block5Date);
+        Assert.assertEquals(events.get(2).getEffectiveDate().compareTo(block5Date), 0);
     }
 
     // See https://github.com/killbill/killbill/commit/92042843e38a67f75495b207385e4c1f9ca60990#commitcomment-4749967
diff --git a/overdue/src/test/java/org/killbill/billing/overdue/glue/TestOverdueModule.java b/overdue/src/test/java/org/killbill/billing/overdue/glue/TestOverdueModule.java
index 3c30da2..d82c38a 100644
--- a/overdue/src/test/java/org/killbill/billing/overdue/glue/TestOverdueModule.java
+++ b/overdue/src/test/java/org/killbill/billing/overdue/glue/TestOverdueModule.java
@@ -47,7 +47,6 @@ import org.killbill.billing.util.glue.CacheModule;
 import org.killbill.billing.util.glue.CallContextModule;
 import org.killbill.billing.util.glue.ConfigModule;
 import org.killbill.billing.util.glue.CustomFieldModule;
-import org.killbill.billing.util.glue.MemoryGlobalLockerModule;
 
 import com.google.inject.name.Names;
 
@@ -72,7 +71,6 @@ public class TestOverdueModule extends DefaultOverdueModule {
         install(new MockTagModule(configSource, true));
         install(new TemplateModule(configSource));
         install(new MockTenantModule(configSource));
-        install(new MemoryGlobalLockerModule(configSource));
 
         bind(OverdueBusListenerTester.class).asEagerSingleton();
         bind(TestOverdueHelper.class).asEagerSingleton();
@@ -91,7 +89,6 @@ public class TestOverdueModule extends DefaultOverdueModule {
             return blockingState;
         }
 
-
         @Override
         public BlockingState getBlockingStateForService(final UUID blockableId, final BlockingStateType blockingStateType, final String serviceName, final InternalTenantContext context) {
             if (blockingState != null && blockingState.getBlockedId().equals(blockableId)) {
diff --git a/overdue/src/test/java/org/killbill/billing/overdue/glue/TestOverdueModuleNoDB.java b/overdue/src/test/java/org/killbill/billing/overdue/glue/TestOverdueModuleNoDB.java
index 498bd46..7db000b 100644
--- a/overdue/src/test/java/org/killbill/billing/overdue/glue/TestOverdueModuleNoDB.java
+++ b/overdue/src/test/java/org/killbill/billing/overdue/glue/TestOverdueModuleNoDB.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -21,18 +21,22 @@ package org.killbill.billing.overdue.glue;
 import org.killbill.billing.GuicyKillbillTestNoDBModule;
 import org.killbill.billing.mock.glue.MockNonEntityDaoModule;
 import org.killbill.billing.platform.api.KillbillConfigSource;
+import org.killbill.clock.ClockMock;
 
 public class TestOverdueModuleNoDB extends TestOverdueModule {
 
-    public TestOverdueModuleNoDB(final KillbillConfigSource configSource) {
+    private final ClockMock clock;
+
+    public TestOverdueModuleNoDB(final KillbillConfigSource configSource, final ClockMock clock) {
         super(configSource);
+        this.clock = clock;
     }
 
     @Override
     public void configure() {
         super.configure();
 
-        install(new GuicyKillbillTestNoDBModule(configSource));
+        install(new GuicyKillbillTestNoDBModule(configSource, clock));
         install(new MockNonEntityDaoModule(configSource));
     }
 }
diff --git a/overdue/src/test/java/org/killbill/billing/overdue/glue/TestOverdueModuleWithEmbeddedDB.java b/overdue/src/test/java/org/killbill/billing/overdue/glue/TestOverdueModuleWithEmbeddedDB.java
index bf62d22..cf0ac33 100644
--- a/overdue/src/test/java/org/killbill/billing/overdue/glue/TestOverdueModuleWithEmbeddedDB.java
+++ b/overdue/src/test/java/org/killbill/billing/overdue/glue/TestOverdueModuleWithEmbeddedDB.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -21,18 +21,22 @@ package org.killbill.billing.overdue.glue;
 import org.killbill.billing.GuicyKillbillTestWithEmbeddedDBModule;
 import org.killbill.billing.platform.api.KillbillConfigSource;
 import org.killbill.billing.util.glue.NonEntityDaoModule;
+import org.killbill.clock.ClockMock;
 
 public class TestOverdueModuleWithEmbeddedDB extends TestOverdueModule {
 
-    public TestOverdueModuleWithEmbeddedDB(final KillbillConfigSource configSource) {
+    private final ClockMock clock;
+
+    public TestOverdueModuleWithEmbeddedDB(final KillbillConfigSource configSource, final ClockMock clock) {
         super(configSource);
+        this.clock = clock;
     }
 
     @Override
     public void configure() {
         super.configure();
 
-        install(new GuicyKillbillTestWithEmbeddedDBModule(configSource));
+        install(new GuicyKillbillTestWithEmbeddedDBModule(configSource, clock));
         install(new NonEntityDaoModule(configSource));
     }
 }
diff --git a/overdue/src/test/java/org/killbill/billing/overdue/notification/TestDefaultOverdueCheckPoster.java b/overdue/src/test/java/org/killbill/billing/overdue/notification/TestDefaultOverdueCheckPoster.java
index 36bd147..8a1758a 100644
--- a/overdue/src/test/java/org/killbill/billing/overdue/notification/TestDefaultOverdueCheckPoster.java
+++ b/overdue/src/test/java/org/killbill/billing/overdue/notification/TestDefaultOverdueCheckPoster.java
@@ -89,7 +89,7 @@ public class TestDefaultOverdueCheckPoster extends OverdueTestSuiteWithEmbeddedD
         Assert.assertEquals(notificationsForKey.size(), 1);
         final NotificationEventWithMetadata nm = notificationsForKey.get(0);
         Assert.assertEquals(nm.getEvent(), notificationKey);
-        Assert.assertEquals(nm.getEffectiveDate(), testReferenceTime.plusDays(expectedNbDaysInFuture));
+        Assert.assertEquals(nm.getEffectiveDate().compareTo(testReferenceTime.plusDays(expectedNbDaysInFuture)), 0);
     }
 
     private List<NotificationEventWithMetadata<OverdueCheckNotificationKey>> getNotificationsForOverdueable(final Account account) {
diff --git a/overdue/src/test/java/org/killbill/billing/overdue/notification/TestOverdueCheckNotifier.java b/overdue/src/test/java/org/killbill/billing/overdue/notification/TestOverdueCheckNotifier.java
index 8856294..73aff0f 100644
--- a/overdue/src/test/java/org/killbill/billing/overdue/notification/TestOverdueCheckNotifier.java
+++ b/overdue/src/test/java/org/killbill/billing/overdue/notification/TestOverdueCheckNotifier.java
@@ -83,6 +83,9 @@ public class TestOverdueCheckNotifier extends OverdueTestSuiteWithEmbeddedDB {
     @Override
     @AfterMethod(groups = "slow")
     public void afterMethod() throws Exception {
+        if (hasFailed()) {
+            return;
+        }
         notifierForMock.stop();
         super.afterMethod();
     }
diff --git a/overdue/src/test/java/org/killbill/billing/overdue/OverdueTestSuiteNoDB.java b/overdue/src/test/java/org/killbill/billing/overdue/OverdueTestSuiteNoDB.java
index 5e2f224..8378eb2 100644
--- a/overdue/src/test/java/org/killbill/billing/overdue/OverdueTestSuiteNoDB.java
+++ b/overdue/src/test/java/org/killbill/billing/overdue/OverdueTestSuiteNoDB.java
@@ -112,7 +112,7 @@ public abstract class OverdueTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
             return;
         }
 
-        final Injector injector = Guice.createInjector(new TestOverdueModuleNoDB(configSource));
+        final Injector injector = Guice.createInjector(new TestOverdueModuleNoDB(configSource, clock));
         injector.injectMembers(this);
     }
 
diff --git a/overdue/src/test/java/org/killbill/billing/overdue/OverdueTestSuiteWithEmbeddedDB.java b/overdue/src/test/java/org/killbill/billing/overdue/OverdueTestSuiteWithEmbeddedDB.java
index da37b6c..36c8a83 100644
--- a/overdue/src/test/java/org/killbill/billing/overdue/OverdueTestSuiteWithEmbeddedDB.java
+++ b/overdue/src/test/java/org/killbill/billing/overdue/OverdueTestSuiteWithEmbeddedDB.java
@@ -106,7 +106,7 @@ public abstract class OverdueTestSuiteWithEmbeddedDB extends GuicyKillbillTestSu
             return;
         }
 
-        final Injector injector = Guice.createInjector(new TestOverdueModuleWithEmbeddedDB(configSource));
+        final Injector injector = Guice.createInjector(new TestOverdueModuleWithEmbeddedDB(configSource, clock));
         injector.injectMembers(this);
     }
 
diff --git a/payment/src/test/java/org/killbill/billing/payment/caching/TestStateMachineConfigCache.java b/payment/src/test/java/org/killbill/billing/payment/caching/TestStateMachineConfigCache.java
index 337ae9e..db29761 100644
--- a/payment/src/test/java/org/killbill/billing/payment/caching/TestStateMachineConfigCache.java
+++ b/payment/src/test/java/org/killbill/billing/payment/caching/TestStateMachineConfigCache.java
@@ -1,6 +1,6 @@
 /*
- * Copyright 2016-2017 Groupon, Inc
- * Copyright 2016-2017 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
diff --git a/payment/src/test/java/org/killbill/billing/payment/core/sm/TestPluginOperation.java b/payment/src/test/java/org/killbill/billing/payment/core/sm/TestPluginOperation.java
index e9323d4..85bce0a 100644
--- a/payment/src/test/java/org/killbill/billing/payment/core/sm/TestPluginOperation.java
+++ b/payment/src/test/java/org/killbill/billing/payment/core/sm/TestPluginOperation.java
@@ -1,6 +1,6 @@
 /*
- * Copyright 2014-2016 Groupon, Inc
- * Copyright 2014-2016 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -18,6 +18,8 @@
 package org.killbill.billing.payment.core.sm;
 
 import java.math.BigDecimal;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.Callable;
 import java.util.concurrent.Semaphore;
@@ -27,6 +29,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 
 import javax.annotation.Nullable;
 
+import org.awaitility.Awaitility;
 import org.killbill.automaton.OperationException;
 import org.killbill.automaton.OperationResult;
 import org.killbill.billing.ErrorCode;
@@ -53,8 +56,6 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import org.awaitility.Awaitility;
 
 public class TestPluginOperation extends PaymentTestSuiteNoDB {
 
@@ -66,12 +67,12 @@ public class TestPluginOperation extends PaymentTestSuiteNoDB {
     private final Account account = Mockito.mock(Account.class);
 
     @Override
-    protected KillbillConfigSource getConfigSource() {
-        return getConfigSource("/payment.properties",
-                               ImmutableMap.<String, String>of("org.killbill.payment.provider.default", MockPaymentProviderPlugin.PLUGIN_NAME,
-                                                               "killbill.payment.engine.events.off", "false",
-                                                               "org.killbill.payment.globalLock.retries", "1"));
-
+    protected KillbillConfigSource getConfigSource(final Map<String, String> extraProperties) {
+        final Map<String, String> allExtraProperties = new HashMap<String, String>(extraProperties);
+        allExtraProperties.put("org.killbill.payment.provider.default", MockPaymentProviderPlugin.PLUGIN_NAME);
+        allExtraProperties.put("killbill.payment.engine.events.off", "false");
+        allExtraProperties.put("org.killbill.payment.globalLock.retries", "1");
+        return getConfigSource("/payment.properties", allExtraProperties);
     }
 
     @BeforeMethod(groups = "fast")
diff --git a/payment/src/test/java/org/killbill/billing/payment/glue/TestPaymentModule.java b/payment/src/test/java/org/killbill/billing/payment/glue/TestPaymentModule.java
index 447cd34..94cae42 100644
--- a/payment/src/test/java/org/killbill/billing/payment/glue/TestPaymentModule.java
+++ b/payment/src/test/java/org/killbill/billing/payment/glue/TestPaymentModule.java
@@ -35,7 +35,6 @@ import org.killbill.billing.util.config.definition.PaymentConfig;
 import org.killbill.billing.util.glue.CacheModule;
 import org.killbill.billing.util.glue.CallContextModule;
 import org.killbill.billing.util.glue.ConfigModule;
-import org.killbill.billing.util.glue.MemoryGlobalLockerModule;
 import org.killbill.billing.util.tag.Tag;
 import org.killbill.clock.Clock;
 import org.mockito.Mockito;
@@ -72,7 +71,6 @@ public class TestPaymentModule extends PaymentModule {
         super.configure();
         install(new MockInvoiceModule(configSource));
         install(new MockSubscriptionModule(configSource));
-        install(new MemoryGlobalLockerModule(configSource));
         install(new MockTenantModule(configSource));
         install(new CacheModule(configSource));
         install(new ConfigModule(configSource));
diff --git a/payment/src/test/java/org/killbill/billing/payment/glue/TestPaymentModuleNoDB.java b/payment/src/test/java/org/killbill/billing/payment/glue/TestPaymentModuleNoDB.java
index cf7d254..52499b0 100644
--- a/payment/src/test/java/org/killbill/billing/payment/glue/TestPaymentModuleNoDB.java
+++ b/payment/src/test/java/org/killbill/billing/payment/glue/TestPaymentModuleNoDB.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2015 Groupon, Inc
- * Copyright 2014-2015 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -26,12 +26,15 @@ import org.killbill.billing.payment.core.sm.PluginControlPaymentAutomatonRunner;
 import org.killbill.billing.payment.dao.MockPaymentDao;
 import org.killbill.billing.payment.dao.PaymentDao;
 import org.killbill.billing.platform.api.KillbillConfigSource;
-import org.killbill.clock.Clock;
+import org.killbill.clock.ClockMock;
 
 public class TestPaymentModuleNoDB extends TestPaymentModule {
 
-    public TestPaymentModuleNoDB(final KillbillConfigSource configSource, final Clock clock) {
+    private final ClockMock clock;
+
+    public TestPaymentModuleNoDB(final KillbillConfigSource configSource, final ClockMock clock) {
         super(configSource, clock);
+        this.clock = clock;
     }
 
     @Override
@@ -41,7 +44,7 @@ public class TestPaymentModuleNoDB extends TestPaymentModule {
 
     @Override
     protected void configure() {
-        install(new GuicyKillbillTestNoDBModule(configSource));
+        install(new GuicyKillbillTestNoDBModule(configSource, clock));
         install(new MockNonEntityDaoModule(configSource));
         install(new MockAccountModule(configSource));
         super.configure();
diff --git a/payment/src/test/java/org/killbill/billing/payment/glue/TestPaymentModuleWithEmbeddedDB.java b/payment/src/test/java/org/killbill/billing/payment/glue/TestPaymentModuleWithEmbeddedDB.java
index b08cab7..c76ddd5 100644
--- a/payment/src/test/java/org/killbill/billing/payment/glue/TestPaymentModuleWithEmbeddedDB.java
+++ b/payment/src/test/java/org/killbill/billing/payment/glue/TestPaymentModuleWithEmbeddedDB.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2015 Groupon, Inc
- * Copyright 2014-2015 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -25,16 +25,20 @@ import org.killbill.billing.platform.api.KillbillConfigSource;
 import org.killbill.billing.util.glue.AuditModule;
 import org.killbill.billing.util.glue.NonEntityDaoModule;
 import org.killbill.clock.Clock;
+import org.killbill.clock.ClockMock;
 
 public class TestPaymentModuleWithEmbeddedDB extends TestPaymentModule {
 
-    public TestPaymentModuleWithEmbeddedDB(final KillbillConfigSource configSource, final Clock clock) {
+    private final ClockMock clock;
+
+    public TestPaymentModuleWithEmbeddedDB(final KillbillConfigSource configSource, final ClockMock clock) {
         super(configSource, clock);
+        this.clock = clock;
     }
 
     @Override
     protected void configure() {
-        install(new GuicyKillbillTestWithEmbeddedDBModule(configSource));
+        install(new GuicyKillbillTestWithEmbeddedDBModule(configSource, clock));
         install(new NonEntityDaoModule(configSource));
         install(new DefaultAccountModule(configSource));
         install(new AuditModule(configSource));
diff --git a/payment/src/test/java/org/killbill/billing/payment/invoice/dao/TestInvoicePaymentControlDao.java b/payment/src/test/java/org/killbill/billing/payment/invoice/dao/TestInvoicePaymentControlDao.java
index 3a3b1e0..55cfdb7 100644
--- a/payment/src/test/java/org/killbill/billing/payment/invoice/dao/TestInvoicePaymentControlDao.java
+++ b/payment/src/test/java/org/killbill/billing/payment/invoice/dao/TestInvoicePaymentControlDao.java
@@ -65,7 +65,7 @@ public class TestInvoicePaymentControlDao extends PaymentTestSuiteWithEmbeddedDB
         assertEquals(entries.get(0).getAmount().compareTo(amount), 0);
         assertEquals(entries.get(0).getCurrency(), Currency.USD);
         assertEquals(entries.get(0).getCreatedBy(), "lulu");
-        assertEquals(entries.get(0).getCreatedDate(), utcNow);
+        assertEquals(entries.get(0).getCreatedDate().compareTo(utcNow), 0);
     }
 
     @Test(groups = "slow")
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 4f451dc..306a5f0 100644
--- a/payment/src/test/java/org/killbill/billing/payment/PaymentTestSuiteNoDB.java
+++ b/payment/src/test/java/org/killbill/billing/payment/PaymentTestSuiteNoDB.java
@@ -18,7 +18,9 @@
 
 package org.killbill.billing.payment;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import javax.inject.Named;
 
@@ -59,7 +61,6 @@ import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
 
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
 import com.google.inject.Guice;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
@@ -131,11 +132,11 @@ public abstract class PaymentTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
     };
 
     @Override
-    protected KillbillConfigSource getConfigSource() {
-        return getConfigSource("/payment.properties",
-                               ImmutableMap.<String, String>of("org.killbill.payment.provider.default", MockPaymentProviderPlugin.PLUGIN_NAME,
-                                                               "killbill.payment.engine.events.off", "false"));
-
+    protected KillbillConfigSource getConfigSource(final Map<String, String> extraProperties) {
+        final Map<String, String> allExtraProperties = new HashMap<String, String>(extraProperties);
+        allExtraProperties.put("org.killbill.payment.provider.default", MockPaymentProviderPlugin.PLUGIN_NAME);
+        allExtraProperties.put("killbill.payment.engine.events.off", "false");
+        return getConfigSource("/payment.properties", allExtraProperties);
     }
 
     @BeforeClass(groups = "fast")
@@ -144,7 +145,7 @@ public abstract class PaymentTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
             return;
         }
 
-        final Injector injector = Guice.createInjector(new TestPaymentModuleNoDB(configSource, getClock()));
+        final Injector injector = Guice.createInjector(new TestPaymentModuleNoDB(configSource, clock));
         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 db0e354..8bf19fa 100644
--- a/payment/src/test/java/org/killbill/billing/payment/PaymentTestSuiteWithEmbeddedDB.java
+++ b/payment/src/test/java/org/killbill/billing/payment/PaymentTestSuiteWithEmbeddedDB.java
@@ -18,6 +18,9 @@
 
 package org.killbill.billing.payment;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import org.killbill.billing.GuicyKillbillTestSuiteWithEmbeddedDB;
 import org.killbill.billing.account.api.AccountInternalApi;
 import org.killbill.billing.control.plugin.api.PaymentControlPluginApi;
@@ -55,7 +58,6 @@ 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;
@@ -120,10 +122,11 @@ public abstract class PaymentTestSuiteWithEmbeddedDB extends GuicyKillbillTestSu
     protected PaymentControlStateMachineHelper paymentControlStateMachineHelper;
 
     @Override
-    protected KillbillConfigSource getConfigSource() {
-        return getConfigSource("/payment.properties",
-                               ImmutableMap.<String, String>of("org.killbill.payment.provider.default", MockPaymentProviderPlugin.PLUGIN_NAME,
-                                                               "killbill.payment.engine.events.off", "false"));
+    protected KillbillConfigSource getConfigSource(final Map<String, String> extraProperties) {
+        final Map<String, String> allExtraProperties = new HashMap<String, String>(extraProperties);
+        allExtraProperties.put("org.killbill.payment.provider.default", MockPaymentProviderPlugin.PLUGIN_NAME);
+        allExtraProperties.put("killbill.payment.engine.events.off", "false");
+        return getConfigSource("/payment.properties", allExtraProperties);
     }
 
     @BeforeClass(groups = "slow")
@@ -132,7 +135,7 @@ public abstract class PaymentTestSuiteWithEmbeddedDB extends GuicyKillbillTestSu
             return;
         }
 
-        final Injector injector = Guice.createInjector(new TestPaymentModuleWithEmbeddedDB(configSource, getClock()));
+        final Injector injector = Guice.createInjector(new TestPaymentModuleWithEmbeddedDB(configSource, clock));
         injector.injectMembers(this);
     }
 
diff --git a/payment/src/test/java/org/killbill/billing/payment/provider/TestExternalPaymentProviderPlugin.java b/payment/src/test/java/org/killbill/billing/payment/provider/TestExternalPaymentProviderPlugin.java
index d2a0430..e887ac8 100644
--- a/payment/src/test/java/org/killbill/billing/payment/provider/TestExternalPaymentProviderPlugin.java
+++ b/payment/src/test/java/org/killbill/billing/payment/provider/TestExternalPaymentProviderPlugin.java
@@ -38,7 +38,6 @@ import com.google.common.collect.ImmutableList;
 
 public class TestExternalPaymentProviderPlugin extends PaymentTestSuiteNoDB {
 
-    private final Clock clock = new ClockMock();
     private ExternalPaymentProviderPlugin plugin;
 
     @Override
diff --git a/payment/src/test/java/org/killbill/billing/payment/TestJanitor.java b/payment/src/test/java/org/killbill/billing/payment/TestJanitor.java
index bf09d24..e8af682 100644
--- a/payment/src/test/java/org/killbill/billing/payment/TestJanitor.java
+++ b/payment/src/test/java/org/killbill/billing/payment/TestJanitor.java
@@ -22,10 +22,12 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.Callable;
 import java.util.concurrent.TimeUnit;
 
+import org.awaitility.Awaitility;
 import org.joda.time.LocalDate;
 import org.killbill.billing.account.api.Account;
 import org.killbill.billing.api.FlakyRetryAnalyzer;
@@ -47,7 +49,6 @@ import org.killbill.billing.payment.bus.PaymentBusEventHandler;
 import org.killbill.billing.payment.core.janitor.Janitor;
 import org.killbill.billing.payment.dao.PaymentAttemptModelDao;
 import org.killbill.billing.payment.dao.PaymentTransactionModelDao;
-import org.killbill.billing.payment.glue.DefaultPaymentService;
 import org.killbill.billing.payment.invoice.InvoicePaymentControlPluginApi;
 import org.killbill.billing.payment.plugin.api.PaymentPluginStatus;
 import org.killbill.billing.payment.plugin.api.PaymentTransactionInfoPlugin;
@@ -74,7 +75,6 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 import com.google.inject.Inject;
 
@@ -112,12 +112,12 @@ public class TestJanitor extends PaymentTestSuiteWithEmbeddedDB {
     private Account account;
 
     @Override
-    protected KillbillConfigSource getConfigSource() {
-        return getConfigSource("/payment.properties",
-                               ImmutableMap.<String, String>of("org.killbill.payment.provider.default", MockPaymentProviderPlugin.PLUGIN_NAME,
-                                                               "killbill.payment.engine.events.off", "false",
-                                                               "org.killbill.payment.janitor.rate", "500ms")
-                              );
+    protected KillbillConfigSource getConfigSource(final Map<String, String> extraProperties) {
+        final Map<String, String> allExtraProperties = new HashMap<String, String>(extraProperties);
+        allExtraProperties.put("org.killbill.payment.provider.default", MockPaymentProviderPlugin.PLUGIN_NAME);
+        allExtraProperties.put("killbill.payment.engine.events.off", "false");
+        allExtraProperties.put("org.killbill.payment.janitor.rate", "500ms");
+        return getConfigSource("/payment.properties", allExtraProperties);
     }
 
     @Override
@@ -222,13 +222,15 @@ public class TestJanitor extends PaymentTestSuiteWithEmbeddedDB {
         assertEquals(attempt2.getStateName(), "INIT");
 
         clock.addDays(1);
-        try {
-            Thread.sleep(1500);
-        } catch (InterruptedException e) {
-        }
-
-        final PaymentAttemptModelDao attempt3 = paymentDao.getPaymentAttempt(attempt.getId(), internalCallContext);
-        assertEquals(attempt3.getStateName(), "SUCCESS");
+        Awaitility.await()
+                  .atMost(5, TimeUnit.SECONDS)
+                  .until(new Callable<Boolean>() {
+                      @Override
+                      public Boolean call() throws Exception {
+                          final PaymentAttemptModelDao attempt3 = paymentDao.getPaymentAttempt(attempt.getId(), internalCallContext);
+                          return "SUCCESS".equals(attempt3.getStateName());
+                      }
+                  });
     }
 
     @Test(groups = "slow")
@@ -476,7 +478,6 @@ public class TestJanitor extends PaymentTestSuiteWithEmbeddedDB {
 
         final String paymentStateName = paymentSMHelper.getPendingStateForTransaction(TransactionType.AUTHORIZE).toString();
 
-
         testListener.pushExpectedEvent(NextEvent.PAYMENT);
         paymentDao.updatePaymentAndTransactionOnCompletion(account.getId(), null, payment.getId(), TransactionType.AUTHORIZE, paymentStateName, paymentStateName,
                                                            payment.getTransactions().get(0).getId(), TransactionStatus.PENDING, requestedAmount, account.getCurrency(),
diff --git a/payment/src/test/java/org/killbill/billing/payment/TestPaymentHelper.java b/payment/src/test/java/org/killbill/billing/payment/TestPaymentHelper.java
index 6183c76..d81b2be 100644
--- a/payment/src/test/java/org/killbill/billing/payment/TestPaymentHelper.java
+++ b/payment/src/test/java/org/killbill/billing/payment/TestPaymentHelper.java
@@ -20,6 +20,7 @@ package org.killbill.billing.payment;
 
 import java.util.UUID;
 
+import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
 import org.joda.time.LocalDate;
 import org.killbill.billing.GuicyKillbillTestSuite;
@@ -145,8 +146,9 @@ public class TestPaymentHelper {
         Mockito.when(accountData.getBillCycleDayLocal()).thenReturn(1);
         Mockito.when(accountData.isMigrated()).thenReturn(false);
         Mockito.when(accountData.getTimeZone()).thenReturn(DateTimeZone.UTC);
-        Mockito.when(accountData.getCreatedDate()).thenReturn(clock.getUTCNow());
-        Mockito.when(accountData.getReferenceTime()).thenReturn(clock.getUTCNow());
+        final DateTime utcNow = clock.getUTCNow();
+        Mockito.when(accountData.getCreatedDate()).thenReturn(utcNow);
+        Mockito.when(accountData.getReferenceTime()).thenReturn(utcNow);
 
         final MutableCallContext mutableCallContext = new MutableCallContext(internalCallContext);
 
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/KillbillClient.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/KillbillClient.java
index c03d61c..3de7ad5 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/KillbillClient.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/KillbillClient.java
@@ -79,9 +79,7 @@ public abstract class KillbillClient extends GuicyKillbillTestSuiteWithEmbeddedD
     protected static final ImmutableMap<String, String> NULL_PLUGIN_PROPERTIES = null;
     protected static final ImmutableList<AuditLog> EMPTY_AUDIT_LOGS = ImmutableList.<AuditLog>of();
 
-
-
-    protected final long DEFAULT_WAIT_COMPLETION_TIMEOUT_SEC = 10;
+    protected final long DEFAULT_WAIT_COMPLETION_TIMEOUT_SEC = 60;
 
     protected static final String PLUGIN_NAME = "noop";
 
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/resources/TestDBRouterResource.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/resources/TestDBRouterResource.java
index 254d526..65da440 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/resources/TestDBRouterResource.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/resources/TestDBRouterResource.java
@@ -25,6 +25,7 @@ import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.core.Response;
 
+import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
 import org.killbill.billing.GuicyKillbillTestSuite;
 import org.killbill.billing.beatrix.integration.db.TestDBRouterAPI;
@@ -40,15 +41,15 @@ public class TestDBRouterResource implements JaxrsResource {
     private final MutableInternalCallContext internalCallContext = new MutableInternalCallContext(InternalCallContextFactory.INTERNAL_TENANT_RECORD_ID,
                                                                                                   1687L,
                                                                                                   DateTimeZone.UTC,
-                                                                                                  GuicyKillbillTestSuite.getClock().getUTCNow(),
+                                                                                                  new DateTime(DateTimeZone.UTC),
                                                                                                   UUID.randomUUID(),
                                                                                                   UUID.randomUUID().toString(),
                                                                                                   CallOrigin.TEST,
                                                                                                   UserType.TEST,
                                                                                                   "Testing",
                                                                                                   "This is a test",
-                                                                                                  GuicyKillbillTestSuite.getClock().getUTCNow(),
-                                                                                                  GuicyKillbillTestSuite.getClock().getUTCNow());
+                                                                                                  new DateTime(DateTimeZone.UTC),
+                                                                                                  new DateTime(DateTimeZone.UTC));
 
     private final MutableCallContext callContext = new MutableCallContext(internalCallContext);
 
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestJaxrsBase.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestJaxrsBase.java
index ea7bbee..763036a 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestJaxrsBase.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestJaxrsBase.java
@@ -90,8 +90,8 @@ import org.killbill.billing.util.cache.CacheControllerDispatcher;
 import org.killbill.billing.util.config.definition.PaymentConfig;
 import org.killbill.billing.util.config.definition.SecurityConfig;
 import org.killbill.bus.api.PersistentBus;
-import org.killbill.commons.jdbi.guice.DaoConfig;
 import org.killbill.notificationq.api.NotificationQueueService;
+import org.skife.config.ConfigSource;
 import org.skife.config.ConfigurationObjectFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -152,18 +152,17 @@ public class TestJaxrsBase extends KillbillClient {
     @Inject
     protected TenantCacheInvalidation tenantCacheInvalidation;
 
-    protected DaoConfig daoConfig;
-    protected KillbillServerConfig serverConfig;
+    private static TestKillbillGuiceListener listener;
 
-    protected static TestKillbillGuiceListener listener;
+    // static because needed in @BeforeSuite and in each instance class
+    private static HttpServerConfig config;
 
-    protected HttpServerConfig config;
     private HttpServer server;
     private CallbackServer callbackServer;
 
     @Override
-    protected KillbillConfigSource getConfigSource() {
-        return getConfigSource("/killbill.properties");
+    protected KillbillConfigSource getConfigSource(final Map<String, String> extraProperties) {
+        return getConfigSource("/killbill.properties", extraProperties);
     }
 
     public class TestKillbillGuiceListener extends KillbillGuiceListener {
@@ -179,7 +178,7 @@ public class TestJaxrsBase extends KillbillClient {
 
         @Override
         protected Module getModule(final ServletContext servletContext) {
-            return Modules.override(new KillbillServerModule(servletContext, serverConfig, configSource)).with(new GuicyKillbillTestWithEmbeddedDBModule(configSource),
+            return Modules.override(new KillbillServerModule(servletContext, serverConfig, configSource)).with(new GuicyKillbillTestWithEmbeddedDBModule(configSource, clock),
                                                                                                                new InvoiceModuleWithMockSender(configSource),
                                                                                                                new PaymentMockModule(configSource),
                                                                                                                new Module() {
@@ -209,7 +208,7 @@ public class TestJaxrsBase extends KillbillClient {
 
         @Override
         protected void installPaymentProviderPlugins(final PaymentConfig config) {
-            install(new MockPaymentProviderPluginModule(PLUGIN_NAME, getClock(), configSource));
+            install(new MockPaymentProviderPluginModule(PLUGIN_NAME, clock, configSource));
         }
     }
 
@@ -347,13 +346,6 @@ public class TestJaxrsBase extends KillbillClient {
             return;
         }
 
-        // TODO PIERRE Unclear why both are needed in beforeClass and beforeSuite
-        if (config == null) {
-            config = new ConfigurationObjectFactory(System.getProperties()).build(HttpServerConfig.class);
-        }
-        if (daoConfig == null) {
-            daoConfig = new ConfigurationObjectFactory(skifeConfigSource).build(DaoConfig.class);
-        }
         listener.getInstantiatedInjector().injectMembers(this);
     }
 
@@ -365,16 +357,18 @@ public class TestJaxrsBase extends KillbillClient {
 
         super.beforeSuite();
 
-        if (config == null) {
-            config = new ConfigurationObjectFactory(System.getProperties()).build(HttpServerConfig.class);
-        }
-        if (daoConfig == null) {
-            daoConfig = new ConfigurationObjectFactory(skifeConfigSource).build(DaoConfig.class);
-        }
-
-        serverConfig = new ConfigurationObjectFactory(skifeConfigSource).build(KillbillServerConfig.class);
+        // We need to setup these earlier than other tests because the server is started once in @BeforeSuite
+        final KillbillConfigSource configSource = getConfigSource(extraPropertiesForTestSuite);
+        final ConfigSource skifeConfigSource = new ConfigSource() {
+            @Override
+            public String getString(final String propertyName) {
+                return configSource.getString(propertyName);
+            }
+        };
+        final KillbillServerConfig serverConfig = new ConfigurationObjectFactory(skifeConfigSource).build(KillbillServerConfig.class);
         listener = new TestKillbillGuiceListener(serverConfig, configSource);
 
+        config = new ConfigurationObjectFactory(System.getProperties()).build(HttpServerConfig.class);
         server = new HttpServer();
         server.configure(config, getListeners(), getFilters());
         server.start();
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPerTenantConfig.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPerTenantConfig.java
index 36e1233..a289fed 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPerTenantConfig.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPerTenantConfig.java
@@ -90,7 +90,7 @@ public class TestPerTenantConfig extends TestJaxrsBase {
         //
 
         //
-        // Now unregister special per tenant config and we the first retry occurs one day after (and still fails), it now sets a retry date of 8 days
+        // Now unregister special per tenant config and when the first retry occurs one day after (and still fails), it now sets a retry date of 8 days
         //
         callbackServlet.pushExpectedEvents(ExtBusEventType.TENANT_CONFIG_DELETION);
         tenantApi.deletePerTenantConfiguration(requestOptions);
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/server/log/ServerTestSuiteNoDB.java b/profiles/killbill/src/test/java/org/killbill/billing/server/log/ServerTestSuiteNoDB.java
index 9d12db6..30e2136 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/server/log/ServerTestSuiteNoDB.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/server/log/ServerTestSuiteNoDB.java
@@ -17,7 +17,6 @@
 
 package org.killbill.billing.server.log;
 
-import org.killbill.billing.GuicyKillbillTestModule;
 import org.killbill.billing.GuicyKillbillTestSuiteNoDB;
 import org.testng.annotations.BeforeClass;
 
@@ -32,7 +31,7 @@ public abstract class ServerTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
             return;
         }
 
-        final Injector injector = Guice.createInjector(new TestServerModuleNoDB(configSource));
+        final Injector injector = Guice.createInjector(new TestServerModuleNoDB(configSource, clock));
         injector.injectMembers(this);
     }
 }
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/server/log/TestServerModuleNoDB.java b/profiles/killbill/src/test/java/org/killbill/billing/server/log/TestServerModuleNoDB.java
index 12744ce..f4bfa1a 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/server/log/TestServerModuleNoDB.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/server/log/TestServerModuleNoDB.java
@@ -1,6 +1,6 @@
 /*
- * Copyright 2014-2016 Groupon, Inc
- * Copyright 2014-2016 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -23,18 +23,22 @@ import org.killbill.billing.mock.glue.MockNonEntityDaoModule;
 import org.killbill.billing.platform.api.KillbillConfigSource;
 import org.killbill.billing.util.cache.CacheControllerDispatcher;
 import org.killbill.billing.util.glue.KillBillModule;
+import org.killbill.clock.ClockMock;
 
 import com.google.inject.util.Providers;
 
 public class TestServerModuleNoDB extends KillBillModule {
 
-    public TestServerModuleNoDB(final KillbillConfigSource configSource) {
+    private final ClockMock clock;
+
+    public TestServerModuleNoDB(final KillbillConfigSource configSource, final ClockMock clock) {
         super(configSource);
+        this.clock = clock;
     }
 
     @Override
     public void configure() {
-        install(new GuicyKillbillTestNoDBModule(configSource));
+        install(new GuicyKillbillTestNoDBModule(configSource, clock));
 
         install(new MockNonEntityDaoModule(configSource));
         install(new MockAccountModule(configSource));
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/alignment/TestPlanAligner.java b/subscription/src/test/java/org/killbill/billing/subscription/alignment/TestPlanAligner.java
index ab1a3ea..757d275 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/alignment/TestPlanAligner.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/alignment/TestPlanAligner.java
@@ -35,18 +35,14 @@ import org.killbill.billing.subscription.events.SubscriptionBaseEvent;
 import org.killbill.billing.subscription.events.user.ApiEventBase;
 import org.killbill.billing.subscription.events.user.ApiEventBuilder;
 import org.killbill.billing.subscription.events.user.ApiEventType;
-import org.killbill.clock.DefaultClock;
 import org.testng.Assert;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
-
 public class TestPlanAligner extends SubscriptionTestSuiteNoDB {
 
     private static final String priceList = PriceListSet.DEFAULT_PRICELIST_NAME;
 
-    private final DefaultClock clock = new DefaultClock();
-
     private PlanAligner planAligner;
 
     @Override
@@ -58,7 +54,6 @@ public class TestPlanAligner extends SubscriptionTestSuiteNoDB {
 
         super.beforeClass();
         planAligner = new PlanAligner();
-
     }
 
     @Test(groups = "fast")
@@ -157,7 +152,7 @@ public class TestPlanAligner extends SubscriptionTestSuiteNoDB {
         final DateTime alignStartDate = bundleStartDate;
 
         final Plan plan = catalogService.getFullCatalog(true, true, internalCallContext).findPlan(productName, clock.getUTCNow());
-        final TimedPhase [] phases = planAligner.getCurrentAndNextTimedPhaseOnCreate(alignStartDate, bundleStartDate, plan, PhaseType.EVERGREEN, PriceListSet.DEFAULT_PRICELIST_NAME, now, catalog, internalCallContext);
+        final TimedPhase[] phases = planAligner.getCurrentAndNextTimedPhaseOnCreate(alignStartDate, bundleStartDate, plan, PhaseType.EVERGREEN, PriceListSet.DEFAULT_PRICELIST_NAME, now, catalog, internalCallContext);
         Assert.assertEquals(phases.length, 2);
         Assert.assertEquals(phases[0].getPhase().getPhaseType(), PhaseType.EVERGREEN);
         Assert.assertEquals(phases[0].getStartPhase(), now);
@@ -169,7 +164,7 @@ public class TestPlanAligner extends SubscriptionTestSuiteNoDB {
         final Plan newPlan = catalogService.getFullCatalog(true, true, internalCallContext).findPlan(newProductName, clock.getUTCNow());
         final DateTime effectiveChangeDate = defaultSubscriptionBase.getStartDate().plusMonths(15);
 
-        final TimedPhase currentPhase  = planAligner.getCurrentTimedPhaseOnChange(defaultSubscriptionBase, newPlan, effectiveChangeDate, null, catalog, internalCallContext);
+        final TimedPhase currentPhase = planAligner.getCurrentTimedPhaseOnChange(defaultSubscriptionBase, newPlan, effectiveChangeDate, null, catalog, internalCallContext);
         Assert.assertEquals(currentPhase.getStartPhase(), alignStartDate);
         Assert.assertEquals(currentPhase.getPhase().getPhaseType(), PhaseType.EVERGREEN);
     }
@@ -186,7 +181,7 @@ public class TestPlanAligner extends SubscriptionTestSuiteNoDB {
         final DateTime alignStartDate = bundleStartDate;
 
         final Plan plan = catalogService.getFullCatalog(true, true, internalCallContext).findPlan(productName, clock.getUTCNow());
-        final TimedPhase [] phases = planAligner.getCurrentAndNextTimedPhaseOnCreate(alignStartDate, bundleStartDate, plan, PhaseType.EVERGREEN, PriceListSet.DEFAULT_PRICELIST_NAME, now, catalog, internalCallContext);
+        final TimedPhase[] phases = planAligner.getCurrentAndNextTimedPhaseOnCreate(alignStartDate, bundleStartDate, plan, PhaseType.EVERGREEN, PriceListSet.DEFAULT_PRICELIST_NAME, now, catalog, internalCallContext);
         Assert.assertEquals(phases.length, 2);
         Assert.assertEquals(phases[0].getPhase().getPhaseType(), PhaseType.EVERGREEN);
         Assert.assertEquals(phases[0].getStartPhase(), now);
@@ -198,7 +193,7 @@ public class TestPlanAligner extends SubscriptionTestSuiteNoDB {
         final Plan newPlan = catalogService.getFullCatalog(true, true, internalCallContext).findPlan(newProductName, clock.getUTCNow());
         final DateTime effectiveChangeDate = defaultSubscriptionBase.getStartDate().plusMonths(15);
 
-        final TimedPhase currentPhase  = planAligner.getCurrentTimedPhaseOnChange(defaultSubscriptionBase, newPlan, effectiveChangeDate, null, catalog, internalCallContext);
+        final TimedPhase currentPhase = planAligner.getCurrentTimedPhaseOnChange(defaultSubscriptionBase, newPlan, effectiveChangeDate, null, catalog, internalCallContext);
         Assert.assertEquals(currentPhase.getStartPhase(), alignStartDate);
         Assert.assertEquals(currentPhase.getPhase().getPhaseType(), PhaseType.EVERGREEN);
     }
@@ -215,7 +210,7 @@ public class TestPlanAligner extends SubscriptionTestSuiteNoDB {
         final DateTime alignStartDate = bundleStartDate;
 
         final Plan plan = catalogService.getFullCatalog(true, true, internalCallContext).findPlan(productName, clock.getUTCNow());
-        final TimedPhase [] phases = planAligner.getCurrentAndNextTimedPhaseOnCreate(alignStartDate, bundleStartDate, plan, PhaseType.EVERGREEN, PriceListSet.DEFAULT_PRICELIST_NAME, now, catalog, internalCallContext);
+        final TimedPhase[] phases = planAligner.getCurrentAndNextTimedPhaseOnCreate(alignStartDate, bundleStartDate, plan, PhaseType.EVERGREEN, PriceListSet.DEFAULT_PRICELIST_NAME, now, catalog, internalCallContext);
         Assert.assertEquals(phases.length, 2);
         Assert.assertEquals(phases[0].getPhase().getPhaseType(), PhaseType.EVERGREEN);
         Assert.assertEquals(phases[0].getStartPhase(), now);
@@ -228,7 +223,7 @@ public class TestPlanAligner extends SubscriptionTestSuiteNoDB {
         final DateTime effectiveChangeDate = defaultSubscriptionBase.getStartDate().plusMonths(15);
 
         // Because new Plan has an EVERGREEN PhaseType we end up directly on that PhaseType
-        final TimedPhase currentPhase  = planAligner.getCurrentTimedPhaseOnChange(defaultSubscriptionBase, newPlan, effectiveChangeDate, null, catalog, internalCallContext);
+        final TimedPhase currentPhase = planAligner.getCurrentTimedPhaseOnChange(defaultSubscriptionBase, newPlan, effectiveChangeDate, null, catalog, internalCallContext);
         Assert.assertEquals(currentPhase.getStartPhase(), alignStartDate);
         Assert.assertEquals(currentPhase.getPhase().getPhaseType(), PhaseType.EVERGREEN);
 
@@ -246,7 +241,7 @@ public class TestPlanAligner extends SubscriptionTestSuiteNoDB {
         final DateTime alignStartDate = bundleStartDate;
 
         final Plan plan = catalogService.getFullCatalog(true, true, internalCallContext).findPlan(productName, clock.getUTCNow());
-        final TimedPhase [] phases = planAligner.getCurrentAndNextTimedPhaseOnCreate(alignStartDate, bundleStartDate, plan, PhaseType.EVERGREEN, PriceListSet.DEFAULT_PRICELIST_NAME, now, catalog, internalCallContext);
+        final TimedPhase[] phases = planAligner.getCurrentAndNextTimedPhaseOnCreate(alignStartDate, bundleStartDate, plan, PhaseType.EVERGREEN, PriceListSet.DEFAULT_PRICELIST_NAME, now, catalog, internalCallContext);
         Assert.assertEquals(phases.length, 2);
         Assert.assertEquals(phases[0].getPhase().getPhaseType(), PhaseType.EVERGREEN);
         Assert.assertEquals(phases[0].getStartPhase(), now);
@@ -259,7 +254,7 @@ public class TestPlanAligner extends SubscriptionTestSuiteNoDB {
         final DateTime effectiveChangeDate = defaultSubscriptionBase.getStartDate().plusMonths(15);
 
         // Because new Plan has an EVERGREEN PhaseType we end up directly on that PhaseType
-        final TimedPhase currentPhase  = planAligner.getCurrentTimedPhaseOnChange(defaultSubscriptionBase, newPlan, effectiveChangeDate, null, catalog, internalCallContext);
+        final TimedPhase currentPhase = planAligner.getCurrentTimedPhaseOnChange(defaultSubscriptionBase, newPlan, effectiveChangeDate, null, catalog, internalCallContext);
         Assert.assertEquals(currentPhase.getStartPhase(), alignStartDate);
         Assert.assertEquals(currentPhase.getPhase().getPhaseType(), PhaseType.EVERGREEN);
     }
@@ -276,7 +271,7 @@ public class TestPlanAligner extends SubscriptionTestSuiteNoDB {
         final DateTime alignStartDate = bundleStartDate;
 
         final Plan plan = catalogService.getFullCatalog(true, true, internalCallContext).findPlan(productName, clock.getUTCNow());
-        final TimedPhase [] phases = planAligner.getCurrentAndNextTimedPhaseOnCreate(alignStartDate, bundleStartDate, plan, PhaseType.EVERGREEN, PriceListSet.DEFAULT_PRICELIST_NAME, now, catalog, internalCallContext);
+        final TimedPhase[] phases = planAligner.getCurrentAndNextTimedPhaseOnCreate(alignStartDate, bundleStartDate, plan, PhaseType.EVERGREEN, PriceListSet.DEFAULT_PRICELIST_NAME, now, catalog, internalCallContext);
         Assert.assertEquals(phases.length, 2);
         Assert.assertEquals(phases[0].getPhase().getPhaseType(), PhaseType.EVERGREEN);
         Assert.assertEquals(phases[0].getStartPhase(), now);
@@ -294,7 +289,7 @@ public class TestPlanAligner extends SubscriptionTestSuiteNoDB {
         Assert.assertEquals(currentPhase.getStartPhase(), alignStartDate);
         Assert.assertEquals(currentPhase.getPhase().getPhaseType(), PhaseType.TRIAL);
 
-        final TimedPhase nextPhase  = planAligner.getNextTimedPhaseOnChange(defaultSubscriptionBase, newPlan, effectiveChangeDate, null, catalog, internalCallContext);
+        final TimedPhase nextPhase = planAligner.getNextTimedPhaseOnChange(defaultSubscriptionBase, newPlan, effectiveChangeDate, null, catalog, internalCallContext);
         Assert.assertEquals(nextPhase.getStartPhase(), alignStartDate.plusDays(30));
         Assert.assertEquals(nextPhase.getPhase().getPhaseType(), PhaseType.FIXEDTERM);
     }
@@ -311,7 +306,7 @@ public class TestPlanAligner extends SubscriptionTestSuiteNoDB {
         final DateTime alignStartDate = bundleStartDate;
 
         final Plan plan = catalogService.getFullCatalog(true, true, internalCallContext).findPlan(productName, clock.getUTCNow());
-        final TimedPhase [] phases = planAligner.getCurrentAndNextTimedPhaseOnCreate(alignStartDate, bundleStartDate, plan, null, PriceListSet.DEFAULT_PRICELIST_NAME, now, catalog, internalCallContext);
+        final TimedPhase[] phases = planAligner.getCurrentAndNextTimedPhaseOnCreate(alignStartDate, bundleStartDate, plan, null, PriceListSet.DEFAULT_PRICELIST_NAME, now, catalog, internalCallContext);
         Assert.assertEquals(phases.length, 2);
         Assert.assertEquals(phases[0].getPhase().getPhaseType(), PhaseType.TRIAL);
         Assert.assertEquals(phases[0].getStartPhase(), now);
@@ -330,7 +325,7 @@ public class TestPlanAligner extends SubscriptionTestSuiteNoDB {
         Assert.assertEquals(currentPhase.getStartPhase(), alignStartDate);
         Assert.assertEquals(currentPhase.getPhase().getPhaseType(), PhaseType.DISCOUNT);
 
-        final TimedPhase nextPhase  = planAligner.getNextTimedPhaseOnChange(defaultSubscriptionBase, newPlan, effectiveChangeDate, PhaseType.DISCOUNT, catalog, internalCallContext);
+        final TimedPhase nextPhase = planAligner.getNextTimedPhaseOnChange(defaultSubscriptionBase, newPlan, effectiveChangeDate, PhaseType.DISCOUNT, catalog, internalCallContext);
         Assert.assertEquals(nextPhase.getStartPhase(), alignStartDate.plusMonths(6));
         Assert.assertEquals(nextPhase.getPhase().getPhaseType(), PhaseType.EVERGREEN);
     }
@@ -347,7 +342,7 @@ public class TestPlanAligner extends SubscriptionTestSuiteNoDB {
         final DateTime alignStartDate = bundleStartDate;
 
         final Plan plan = catalogService.getFullCatalog(true, true, internalCallContext).findPlan(productName, clock.getUTCNow());
-        final TimedPhase [] phases = planAligner.getCurrentAndNextTimedPhaseOnCreate(alignStartDate, bundleStartDate, plan, null, PriceListSet.DEFAULT_PRICELIST_NAME, now, catalog, internalCallContext);
+        final TimedPhase[] phases = planAligner.getCurrentAndNextTimedPhaseOnCreate(alignStartDate, bundleStartDate, plan, null, PriceListSet.DEFAULT_PRICELIST_NAME, now, catalog, internalCallContext);
         Assert.assertEquals(phases.length, 2);
         Assert.assertEquals(phases[0].getPhase().getPhaseType(), PhaseType.TRIAL);
         Assert.assertEquals(phases[0].getStartPhase(), now);
@@ -366,7 +361,7 @@ public class TestPlanAligner extends SubscriptionTestSuiteNoDB {
         Assert.assertEquals(currentPhase.getStartPhase(), alignStartDate.plusDays(5));
         Assert.assertEquals(currentPhase.getPhase().getPhaseType(), PhaseType.EVERGREEN);
 
-        final TimedPhase nextPhase  = planAligner.getNextTimedPhaseOnChange(defaultSubscriptionBase, newPlan, effectiveChangeDate, PhaseType.EVERGREEN, catalog, internalCallContext);
+        final TimedPhase nextPhase = planAligner.getNextTimedPhaseOnChange(defaultSubscriptionBase, newPlan, effectiveChangeDate, PhaseType.EVERGREEN, catalog, internalCallContext);
         Assert.assertNull(nextPhase);
     }
 
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/api/user/TestUserApiAddOn.java b/subscription/src/test/java/org/killbill/billing/subscription/api/user/TestUserApiAddOn.java
index 1934905..0e2e9ec 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/api/user/TestUserApiAddOn.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/api/user/TestUserApiAddOn.java
@@ -456,7 +456,7 @@ public class TestUserApiAddOn extends SubscriptionTestSuiteWithEmbeddedDB {
         assertEquals(aoCurrentPhase.getPhaseType(), PhaseType.DISCOUNT);
 
         testUtil.assertDateWithin(aoSubscription.getStartDate(), beforeAOCreation, afterAOCreation);
-        assertEquals(aoSubscription.getBundleStartDate(), baseSubscription.getBundleStartDate());
+        assertEquals(aoSubscription.getBundleStartDate().compareTo(baseSubscription.getBundleStartDate()), 0);
 
         // CHECK next AO PHASE EVENT IS INDEED A MONTH AFTER BP STARTED => BUNDLE ALIGNMENT
         SubscriptionBaseTransition aoPendingTranstion = aoSubscription.getPendingTransition();
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/api/user/TestUserApiCreate.java b/subscription/src/test/java/org/killbill/billing/subscription/api/user/TestUserApiCreate.java
index e112ad0..9e717cf 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/api/user/TestUserApiCreate.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/api/user/TestUserApiCreate.java
@@ -131,7 +131,7 @@ public class TestUserApiCreate extends SubscriptionTestSuiteWithEmbeddedDB {
         final SubscriptionBaseEvent phaseEvent = events.get(1);
 
         assertEquals(subscription.getBundleExternalKey(), bundle.getExternalKey());
-        assertEquals(subscription.getStartDate(), requestedDate.toDateTime(accountData.getReferenceTime()));
+        assertEquals(subscription.getStartDate().compareTo(requestedDate.toDateTime(accountData.getReferenceTime())), 0);
 
         assertListenerStatus();
 
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/glue/TestDefaultSubscriptionModuleNoDB.java b/subscription/src/test/java/org/killbill/billing/subscription/glue/TestDefaultSubscriptionModuleNoDB.java
index 571f6ff..86be2f9 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/glue/TestDefaultSubscriptionModuleNoDB.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/glue/TestDefaultSubscriptionModuleNoDB.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2015 Groupon, Inc
- * Copyright 2014-2015 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -19,18 +19,20 @@
 package org.killbill.billing.subscription.glue;
 
 import org.killbill.billing.GuicyKillbillTestNoDBModule;
-import org.killbill.billing.account.api.AccountUserApi;
 import org.killbill.billing.mock.glue.MockAccountModule;
 import org.killbill.billing.mock.glue.MockNonEntityDaoModule;
 import org.killbill.billing.platform.api.KillbillConfigSource;
 import org.killbill.billing.subscription.engine.dao.MockSubscriptionDaoMemory;
 import org.killbill.billing.subscription.engine.dao.SubscriptionDao;
-import org.mockito.Mockito;
+import org.killbill.clock.ClockMock;
 
 public class TestDefaultSubscriptionModuleNoDB extends TestDefaultSubscriptionModule {
 
-    public TestDefaultSubscriptionModuleNoDB(final KillbillConfigSource configSource) {
+    private final ClockMock clock;
+
+    public TestDefaultSubscriptionModuleNoDB(final KillbillConfigSource configSource, final ClockMock clock) {
         super(configSource);
+        this.clock = clock;
     }
 
     @Override
@@ -40,7 +42,7 @@ public class TestDefaultSubscriptionModuleNoDB extends TestDefaultSubscriptionMo
 
     @Override
     protected void configure() {
-        install(new GuicyKillbillTestNoDBModule(configSource));
+        install(new GuicyKillbillTestNoDBModule(configSource, clock));
         install(new MockAccountModule(configSource));
 
         super.configure();
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/glue/TestDefaultSubscriptionModuleWithEmbeddedDB.java b/subscription/src/test/java/org/killbill/billing/subscription/glue/TestDefaultSubscriptionModuleWithEmbeddedDB.java
index 0d2cb09..ca437d9 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/glue/TestDefaultSubscriptionModuleWithEmbeddedDB.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/glue/TestDefaultSubscriptionModuleWithEmbeddedDB.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2015 Groupon, Inc
- * Copyright 2014-2015 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -26,12 +26,15 @@ import org.killbill.billing.subscription.engine.dao.SubscriptionDao;
 import org.killbill.billing.util.glue.AuditModule;
 import org.killbill.billing.util.glue.CustomFieldModule;
 import org.killbill.billing.util.glue.NonEntityDaoModule;
-import org.killbill.billing.util.glue.TestUtilModuleNoDB;
+import org.killbill.clock.ClockMock;
 
 public class TestDefaultSubscriptionModuleWithEmbeddedDB extends TestDefaultSubscriptionModule {
 
-    public TestDefaultSubscriptionModuleWithEmbeddedDB(final KillbillConfigSource configSource) {
+    private final ClockMock clock;
+
+    public TestDefaultSubscriptionModuleWithEmbeddedDB(final KillbillConfigSource configSource, final ClockMock clock) {
         super(configSource);
+        this.clock = clock;
     }
 
     @Override
@@ -41,8 +44,7 @@ public class TestDefaultSubscriptionModuleWithEmbeddedDB extends TestDefaultSubs
 
     @Override
     protected void configure() {
-
-        install(new GuicyKillbillTestWithEmbeddedDBModule(configSource));
+        install(new GuicyKillbillTestWithEmbeddedDBModule(configSource, clock));
         install(new NonEntityDaoModule(configSource));
         install(new CustomFieldModule(configSource));
         install(new DefaultAccountModule(configSource));
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 3535366..36f17d1 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteNoDB.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteNoDB.java
@@ -18,6 +18,7 @@
 
 package org.killbill.billing.subscription;
 
+import java.util.Map;
 import java.util.UUID;
 
 import javax.inject.Inject;
@@ -49,7 +50,6 @@ import org.killbill.billing.subscription.glue.TestDefaultSubscriptionModuleNoDB;
 import org.killbill.billing.util.cache.CacheControllerDispatcher;
 import org.killbill.billing.util.callcontext.InternalCallContextFactory;
 import org.killbill.billing.util.config.definition.SubscriptionConfig;
-import org.killbill.clock.ClockMock;
 import org.mockito.Mockito;
 import org.skife.jdbi.v2.IDBI;
 import org.skife.jdbi.v2.tweak.HandleCallback;
@@ -120,8 +120,8 @@ public class SubscriptionTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
     protected SubscriptionBaseBundle bundle;
 
     @Override
-    protected KillbillConfigSource getConfigSource() {
-        return getConfigSource("/subscription.properties");
+    protected KillbillConfigSource getConfigSource(final Map<String, String> extraProperties) {
+        return getConfigSource("/subscription.properties", extraProperties);
     }
 
     @BeforeClass(groups = "fast")
@@ -130,7 +130,7 @@ public class SubscriptionTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
             return;
         }
 
-        final Injector g = Guice.createInjector(Stage.PRODUCTION, new TestDefaultSubscriptionModuleNoDB(configSource));
+        final Injector g = Guice.createInjector(Stage.PRODUCTION, new TestDefaultSubscriptionModuleNoDB(configSource, clock));
         g.injectMembers(this);
 
         // For TestApiListener#isCompleted
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 b22a8c2..5a59f67 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteWithEmbeddedDB.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteWithEmbeddedDB.java
@@ -18,6 +18,8 @@
 
 package org.killbill.billing.subscription;
 
+import java.util.Map;
+
 import javax.inject.Inject;
 
 import org.killbill.billing.GuicyKillbillTestSuiteWithEmbeddedDB;
@@ -42,7 +44,6 @@ import org.killbill.billing.subscription.glue.TestDefaultSubscriptionModuleWithE
 import org.killbill.billing.util.config.definition.SubscriptionConfig;
 import org.killbill.billing.util.dao.NonEntityDao;
 import org.killbill.bus.api.PersistentBus;
-import org.killbill.clock.ClockMock;
 import org.killbill.notificationq.api.NotificationQueueService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -99,8 +100,8 @@ public class SubscriptionTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteW
     protected SubscriptionBaseBundle bundle;
 
     @Override
-    protected KillbillConfigSource getConfigSource() {
-        return getConfigSource("/subscription.properties");
+    protected KillbillConfigSource getConfigSource(final Map<String, String> extraProperties) {
+        return getConfigSource("/subscription.properties", extraProperties);
     }
 
     @BeforeClass(groups = "slow")
@@ -109,7 +110,7 @@ public class SubscriptionTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteW
             return;
         }
 
-        final Injector g = Guice.createInjector(Stage.PRODUCTION, new TestDefaultSubscriptionModuleWithEmbeddedDB(configSource));
+        final Injector g = Guice.createInjector(Stage.PRODUCTION, new TestDefaultSubscriptionModuleWithEmbeddedDB(configSource, clock));
         g.injectMembers(this);
     }
 
diff --git a/tenant/src/test/java/org/killbill/billing/tenant/glue/TestTenantModuleNoDB.java b/tenant/src/test/java/org/killbill/billing/tenant/glue/TestTenantModuleNoDB.java
index aacb5ab..75cb051 100644
--- a/tenant/src/test/java/org/killbill/billing/tenant/glue/TestTenantModuleNoDB.java
+++ b/tenant/src/test/java/org/killbill/billing/tenant/glue/TestTenantModuleNoDB.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -19,22 +19,33 @@
 package org.killbill.billing.tenant.glue;
 
 import org.killbill.billing.GuicyKillbillTestNoDBModule;
+import org.killbill.billing.mock.glue.MockAccountModule;
 import org.killbill.billing.mock.glue.MockNonEntityDaoModule;
 import org.killbill.billing.platform.api.KillbillConfigSource;
-import org.killbill.billing.tenant.dao.DefaultTenantDao;
-import org.killbill.billing.tenant.dao.TenantDao;
+import org.killbill.billing.util.glue.KillBillShiroAopModule;
+import org.killbill.billing.util.glue.SecurityModule;
+import org.killbill.billing.util.glue.TestUtilModuleNoDB.ShiroModuleNoDB;
+import org.killbill.clock.ClockMock;
 
 public class TestTenantModuleNoDB extends TestTenantModule {
 
-    public TestTenantModuleNoDB(final KillbillConfigSource configSource) {
+    private final ClockMock clock;
+
+    public TestTenantModuleNoDB(final KillbillConfigSource configSource, final ClockMock clock) {
         super(configSource);
+        this.clock = clock;
     }
 
     @Override
     public void configure() {
         super.configure();
 
-        install(new GuicyKillbillTestNoDBModule(configSource));
+        install(new GuicyKillbillTestNoDBModule(configSource, clock));
         install(new MockNonEntityDaoModule(configSource));
+        install(new MockAccountModule(configSource));
+
+        install(new ShiroModuleNoDB(configSource));
+        install(new KillBillShiroAopModule());
+        install(new SecurityModule(configSource));
     }
 }
diff --git a/tenant/src/test/java/org/killbill/billing/tenant/glue/TestTenantModuleWithEmbeddedDB.java b/tenant/src/test/java/org/killbill/billing/tenant/glue/TestTenantModuleWithEmbeddedDB.java
index 8c14902..e0d6c3c 100644
--- a/tenant/src/test/java/org/killbill/billing/tenant/glue/TestTenantModuleWithEmbeddedDB.java
+++ b/tenant/src/test/java/org/killbill/billing/tenant/glue/TestTenantModuleWithEmbeddedDB.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2015 Groupon, Inc
- * Copyright 2014-2015 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -24,18 +24,22 @@ import org.killbill.billing.platform.api.KillbillConfigSource;
 import org.killbill.billing.util.glue.NonEntityDaoModule;
 import org.killbill.billing.util.glue.SecurityModule;
 import org.killbill.billing.util.glue.TestUtilModuleNoDB.ShiroModuleNoDB;
+import org.killbill.clock.ClockMock;
 
 public class TestTenantModuleWithEmbeddedDB extends TestTenantModule {
 
-    public TestTenantModuleWithEmbeddedDB(final KillbillConfigSource configSource) {
+    private final ClockMock clock;
+
+    public TestTenantModuleWithEmbeddedDB(final KillbillConfigSource configSource, final ClockMock clock) {
         super(configSource);
+        this.clock = clock;
     }
 
     @Override
     public void configure() {
         super.configure();
 
-        install(new GuicyKillbillTestWithEmbeddedDBModule(configSource));
+        install(new GuicyKillbillTestWithEmbeddedDBModule(configSource, clock));
         install(new NonEntityDaoModule(configSource));
         install(new SecurityModule(configSource));
         install(new ShiroModuleNoDB(configSource));
diff --git a/tenant/src/test/java/org/killbill/billing/tenant/TenantTestSuiteNoDB.java b/tenant/src/test/java/org/killbill/billing/tenant/TenantTestSuiteNoDB.java
index 5d15d41..730da01 100644
--- a/tenant/src/test/java/org/killbill/billing/tenant/TenantTestSuiteNoDB.java
+++ b/tenant/src/test/java/org/killbill/billing/tenant/TenantTestSuiteNoDB.java
@@ -32,7 +32,7 @@ public class TenantTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
             return;
         }
 
-        final Injector injector = Guice.createInjector(new TestTenantModuleNoDB(configSource));
+        final Injector injector = Guice.createInjector(new TestTenantModuleNoDB(configSource, clock));
         injector.injectMembers(this);
     }
 }
diff --git a/tenant/src/test/java/org/killbill/billing/tenant/TenantTestSuiteWithEmbeddedDb.java b/tenant/src/test/java/org/killbill/billing/tenant/TenantTestSuiteWithEmbeddedDb.java
index 1c5b407..ba00904 100644
--- a/tenant/src/test/java/org/killbill/billing/tenant/TenantTestSuiteWithEmbeddedDb.java
+++ b/tenant/src/test/java/org/killbill/billing/tenant/TenantTestSuiteWithEmbeddedDb.java
@@ -27,9 +27,7 @@ import org.killbill.billing.tenant.dao.TenantBroadcastDao;
 import org.killbill.billing.tenant.glue.DefaultTenantModule;
 import org.killbill.billing.tenant.glue.TestTenantModuleWithEmbeddedDB;
 import org.killbill.billing.util.config.definition.SecurityConfig;
-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;
@@ -59,7 +57,7 @@ public class TenantTestSuiteWithEmbeddedDb extends GuicyKillbillTestSuiteWithEmb
             return;
         }
 
-        final Injector injector = Guice.createInjector(new TestTenantModuleWithEmbeddedDB(configSource));
+        final Injector injector = Guice.createInjector(new TestTenantModuleWithEmbeddedDB(configSource, clock));
         injector.injectMembers(this);
     }
 }
diff --git a/usage/src/test/java/org/killbill/billing/usage/glue/TestUsageModuleNoDB.java b/usage/src/test/java/org/killbill/billing/usage/glue/TestUsageModuleNoDB.java
index c82920a..b8c49f7 100644
--- a/usage/src/test/java/org/killbill/billing/usage/glue/TestUsageModuleNoDB.java
+++ b/usage/src/test/java/org/killbill/billing/usage/glue/TestUsageModuleNoDB.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -20,17 +20,21 @@ package org.killbill.billing.usage.glue;
 
 import org.killbill.billing.GuicyKillbillTestNoDBModule;
 import org.killbill.billing.platform.api.KillbillConfigSource;
+import org.killbill.clock.ClockMock;
 
 public class TestUsageModuleNoDB extends TestUsageModule {
 
-    public TestUsageModuleNoDB(final KillbillConfigSource configSource) {
+    private final ClockMock clock;
+
+    public TestUsageModuleNoDB(final KillbillConfigSource configSource, final ClockMock clock) {
         super(configSource);
+        this.clock = clock;
     }
 
     @Override
     public void configure() {
         super.configure();
 
-        install(new GuicyKillbillTestNoDBModule(configSource));
+        install(new GuicyKillbillTestNoDBModule(configSource, clock));
     }
 }
diff --git a/usage/src/test/java/org/killbill/billing/usage/glue/TestUsageModuleWithEmbeddedDB.java b/usage/src/test/java/org/killbill/billing/usage/glue/TestUsageModuleWithEmbeddedDB.java
index cf71e96..28b1d50 100644
--- a/usage/src/test/java/org/killbill/billing/usage/glue/TestUsageModuleWithEmbeddedDB.java
+++ b/usage/src/test/java/org/killbill/billing/usage/glue/TestUsageModuleWithEmbeddedDB.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2016 Groupon, Inc
- * Copyright 2014-2016 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -25,18 +25,22 @@ import org.killbill.billing.util.glue.AuditModule;
 import org.killbill.billing.util.glue.CacheModule;
 import org.killbill.billing.util.glue.ConfigModule;
 import org.killbill.billing.util.glue.NonEntityDaoModule;
+import org.killbill.clock.ClockMock;
 
 public class TestUsageModuleWithEmbeddedDB extends TestUsageModule {
 
-    public TestUsageModuleWithEmbeddedDB(final KillbillConfigSource configSource) {
+    private final ClockMock clock;
+
+    public TestUsageModuleWithEmbeddedDB(final KillbillConfigSource configSource, final ClockMock clock) {
         super(configSource);
+        this.clock = clock;
     }
 
     @Override
     public void configure() {
         super.configure();
 
-        install(new GuicyKillbillTestWithEmbeddedDBModule(configSource));
+        install(new GuicyKillbillTestWithEmbeddedDBModule(configSource, clock));
         install(new CacheModule(configSource));
         install(new ConfigModule(configSource));
         install(new NonEntityDaoModule(configSource));
diff --git a/usage/src/test/java/org/killbill/billing/usage/UsageTestSuiteNoDB.java b/usage/src/test/java/org/killbill/billing/usage/UsageTestSuiteNoDB.java
index 54b2182..de21e85 100644
--- a/usage/src/test/java/org/killbill/billing/usage/UsageTestSuiteNoDB.java
+++ b/usage/src/test/java/org/killbill/billing/usage/UsageTestSuiteNoDB.java
@@ -1,7 +1,9 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
- * Ning licenses this file to you under the Apache License, version 2.0
+ * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
  * License.  You may obtain a copy of the License at:
  *
@@ -16,6 +18,7 @@
 
 package org.killbill.billing.usage;
 
+import org.killbill.clock.ClockMock;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
@@ -28,13 +31,19 @@ import com.google.inject.Injector;
 
 public class UsageTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
 
+    private final ClockMock clock;
+
+    public UsageTestSuiteNoDB(final ClockMock clock) {
+        this.clock = clock;
+    }
+
     @BeforeClass(groups = "fast")
     protected void beforeClass() throws Exception {
         if (hasFailed()) {
             return;
         }
 
-        final Injector injector = Guice.createInjector(new TestUsageModuleNoDB(configSource));
+        final Injector injector = Guice.createInjector(new TestUsageModuleNoDB(configSource, clock));
         injector.injectMembers(this);
     }
 }
diff --git a/usage/src/test/java/org/killbill/billing/usage/UsageTestSuiteWithEmbeddedDB.java b/usage/src/test/java/org/killbill/billing/usage/UsageTestSuiteWithEmbeddedDB.java
index 32c5aea..587df49 100644
--- a/usage/src/test/java/org/killbill/billing/usage/UsageTestSuiteWithEmbeddedDB.java
+++ b/usage/src/test/java/org/killbill/billing/usage/UsageTestSuiteWithEmbeddedDB.java
@@ -39,7 +39,7 @@ public class UsageTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteWithEmbe
             return;
         }
 
-        final Injector injector = Guice.createInjector(new TestUsageModuleWithEmbeddedDB(configSource));
+        final Injector injector = Guice.createInjector(new TestUsageModuleWithEmbeddedDB(configSource, clock));
         injector.injectMembers(this);
     }
 }
diff --git a/util/src/main/java/org/killbill/billing/util/callcontext/InternalCallContextFactory.java b/util/src/main/java/org/killbill/billing/util/callcontext/InternalCallContextFactory.java
index ec78672..c4f9a6f 100644
--- a/util/src/main/java/org/killbill/billing/util/callcontext/InternalCallContextFactory.java
+++ b/util/src/main/java/org/killbill/billing/util/callcontext/InternalCallContextFactory.java
@@ -146,19 +146,13 @@ public class InternalCallContextFactory {
         return createInternalTenantContext(tenantRecordId, accountRecordId);
     }
 
-    public InternalTenantContext recreateInternalTenantContextWithAccountRecordId(final UUID objectId, final ObjectType objectType, final InternalTenantContext inputContext) {
-        final Long tenantRecordId = inputContext.getTenantRecordId();
-        final Long accountRecordId = getAccountRecordIdSafe(objectId, objectType, tenantRecordId);
-        return createInternalTenantContext(tenantRecordId, accountRecordId);
-    }
-
-        /**
-         * Create an internal tenant callcontext
-         *
-         * @param tenantRecordId  tenant_record_id (cannot be null)
-         * @param accountRecordId account_record_id (cannot be null for INSERT operations)
-         * @return internal tenant callcontext
-         */
+    /**
+     * Create an internal tenant callcontext
+     *
+     * @param tenantRecordId  tenant_record_id (cannot be null)
+     * @param accountRecordId account_record_id (cannot be null for INSERT operations)
+     * @return internal tenant callcontext
+     */
     public InternalTenantContext createInternalTenantContext(final Long tenantRecordId, @Nullable final Long accountRecordId) {
         populateMDCContext(null, accountRecordId, tenantRecordId);
 
@@ -204,16 +198,25 @@ public class InternalCallContextFactory {
         //Preconditions.checkState(tenantRecordIdFromContext.equals(tenantRecordIdFromObject),
         //                         "tenant of the pointed object (%s) and the callcontext (%s) don't match!", tenantRecordIdFromObject, tenantRecordIdFromContext);
 
-        return createInternalCallContext(objectId, objectType, context.getUserName(), context.getCallOrigin(),
-                                         context.getUserType(), context.getUserToken(), context.getReasonCode(), context.getComments(),
-                                         context);
+        final Long tenantRecordId = getTenantRecordIdSafe(context);
+        final Long accountRecordId = getAccountRecordIdSafe(objectId, objectType, context);
+        return createInternalCallContext(tenantRecordId,
+                                         accountRecordId,
+                                         context.getUserName(),
+                                         context.getCallOrigin(),
+                                         context.getUserType(),
+                                         context.getUserToken(),
+                                         context.getReasonCode(),
+                                         context.getComments(),
+                                         context.getCreatedDate(),
+                                         context.getUpdatedDate());
     }
 
     // Used by the payment retry service
     public InternalCallContext createInternalCallContext(final UUID objectId, final ObjectType objectType, final String userName,
                                                          final CallOrigin callOrigin, final UserType userType, @Nullable final UUID userToken, final Long tenantRecordId) {
         final Long accountRecordId = getAccountRecordIdSafe(objectId, objectType, tenantRecordId);
-        return createInternalCallContext(tenantRecordId, accountRecordId, userName, callOrigin, userType, userToken, null, null);
+        return createInternalCallContext(tenantRecordId, accountRecordId, userName, callOrigin, userType, userToken, null, null, null, null);
     }
 
     /**
@@ -231,7 +234,7 @@ public class InternalCallContextFactory {
      */
     public InternalCallContext createInternalCallContext(@Nullable final Long tenantRecordId, @Nullable final Long accountRecordId, final String userName,
                                                          final CallOrigin callOrigin, final UserType userType, @Nullable final UUID userToken) {
-        return createInternalCallContext(tenantRecordId, accountRecordId, userName, callOrigin, userType, userToken, null, null);
+        return createInternalCallContext(tenantRecordId, accountRecordId, userName, callOrigin, userType, userToken, null, null, null, null);
     }
 
     /**
@@ -273,19 +276,16 @@ public class InternalCallContextFactory {
         return new InternalCallContext(context, accountRecordId, fixedOffsetTimeZone, referenceTime, context.getCreatedDate());
     }
 
-    private InternalCallContext createInternalCallContext(final UUID objectId, final ObjectType objectType, final String userName,
-                                                          final CallOrigin callOrigin, final UserType userType, @Nullable final UUID userToken,
-                                                          @Nullable final String reasonCode, @Nullable final String comment,
-                                                          final TenantContext tenantContext) {
-        final Long tenantRecordId = getTenantRecordIdSafe(tenantContext);
-        final Long accountRecordId = getAccountRecordIdSafe(objectId, objectType, tenantContext);
-        return createInternalCallContext(tenantRecordId, accountRecordId, userName, callOrigin, userType, userToken,
-                                         reasonCode, comment);
-    }
-
-    private InternalCallContext createInternalCallContext(@Nullable final Long tenantRecordId, @Nullable final Long accountRecordId, final String userName,
-                                                          final CallOrigin callOrigin, final UserType userType, @Nullable final UUID userToken,
-                                                          @Nullable final String reasonCode, @Nullable final String comment) {
+    private InternalCallContext createInternalCallContext(@Nullable final Long tenantRecordId,
+                                                          @Nullable final Long accountRecordId,
+                                                          final String userName,
+                                                          final CallOrigin callOrigin,
+                                                          final UserType userType,
+                                                          @Nullable final UUID userToken,
+                                                          @Nullable final String reasonCode,
+                                                          @Nullable final String comment,
+                                                          @Nullable final DateTime createdDate,
+                                                          @Nullable final DateTime updatedDate) {
         final Long nonNulTenantRecordId = MoreObjects.firstNonNull(tenantRecordId, INTERNAL_TENANT_RECORD_ID);
 
         final DateTimeZone fixedOffsetTimeZone;
@@ -312,8 +312,8 @@ public class InternalCallContextFactory {
                                        userType,
                                        reasonCode,
                                        comment,
-                                       clock.getUTCNow(),
-                                       clock.getUTCNow());
+                                       createdDate != null ? createdDate : clock.getUTCNow(),
+                                       updatedDate != null ? createdDate : clock.getUTCNow());
     }
 
     private ImmutableAccountData getImmutableAccountData(final Long accountRecordId, final Long tenantRecordId) {
diff --git a/util/src/main/java/org/killbill/billing/util/dao/AuditLogModelDaoMapper.java b/util/src/main/java/org/killbill/billing/util/dao/AuditLogModelDaoMapper.java
index 9f57e77..b326fb5 100644
--- a/util/src/main/java/org/killbill/billing/util/dao/AuditLogModelDaoMapper.java
+++ b/util/src/main/java/org/killbill/billing/util/dao/AuditLogModelDaoMapper.java
@@ -45,7 +45,7 @@ public class AuditLogModelDaoMapper extends MapperBase implements ResultSetMappe
 
         final EntityAudit entityAudit = new EntityAudit(id, TableName.valueOf(tableName), targetRecordId, ChangeType.valueOf(changeType), createdDate);
         // TODO - we have the tenant_record_id but not the tenant id here
-        final CallContext callContext = new DefaultCallContext(null, null, createdBy, createdDate, reasonCode, comments, userToken);
+        final DefaultCallContext callContext = new DefaultCallContext(null, null, createdBy, createdDate, reasonCode, comments, userToken);
         return new AuditLogModelDao(entityAudit, callContext);
     }
 }
diff --git a/util/src/test/java/org/killbill/billing/GuicyKillbillTestModule.java b/util/src/test/java/org/killbill/billing/GuicyKillbillTestModule.java
index 49cb620..e82f68b 100644
--- a/util/src/test/java/org/killbill/billing/GuicyKillbillTestModule.java
+++ b/util/src/test/java/org/killbill/billing/GuicyKillbillTestModule.java
@@ -35,34 +35,33 @@ import org.killbill.clock.ClockMock;
 
 public class GuicyKillbillTestModule extends KillBillModule {
 
-    //
-    // CreatedFontTracker references that will later be injected through Guices.
-    // That we we have only one clock and all internalContext/callcontext are consistent
-    //
+    private final MutableInternalCallContext internalCallContext;
+    private final MutableCallContext callContext;
+    private final ClockMock clock;
 
-    private final MutableInternalCallContext internalCallContext = new MutableInternalCallContext(InternalCallContextFactory.INTERNAL_TENANT_RECORD_ID,
-                                                                                                  1687L,
-                                                                                                  DateTimeZone.UTC,
-                                                                                                  GuicyKillbillTestSuite.getClock().getUTCNow(),
-                                                                                                  UUID.randomUUID(),
-                                                                                                  UUID.randomUUID().toString(),
-                                                                                                  CallOrigin.TEST,
-                                                                                                  UserType.TEST,
-                                                                                                  "Testing",
-                                                                                                  "This is a test",
-                                                                                                  GuicyKillbillTestSuite.getClock().getUTCNow(),
-                                                                                                  GuicyKillbillTestSuite.getClock().getUTCNow());
-
-    private final MutableCallContext callContext = new MutableCallContext(internalCallContext);
-
-    public GuicyKillbillTestModule(final KillbillConfigSource configSource) {
+    public GuicyKillbillTestModule(final KillbillConfigSource configSource, final ClockMock clock) {
         super(configSource);
+        this.clock = clock;
+
+        internalCallContext = new MutableInternalCallContext(InternalCallContextFactory.INTERNAL_TENANT_RECORD_ID,
+                                                             1687L,
+                                                             DateTimeZone.UTC,
+                                                             clock.getUTCNow(),
+                                                             UUID.randomUUID(),
+                                                             UUID.randomUUID().toString(),
+                                                             CallOrigin.TEST,
+                                                             UserType.TEST,
+                                                             "Testing",
+                                                             "This is a test",
+                                                             clock.getUTCNow(),
+                                                             clock.getUTCNow());
+        callContext = new MutableCallContext(internalCallContext);
     }
 
     @Override
     protected void configure() {
-        bind(ClockMock.class).toInstance(GuicyKillbillTestSuite.getClock());
-        bind(Clock.class).to(ClockMock.class);
+        bind(ClockMock.class).toInstance(clock);
+        bind(Clock.class).toInstance(clock);
         bind(InternalCallContext.class).toInstance(internalCallContext);
         bind(MutableInternalCallContext.class).toInstance(internalCallContext);
         bind(CallContext.class).toInstance(callContext);
diff --git a/util/src/test/java/org/killbill/billing/GuicyKillbillTestNoDBModule.java b/util/src/test/java/org/killbill/billing/GuicyKillbillTestNoDBModule.java
index ba6716a..7388603 100644
--- a/util/src/test/java/org/killbill/billing/GuicyKillbillTestNoDBModule.java
+++ b/util/src/test/java/org/killbill/billing/GuicyKillbillTestNoDBModule.java
@@ -21,6 +21,8 @@ package org.killbill.billing;
 import org.killbill.billing.platform.api.KillbillConfigSource;
 import org.killbill.billing.platform.test.glue.TestPlatformModuleNoDB;
 import org.killbill.billing.util.glue.IDBISetup;
+import org.killbill.billing.util.glue.MemoryGlobalLockerModule;
+import org.killbill.clock.ClockMock;
 import org.skife.jdbi.v2.IDBI;
 
 import com.google.inject.Provides;
@@ -29,8 +31,8 @@ import com.google.inject.name.Named;
 
 public class GuicyKillbillTestNoDBModule extends GuicyKillbillTestModule {
 
-    public GuicyKillbillTestNoDBModule(final KillbillConfigSource configSource) {
-        super(configSource);
+    public GuicyKillbillTestNoDBModule(final KillbillConfigSource configSource, final ClockMock clock) {
+        super(configSource, clock);
     }
 
     @Override
@@ -38,6 +40,7 @@ public class GuicyKillbillTestNoDBModule extends GuicyKillbillTestModule {
         super.configure();
 
         install(new TestPlatformModuleNoDB(configSource));
+        install(new MemoryGlobalLockerModule(configSource));
     }
 
     @Provides
diff --git a/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuite.java b/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuite.java
index f2b2a72..68b9717 100644
--- a/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuite.java
+++ b/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuite.java
@@ -19,12 +19,12 @@
 package org.killbill.billing;
 
 import java.lang.reflect.Method;
+import java.util.Map;
 import java.util.UUID;
 
 import javax.inject.Inject;
 
 import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
 import org.killbill.billing.api.AbortAfterFirstFailureListener;
 import org.killbill.billing.api.FlakyInvokedMethodListener;
 import org.killbill.billing.api.FlakyRetryAnalyzer;
@@ -34,7 +34,6 @@ import org.killbill.billing.callcontext.MutableInternalCallContext;
 import org.killbill.billing.platform.api.KillbillConfigSource;
 import org.killbill.billing.platform.test.config.TestKillbillConfigSource;
 import org.killbill.billing.util.callcontext.InternalCallContextFactory;
-import org.killbill.billing.util.callcontext.TenantContext;
 import org.killbill.clock.Clock;
 import org.killbill.clock.ClockMock;
 import org.mockito.Mockito;
@@ -48,9 +47,13 @@ import org.testng.IHookable;
 import org.testng.ITestNGMethod;
 import org.testng.ITestResult;
 import org.testng.annotations.AfterMethod;
+import org.testng.annotations.AfterSuite;
+import org.testng.annotations.BeforeClass;
 import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.BeforeSuite;
 import org.testng.annotations.Listeners;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableMap;
 
 import static org.testng.ITestResult.CREATED;
@@ -66,10 +69,15 @@ public class GuicyKillbillTestSuite implements IHookable {
     // Use the simple name here to save screen real estate
     protected static final Logger log = LoggerFactory.getLogger(KillbillTestSuite.class.getSimpleName());
 
-    private static final ClockMock theStaticClock = new ClockMock();
+    // Variables set in @BeforeSuite
+    protected static ImmutableMap<String, String> extraPropertiesForTestSuite;
+    // The clock needs to be setup early, as it is needed when starting the server, but see below
+    @VisibleForTesting
+    protected static ClockMock theRealClock = new ClockMock();
 
-    protected final KillbillConfigSource configSource;
-    protected final ConfigSource skifeConfigSource;
+    protected ClockMock clock = theRealClock;
+    protected KillbillConfigSource configSource;
+    protected ConfigSource skifeConfigSource;
 
     @Inject
     protected InternalCallContextFactory internalCallContextFactory;
@@ -80,28 +88,9 @@ public class GuicyKillbillTestSuite implements IHookable {
     @Inject
     protected MutableCallContext callContext;
 
-    @Inject
-    private ClockMock theRealClock;
-
-    // Initialized to avoid NPE when skipping tests, but see below
-    protected ClockMock clock = new ClockMock();
 
     private boolean hasFailed = false;
 
-    public GuicyKillbillTestSuite() {
-        this.configSource = getConfigSource();
-        this.skifeConfigSource = new ConfigSource() {
-            @Override
-            public String getString(final String propertyName) {
-                return configSource.getString(propertyName);
-            }
-        };
-    }
-
-    public static ClockMock getClock() {
-        return theStaticClock;
-    }
-
     public static void refreshCallContext(final UUID accountId,
                                           final Clock clock,
                                           final InternalCallContextFactory internalCallContextFactory,
@@ -117,21 +106,11 @@ public class GuicyKillbillTestSuite implements IHookable {
         callContext.setDelegate(accountId, internalCallContext);
     }
 
-    protected KillbillConfigSource getConfigSource() {
-        try {
-            return new TestKillbillConfigSource(DBTestingHelper.class);
-        } catch (final Exception e) {
-            final AssertionError assertionError = new AssertionError("Initialization error");
-            assertionError.initCause(e);
-            throw assertionError;
-        }
-    }
-
-    protected KillbillConfigSource getConfigSource(final String file) {
-        return getConfigSource(file, ImmutableMap.<String, String>of());
+    protected KillbillConfigSource getConfigSource(final Map<String, String> extraProperties) {
+        return getConfigSource(null, extraProperties);
     }
 
-    protected KillbillConfigSource getConfigSource(final String file, final ImmutableMap<String, String> extraProperties) {
+    protected KillbillConfigSource getConfigSource(final String file, final Map<String, String> extraProperties) {
         try {
             return new TestKillbillConfigSource(file, DBTestingHelper.class, extraProperties);
         } catch (final Exception e) {
@@ -163,40 +142,6 @@ public class GuicyKillbillTestSuite implements IHookable {
         if (internalCallContext != null) {
             internalCallContext.reset();
         }
-
-        if (theRealClock != null) {
-            clock = Mockito.spy(theRealClock);
-            final Answer answer = new Answer() {
-                @Override
-                public Object answer(final InvocationOnMock invocation) throws Throwable {
-                    // Sync clock and theRealClock
-                    final Object realAnswer = invocation.callRealMethod();
-                    invocation.getMethod().invoke(theRealClock, invocation.getArguments());
-
-                    // Update the contexts createdDate each time we move the clock
-                    final DateTime utcNow = theRealClock.getUTCNow();
-                    if (callContext != null) {
-                        callContext.setCreatedDate(utcNow);
-                    }
-                    if (internalCallContext != null) {
-                        internalCallContext.setCreatedDate(utcNow);
-                    }
-
-                    return realAnswer;
-                }
-            };
-            Mockito.doAnswer(answer).when(clock).getUTCNow();
-            Mockito.doAnswer(answer).when(clock).getNow(Mockito.any(DateTimeZone.class));
-            Mockito.doAnswer(answer).when(clock).getUTCToday();
-            Mockito.doAnswer(answer).when(clock).getToday(Mockito.any(DateTimeZone.class));
-            Mockito.doAnswer(answer).when(clock).addDays(Mockito.anyInt());
-            Mockito.doAnswer(answer).when(clock).addWeeks(Mockito.anyInt());
-            Mockito.doAnswer(answer).when(clock).addMonths(Mockito.anyInt());
-            Mockito.doAnswer(answer).when(clock).addYears(Mockito.anyInt());
-            Mockito.doAnswer(answer).when(clock).addDeltaFromReality(Mockito.anyLong());
-            Mockito.doAnswer(answer).when(clock).setTime(Mockito.any(DateTime.class));
-            Mockito.doAnswer(answer).when(clock).resetDeltaFromReality();
-        }
     }
 
     @AfterMethod(alwaysRun = true)
@@ -265,6 +210,48 @@ public class GuicyKillbillTestSuite implements IHookable {
         // No-op
     }
 
+    @BeforeSuite(alwaysRun = true)
+    public void globalBeforeSuite() {
+        theRealClock.resetDeltaFromReality();
+
+        extraPropertiesForTestSuite = ImmutableMap.<String, String>of();
+    }
+
+    @BeforeClass(alwaysRun = true)
+    public void globalBeforeTest() {
+        configSource = getConfigSource(extraPropertiesForTestSuite);
+        skifeConfigSource = new ConfigSource() {
+            @Override
+            public String getString(final String propertyName) {
+                return configSource.getString(propertyName);
+            }
+        };
+
+        // We need to set the instance variable in each subsequent class instantiated in the suite
+        clock = Mockito.mock(ClockMock.class,
+                             new Answer() {
+                                 @Override
+                                 public Object answer(final InvocationOnMock invocation) throws Throwable {
+                                     final Object answer = invocation.getMethod().invoke(theRealClock, invocation.getArguments());
+                                     final DateTime utcNow = theRealClock.getUTCNow();
+
+                                     if (callContext != null) {
+                                         callContext.setCreatedDate(utcNow);
+                                     }
+                                     if (internalCallContext != null) {
+                                         internalCallContext.setCreatedDate(utcNow);
+                                         internalCallContext.setUpdatedDate(utcNow);
+                                     }
+
+                                     return answer;
+                                 }
+                             });
+    }
+
+    @AfterSuite(alwaysRun = true)
+    public void globalAfterSuite() {
+    }
+
     public boolean hasFailed() {
         return hasFailed || AbortAfterFirstFailureListener.hasFailures();
     }
diff --git a/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuiteWithEmbeddedDB.java b/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuiteWithEmbeddedDB.java
index 530530f..c282bd2 100644
--- a/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuiteWithEmbeddedDB.java
+++ b/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuiteWithEmbeddedDB.java
@@ -18,7 +18,22 @@
 
 package org.killbill.billing;
 
-import javax.inject.Inject;
+import java.io.ByteArrayOutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.lang.management.LockInfo;
+import java.lang.management.ManagementFactory;
+import java.lang.management.MonitorInfo;
+import java.lang.management.ThreadInfo;
+import java.nio.charset.Charset;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.ResultSetMetaData;
+import java.sql.Statement;
+import java.util.List;
+
+import javax.annotation.Nullable;
+import javax.cache.CacheManager;
 import javax.inject.Named;
 import javax.sql.DataSource;
 
@@ -32,6 +47,9 @@ import org.testng.annotations.AfterSuite;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.BeforeSuite;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.inject.Inject;
+
 import static org.killbill.billing.util.glue.IDBISetup.MAIN_RO_IDBI_NAMED;
 
 public class GuicyKillbillTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuite {
@@ -54,8 +72,14 @@ public class GuicyKillbillTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuite
     @Inject
     protected CacheControllerDispatcher controlCacheDispatcher;
 
+    @Nullable
+    @Inject(optional = true)
+    protected CacheManager cacheManager;
+
     @BeforeSuite(groups = "slow")
     public void beforeSuite() throws Exception {
+        // Hack to configure log4jdbc -- properties used by tests will be properly setup in @BeforeClass
+        getConfigSource(ImmutableMap.<String, String>of());
         DBTestingHelper.get().start();
     }
 
@@ -81,6 +105,8 @@ public class GuicyKillbillTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuite
     @AfterSuite(groups = "slow")
     public void afterSuite() throws Exception {
         if (hasFailed()) {
+            threadDump();
+            dumpDB();
             log.error("**********************************************************************************************");
             log.error("*** TESTS HAVE FAILED - LEAVING DB RUNNING FOR DEBUGGING - MAKE SURE TO KILL IT ONCE DONE ****");
             log.error(DBTestingHelper.get().getInstance().getCmdLineConnectionString());
@@ -88,9 +114,139 @@ public class GuicyKillbillTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuite
             return;
         }
 
+        if (cacheManager != null) {
+            cacheManager.close();
+        }
+
         try {
             DBTestingHelper.get().getInstance().stop();
         } catch (final Exception ignored) {
         }
     }
+
+    private void dumpDB() {
+        log.error("*********************************************");
+        log.error("*** TESTS HAVE FAILED - DUMPING DATABASE ****");
+        log.error("*********************************************\n");
+
+        try {
+            final EmbeddedDB embeddedDB = DBTestingHelper.get().getInstance();
+            final List<String> tables = embeddedDB.getAllTables();
+
+            final Connection connection = embeddedDB.getDataSource().getConnection();
+            try {
+                for (final String table : tables) {
+                    final StringBuilder tableDump = new StringBuilder("Table ").append(table).append("\n");
+                    boolean hasData = false;
+
+                    Statement statement = null;
+                    try {
+                        statement = connection.createStatement();
+                        final ResultSet rs = statement.executeQuery("select * from " + table);
+
+                        final ResultSetMetaData metadata = rs.getMetaData();
+                        final int columnCount = metadata.getColumnCount();
+                        for (int i = 1; i <= columnCount; i++) {
+                            tableDump.append(metadata.getColumnName(i)).append(",");
+                        }
+                        tableDump.append("\n");
+
+                        while (rs.next()) {
+                            hasData = true;
+                            for (int i = 1; i <= columnCount; i++) {
+                                tableDump.append(rs.getString(i)).append(",");
+                            }
+                            tableDump.append("\n");
+                        }
+                    } finally {
+                        if (statement != null) {
+                            statement.close();
+                        }
+                    }
+
+                    if (hasData) {
+                        log.error(tableDump.toString());
+                    }
+                }
+            } finally {
+                connection.close();
+            }
+            log.error("*********************************************");
+        } catch (final Exception e) {
+            log.error("Unable to dump DB");
+        }
+    }
+
+    private void threadDump() {
+        final ThreadInfo[] threads = ManagementFactory.getThreadMXBean().dumpAllThreads(true, true);
+        final ByteArrayOutputStream out = new ByteArrayOutputStream();
+        final PrintWriter writer = new PrintWriter(new OutputStreamWriter(out, Charset.forName("UTF-8")));
+
+        for (int ti = threads.length - 1; ti >= 0; ti--) {
+            final ThreadInfo t = threads[ti];
+            writer.printf("\"%s\" id=%d state=%s",
+                          t.getThreadName(),
+                          t.getThreadId(),
+                          t.getThreadState());
+            final LockInfo lock = t.getLockInfo();
+            if (lock != null && t.getThreadState() != Thread.State.BLOCKED) {
+                writer.printf("%n    - waiting on <0x%08x> (a %s)",
+                              lock.getIdentityHashCode(),
+                              lock.getClassName());
+                writer.printf("%n    - locked <0x%08x> (a %s)",
+                              lock.getIdentityHashCode(),
+                              lock.getClassName());
+            } else if (lock != null && t.getThreadState() == Thread.State.BLOCKED) {
+                writer.printf("%n    - waiting to lock <0x%08x> (a %s)",
+                              lock.getIdentityHashCode(),
+                              lock.getClassName());
+            }
+
+            if (t.isSuspended()) {
+                writer.print(" (suspended)");
+            }
+
+            if (t.isInNative()) {
+                writer.print(" (running in native)");
+            }
+
+            writer.println();
+            if (t.getLockOwnerName() != null) {
+                writer.printf("     owned by %s id=%d%n", t.getLockOwnerName(), t.getLockOwnerId());
+            }
+
+            final StackTraceElement[] elements = t.getStackTrace();
+            final MonitorInfo[] monitors = t.getLockedMonitors();
+
+            for (int i = 0; i < elements.length; i++) {
+                final StackTraceElement element = elements[i];
+                writer.printf("    at %s%n", element);
+                for (int j = 1; j < monitors.length; j++) {
+                    final MonitorInfo monitor = monitors[j];
+                    if (monitor.getLockedStackDepth() == i) {
+                        writer.printf("      - locked %s%n", monitor);
+                    }
+                }
+            }
+            writer.println();
+
+            final LockInfo[] locks = t.getLockedSynchronizers();
+            if (locks.length > 0) {
+                writer.printf("    Locked synchronizers: count = %d%n", locks.length);
+                for (LockInfo l : locks) {
+                    writer.printf("      - %s%n", l);
+                }
+                writer.println();
+            }
+        }
+
+        writer.println();
+        writer.flush();
+
+        log.error("********************************************");
+        log.error("*** TESTS HAVE FAILED - DUMPING THREADS ****");
+        log.error("********************************************\n");
+        log.error(out.toString());
+        log.error("********************************************");
+    }
 }
diff --git a/util/src/test/java/org/killbill/billing/GuicyKillbillTestWithEmbeddedDBModule.java b/util/src/test/java/org/killbill/billing/GuicyKillbillTestWithEmbeddedDBModule.java
index 330d1a2..7bc9e74 100644
--- a/util/src/test/java/org/killbill/billing/GuicyKillbillTestWithEmbeddedDBModule.java
+++ b/util/src/test/java/org/killbill/billing/GuicyKillbillTestWithEmbeddedDBModule.java
@@ -22,7 +22,9 @@ import org.killbill.billing.platform.api.KillbillConfigSource;
 import org.killbill.billing.platform.test.PlatformDBTestingHelper;
 import org.killbill.billing.platform.test.config.TestKillbillConfigSource;
 import org.killbill.billing.platform.test.glue.TestPlatformModuleWithEmbeddedDB;
+import org.killbill.billing.util.glue.GlobalLockerModule;
 import org.killbill.billing.util.glue.IDBISetup;
+import org.killbill.clock.ClockMock;
 import org.skife.jdbi.v2.IDBI;
 
 import com.google.inject.Provides;
@@ -33,12 +35,12 @@ public class GuicyKillbillTestWithEmbeddedDBModule extends GuicyKillbillTestModu
 
     private final boolean withOSGI;
 
-    public GuicyKillbillTestWithEmbeddedDBModule(final KillbillConfigSource configSource) {
-        this(false, configSource);
+    public GuicyKillbillTestWithEmbeddedDBModule(final KillbillConfigSource configSource, final ClockMock clock) {
+        this(false, configSource, clock);
     }
 
-    public GuicyKillbillTestWithEmbeddedDBModule(final boolean withOSGI, final KillbillConfigSource configSource) {
-        super(configSource);
+    public GuicyKillbillTestWithEmbeddedDBModule(final boolean withOSGI, final KillbillConfigSource configSource, final ClockMock clock) {
+        super(configSource, clock);
         this.withOSGI = withOSGI;
     }
 
@@ -47,6 +49,7 @@ public class GuicyKillbillTestWithEmbeddedDBModule extends GuicyKillbillTestModu
         super.configure();
 
         install(new KillbillTestPlatformModuleWithEmbeddedDB(configSource));
+        install(new GlobalLockerModule(configSource));
     }
 
     private final class KillbillTestPlatformModuleWithEmbeddedDB extends TestPlatformModuleWithEmbeddedDB {
diff --git a/util/src/test/java/org/killbill/billing/TestClockMockSetup.java b/util/src/test/java/org/killbill/billing/TestClockMockSetup.java
new file mode 100644
index 0000000..4e2573e
--- /dev/null
+++ b/util/src/test/java/org/killbill/billing/TestClockMockSetup.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
+ *
+ * The Billing Project licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.killbill.billing;
+
+import org.joda.time.LocalDate;
+import org.killbill.billing.util.UtilTestSuiteNoDB;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+public class TestClockMockSetup extends UtilTestSuiteNoDB {
+
+    @Test(groups = "fast", description = "Verify Mockito setup in GuicyKillbillTestSuite")
+    public void testSpy() {
+        clock.setDay(new LocalDate("2012-08-01"));
+        Assert.assertEquals(clock.getUTCToday().toString(), "2012-08-01");
+        Assert.assertEquals(theRealClock.getUTCToday().toString(), "2012-08-01");
+        clock.addMonths(1);
+        Assert.assertEquals(clock.getUTCToday().toString(), "2012-09-01");
+        Assert.assertEquals(theRealClock.getUTCToday().toString(), "2012-09-01");
+        clock.addDays(30);
+        Assert.assertEquals(clock.getUTCToday().toString(), "2012-10-01");
+        Assert.assertEquals(theRealClock.getUTCToday().toString(), "2012-10-01");
+    }
+}
diff --git a/util/src/test/java/org/killbill/billing/util/audit/api/TestDefaultAuditUserApi.java b/util/src/test/java/org/killbill/billing/util/audit/api/TestDefaultAuditUserApi.java
index 76405d9..48782cc 100644
--- a/util/src/test/java/org/killbill/billing/util/audit/api/TestDefaultAuditUserApi.java
+++ b/util/src/test/java/org/killbill/billing/util/audit/api/TestDefaultAuditUserApi.java
@@ -19,17 +19,15 @@ package org.killbill.billing.util.audit.api;
 import java.util.List;
 import java.util.UUID;
 
-import org.testng.Assert;
-import org.testng.annotations.BeforeClass;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
 import org.killbill.billing.ObjectType;
 import org.killbill.billing.util.api.AuditLevel;
 import org.killbill.billing.util.audit.AuditLog;
 import org.killbill.billing.util.audit.AuditLogsTestBase;
 import org.killbill.billing.util.audit.dao.MockAuditDao;
 import org.killbill.billing.util.dao.TableName;
+import org.testng.Assert;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
 
 import com.google.common.collect.ImmutableList;
 
@@ -40,6 +38,10 @@ public class TestDefaultAuditUserApi extends AuditLogsTestBase {
 
     @BeforeMethod(groups = "fast")
     public void setup() throws Exception {
+        if (hasFailed()) {
+            return;
+        }
+
         auditLogs = ImmutableList.<AuditLog>of(createAuditLog(), createAuditLog(), createAuditLog(), createAuditLog());
         objectIds = ImmutableList.<UUID>of(UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID());
 
diff --git a/util/src/test/java/org/killbill/billing/util/audit/TestDefaultAuditLog.java b/util/src/test/java/org/killbill/billing/util/audit/TestDefaultAuditLog.java
index 8ef5a77..64f032c 100644
--- a/util/src/test/java/org/killbill/billing/util/audit/TestDefaultAuditLog.java
+++ b/util/src/test/java/org/killbill/billing/util/audit/TestDefaultAuditLog.java
@@ -1,7 +1,9 @@
 /*
  * Copyright 2010-2012 Ning, Inc.
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
- * Ning licenses this file to you under the Apache License, version 2.0
+ * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
  * License.  You may obtain a copy of the License at:
  *
@@ -18,19 +20,17 @@ package org.killbill.billing.util.audit;
 
 import java.util.UUID;
 
-import org.testng.Assert;
-import org.testng.annotations.Test;
-
 import org.killbill.billing.ObjectType;
 import org.killbill.billing.callcontext.DefaultCallContext;
-import org.killbill.clock.ClockMock;
 import org.killbill.billing.util.UtilTestSuiteNoDB;
 import org.killbill.billing.util.audit.dao.AuditLogModelDao;
-import org.killbill.billing.util.callcontext.CallContext;
 import org.killbill.billing.util.callcontext.CallOrigin;
 import org.killbill.billing.util.callcontext.UserType;
 import org.killbill.billing.util.dao.EntityAudit;
 import org.killbill.billing.util.dao.TableName;
+import org.killbill.clock.ClockMock;
+import org.testng.Assert;
+import org.testng.annotations.Test;
 
 public class TestDefaultAuditLog extends UtilTestSuiteNoDB {
 
@@ -47,8 +47,7 @@ public class TestDefaultAuditLog extends UtilTestSuiteNoDB {
         final CallOrigin callOrigin = CallOrigin.EXTERNAL;
         final UserType userType = UserType.CUSTOMER;
         final UUID userToken = UUID.randomUUID();
-        final ClockMock clock = new ClockMock();
-        final CallContext callContext = new DefaultCallContext(accountId, tenantId, userName, callOrigin, userType, userToken, clock);
+        final DefaultCallContext callContext = new DefaultCallContext(accountId, tenantId, userName, callOrigin, userType, userToken, clock);
 
         final AuditLog auditLog = new DefaultAuditLog(new AuditLogModelDao(entityAudit, callContext), ObjectType.ACCOUNT_EMAIL, UUID.randomUUID());
         Assert.assertEquals(auditLog.getChangeType(), changeType);
@@ -72,8 +71,7 @@ public class TestDefaultAuditLog extends UtilTestSuiteNoDB {
         final CallOrigin callOrigin = CallOrigin.EXTERNAL;
         final UserType userType = UserType.CUSTOMER;
         final UUID userToken = UUID.randomUUID();
-        final ClockMock clock = new ClockMock();
-        final CallContext callContext = new DefaultCallContext(accountId, tenantId, userName, callOrigin, userType, userToken, clock);
+        final DefaultCallContext callContext = new DefaultCallContext(accountId, tenantId, userName, callOrigin, userType, userToken, clock);
 
         final AuditLogModelDao auditLog = new AuditLogModelDao(entityAudit, callContext);
         Assert.assertEquals(auditLog, auditLog);
@@ -82,7 +80,7 @@ public class TestDefaultAuditLog extends UtilTestSuiteNoDB {
         Assert.assertEquals(sameAuditLog, auditLog);
 
         clock.addMonths(1);
-        final CallContext otherCallContext = new DefaultCallContext(accountId, tenantId, userName, callOrigin, userType, userToken, clock);
+        final DefaultCallContext otherCallContext = new DefaultCallContext(accountId, tenantId, userName, callOrigin, userType, userToken, clock);
         final AuditLogModelDao otherAuditLog = new AuditLogModelDao(entityAudit, otherCallContext);
         Assert.assertNotEquals(otherAuditLog, auditLog);
     }
diff --git a/util/src/test/java/org/killbill/billing/util/broadcast/TestBroadcastService.java b/util/src/test/java/org/killbill/billing/util/broadcast/TestBroadcastService.java
index 3868a56..f473cca 100644
--- a/util/src/test/java/org/killbill/billing/util/broadcast/TestBroadcastService.java
+++ b/util/src/test/java/org/killbill/billing/util/broadcast/TestBroadcastService.java
@@ -1,6 +1,6 @@
 /*
- * Copyright 2014-2015 Groupon, Inc
- * Copyright 2014-2015 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -17,6 +17,9 @@
 
 package org.killbill.billing.util.broadcast;
 
+import java.util.HashMap;
+import java.util.Map;
+
 import org.killbill.billing.api.TestApiListener.NextEvent;
 import org.killbill.billing.platform.api.KillbillConfigSource;
 import org.killbill.billing.util.UtilTestSuiteWithEmbeddedDB;
@@ -25,7 +28,6 @@ import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
-import com.google.common.collect.ImmutableMap;
 import com.google.inject.Inject;
 
 public class TestBroadcastService extends UtilTestSuiteWithEmbeddedDB {
@@ -34,9 +36,10 @@ public class TestBroadcastService extends UtilTestSuiteWithEmbeddedDB {
     private BroadcastService broadcastService;
 
     @Override
-    protected KillbillConfigSource getConfigSource() {
-            return getConfigSource(null,
-                               ImmutableMap.<String, String>of("org.killbill.billing.util.broadcast.rate", "500ms"));
+    protected KillbillConfigSource getConfigSource(final Map<String, String> extraProperties) {
+        final Map<String, String> allExtraProperties = new HashMap<String, String>(extraProperties);
+        allExtraProperties.put("org.killbill.billing.util.broadcast.rate", "500ms");
+        return getConfigSource(null, allExtraProperties);
     }
 
     @BeforeMethod(groups = "slow")
diff --git a/util/src/test/java/org/killbill/billing/util/callcontext/TestInternalCallContextFactory.java b/util/src/test/java/org/killbill/billing/util/callcontext/TestInternalCallContextFactory.java
index 5afce8e..432910f 100644
--- a/util/src/test/java/org/killbill/billing/util/callcontext/TestInternalCallContextFactory.java
+++ b/util/src/test/java/org/killbill/billing/util/callcontext/TestInternalCallContextFactory.java
@@ -21,21 +21,19 @@ package org.killbill.billing.util.callcontext;
 import java.util.Date;
 import java.util.UUID;
 
+import org.killbill.billing.ObjectType;
 import org.killbill.billing.account.api.ImmutableAccountData;
+import org.killbill.billing.callcontext.InternalCallContext;
 import org.killbill.billing.callcontext.InternalTenantContext;
+import org.killbill.billing.util.UtilTestSuiteWithEmbeddedDB;
 import org.mockito.Mockito;
 import org.skife.jdbi.v2.Handle;
 import org.skife.jdbi.v2.tweak.HandleCallback;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import org.killbill.billing.ObjectType;
-import org.killbill.billing.callcontext.InternalCallContext;
-import org.killbill.billing.util.UtilTestSuiteWithEmbeddedDB;
-
 public class TestInternalCallContextFactory extends UtilTestSuiteWithEmbeddedDB {
 
-
     @Test(groups = "slow")
     public void testCreateInternalCallContextWithAccountRecordIdFromSimpleObjectType() throws Exception {
         final UUID invoiceId = UUID.randomUUID();
diff --git a/util/src/test/java/org/killbill/billing/util/dao/KombuchaSqlDao.java b/util/src/test/java/org/killbill/billing/util/dao/KombuchaSqlDao.java
index a5827f6..b9db3b1 100644
--- a/util/src/test/java/org/killbill/billing/util/dao/KombuchaSqlDao.java
+++ b/util/src/test/java/org/killbill/billing/util/dao/KombuchaSqlDao.java
@@ -25,5 +25,5 @@ import org.skife.jdbi.v2.sqlobject.SqlQuery;
 interface KombuchaSqlDao extends EntitySqlDao<KombuchaModelDao, Kombucha> {
 
     @SqlQuery
-    public boolean isIsTimeForKombucha();
+    public boolean isItTimeForKombucha();
 }
diff --git a/util/src/test/java/org/killbill/billing/util/dao/TestStringTemplateInheritance.java b/util/src/test/java/org/killbill/billing/util/dao/TestStringTemplateInheritance.java
index 588d765..c099f56 100644
--- a/util/src/test/java/org/killbill/billing/util/dao/TestStringTemplateInheritance.java
+++ b/util/src/test/java/org/killbill/billing/util/dao/TestStringTemplateInheritance.java
@@ -31,7 +31,7 @@ public class TestStringTemplateInheritance extends UtilTestSuiteNoDB {
         final STGroup kombucha = new STGroupFile(this.getClass().getResource("/org/killbill/billing/util/dao/Kombucha.sql.stg"), "UTF-8", '<', '>');
 
         // Verify non inherited template
-        Assert.assertEquals(kombucha.getInstanceOf("isIsTimeForKombucha").render(), "select hour(current_timestamp(0)) = 17 as is_time;");
+        Assert.assertEquals(kombucha.getInstanceOf("isItTimeForKombucha").render(), "select hour(current_timestamp(0)) < 24 as is_time;");
 
         // Verify inherited templates
         assertPattern(kombucha.getInstanceOf("getById").render(), "select\r?\n" +
diff --git a/util/src/test/java/org/killbill/billing/util/dao/TestStringTemplateInheritanceWithJdbi.java b/util/src/test/java/org/killbill/billing/util/dao/TestStringTemplateInheritanceWithJdbi.java
index fa36842..e2be33a 100644
--- a/util/src/test/java/org/killbill/billing/util/dao/TestStringTemplateInheritanceWithJdbi.java
+++ b/util/src/test/java/org/killbill/billing/util/dao/TestStringTemplateInheritanceWithJdbi.java
@@ -28,7 +28,7 @@ public class TestStringTemplateInheritanceWithJdbi extends UtilTestSuiteWithEmbe
         final KombuchaSqlDao dao = dbi.onDemand(KombuchaSqlDao.class);
 
         // Verify non inherited template
-        Assert.assertEquals(dao.isIsTimeForKombucha(), clock.getUTCNow().getHourOfDay() == 17);
+        Assert.assertTrue(dao.isItTimeForKombucha());
 
         // Verify inherited templates
         Assert.assertFalse(dao.getAll(internalCallContext).hasNext());
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 7e34658..46ad7b6 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
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014 Groupon, Inc
- * Copyright 2014 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -26,11 +26,15 @@ import org.killbill.billing.util.api.AuditUserApi;
 import org.killbill.billing.util.audit.api.DefaultAuditUserApi;
 import org.killbill.billing.util.audit.dao.AuditDao;
 import org.killbill.billing.util.audit.dao.MockAuditDao;
+import org.killbill.clock.ClockMock;
 
 public class TestUtilModuleNoDB extends TestUtilModule {
 
-    public TestUtilModuleNoDB(final KillbillConfigSource configSource) {
+    private final ClockMock clock;
+
+    public TestUtilModuleNoDB(final KillbillConfigSource configSource, final ClockMock clock) {
         super(configSource);
+        this.clock = clock;
     }
 
     private void installAuditMock() {
@@ -41,7 +45,7 @@ public class TestUtilModuleNoDB extends TestUtilModule {
     @Override
     protected void configure() {
         super.configure();
-        install(new GuicyKillbillTestNoDBModule(configSource));
+        install(new GuicyKillbillTestNoDBModule(configSource, clock));
 
         install(new MockNonEntityDaoModule(configSource));
         install(new MockGlobalLockerModule(configSource));
diff --git a/util/src/test/java/org/killbill/billing/util/glue/TestUtilModuleWithEmbeddedDB.java b/util/src/test/java/org/killbill/billing/util/glue/TestUtilModuleWithEmbeddedDB.java
index 3529062..772d545 100644
--- a/util/src/test/java/org/killbill/billing/util/glue/TestUtilModuleWithEmbeddedDB.java
+++ b/util/src/test/java/org/killbill/billing/util/glue/TestUtilModuleWithEmbeddedDB.java
@@ -1,7 +1,7 @@
 /*
  * Copyright 2010-2013 Ning, Inc.
- * Copyright 2014-2015 Groupon, Inc
- * Copyright 2014-2015 The Billing Project, LLC
+ * Copyright 2014-2018 Groupon, Inc
+ * Copyright 2014-2018 The Billing Project, LLC
  *
  * The Billing Project licenses this file to you under the Apache License, version 2.0
  * (the "License"); you may not use this file except in compliance with the
@@ -22,18 +22,22 @@ import org.killbill.billing.GuicyKillbillTestWithEmbeddedDBModule;
 import org.killbill.billing.api.TestApiListener;
 import org.killbill.billing.osgi.api.PluginsInfoApi;
 import org.killbill.billing.platform.api.KillbillConfigSource;
+import org.killbill.clock.ClockMock;
 import org.mockito.Mockito;
 
 public class TestUtilModuleWithEmbeddedDB extends TestUtilModule {
 
-    public TestUtilModuleWithEmbeddedDB(final KillbillConfigSource configSource) {
+    private final ClockMock clock;
+
+    public TestUtilModuleWithEmbeddedDB(final KillbillConfigSource configSource, final ClockMock clock) {
         super(configSource);
+        this.clock = clock;
     }
 
     @Override
     protected void configure() {
         super.configure();
-        install(new GuicyKillbillTestWithEmbeddedDBModule(configSource));
+        install(new GuicyKillbillTestWithEmbeddedDBModule(configSource, clock));
 
         install(new AuditModule(configSource));
         install(new InfoModuleWithPluginInfoApi(configSource));
@@ -42,7 +46,6 @@ public class TestUtilModuleWithEmbeddedDB extends TestUtilModule {
         install(new CustomFieldModule(configSource));
         install(new NonEntityDaoModule(configSource));
         install(new SecurityModuleWithNoSecurityManager(configSource));
-        install(new GlobalLockerModule(configSource));
         bind(TestApiListener.class).asEagerSingleton();
     }
 
diff --git a/util/src/test/java/org/killbill/billing/util/listener/TestRetryableService.java b/util/src/test/java/org/killbill/billing/util/listener/TestRetryableService.java
index eed7a14..cb10dd8 100644
--- a/util/src/test/java/org/killbill/billing/util/listener/TestRetryableService.java
+++ b/util/src/test/java/org/killbill/billing/util/listener/TestRetryableService.java
@@ -71,6 +71,10 @@ public class TestRetryableService extends UtilTestSuiteWithEmbeddedDB {
 
     @BeforeMethod(groups = "slow")
     public void setUp() throws Exception {
+        if (hasFailed()) {
+            return;
+        }
+
         event = new DefaultControlTagCreationEvent(UUID.randomUUID(),
                                                    UUID.randomUUID(),
                                                    ObjectType.ACCOUNT,
@@ -86,6 +90,10 @@ public class TestRetryableService extends UtilTestSuiteWithEmbeddedDB {
 
     @AfterMethod(groups = "slow")
     public void tearDown() throws Exception {
+        if (hasFailed()) {
+            return;
+        }
+
         testListener.stop();
     }
 
diff --git a/util/src/test/java/org/killbill/billing/util/UtilTestSuiteNoDB.java b/util/src/test/java/org/killbill/billing/util/UtilTestSuiteNoDB.java
index cda04b3..12f2b9f 100644
--- a/util/src/test/java/org/killbill/billing/util/UtilTestSuiteNoDB.java
+++ b/util/src/test/java/org/killbill/billing/util/UtilTestSuiteNoDB.java
@@ -79,7 +79,7 @@ public class UtilTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
             return;
         }
 
-        final Injector g = Guice.createInjector(Stage.PRODUCTION, new TestUtilModuleNoDB(configSource));
+        final Injector g = Guice.createInjector(Stage.PRODUCTION, new TestUtilModuleNoDB(configSource, clock));
         g.injectMembers(this);
     }
 
diff --git a/util/src/test/java/org/killbill/billing/util/UtilTestSuiteWithEmbeddedDB.java b/util/src/test/java/org/killbill/billing/util/UtilTestSuiteWithEmbeddedDB.java
index 3868612..77500b0 100644
--- a/util/src/test/java/org/killbill/billing/util/UtilTestSuiteWithEmbeddedDB.java
+++ b/util/src/test/java/org/killbill/billing/util/UtilTestSuiteWithEmbeddedDB.java
@@ -38,11 +38,7 @@ import org.killbill.billing.util.tag.api.DefaultTagUserApi;
 import org.killbill.billing.util.tag.dao.DefaultTagDao;
 import org.killbill.billing.util.tag.dao.TagDefinitionDao;
 import org.killbill.bus.api.PersistentBus;
-import org.killbill.commons.embeddeddb.EmbeddedDB.DBEngine;
 import org.killbill.commons.locker.GlobalLocker;
-import org.killbill.commons.locker.memory.MemoryGlobalLocker;
-import org.killbill.commons.locker.mysql.MySqlGlobalLocker;
-import org.killbill.commons.locker.postgresql.PostgreSQLGlobalLocker;
 import org.killbill.notificationq.api.NotificationQueueService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -102,16 +98,9 @@ public abstract class UtilTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuite
             return;
         }
 
-        final Injector g = Guice.createInjector(Stage.PRODUCTION, new TestUtilModuleWithEmbeddedDB(configSource));
+        final Injector g = Guice.createInjector(Stage.PRODUCTION, new TestUtilModuleWithEmbeddedDB(configSource, clock));
         g.injectMembers(this);
 
-        if (DBEngine.MYSQL.equals(helper.getDBEngine())) {
-            Assert.assertTrue(locker instanceof MySqlGlobalLocker);
-        } else if (DBEngine.POSTGRESQL.equals(helper.getDBEngine())) {
-            Assert.assertTrue(locker instanceof PostgreSQLGlobalLocker);
-        } else {
-            Assert.assertTrue(locker instanceof MemoryGlobalLocker);
-        }
         Assert.assertTrue(locker.isFree("a", "b"));
     }
 
diff --git a/util/src/test/resources/org/killbill/billing/util/dao/Kombucha.sql.stg b/util/src/test/resources/org/killbill/billing/util/dao/Kombucha.sql.stg
index 52dbbc8..ac26f3d 100644
--- a/util/src/test/resources/org/killbill/billing/util/dao/Kombucha.sql.stg
+++ b/util/src/test/resources/org/killbill/billing/util/dao/Kombucha.sql.stg
@@ -16,6 +16,6 @@ tableValues() ::= <<
 , :sugar
 >>
 
-isIsTimeForKombucha() ::= <<
-select hour(current_timestamp(0)) = 17 as is_time;
+isItTimeForKombucha() ::= <<
+select hour(current_timestamp(0)) \< 24 as is_time;
 >>