killbill-memoizeit

Changes

pom.xml 2(+1 -1)

Details

diff --git a/account/src/main/java/org/killbill/billing/account/api/DefaultAccount.java b/account/src/main/java/org/killbill/billing/account/api/DefaultAccount.java
index ca107c9..40647a9 100644
--- a/account/src/main/java/org/killbill/billing/account/api/DefaultAccount.java
+++ b/account/src/main/java/org/killbill/billing/account/api/DefaultAccount.java
@@ -42,6 +42,7 @@ public class DefaultAccount extends EntityBase implements Account {
     private final Boolean isPaymentDelegatedToParent;
     private final Integer billCycleDayLocal;
     private final UUID paymentMethodId;
+    private final DateTime referenceTime;
     private final DateTimeZone timeZone;
     private final String locale;
     private final String address1;
@@ -73,6 +74,7 @@ public class DefaultAccount extends EntityBase implements Account {
              data.isPaymentDelegatedToParent(),
              data.getBillCycleDayLocal(),
              data.getPaymentMethodId(),
+             data.getReferenceTime(),
              data.getTimeZone(),
              data.getLocale(),
              data.getAddress1(),
@@ -93,7 +95,7 @@ public class DefaultAccount extends EntityBase implements Account {
                           final String name, final Integer firstNameLength, final Currency currency,
                           final UUID parentAccountId, final Boolean isPaymentDelegatedToParent,
                           final Integer billCycleDayLocal, final UUID paymentMethodId,
-                          final DateTimeZone timeZone, final String locale,
+                          final DateTime referenceTime, final DateTimeZone timeZone, final String locale,
                           final String address1, final String address2, final String companyName,
                           final String city, final String stateOrProvince, final String country,
                           final String postalCode, final String phone, final String notes,
@@ -110,6 +112,7 @@ public class DefaultAccount extends EntityBase implements Account {
              isPaymentDelegatedToParent,
              billCycleDayLocal,
              paymentMethodId,
+             referenceTime,
              timeZone,
              locale,
              address1,
@@ -130,7 +133,7 @@ public class DefaultAccount extends EntityBase implements Account {
                           final String name, final Integer firstNameLength, final Currency currency,
                           final UUID parentAccountId, final Boolean isPaymentDelegatedToParent,
                           final Integer billCycleDayLocal, final UUID paymentMethodId,
-                          final DateTimeZone timeZone, final String locale,
+                          final DateTime referenceTime, final DateTimeZone timeZone, final String locale,
                           final String address1, final String address2, final String companyName,
                           final String city, final String stateOrProvince, final String country,
                           final String postalCode, final String phone, final String notes,
@@ -145,6 +148,7 @@ public class DefaultAccount extends EntityBase implements Account {
         this.isPaymentDelegatedToParent = isPaymentDelegatedToParent != null ? isPaymentDelegatedToParent : false;
         this.billCycleDayLocal = billCycleDayLocal == null ? DEFAULT_BILLING_CYCLE_DAY_LOCAL : billCycleDayLocal;
         this.paymentMethodId = paymentMethodId;
+        this.referenceTime = referenceTime;
         this.timeZone = timeZone;
         this.locale = locale;
         this.address1 = address1;
@@ -173,6 +177,7 @@ public class DefaultAccount extends EntityBase implements Account {
              accountModelDao.getIsPaymentDelegatedToParent(),
              accountModelDao.getBillingCycleDayLocal(),
              accountModelDao.getPaymentMethodId(),
+             accountModelDao.getReferenceTime(),
              accountModelDao.getTimeZone(),
              accountModelDao.getLocale(),
              accountModelDao.getAddress1(),
@@ -366,7 +371,7 @@ public class DefaultAccount extends EntityBase implements Account {
 
     @Override
     public DateTime getReferenceTime() {
-        return AccountDateTimeUtils.getReferenceDateTime(this);
+        return referenceTime;
     }
 
     @Override
@@ -381,6 +386,7 @@ public class DefaultAccount extends EntityBase implements Account {
                ", isPaymentDelegatedToParent=" + isPaymentDelegatedToParent +
                ", billCycleDayLocal=" + billCycleDayLocal +
                ", paymentMethodId=" + paymentMethodId +
+               ", referenceTime=" + referenceTime +
                ", timezone=" + timeZone +
                ", locale=" + locale +
                ", address1=" + address1 +
@@ -468,6 +474,9 @@ public class DefaultAccount extends EntityBase implements Account {
         if (stateOrProvince != null ? !stateOrProvince.equals(that.stateOrProvince) : that.stateOrProvince != null) {
             return false;
         }
+        if (referenceTime != null ? referenceTime.compareTo(that.referenceTime) != 0 : that.referenceTime != null) {
+            return false;
+        }
         if (timeZone != null ? !timeZone.equals(that.timeZone) : that.timeZone != null) {
             return false;
         }
@@ -490,6 +499,7 @@ public class DefaultAccount extends EntityBase implements Account {
         result = 31 * result + (isPaymentDelegatedToParent != null ? isPaymentDelegatedToParent.hashCode() : 0);
         result = 31 * result + billCycleDayLocal;
         result = 31 * result + (paymentMethodId != null ? paymentMethodId.hashCode() : 0);
+        result = 31 * result + (referenceTime != null ? referenceTime.hashCode() : 0);
         result = 31 * result + (timeZone != null ? timeZone.hashCode() : 0);
         result = 31 * result + (locale != null ? locale.hashCode() : 0);
         result = 31 * result + (address1 != null ? address1.hashCode() : 0);
@@ -514,8 +524,8 @@ public class DefaultAccount extends EntityBase implements Account {
         // All these conditions are written in the exact same way:
         //
         // There is already a defined value BUT those don't match (either input is null or different) => Not Allowed
-        // * ignoreNullInput=true (case where we allow to reset values)
-        // * ignoreNullInput=true (case where we DON'T allow to reset values and so is such value is null we ignore the check)
+        // * ignoreNullInput = false (case where we allow to reset values)
+        // * ignoreNullInput = true (case where we DON'T allow to reset values and so if such value is null we ignore the check)
         //
         //
         if ((ignoreNullInput || externalKey != null) &&
@@ -545,6 +555,11 @@ public class DefaultAccount extends EntityBase implements Account {
                                                              timeZone, currentAccount.getTimeZone()));
         }
 
+        if (referenceTime != null && currentAccount.getReferenceTime().withMillisOfDay(0).compareTo(referenceTime.withMillisOfDay(0)) != 0) {
+            throw new IllegalArgumentException(String.format("Killbill doesn't support updating the account referenceTime yet: new=%s, current=%s",
+                                                             referenceTime, currentAccount.getReferenceTime()));
+        }
+
     }
 
 }
diff --git a/account/src/main/java/org/killbill/billing/account/api/DefaultImmutableAccountData.java b/account/src/main/java/org/killbill/billing/account/api/DefaultImmutableAccountData.java
index df7a78b..fdce2f1 100644
--- a/account/src/main/java/org/killbill/billing/account/api/DefaultImmutableAccountData.java
+++ b/account/src/main/java/org/killbill/billing/account/api/DefaultImmutableAccountData.java
@@ -61,7 +61,7 @@ public class DefaultImmutableAccountData implements ImmutableAccountData, Extern
              account.getCurrency(),
              account.getTimeZone(),
              AccountDateTimeUtils.getFixedOffsetTimeZone(account),
-             AccountDateTimeUtils.getReferenceDateTime(account));
+             account.getReferenceTime());
     }
 
     public DefaultImmutableAccountData(final AccountModelDao account) {
@@ -70,7 +70,7 @@ public class DefaultImmutableAccountData implements ImmutableAccountData, Extern
              account.getCurrency(),
              account.getTimeZone(),
              AccountDateTimeUtils.getFixedOffsetTimeZone(account),
-             AccountDateTimeUtils.getReferenceDateTime(account));
+             account.getReferenceTime());
     }
 
     @Override
diff --git a/account/src/main/java/org/killbill/billing/account/api/DefaultMutableAccountData.java b/account/src/main/java/org/killbill/billing/account/api/DefaultMutableAccountData.java
index 1f1c6fc..6829226 100644
--- a/account/src/main/java/org/killbill/billing/account/api/DefaultMutableAccountData.java
+++ b/account/src/main/java/org/killbill/billing/account/api/DefaultMutableAccountData.java
@@ -20,6 +20,7 @@ package org.killbill.billing.account.api;
 
 import java.util.UUID;
 
+import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
 import org.killbill.billing.catalog.api.Currency;
 
@@ -37,6 +38,7 @@ public class DefaultMutableAccountData implements MutableAccountData {
     private Boolean isPaymentDelegatedToParent;
     private int billCycleDayLocal;
     private UUID paymentMethodId;
+    private DateTime referenceTime;
     private DateTimeZone timeZone;
     private String locale;
     private String address1;
@@ -54,8 +56,8 @@ public class DefaultMutableAccountData implements MutableAccountData {
     public DefaultMutableAccountData(final String externalKey, final String email, final String name,
                                      final int firstNameLength, final Currency currency,
                                      final UUID parentAccountId, final Boolean isPaymentDelegatedToParent,
-                                     final int billCycleDayLocal, final UUID paymentMethodId, final DateTimeZone timeZone,
-                                     final String locale, final String address1, final String address2,
+                                     final int billCycleDayLocal, final UUID paymentMethodId, final DateTime referenceTime,
+                                     final DateTimeZone timeZone, final String locale, final String address1, final String address2,
                                      final String companyName, final String city, final String stateOrProvince,
                                      final String country, final String postalCode, final String phone,
                                      final String notes, final boolean isMigrated, final boolean isNotifiedForInvoices) {
@@ -68,6 +70,7 @@ public class DefaultMutableAccountData implements MutableAccountData {
         this.isPaymentDelegatedToParent = isPaymentDelegatedToParent;
         this.billCycleDayLocal = billCycleDayLocal;
         this.paymentMethodId = paymentMethodId;
+        this.referenceTime = referenceTime;
         this.timeZone = timeZone;
         this.locale = locale;
         this.address1 = address1;
@@ -93,6 +96,7 @@ public class DefaultMutableAccountData implements MutableAccountData {
         this.isPaymentDelegatedToParent = accountData.isPaymentDelegatedToParent();
         this.billCycleDayLocal = accountData.getBillCycleDayLocal() == null ? DEFAULT_BILLING_CYCLE_DAY_LOCAL : accountData.getBillCycleDayLocal();
         this.paymentMethodId = accountData.getPaymentMethodId();
+        this.referenceTime = accountData.getReferenceTime();
         this.timeZone = accountData.getTimeZone();
         this.locale = accountData.getLocale();
         this.address1 = accountData.getAddress1();
@@ -174,11 +178,22 @@ public class DefaultMutableAccountData implements MutableAccountData {
     }
 
     @Override
+    public DateTime getReferenceTime() {
+        return referenceTime;
+    }
+
+
+    @Override
     public void setPaymentMethodId(final UUID paymentMethodId) {
         this.paymentMethodId = paymentMethodId;
     }
 
     @Override
+    public void setReferenceTime(final DateTime dateTime) {
+        this.referenceTime = referenceTime;
+    }
+
+    @Override
     public DateTimeZone getTimeZone() {
         return timeZone;
     }
diff --git a/account/src/main/java/org/killbill/billing/account/api/user/DefaultAccountCreationEvent.java b/account/src/main/java/org/killbill/billing/account/api/user/DefaultAccountCreationEvent.java
index 1ddfd15..54da302 100644
--- a/account/src/main/java/org/killbill/billing/account/api/user/DefaultAccountCreationEvent.java
+++ b/account/src/main/java/org/killbill/billing/account/api/user/DefaultAccountCreationEvent.java
@@ -20,7 +20,10 @@ package org.killbill.billing.account.api.user;
 
 import java.util.UUID;
 
+import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
+import org.joda.time.format.DateTimeFormatter;
+import org.joda.time.format.ISODateTimeFormat;
 import org.killbill.billing.account.api.AccountData;
 import org.killbill.billing.account.dao.AccountModelDao;
 import org.killbill.billing.catalog.api.Currency;
@@ -34,6 +37,8 @@ import com.google.common.base.Strings;
 
 public class DefaultAccountCreationEvent extends BusEventBase implements AccountCreationInternalEvent {
 
+    private static final DateTimeFormatter DATE_TIME_FORMATTER = ISODateTimeFormat.dateTimeParser();
+
     private final UUID id;
     private final AccountData data;
 
@@ -113,6 +118,7 @@ public class DefaultAccountCreationEvent extends BusEventBase implements Account
         private final UUID parentAccountId;
         private final Boolean isPaymentDelegatedToParent;
         private final UUID paymentMethodId;
+        private final String referenceTime;
         private final String timeZone;
         private final String locale;
         private final String address1;
@@ -137,6 +143,7 @@ public class DefaultAccountCreationEvent extends BusEventBase implements Account
                  d.getParentAccountId(),
                  d.getIsPaymentDelegatedToParent(),
                  d.getPaymentMethodId(),
+                 d.getReferenceTime() != null ? d.getReferenceTime().toString() : null,
                  d.getTimeZone() != null ? d.getTimeZone().getID() : null,
                  d.getLocale(),
                  d.getAddress1(),
@@ -162,6 +169,7 @@ public class DefaultAccountCreationEvent extends BusEventBase implements Account
                                   @JsonProperty("parentAccountId") final UUID parentAccountId,
                                   @JsonProperty("isPaymentDelegatedToParent") final Boolean isPaymentDelegatedToParent,
                                   @JsonProperty("paymentMethodId") final UUID paymentMethodId,
+                                  @JsonProperty("referenceTime") final String referenceTime,
                                   @JsonProperty("timeZone") final String timeZone,
                                   @JsonProperty("locale") final String locale,
                                   @JsonProperty("address1") final String address1,
@@ -184,6 +192,7 @@ public class DefaultAccountCreationEvent extends BusEventBase implements Account
             this.parentAccountId = parentAccountId;
             this.isPaymentDelegatedToParent = isPaymentDelegatedToParent;
             this.paymentMethodId = paymentMethodId;
+            this.referenceTime = referenceTime;
             this.timeZone = timeZone;
             this.locale = locale;
             this.address1 = address1;
@@ -315,6 +324,11 @@ public class DefaultAccountCreationEvent extends BusEventBase implements Account
         }
 
         @Override
+        public DateTime getReferenceTime() {
+            return DATE_TIME_FORMATTER.parseDateTime(referenceTime);
+        }
+
+        @Override
         @JsonIgnore
         public Boolean isMigrated() {
             return isMigrated;
@@ -414,10 +428,12 @@ public class DefaultAccountCreationEvent extends BusEventBase implements Account
             if (stateOrProvince != null ? !stateOrProvince.equals(that.stateOrProvince) : that.stateOrProvince != null) {
                 return false;
             }
+            if (referenceTime != null ? referenceTime.compareTo(that.referenceTime) != 0 : that.referenceTime != null) {
+                return false;
+            }
             if (timeZone != null ? !timeZone.equals(that.timeZone) : that.timeZone != null) {
                 return false;
             }
-
             return true;
         }
 
@@ -432,6 +448,7 @@ public class DefaultAccountCreationEvent extends BusEventBase implements Account
             result = 31 * result + (parentAccountId != null ? parentAccountId.hashCode() : 0);
             result = 31 * result + (isPaymentDelegatedToParent != null ? isPaymentDelegatedToParent.hashCode() : 0);
             result = 31 * result + (paymentMethodId != null ? paymentMethodId.hashCode() : 0);
+            result = 31 * result + (referenceTime != null ? referenceTime.hashCode() : 0);
             result = 31 * result + (timeZone != null ? timeZone.hashCode() : 0);
             result = 31 * result + (locale != null ? locale.hashCode() : 0);
             result = 31 * result + (address1 != null ? address1.hashCode() : 0);
diff --git a/account/src/main/java/org/killbill/billing/account/api/user/DefaultAccountUserApi.java b/account/src/main/java/org/killbill/billing/account/api/user/DefaultAccountUserApi.java
index c1474e4..dadff1f 100644
--- a/account/src/main/java/org/killbill/billing/account/api/user/DefaultAccountUserApi.java
+++ b/account/src/main/java/org/killbill/billing/account/api/user/DefaultAccountUserApi.java
@@ -100,8 +100,7 @@ public class DefaultAccountUserApi extends DefaultAccountApiBase implements Acco
             }
         }
 
-        final AccountModelDao account = new AccountModelDao(data);
-
+        final AccountModelDao account = new AccountModelDao(data, context.getCreatedDate());
         if (null != account.getExternalKey() && account.getExternalKey().length() > 255) {
             throw new AccountApiException(ErrorCode.EXTERNAL_KEY_LIMIT_EXCEEDED);
         }
@@ -166,7 +165,7 @@ public class DefaultAccountUserApi extends DefaultAccountApiBase implements Acco
 
         input.validateAccountUpdateInput(currentAccount, true);
 
-        final AccountModelDao updatedAccountModelDao = new AccountModelDao(currentAccount.getId(), input);
+        final AccountModelDao updatedAccountModelDao = new AccountModelDao(currentAccount.getId(),  input);
 
         accountDao.update(updatedAccountModelDao, internalCallContextFactory.createInternalCallContext(updatedAccountModelDao.getId(), context));
     }
diff --git a/account/src/main/java/org/killbill/billing/account/dao/AccountModelDao.java b/account/src/main/java/org/killbill/billing/account/dao/AccountModelDao.java
index b0e392f..47f81a5 100644
--- a/account/src/main/java/org/killbill/billing/account/dao/AccountModelDao.java
+++ b/account/src/main/java/org/killbill/billing/account/dao/AccountModelDao.java
@@ -48,6 +48,7 @@ public class AccountModelDao extends EntityModelDaoBase implements TimeZoneAware
     private Boolean isPaymentDelegatedToParent;
     private int billingCycleDayLocal;
     private UUID paymentMethodId;
+    private DateTime referenceTime;
     private DateTimeZone timeZone;
     private String locale;
     private String address1;
@@ -68,7 +69,7 @@ public class AccountModelDao extends EntityModelDaoBase implements TimeZoneAware
     public AccountModelDao(final UUID id, final DateTime createdDate, final DateTime updatedDate, final String externalKey,
                            final String email, final String name, final Integer firstNameLength, final Currency currency,
                            final UUID parentAccountId, final Boolean isPaymentDelegatedToParent,
-                           final int billingCycleDayLocal, final UUID paymentMethodId, final DateTimeZone timeZone,
+                           final int billingCycleDayLocal, final UUID paymentMethodId, final DateTime referenceTime, final DateTimeZone timeZone,
                            final String locale, final String address1, final String address2, final String companyName,
                            final String city, final String stateOrProvince, final String country, final String postalCode,
                            final String phone, final String notes, final Boolean migrated, final Boolean notifiedForInvoices) {
@@ -82,6 +83,7 @@ public class AccountModelDao extends EntityModelDaoBase implements TimeZoneAware
         this.isPaymentDelegatedToParent = isPaymentDelegatedToParent;
         this.billingCycleDayLocal = billingCycleDayLocal;
         this.paymentMethodId = paymentMethodId;
+        this.referenceTime = referenceTime;
         this.timeZone = MoreObjects.firstNonNull(timeZone, DateTimeZone.UTC);
         this.locale = locale;
         this.address1 = address1;
@@ -97,7 +99,7 @@ public class AccountModelDao extends EntityModelDaoBase implements TimeZoneAware
         this.isNotifiedForInvoices = notifiedForInvoices;
     }
 
-    public AccountModelDao(final UUID id, @Nullable final DateTime createdDate, final DateTime updatedDate, final AccountData account) {
+    private AccountModelDao(final UUID id, @Nullable final DateTime createdDate, @Nullable final DateTime updatedDate, final AccountData account) {
         this(id,
              createdDate,
              updatedDate,
@@ -110,6 +112,7 @@ public class AccountModelDao extends EntityModelDaoBase implements TimeZoneAware
              account.isPaymentDelegatedToParent(),
              MoreObjects.firstNonNull(account.getBillCycleDayLocal(), DEFAULT_BILLING_CYCLE_DAY_LOCAL),
              account.getPaymentMethodId(),
+             account.getReferenceTime() != null ? account.getReferenceTime() : createdDate,
              account.getTimeZone(),
              account.getLocale(),
              account.getAddress1(),
@@ -126,14 +129,17 @@ public class AccountModelDao extends EntityModelDaoBase implements TimeZoneAware
              MoreObjects.firstNonNull(account.isNotifiedForInvoices(), false));
     }
 
-    public AccountModelDao(final UUID id, final AccountData account) {
-        this(id, null, null, account);
+
+    public AccountModelDao(final UUID accountId, final AccountData account) {
+        this(accountId, null, null, account);
     }
 
-    public AccountModelDao(final AccountData account) {
-        this(UUIDs.randomUUID(), account);
+
+    public AccountModelDao(final AccountData account, final DateTime createdDate) {
+        this(UUIDs.randomUUID(), createdDate, createdDate, account);
     }
 
+
     @Override
     public void setRecordId(final Long recordId) {
         super.setRecordId(recordId);
@@ -216,6 +222,15 @@ public class AccountModelDao extends EntityModelDaoBase implements TimeZoneAware
     }
 
     @Override
+    public DateTime getReferenceTime() {
+        return referenceTime;
+    }
+
+    public void setReferenceTime(final DateTime referenceTime) {
+        this.referenceTime = referenceTime;
+    }
+
+    @Override
     public DateTimeZone getTimeZone() {
         return timeZone;
     }
@@ -335,6 +350,7 @@ public class AccountModelDao extends EntityModelDaoBase implements TimeZoneAware
         sb.append(", isPaymentDelegatedToParent=").append(isPaymentDelegatedToParent);
         sb.append(", billingCycleDayLocal=").append(billingCycleDayLocal);
         sb.append(", paymentMethodId=").append(paymentMethodId);
+        sb.append(", referenceTime=").append(referenceTime);
         sb.append(", timeZone=").append(timeZone);
         sb.append(", locale='").append(locale).append('\'');
         sb.append(", address1='").append(address1).append('\'');
@@ -429,10 +445,12 @@ public class AccountModelDao extends EntityModelDaoBase implements TimeZoneAware
         if (stateOrProvince != null ? !stateOrProvince.equals(that.stateOrProvince) : that.stateOrProvince != null) {
             return false;
         }
+        if (referenceTime != null ? referenceTime.compareTo(that.referenceTime) != 0 : that.referenceTime != null) {
+            return false;
+        }
         if (timeZone != null ? !timeZone.equals(that.timeZone) : that.timeZone != null) {
             return false;
         }
-
         return true;
     }
 
@@ -448,6 +466,7 @@ public class AccountModelDao extends EntityModelDaoBase implements TimeZoneAware
         result = 31 * result + (isPaymentDelegatedToParent != null ? isPaymentDelegatedToParent.hashCode() : 0);
         result = 31 * result + billingCycleDayLocal;
         result = 31 * result + (paymentMethodId != null ? paymentMethodId.hashCode() : 0);
+        result = 31 * result + (referenceTime != null ? referenceTime.hashCode() : 0);
         result = 31 * result + (timeZone != null ? timeZone.hashCode() : 0);
         result = 31 * result + (locale != null ? locale.hashCode() : 0);
         result = 31 * result + (address1 != null ? address1.hashCode() : 0);
diff --git a/account/src/main/java/org/killbill/billing/account/dao/DefaultAccountDao.java b/account/src/main/java/org/killbill/billing/account/dao/DefaultAccountDao.java
index 3054b9e..919ccf3 100644
--- a/account/src/main/java/org/killbill/billing/account/dao/DefaultAccountDao.java
+++ b/account/src/main/java/org/killbill/billing/account/dao/DefaultAccountDao.java
@@ -57,6 +57,7 @@ import org.skife.jdbi.v2.IDBI;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.inject.Inject;
 
@@ -81,6 +82,14 @@ public class DefaultAccountDao extends EntityDaoBase<AccountModelDao, Account, A
 
     @Override
     public void create(final AccountModelDao entity, final InternalCallContext context) throws AccountApiException {
+
+        // We don't enforce the created_date for the Account because it is extracted from context
+        // so, if there is no referenceTime specified we have to set it from the InternalCallContext#created_date
+        //
+        if (entity.getReferenceTime() == null) {
+            entity.setReferenceTime(context.getCreatedDate());
+        }
+
         final AccountModelDao refreshedEntity = transactionalSqlDao.execute(getCreateEntitySqlDaoTransactionWrapper(entity, context));
         // Populate the caches only after the transaction has been committed, in case of rollbacks
         transactionalSqlDao.populateCaches(refreshedEntity);
diff --git a/account/src/main/resources/org/killbill/billing/account/dao/AccountSqlDao.sql.stg b/account/src/main/resources/org/killbill/billing/account/dao/AccountSqlDao.sql.stg
index c46855d..ddc38f6 100644
--- a/account/src/main/resources/org/killbill/billing/account/dao/AccountSqlDao.sql.stg
+++ b/account/src/main/resources/org/killbill/billing/account/dao/AccountSqlDao.sql.stg
@@ -14,6 +14,7 @@ tableFields(prefix) ::= <<
 , <prefix>parent_account_id
 , <prefix>is_payment_delegated_to_parent
 , <prefix>payment_method_id
+, <prefix>reference_time
 , <prefix>time_zone
 , <prefix>locale
 , <prefix>address1
@@ -43,6 +44,7 @@ tableValues() ::= <<
 , :parentAccountId
 , :isPaymentDelegatedToParent
 , :paymentMethodId
+, :referenceTime
 , :timeZone
 , :locale
 , :address1
diff --git a/account/src/main/resources/org/killbill/billing/account/ddl.sql b/account/src/main/resources/org/killbill/billing/account/ddl.sql
index 5fa0931..55019dc 100644
--- a/account/src/main/resources/org/killbill/billing/account/ddl.sql
+++ b/account/src/main/resources/org/killbill/billing/account/ddl.sql
@@ -13,6 +13,7 @@ CREATE TABLE accounts (
     parent_account_id varchar(36) DEFAULT NULL,
     is_payment_delegated_to_parent boolean DEFAULT FALSE,
     payment_method_id varchar(36) DEFAULT NULL,
+    reference_time datetime NOT NULL,
     time_zone varchar(50) NOT NULL,
     locale varchar(5) DEFAULT NULL,
     address1 varchar(100) DEFAULT NULL,
@@ -41,6 +42,7 @@ CREATE INDEX accounts_email_tenant_record_id ON accounts(email, tenant_record_id
 CREATE INDEX accounts_company_name_tenant_record_id ON accounts(company_name, tenant_record_id);
 CREATE INDEX accounts_name_tenant_record_id ON accounts(name, tenant_record_id);
 
+
 DROP TABLE IF EXISTS account_history;
 CREATE TABLE account_history (
     record_id serial unique,
@@ -53,8 +55,9 @@ CREATE TABLE account_history (
     currency varchar(3) DEFAULT NULL,
     billing_cycle_day_local int DEFAULT NULL,
     parent_account_id varchar(36) DEFAULT NULL,
-    payment_method_id varchar(36) DEFAULT NULL,
     is_payment_delegated_to_parent boolean default false,
+    payment_method_id varchar(36) DEFAULT NULL,
+    reference_time datetime NOT NULL,
     time_zone varchar(50) NOT NULL,
     locale varchar(5) DEFAULT NULL,
     address1 varchar(100) DEFAULT NULL,
diff --git a/account/src/main/resources/org/killbill/billing/account/migration/V20181108184350__reference_time.sql b/account/src/main/resources/org/killbill/billing/account/migration/V20181108184350__reference_time.sql
new file mode 100644
index 0000000..7e3db7c
--- /dev/null
+++ b/account/src/main/resources/org/killbill/billing/account/migration/V20181108184350__reference_time.sql
@@ -0,0 +1,2 @@
+alter table accounts add column reference_time datetime NOT NULL after payment_method_id;
+alter table account_history add column reference_time datetime NOT NULL after payment_method_id;
diff --git a/account/src/test/java/org/killbill/billing/account/AccountTestUtils.java b/account/src/test/java/org/killbill/billing/account/AccountTestUtils.java
index 8b53264..793e8fb 100644
--- a/account/src/test/java/org/killbill/billing/account/AccountTestUtils.java
+++ b/account/src/test/java/org/killbill/billing/account/AccountTestUtils.java
@@ -19,6 +19,7 @@ package org.killbill.billing.account;
 import java.util.Locale;
 import java.util.UUID;
 
+import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
 import org.killbill.billing.account.api.AccountData;
 import org.killbill.billing.account.api.DefaultMutableAccountData;
@@ -65,31 +66,32 @@ public abstract class AccountTestUtils {
     }
 
     public static AccountModelDao createTestAccount() {
-        return createTestAccount(30, 31, UUID.randomUUID().toString().substring(0, 4));
+        return createTestAccount(31, UUID.randomUUID().toString().substring(0, 4));
     }
 
     public static AccountModelDao createTestAccount(final String phone) {
-        return createTestAccount(30, 31, phone);
+        return createTestAccount(31, phone);
     }
 
     public static AccountModelDao createTestAccount(final int billCycleDay) {
-        return createTestAccount(billCycleDay, billCycleDay, UUID.randomUUID().toString().substring(0, 4));
+        return createTestAccount(billCycleDay, UUID.randomUUID().toString().substring(0, 4));
     }
 
-    private static AccountModelDao createTestAccount(final int billCycleDayUTC, final int billCycleDayLocal, final String phone) {
-        final AccountData accountData = createAccountData(billCycleDayUTC, billCycleDayLocal, phone);
+    private static AccountModelDao createTestAccount(final int billCycleDayLocal, final String phone) {
+        final AccountData accountData = createAccountData(billCycleDayLocal, phone);
         return new AccountModelDao(UUID.randomUUID(), accountData);
     }
 
     public static MutableAccountData createAccountData() {
-        return createAccountData(30, 31, UUID.randomUUID().toString().substring(0, 4));
+        return createAccountData(31, UUID.randomUUID().toString().substring(0, 4));
     }
 
-    private static MutableAccountData createAccountData(final int billCycleDayUTC, final int billCycleDayLocal, final String phone) {
+    private static MutableAccountData createAccountData(final int billCycleDayLocal, final String phone) {
         final String externalKey = UUID.randomUUID().toString();
         final String email = UUID.randomUUID().toString().substring(0, 4) + '@' + UUID.randomUUID().toString().substring(0, 4);
         final String name = UUID.randomUUID().toString();
         final String locale = Locale.GERMANY.toString();
+        //final DateTime referenceTime = billCycleDayLocal
         final DateTimeZone timeZone = DateTimeZone.forID("America/Los_Angeles");
         final int firstNameLength = name.length();
         final Currency currency = Currency.MXN;
@@ -104,7 +106,7 @@ public abstract class AccountTestUtils {
         final String notes = UUID.randomUUID().toString();
 
         return new DefaultMutableAccountData(externalKey, email, name, firstNameLength, currency, null, false,
-                                             billCycleDayLocal, paymentMethodId, timeZone,
+                                             billCycleDayLocal, paymentMethodId, null, timeZone,
                                              locale, address1, address2, companyName, city, stateOrProvince,
                                              country, postalCode, phone, notes, false, true);
     }
diff --git a/account/src/test/java/org/killbill/billing/account/api/user/TestDefaultAccountUserApi.java b/account/src/test/java/org/killbill/billing/account/api/user/TestDefaultAccountUserApi.java
index f5d36ef..76627a0 100644
--- a/account/src/test/java/org/killbill/billing/account/api/user/TestDefaultAccountUserApi.java
+++ b/account/src/test/java/org/killbill/billing/account/api/user/TestDefaultAccountUserApi.java
@@ -138,7 +138,7 @@ public class TestDefaultAccountUserApi extends AccountTestSuiteWithEmbeddedDB {
 
         // Update the address and leave other fields null
         final MutableAccountData mutableAccountData = new DefaultMutableAccountData(null, null, null, 0, null, null, false, 0, null,
-                                                                                    null, null, null, null, null, null,
+                                                                                    clock.getUTCNow(), null, null, null, null, null, null,
                                                                                     null, null, null, null, null, false, false);
         final String newAddress1 = UUID.randomUUID().toString();
         mutableAccountData.setAddress1(newAddress1);
diff --git a/account/src/test/java/org/killbill/billing/account/api/user/TestDefaultAccountUserApiWithMocks.java b/account/src/test/java/org/killbill/billing/account/api/user/TestDefaultAccountUserApiWithMocks.java
index 44e370c..28e1ba0 100644
--- a/account/src/test/java/org/killbill/billing/account/api/user/TestDefaultAccountUserApiWithMocks.java
+++ b/account/src/test/java/org/killbill/billing/account/api/user/TestDefaultAccountUserApiWithMocks.java
@@ -20,6 +20,7 @@ package org.killbill.billing.account.api.user;
 
 import java.util.UUID;
 
+import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
 import org.killbill.billing.account.AccountTestSuiteNoDB;
 import org.killbill.billing.account.api.AccountData;
@@ -66,6 +67,7 @@ public class TestDefaultAccountUserApiWithMocks extends AccountTestSuiteNoDB {
         final Currency currency = Currency.BRL;
         final Integer billCycleDay = Integer.MAX_VALUE;
         final UUID paymentMethodId = UUID.randomUUID();
+        final DateTime referenceTime = clock.getUTCNow();
         final DateTimeZone timeZone = DateTimeZone.UTC;
         final String locale = UUID.randomUUID().toString();
         final String address1 = UUID.randomUUID().toString();
@@ -80,7 +82,7 @@ public class TestDefaultAccountUserApiWithMocks extends AccountTestSuiteNoDB {
         final Boolean isMigrated = true;
         final Boolean isNotifiedForInvoices = false;
         final AccountData data = new DefaultAccount(id, externalKey, email, name, firstNameLength, currency, null, false, billCycleDay,
-                                                    paymentMethodId, timeZone, locale, address1, address2, companyName,
+                                                    paymentMethodId, referenceTime, timeZone, locale, address1, address2, companyName,
                                                     city, stateOrProvince, country, postalCode, phone, notes, isMigrated, isNotifiedForInvoices);
 
         accountUserApi.createAccount(data, callContext);
diff --git a/account/src/test/java/org/killbill/billing/account/api/user/TestEventJson.java b/account/src/test/java/org/killbill/billing/account/api/user/TestEventJson.java
index c5176da..8e142cb 100644
--- a/account/src/test/java/org/killbill/billing/account/api/user/TestEventJson.java
+++ b/account/src/test/java/org/killbill/billing/account/api/user/TestEventJson.java
@@ -20,6 +20,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
 
+import org.joda.time.DateTime;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
@@ -51,7 +52,7 @@ public class TestEventJson extends AccountTestSuiteNoDB {
     @Test(groups = "fast", description="Test Account event serialization")
     public void testAccountCreationEvent() throws Exception {
         final DefaultAccountData data = new DefaultAccountData("dsfdsf", "bobo", 3, "bobo@yahoo.com", 12, "USD", null, false, UUID.randomUUID(),
-                                                               "UTC", "US", "21 avenue", "", "Gling", "San Franciso", "CA", "94110", "USA", "4126789887", "notes", false, false);
+                                                               new DateTime().toString(), "UTC", "US", "21 avenue", "", "Gling", "San Franciso", "CA", "94110", "USA", "4126789887", "notes", false, false);
         final DefaultAccountCreationEvent e = new DefaultAccountCreationEvent(data, UUID.randomUUID(), 1L, 2L, null);
         final String json = mapper.writeValueAsString(e);
 
diff --git a/account/src/test/java/org/killbill/billing/account/dao/TestAccountDao.java b/account/src/test/java/org/killbill/billing/account/dao/TestAccountDao.java
index 2bc7bd3..3db923f 100644
--- a/account/src/test/java/org/killbill/billing/account/dao/TestAccountDao.java
+++ b/account/src/test/java/org/killbill/billing/account/dao/TestAccountDao.java
@@ -65,7 +65,7 @@ public class TestAccountDao extends AccountTestSuiteWithEmbeddedDB {
         final String email = UUID.randomUUID().toString();
         final String name = UUID.randomUUID().toString();
         final AccountData accountData = new DefaultMutableAccountData(null, email, name, 0, null, null, false,
-                                                                      0, null, null, null, null,
+                                                                      0, null, clock.getUTCNow(), null, null, null,
                                                                       null, null, null, null, null,
                                                                       null, null, null, false, true);
         final AccountModelDao account = new AccountModelDao(UUID.randomUUID(), accountData);
diff --git a/api/src/main/java/org/killbill/billing/callcontext/TimeAwareContext.java b/api/src/main/java/org/killbill/billing/callcontext/TimeAwareContext.java
index 2d23d02..fd936d2 100644
--- a/api/src/main/java/org/killbill/billing/callcontext/TimeAwareContext.java
+++ b/api/src/main/java/org/killbill/billing/callcontext/TimeAwareContext.java
@@ -29,18 +29,18 @@ public class TimeAwareContext {
 
     private final DateTimeZone fixedOffsetTimeZone;
     private final DateTime referenceDateTime;
-    private final LocalTime referenceTime;
+    private final LocalTime referenceLocalTime;
 
     public TimeAwareContext(@Nullable final DateTimeZone fixedOffsetTimeZone, @Nullable final DateTime referenceDateTime) {
         this.fixedOffsetTimeZone = fixedOffsetTimeZone;
         this.referenceDateTime = referenceDateTime;
-        this.referenceTime = computeReferenceTime(referenceDateTime);
+        this.referenceLocalTime = computeReferenceTime(referenceDateTime);
     }
 
     public DateTime toUTCDateTime(final LocalDate localDate) {
         validateContext();
 
-        return ClockUtil.toUTCDateTime(localDate, getReferenceTime(), getFixedOffsetTimeZone());
+        return ClockUtil.toUTCDateTime(localDate, getReferenceLocalTime(), getFixedOffsetTimeZone());
     }
 
     public LocalDate toLocalDate(final DateTime dateTime) {
@@ -50,8 +50,8 @@ public class TimeAwareContext {
     }
 
     private void validateContext() {
-        if (getFixedOffsetTimeZone() == null || getReferenceTime() == null) {
-            throw new IllegalArgumentException(String.format("Context mis-configured: fixedOffsetTimeZone=%s, referenceTime=%s", getFixedOffsetTimeZone(), getReferenceTime()));
+        if (getFixedOffsetTimeZone() == null || getReferenceLocalTime() == null) {
+            throw new IllegalArgumentException(String.format("Context mis-configured: fixedOffsetTimeZone=%s, referenceLocalTime=%s", getFixedOffsetTimeZone(), getReferenceLocalTime()));
         }
     }
 
@@ -72,7 +72,7 @@ public class TimeAwareContext {
     }
 
     //@VisibleForTesting
-    public LocalTime getReferenceTime() {
-        return referenceTime;
+    public LocalTime getReferenceLocalTime() {
+        return referenceLocalTime;
     }
 }
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 f85f029..5c5b252 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
@@ -434,6 +434,7 @@ public class TestIntegrationBase extends BeatrixTestSuiteWithEmbeddedDB implemen
                 .isNotifiedForInvoices(false)
                 .externalKey(UUID.randomUUID().toString().substring(1, 8))
                 .currency(Currency.USD)
+                .referenceTime(clock.getUTCNow())
                 .timeZone(DateTimeZone.UTC);
         if (billingDay != null) {
             builder.billingCycleDayLocal(billingDay);
@@ -452,6 +453,7 @@ public class TestIntegrationBase extends BeatrixTestSuiteWithEmbeddedDB implemen
                                        .billingCycleDayLocal(billingDay)
                                        .currency(Currency.USD)
                                        .paymentMethodId(UUID.randomUUID())
+                                       .referenceTime(clock.getUTCNow())
                                        .timeZone(DateTimeZone.UTC)
                                        .parentAccountId(parentAccountId)
                                        .isPaymentDelegatedToParent(isPaymentDelegatedToParent)
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithTimeZones.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithTimeZones.java
index 94b47e6..50237ba 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithTimeZones.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/TestWithTimeZones.java
@@ -70,6 +70,7 @@ public class TestWithTimeZones extends TestIntegrationBase {
                                                                 .billingCycleDayLocal(1)
                                                                 .currency(Currency.USD)
                                                                 .paymentMethodId(UUID.randomUUID())
+                                                                .referenceTime(clock.getUTCNow())
                                                                 .timeZone(tz)
                                                                 .build();
         final Account account = createAccountWithNonOsgiPaymentMethod(accountData);
@@ -129,6 +130,7 @@ public class TestWithTimeZones extends TestIntegrationBase {
                                                                 .billingCycleDayLocal(1)
                                                                 .currency(Currency.USD)
                                                                 .paymentMethodId(UUID.randomUUID())
+                                                                .referenceTime(clock.getUTCNow())
                                                                 .timeZone(tz)
                                                                 .build();
         final Account account = createAccountWithNonOsgiPaymentMethod(accountData);
@@ -174,6 +176,7 @@ public class TestWithTimeZones extends TestIntegrationBase {
                                                                 .billingCycleDayLocal(1)
                                                                 .currency(Currency.USD)
                                                                 .paymentMethodId(UUID.randomUUID())
+                                                                .referenceTime(clock.getUTCNow())
                                                                 .timeZone(tz)
                                                                 .build();
         final Account account = createAccountWithNonOsgiPaymentMethod(accountData);
@@ -207,6 +210,7 @@ public class TestWithTimeZones extends TestIntegrationBase {
         clock.setTime(new DateTime(2015, 3, 7, 2, 0, 0, tz));
 
         final AccountData accountData = new MockAccountBuilder().currency(Currency.USD)
+                                                                .referenceTime(clock.getUTCNow())
                                                                 .timeZone(tz)
                                                                 .build();
         final Account account = createAccountWithNonOsgiPaymentMethod(accountData);
@@ -269,6 +273,7 @@ public class TestWithTimeZones extends TestIntegrationBase {
         clock.setTime(new DateTime(2017, 3, 1, 23, 30, 0, tz));
 
         final AccountData accountData = new MockAccountBuilder().currency(Currency.USD)
+                                                                .referenceTime(clock.getUTCNow())
                                                                 .timeZone(tz)
                                                                 .build();
 
@@ -306,6 +311,7 @@ public class TestWithTimeZones extends TestIntegrationBase {
         clock.setTime(new DateTime(2016, 11, 5, 23, 30, 0, tz));
 
         final AccountData accountData = new MockAccountBuilder().currency(Currency.USD)
+                                                                .referenceTime(clock.getUTCNow())
                                                                 .timeZone(tz)
                                                                 .build();
 
@@ -350,6 +356,7 @@ public class TestWithTimeZones extends TestIntegrationBase {
 
         final AccountData accountData = new MockAccountBuilder().currency(Currency.USD)
                                                                 .timeZone(tz)
+                                                                .referenceTime(clock.getUTCNow())
                                                                 .build();
 
         // Create account with non BCD to force junction BCD logic to activate
@@ -386,6 +393,7 @@ public class TestWithTimeZones extends TestIntegrationBase {
 
         final AccountData accountData = new MockAccountBuilder().currency(Currency.USD)
                                                                 .timeZone(tz)
+                                                                .referenceTime(clock.getUTCNow())
                                                                 .build();
 
         // Create account with non BCD to force junction BCD logic to activate
diff --git a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/usage/TestConsumableInArrear.java b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/usage/TestConsumableInArrear.java
index 52f5921..b67a99a 100644
--- a/beatrix/src/test/java/org/killbill/billing/beatrix/integration/usage/TestConsumableInArrear.java
+++ b/beatrix/src/test/java/org/killbill/billing/beatrix/integration/usage/TestConsumableInArrear.java
@@ -189,6 +189,7 @@ public class TestConsumableInArrear extends TestIntegrationBase {
                                                                 .billingCycleDayLocal(1)
                                                                 .currency(Currency.USD)
                                                                 .paymentMethodId(UUID.randomUUID())
+                                                                .referenceTime(clock.getUTCNow())
                                                                 .timeZone(tz)
                                                                 .build();
         final Account account = createAccountWithNonOsgiPaymentMethod(accountData);
diff --git a/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestEntitlementDateHelper.java b/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestEntitlementDateHelper.java
index 9e83793..d53c82d 100644
--- a/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestEntitlementDateHelper.java
+++ b/entitlement/src/test/java/org/killbill/billing/entitlement/api/TestEntitlementDateHelper.java
@@ -145,6 +145,7 @@ public class TestEntitlementDateHelper extends EntitlementTestSuiteNoDB {
     private void createAccount(final DateTimeZone dateTimeZone, final DateTime referenceDateTime) throws AccountApiException {
         final Account accountData = new MockAccountBuilder().externalKey(UUID.randomUUID().toString())
                                                             .timeZone(dateTimeZone)
+                                                            .referenceTime(referenceDateTime)
                                                             .createdDate(referenceDateTime)
                                                             .build();
 
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 120548c..27c7b67 100644
--- a/entitlement/src/test/java/org/killbill/billing/entitlement/EntitlementTestSuiteWithEmbeddedDB.java
+++ b/entitlement/src/test/java/org/killbill/billing/entitlement/EntitlementTestSuiteWithEmbeddedDB.java
@@ -260,6 +260,7 @@ public class EntitlementTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteWi
     }
 
     protected AccountData getAccountData(final int billingDay) {
+
         return new MockAccountBuilder().name(UUID.randomUUID().toString().substring(1, 8))
                                        .firstNameLength(6)
                                        .email(UUID.randomUUID().toString().substring(1, 8))
@@ -270,6 +271,7 @@ public class EntitlementTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteWi
                                        .billingCycleDayLocal(billingDay)
                                        .currency(Currency.USD)
                                        .paymentMethodId(UUID.randomUUID())
+                                       .referenceTime(clock.getUTCNow())
                                        .timeZone(DateTimeZone.UTC)
                                        .build();
     }
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/AccountJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/AccountJson.java
index fe81d21..d9b0043 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/AccountJson.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/AccountJson.java
@@ -54,6 +54,7 @@ public class AccountJson extends JsonBase {
     private final Boolean isPaymentDelegatedToParent;
     @ApiModelProperty(dataType = "java.util.UUID")
     private final String paymentMethodId;
+    private final DateTime referenceTime;
     private final String timeZone;
     private final String address1;
     private final String address2;
@@ -82,6 +83,7 @@ public class AccountJson extends JsonBase {
         this.parentAccountId = account.getParentAccountId() != null ? account.getParentAccountId().toString() : null;
         this.isPaymentDelegatedToParent = account.isPaymentDelegatedToParent();
         this.paymentMethodId = account.getPaymentMethodId() != null ? account.getPaymentMethodId().toString() : null;
+        this.referenceTime = account.getReferenceTime();
         this.timeZone = account.getTimeZone() != null ? account.getTimeZone().toString() : null;
         this.address1 = account.getAddress1();
         this.address2 = account.getAddress2();
@@ -108,6 +110,7 @@ public class AccountJson extends JsonBase {
                        @JsonProperty("parentAccountId") final String parentAccountId,
                        @JsonProperty("isPaymentDelegatedToParent") final Boolean isPaymentDelegatedToParent,
                        @JsonProperty("paymentMethodId") final String paymentMethodId,
+                       @JsonProperty("referenceTime") final DateTime referenceTime,
                        @JsonProperty("timeZone") final String timeZone,
                        @JsonProperty("address1") final String address1,
                        @JsonProperty("address2") final String address2,
@@ -136,6 +139,7 @@ public class AccountJson extends JsonBase {
         this.parentAccountId = parentAccountId;
         this.isPaymentDelegatedToParent = isPaymentDelegatedToParent;
         this.paymentMethodId = paymentMethodId;
+        this.referenceTime = referenceTime;
         this.timeZone = timeZone;
         this.address1 = address1;
         this.address2 = address2;
@@ -297,7 +301,7 @@ public class AccountJson extends JsonBase {
 
             @Override
             public DateTime getReferenceTime() {
-                return null;
+                return referenceTime;
             }
 
             @Override
@@ -371,6 +375,10 @@ public class AccountJson extends JsonBase {
         return paymentMethodId;
     }
 
+    public DateTime getReferenceTime() {
+        return referenceTime;
+    }
+
     public String getTimeZone() {
         return timeZone;
     }
@@ -440,6 +448,7 @@ public class AccountJson extends JsonBase {
                ", parentAccountId=" + parentAccountId + '\'' +
                ", isPaymentDelegatedToParent=" + isPaymentDelegatedToParent + '\'' +
                ", paymentMethodId='" + paymentMethodId + '\'' +
+               ", referenceTime='" + referenceTime + '\'' +
                ", timeZone='" + timeZone + '\'' +
                ", address1='" + address1 + '\'' +
                ", address2='" + address2 + '\'' +
@@ -539,10 +548,12 @@ public class AccountJson extends JsonBase {
         if (state != null ? !state.equals(that.state) : that.state != null) {
             return false;
         }
+        if (referenceTime != null ? referenceTime.compareTo(that.referenceTime) != 0 : that.referenceTime != null) {
+            return false;
+        }
         if (timeZone != null ? !timeZone.equals(that.timeZone) : that.timeZone != null) {
             return false;
         }
-
         return true;
     }
 
@@ -560,6 +571,7 @@ public class AccountJson extends JsonBase {
         result = 31 * result + (parentAccountId != null ? parentAccountId.hashCode() : 0);
         result = 31 * result + (isPaymentDelegatedToParent != null ? isPaymentDelegatedToParent.hashCode() : 0);
         result = 31 * result + (paymentMethodId != null ? paymentMethodId.hashCode() : 0);
+        result = 31 * result + (referenceTime != null ? referenceTime.hashCode() : 0);
         result = 31 * result + (timeZone != null ? timeZone.hashCode() : 0);
         result = 31 * result + (address1 != null ? address1.hashCode() : 0);
         result = 31 * result + (address2 != null ? address2.hashCode() : 0);
diff --git a/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestAccountJson.java b/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestAccountJson.java
index b601e7c..08b1186 100644
--- a/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestAccountJson.java
+++ b/jaxrs/src/test/java/org/killbill/billing/jaxrs/json/TestAccountJson.java
@@ -18,6 +18,7 @@ package org.killbill.billing.jaxrs.json;
 
 import java.util.UUID;
 
+import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
 import org.testng.Assert;
 import org.testng.annotations.Test;
@@ -39,6 +40,7 @@ public class TestAccountJson extends JaxrsTestSuiteNoDB {
         final Integer billCycleDayLocal = 6;
         final String currency = UUID.randomUUID().toString();
         final String paymentMethodId = UUID.randomUUID().toString();
+        final DateTime referenceTime = new DateTime();
         final String timeZone = UUID.randomUUID().toString();
         final String address1 = UUID.randomUUID().toString();
         final String address2 = UUID.randomUUID().toString();
@@ -56,7 +58,7 @@ public class TestAccountJson extends JaxrsTestSuiteNoDB {
 
         final AccountJson accountJson = new AccountJson(accountId, name, length, externalKey,
                                                         email, billCycleDayLocal, currency, parentAccountId, true, paymentMethodId,
-                                                        timeZone, address1, address2, postalCode, company, city, state,
+                                                        referenceTime, timeZone, address1, address2, postalCode, company, city, state,
                                                         country, locale, phone, notes, isMigrated, isNotifiedForInvoice, null, null, null);
         Assert.assertEquals(accountJson.getAccountId(), accountId);
         Assert.assertEquals(accountJson.getName(), name);
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 772235b..5114550 100644
--- a/payment/src/test/java/org/killbill/billing/payment/TestPaymentHelper.java
+++ b/payment/src/test/java/org/killbill/billing/payment/TestPaymentHelper.java
@@ -146,6 +146,7 @@ public class TestPaymentHelper {
         Mockito.when(accountData.isNotifiedForInvoices()).thenReturn(false);
         Mockito.when(accountData.getTimeZone()).thenReturn(DateTimeZone.UTC);
         Mockito.when(accountData.getCreatedDate()).thenReturn(clock.getUTCNow());
+        Mockito.when(accountData.getReferenceTime()).thenReturn(clock.getUTCNow());
 
         Account account;
         if (isFastTest()) {

pom.xml 2(+1 -1)

diff --git a/pom.xml b/pom.xml
index d9d9940..377eca0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -21,7 +21,7 @@
     <parent>
         <artifactId>killbill-oss-parent</artifactId>
         <groupId>org.kill-bill.billing</groupId>
-        <version>0.141.7</version>
+        <version>0.141.8-SNAPSHOT</version>
     </parent>
     <artifactId>killbill</artifactId>
     <version>0.19.0-SNAPSHOT</version>
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 319573b..cd4b396 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
@@ -246,7 +246,7 @@ public abstract class KillbillClient extends GuicyKillbillTestSuiteWithEmbeddedD
         final boolean isPaymentDelegatedToParent = parentAccountId != null;
 
         // Note: the accountId payload is ignored on account creation
-        return new Account(accountId, name, length, externalKey, email, null, currency, parentAccountId, isPaymentDelegatedToParent, null, timeZone,
+        return new Account(accountId, name, length, externalKey, email, null, currency, parentAccountId, isPaymentDelegatedToParent, null, null, timeZone,
                            address1, address2, postalCode, company, city, state, country, locale, phone, notes, false, false, null, null);
     }
 
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccount.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccount.java
index 83f655b..b315d8d 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccount.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestAccount.java
@@ -116,10 +116,13 @@ public class TestAccount extends TestJaxrsBase {
         // Update Account
         final Account newInput = new Account(input.getAccountId(),
                                              "zozo", 4, input.getExternalKey(), "rr@google.com", 18,
-                                             "USD", null, false, null, "UTC",
+                                             "USD", null, false, null, null, "UTC",
                                              "bl1", "bh2", "", "", "ca", "San Francisco", "usa", "en", "415-255-2991",
                                              "notes", false, false, null, null);
+
         final Account updatedAccount = killBillClient.updateAccount(newInput, requestOptions);
+        // referenceTime is set automatically by system, no way to guess it
+        newInput.setReferenceTime(updatedAccount.getReferenceTime());
         Assert.assertTrue(updatedAccount.equals(newInput));
 
         // Try search endpoint
@@ -163,6 +166,7 @@ public class TestAccount extends TestJaxrsBase {
                                              null,
                                              null,
                                              null,
+                                             null,
                                              "notes2",
                                              null,
                                              null,
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/api/transfer/TestTransfer.java b/subscription/src/test/java/org/killbill/billing/subscription/api/transfer/TestTransfer.java
index ea1b9fa..75333b7 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/api/transfer/TestTransfer.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/api/transfer/TestTransfer.java
@@ -60,12 +60,12 @@ public class TestTransfer extends SubscriptionTestSuiteWithEmbeddedDB {
         // Note: this will cleanup all tables
         super.beforeMethod();
 
-        final AccountData accountData2 = subscriptionTestInitializer.initAccountData();
+        final AccountData accountData2 = subscriptionTestInitializer.initAccountData(clock);
         final Account account2 = createAccount(accountData2);
         finalNewAccountId = account2.getId();
 
         // internal context will be configured for accountId
-        final AccountData accountData = subscriptionTestInitializer.initAccountData();
+        final AccountData accountData = subscriptionTestInitializer.initAccountData(clock);
         final Account account = createAccount(accountData);
         newAccountId = account.getId();
     }
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/DefaultSubscriptionTestInitializer.java b/subscription/src/test/java/org/killbill/billing/subscription/DefaultSubscriptionTestInitializer.java
index 003c00f..744a07c 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/DefaultSubscriptionTestInitializer.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/DefaultSubscriptionTestInitializer.java
@@ -37,6 +37,7 @@ import org.killbill.billing.subscription.api.SubscriptionBaseService;
 import org.killbill.billing.subscription.api.user.SubscriptionBaseBundle;
 import org.killbill.billing.subscription.engine.core.DefaultSubscriptionBaseService;
 import org.killbill.billing.util.UUIDs;
+import org.killbill.clock.Clock;
 import org.killbill.clock.ClockMock;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -60,7 +61,7 @@ public class DefaultSubscriptionTestInitializer implements SubscriptionTestIniti
         return catalog;
     }
 
-    public AccountData initAccountData() {
+    public AccountData initAccountData(final Clock clock) {
         final AccountData accountData = new MockAccountBuilder().name(UUIDs.randomUUID().toString().substring(1, 8))
                                                                 .firstNameLength(6)
                                                                 .email(UUIDs.randomUUID().toString().substring(1, 8))
@@ -71,6 +72,7 @@ public class DefaultSubscriptionTestInitializer implements SubscriptionTestIniti
                                                                 .billingCycleDayLocal(1)
                                                                 .currency(Currency.USD)
                                                                 .paymentMethodId(UUIDs.randomUUID())
+                                                                .referenceTime(clock.getUTCNow())
                                                                 .timeZone(DateTimeZone.forID("Europe/Paris"))
                                                                 .build();
 
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/engine/dao/TestSubscriptionDao.java b/subscription/src/test/java/org/killbill/billing/subscription/engine/dao/TestSubscriptionDao.java
index 0455390..99b6544 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/engine/dao/TestSubscriptionDao.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/engine/dao/TestSubscriptionDao.java
@@ -57,7 +57,7 @@ public class TestSubscriptionDao extends SubscriptionTestSuiteWithEmbeddedDB {
         super.beforeMethod();
 
         // internal context will be configured for accountId
-        final AccountData accountData = subscriptionTestInitializer.initAccountData();
+        final AccountData accountData = subscriptionTestInitializer.initAccountData(clock);
         final Account account = createAccount(accountData);
         accountId = account.getId();
     }
diff --git a/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestInitializer.java b/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestInitializer.java
index ca1baec..a00a661 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestInitializer.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestInitializer.java
@@ -30,13 +30,14 @@ import org.killbill.billing.lifecycle.api.BusService;
 import org.killbill.billing.subscription.api.SubscriptionBaseInternalApi;
 import org.killbill.billing.subscription.api.SubscriptionBaseService;
 import org.killbill.billing.subscription.api.user.SubscriptionBaseBundle;
+import org.killbill.clock.Clock;
 import org.killbill.clock.ClockMock;
 
 public interface SubscriptionTestInitializer {
 
     public Catalog initCatalog(final CatalogService catalogService, final InternalTenantContext context) throws Exception;
 
-    public AccountData initAccountData();
+    public AccountData initAccountData(Clock clock);
 
     public SubscriptionBaseBundle initBundle(final UUID accountId, final SubscriptionBaseInternalApi subscriptionApi, final InternalCallContext callContext) throws Exception;
 
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 0961ea1..b531dfe 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteNoDB.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteNoDB.java
@@ -138,7 +138,7 @@ public class SubscriptionTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
         subscriptionTestInitializer.startTestFramework(testListener, clock, busService, subscriptionBaseService);
 
         this.catalog = subscriptionTestInitializer.initCatalog(catalogService, internalCallContext);
-        this.accountData = subscriptionTestInitializer.initAccountData();
+        this.accountData = subscriptionTestInitializer.initAccountData(clock);
         final UUID accountId = UUIDs.randomUUID();
         mockNonEntityDao.addTenantRecordIdMapping(accountId, internalCallContext);
 
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 02ce1be..fa1c027 100644
--- a/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteWithEmbeddedDB.java
+++ b/subscription/src/test/java/org/killbill/billing/subscription/SubscriptionTestSuiteWithEmbeddedDB.java
@@ -112,7 +112,7 @@ public class SubscriptionTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteW
         subscriptionTestInitializer.startTestFramework(testListener, clock, busService, subscriptionBaseService);
 
         this.catalog = subscriptionTestInitializer.initCatalog(catalogService, internalCallContext);
-        this.accountData = subscriptionTestInitializer.initAccountData();
+        this.accountData = subscriptionTestInitializer.initAccountData(clock);
         final Account account = createAccount(accountData);
         this.bundle = subscriptionTestInitializer.initBundle(account.getId(), subscriptionInternalApi, internalCallContext);
     }
diff --git a/util/src/main/java/org/killbill/billing/util/account/AccountDateTimeUtils.java b/util/src/main/java/org/killbill/billing/util/account/AccountDateTimeUtils.java
index 58f9157..1a0f1a5 100644
--- a/util/src/main/java/org/killbill/billing/util/account/AccountDateTimeUtils.java
+++ b/util/src/main/java/org/killbill/billing/util/account/AccountDateTimeUtils.java
@@ -26,16 +26,14 @@ import org.killbill.billing.util.entity.dao.TimeZoneAwareEntity;
 public abstract class AccountDateTimeUtils {
 
     public static DateTimeZone getFixedOffsetTimeZone(final TimeZoneAwareEntity account) {
-        return getFixedOffsetTimeZone(account.getTimeZone(), account);
+        return getFixedOffsetTimeZone(account.getTimeZone(), account.getReferenceTime());
     }
 
     public static DateTimeZone getFixedOffsetTimeZone(final Account account) {
-        return getFixedOffsetTimeZone(account.getTimeZone(), account);
+        return getFixedOffsetTimeZone(account.getTimeZone(), account.getReferenceTime());
     }
 
-    public static DateTimeZone getFixedOffsetTimeZone(final DateTimeZone referenceDateTimeZone, final Entity account) {
-        final DateTime referenceDateTime = getReferenceDateTime(account);
-
+    private static DateTimeZone getFixedOffsetTimeZone(final DateTimeZone referenceDateTimeZone, final DateTime referenceDateTime) {
         // Check if DST was in effect at the reference date time
         final boolean shouldUseDST = !referenceDateTimeZone.isStandardOffset(referenceDateTime.getMillis());
         if (shouldUseDST) {
@@ -44,8 +42,4 @@ public abstract class AccountDateTimeUtils {
             return DateTimeZone.forOffsetMillis(referenceDateTimeZone.getStandardOffset(referenceDateTime.getMillis()));
         }
     }
-
-    public static DateTime getReferenceDateTime(final Entity account) {
-        return account.getCreatedDate();
-    }
 }
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 947eae9..9a8abae 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
@@ -262,7 +262,7 @@ public class InternalCallContextFactory {
     public InternalCallContext createInternalCallContext(final TimeZoneAwareEntity accountModelDao, final Long accountRecordId, final InternalCallContext context) {
         // See DefaultImmutableAccountData implementation
         final DateTimeZone fixedOffsetTimeZone = AccountDateTimeUtils.getFixedOffsetTimeZone(accountModelDao);
-        final DateTime referenceTime = AccountDateTimeUtils.getReferenceDateTime(accountModelDao);
+        final DateTime referenceTime = accountModelDao.getReferenceTime();
         populateMDCContext(accountRecordId, context.getTenantRecordId());
         return new InternalCallContext(context, accountRecordId, fixedOffsetTimeZone, referenceTime, clock.getUTCNow());
     }
diff --git a/util/src/main/java/org/killbill/billing/util/entity/dao/TimeZoneAwareEntity.java b/util/src/main/java/org/killbill/billing/util/entity/dao/TimeZoneAwareEntity.java
index feff107..6e0813b 100644
--- a/util/src/main/java/org/killbill/billing/util/entity/dao/TimeZoneAwareEntity.java
+++ b/util/src/main/java/org/killbill/billing/util/entity/dao/TimeZoneAwareEntity.java
@@ -17,10 +17,13 @@
 
 package org.killbill.billing.util.entity.dao;
 
+import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
 import org.killbill.billing.util.entity.Entity;
 
 public interface TimeZoneAwareEntity extends Entity {
 
+    public DateTime getReferenceTime();
+
     public DateTimeZone getTimeZone();
 }
diff --git a/util/src/test/java/org/killbill/billing/callcontext/MutableInternalCallContext.java b/util/src/test/java/org/killbill/billing/callcontext/MutableInternalCallContext.java
index 2066bcf..12c5ac7 100644
--- a/util/src/test/java/org/killbill/billing/callcontext/MutableInternalCallContext.java
+++ b/util/src/test/java/org/killbill/billing/callcontext/MutableInternalCallContext.java
@@ -59,7 +59,7 @@ public class MutableInternalCallContext extends InternalCallContext {
         this.initialAccountRecordId = accountRecordId;
         this.initialTenantRecordId = tenantRecordId;
         this.initialReferenceDateTimeZone = fixedOffsetTimeZone;
-        this.initialReferenceTime = super.getReferenceTime();
+        this.initialReferenceTime = super.getReferenceLocalTime();
         this.initialCreatedDate = createdDate;
         this.initialUpdatedDate = updatedDate;
 
@@ -94,7 +94,7 @@ public class MutableInternalCallContext extends InternalCallContext {
     }
 
     @Override
-    public LocalTime getReferenceTime() {
+    public LocalTime getReferenceLocalTime() {
         return referenceTime;
     }
 
diff --git a/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuite.java b/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuite.java
index 79008a6..3196aef 100644
--- a/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuite.java
+++ b/util/src/test/java/org/killbill/billing/GuicyKillbillTestSuite.java
@@ -116,7 +116,7 @@ public class GuicyKillbillTestSuite implements IHookable {
         final InternalTenantContext tmp = internalCallContextFactory.createInternalTenantContext(accountId, callContext);
         internalCallContext.setAccountRecordId(tmp.getAccountRecordId());
         internalCallContext.setFixedOffsetTimeZone(tmp.getFixedOffsetTimeZone());
-        internalCallContext.setReferenceTime(tmp.getReferenceTime());
+        internalCallContext.setReferenceTime(tmp.getReferenceLocalTime());
         internalCallContext.setCreatedDate(clock.getUTCNow());
         internalCallContext.setUpdatedDate(clock.getUTCNow());
     }
diff --git a/util/src/test/java/org/killbill/billing/mock/MockAccountBuilder.java b/util/src/test/java/org/killbill/billing/mock/MockAccountBuilder.java
index 36975d9..3d125dc 100644
--- a/util/src/test/java/org/killbill/billing/mock/MockAccountBuilder.java
+++ b/util/src/test/java/org/killbill/billing/mock/MockAccountBuilder.java
@@ -38,6 +38,7 @@ public class MockAccountBuilder {
     private boolean isPaymentDelegatedToParent = false;
     private int billingCycleDayLocal;
     private UUID paymentMethodId;
+    private DateTime referenceTime = new DateTime(DateTimeZone.UTC);
     private DateTimeZone timeZone = DateTimeZone.UTC;
     private String locale = "";
     private String address1 = "";
@@ -84,6 +85,7 @@ public class MockAccountBuilder {
         this.notes(data.getNotes());
         this.postalCode(data.getPostalCode());
         this.stateOrProvince(data.getStateOrProvince());
+        this.referenceTime(data.getReferenceTime());
         this.timeZone(data.getTimeZone());
         if (data instanceof Account) {
             this.id = ((Account) data).getId();
@@ -139,6 +141,11 @@ public class MockAccountBuilder {
         return this;
     }
 
+    public MockAccountBuilder referenceTime(final DateTime referenceTime) {
+        this.referenceTime = referenceTime;
+        return this;
+    }
+
     public MockAccountBuilder timeZone(final DateTimeZone timeZone) {
         this.timeZone = timeZone;
         return this;
@@ -273,7 +280,7 @@ public class MockAccountBuilder {
 
             @Override
             public DateTime getReferenceTime() {
-                return AccountDateTimeUtils.getReferenceDateTime(this);
+                return referenceTime;
             }
 
             @Override
diff --git a/util/src/test/java/org/killbill/billing/util/callcontext/TestTimeAwareContext.java b/util/src/test/java/org/killbill/billing/util/callcontext/TestTimeAwareContext.java
index 49ecb00..51173e3 100644
--- a/util/src/test/java/org/killbill/billing/util/callcontext/TestTimeAwareContext.java
+++ b/util/src/test/java/org/killbill/billing/util/callcontext/TestTimeAwareContext.java
@@ -190,8 +190,9 @@ public class TestTimeAwareContext extends UtilTestSuiteNoDB {
     private void refreshCallContext(final DateTime effectiveDateTime, final DateTimeZone timeZone) {
         final Account account = new MockAccountBuilder().timeZone(timeZone)
                                                         .createdDate(effectiveDateTime)
+                                                        .referenceTime(effectiveDateTime)
                                                         .build();
         internalCallContext.setFixedOffsetTimeZone(AccountDateTimeUtils.getFixedOffsetTimeZone(account));
-        internalCallContext.setReferenceTime(AccountDateTimeUtils.getReferenceDateTime(account));
+        internalCallContext.setReferenceTime(account.getReferenceTime());
     }
 }