killbill-aplcache

Changes

api/src/main/java/com/ning/billing/subscription/api/user/SubscriptionSourceType.java 23(+0 -23)

Details

diff --git a/api/src/main/java/com/ning/billing/subscription/api/SubscriptionBase.java b/api/src/main/java/com/ning/billing/subscription/api/SubscriptionBase.java
index 6595dd6..c1964c4 100644
--- a/api/src/main/java/com/ning/billing/subscription/api/SubscriptionBase.java
+++ b/api/src/main/java/com/ning/billing/subscription/api/SubscriptionBase.java
@@ -11,11 +11,13 @@ import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
 import com.ning.billing.catalog.api.PlanPhaseSpecifier;
 import com.ning.billing.catalog.api.PriceList;
+import com.ning.billing.catalog.api.Product;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.entitlement.api.Blockable;
+import com.ning.billing.entitlement.api.Entitlement.EntitlementSourceType;
+import com.ning.billing.entitlement.api.Entitlement.EntitlementState;
 import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
 import com.ning.billing.subscription.api.user.SubscriptionBaseTransition;
-import com.ning.billing.subscription.api.user.SubscriptionSourceType;
 import com.ning.billing.subscription.api.user.SubscriptionState;
 import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.entity.Entity;
@@ -44,9 +46,9 @@ public interface SubscriptionBase extends Entity, Blockable {
 
     public UUID getBundleId();
 
-    public SubscriptionState getState();
+    public EntitlementState getState();
 
-    public SubscriptionSourceType getSourceType();
+    public EntitlementSourceType getSourceType();
 
     public DateTime getStartDate();
 
@@ -62,13 +64,13 @@ public interface SubscriptionBase extends Entity, Blockable {
 
     public PlanPhase getCurrentPhase();
 
-    public String getLastActiveProductName();
+    public Product getLastActiveProduct();
 
-    public String getLastActivePriceListName();
+    public PriceList getLastActivePriceList();
 
-    public String getLastActiveCategoryName();
+    public ProductCategory getLastActiveCategory();
 
-    public String getLastActiveBillingPeriod();
+    public BillingPeriod getLastActiveBillingPeriod();
 
     public DateTime getChargedThroughDate();
 
diff --git a/api/src/main/java/com/ning/billing/subscription/api/user/SubscriptionBaseTransition.java b/api/src/main/java/com/ning/billing/subscription/api/user/SubscriptionBaseTransition.java
index fa1c75e..01acb68 100644
--- a/api/src/main/java/com/ning/billing/subscription/api/user/SubscriptionBaseTransition.java
+++ b/api/src/main/java/com/ning/billing/subscription/api/user/SubscriptionBaseTransition.java
@@ -23,6 +23,7 @@ import org.joda.time.DateTime;
 import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
 import com.ning.billing.catalog.api.PriceList;
+import com.ning.billing.entitlement.api.Entitlement.EntitlementState;
 import com.ning.billing.subscription.api.SubscriptionBaseTransitionType;
 
 public interface SubscriptionBaseTransition {
@@ -31,9 +32,9 @@ public interface SubscriptionBaseTransition {
 
     public UUID getBundleId();
 
-    public SubscriptionState getPreviousState();
+    public EntitlementState getPreviousState();
 
-    public SubscriptionState getNextState();
+    public EntitlementState getNextState();
 
     public UUID getPreviousEventId();
 
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueWithSubscriptionCancellation.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueWithSubscriptionCancellation.java
index 0a26258..e82a158 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueWithSubscriptionCancellation.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/overdue/TestOverdueWithSubscriptionCancellation.java
@@ -26,6 +26,7 @@ import com.ning.billing.api.TestApiListener.NextEvent;
 import com.ning.billing.beatrix.util.InvoiceChecker.ExpectedInvoiceItemCheck;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.entitlement.api.DefaultEntitlement;
+import com.ning.billing.entitlement.api.Entitlement.EntitlementState;
 import com.ning.billing.invoice.api.InvoiceItemType;
 import com.ning.billing.subscription.api.SubscriptionBase;
 import com.ning.billing.subscription.api.user.SubscriptionState;
@@ -87,6 +88,6 @@ public class TestOverdueWithSubscriptionCancellation extends TestOverdueBase {
         checkODState("OD1");
 
         final SubscriptionBase cancelledBaseSubscription = ((DefaultEntitlement) entitlementApi.getEntitlementForId(baseEntitlement.getId(), callContext)).getSubscriptionBase();
-        assertTrue(cancelledBaseSubscription.getState() == SubscriptionState.CANCELLED);
+        assertTrue(cancelledBaseSubscription.getState() == EntitlementState.CANCELLED);
     }
 }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultEntitlement.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultEntitlement.java
index 289fc5b..76a3615 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultEntitlement.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultEntitlement.java
@@ -19,6 +19,7 @@ package com.ning.billing.entitlement.api;
 import java.util.UUID;
 
 import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
 import org.joda.time.LocalDate;
 
 import com.ning.billing.account.api.Account;
@@ -47,195 +48,208 @@ public class DefaultEntitlement extends EntityBase implements Entitlement {
     private final SubscriptionBase subscriptionBase;
     private final InternalCallContextFactory internalCallContextFactory;
     private final Clock clock;
+    private final boolean isBlocked;
+    private final BlockingState entitlementBlockingState;
     private final BlockingChecker checker;
     private final UUID accountId;
     private final String externalKey;
+    private final DateTimeZone accountTimeZone;
 
-    public DefaultEntitlement(final AccountInternalApi accountApi, final SubscriptionBase subscriptionBase, final UUID accountId, final String externalKey, final InternalCallContextFactory internalCallContextFactory, final Clock clock, final BlockingChecker checker) {
+    public DefaultEntitlement(final AccountInternalApi accountApi, final SubscriptionBase subscriptionBase, final UUID accountId,
+                              final String externalKey, final boolean isBlocked, final BlockingState entitlementBlockingState, final DateTimeZone accountTimeZone,
+                              final InternalCallContextFactory internalCallContextFactory,
+                              final Clock clock, final BlockingChecker checker) {
         super(subscriptionBase.getId(), subscriptionBase.getCreatedDate(), subscriptionBase.getUpdatedDate());
         this.accountApi = accountApi;
         this.subscriptionBase = subscriptionBase;
         this.accountId = accountId;
         this.externalKey = externalKey;
+        this.isBlocked = isBlocked;
+        this.entitlementBlockingState = entitlementBlockingState;
+        this.accountTimeZone = accountTimeZone;
         this.internalCallContextFactory = internalCallContextFactory;
         this.clock = clock;
         this.checker = checker;
     }
 
-
-    @Override
-    public boolean cancelEntitlementWithDate(final LocalDate localDate, final CallContext callContext) throws EntitlementApiException {
-
-        final InternalCallContext context = internalCallContextFactory.createInternalCallContext(accountId, callContext);
-        final DateTime requestedDate = fromLocalDateAndReferenceTime(localDate, subscriptionBase.getStartDate(), clock, context);
-        try {
-            return subscriptionBase.cancel(requestedDate, callContext);
-        } catch (SubscriptionBaseApiException e) {
-            throw new EntitlementApiException(e);
-        }
+    // STEPH_ENT should be remove but beatrix tests need to be changed
+    public SubscriptionBase getSubscriptionBase() {
+        return subscriptionBase;
     }
 
-
     @Override
-    public boolean cancelEntitlementWithPolicy(final EntitlementActionPolicy entitlementBillingActionPolicy, final CallContext callContext) throws EntitlementApiException {
-        return false;
+    public UUID getBaseEntitlementId() {
+        return subscriptionBase.getId();
     }
 
     @Override
-    public boolean cancelEntitlementWithDateOverrideBillingPolicy(final LocalDate effectiveDate, final BillingActionPolicy billingPolicy, final CallContext context) throws EntitlementApiException {
-        return false;  //To change body of implemented methods use File | Settings | File Templates.
+    public UUID getBundleId() {
+        return subscriptionBase.getBundleId();
     }
 
     @Override
-    public boolean cancelEntitlementWithPolicyOverrideBillingPolicy(final EntitlementActionPolicy policy, final BillingActionPolicy billingPolicy, final CallContext context) throws EntitlementApiException {
-        return false;  //To change body of implemented methods use File | Settings | File Templates.
+    public UUID getAccountId() {
+        return accountId;
     }
 
     @Override
-    public void uncancel(final CallContext context) throws EntitlementApiException {
-        //To change body of implemented methods use File | Settings | File Templates.
+    public String getExternalKey() {
+        return externalKey;
     }
 
-
     @Override
-    public boolean changePlan(final String productName, final BillingPeriod billingPeriod, final String priceList, final LocalDate localDate, final CallContext callContext) throws EntitlementApiException {
-
-        final InternalCallContext context = internalCallContextFactory.createInternalCallContext(accountId, callContext);
-        final DateTime requestedDate = fromLocalDateAndReferenceTime(localDate, subscriptionBase.getStartDate(), clock, context);
-        try {
-            checker.checkBlockedChange(subscriptionBase, context);
-            return subscriptionBase.changePlan(productName, billingPeriod, priceList, requestedDate, callContext);
-        } catch (BlockingApiException e) {
-            throw new EntitlementApiException(e, e.getCode(), e.getMessage());
-        } catch (SubscriptionBaseApiException e) {
-            throw new EntitlementApiException(e);
-        }
+    public EntitlementState getState() {
+        return isBlocked ? EntitlementState.BLOCKED : subscriptionBase.getState();
     }
 
     @Override
-    public boolean changePlanOverrideBillingPolicy(final String productName, final BillingPeriod billingPeriod, final String priceList, final LocalDate localDate, final BillingActionPolicy actionPolicy, final CallContext callContext) throws EntitlementApiException {
-        final InternalCallContext context = internalCallContextFactory.createInternalCallContext(accountId, callContext);
-        final DateTime requestedDate = fromLocalDateAndReferenceTime(localDate, subscriptionBase.getStartDate(), clock, context);
-        try {
-            checker.checkBlockedChange(subscriptionBase, context);
-            return subscriptionBase.changePlanWithPolicy(productName, billingPeriod, priceList, requestedDate, actionPolicy, callContext);
-        } catch (BlockingApiException e) {
-            throw new EntitlementApiException(e, e.getCode(), e.getMessage());
-        } catch (SubscriptionBaseApiException e) {
-            throw new EntitlementApiException(e);
-        }
+    public EntitlementSourceType getSourceType() {
+        return subscriptionBase.getSourceType();
     }
 
     @Override
-    public boolean block(final String serviceName, final LocalDate effectiveDate, final CallContext context) throws EntitlementApiException {
-
-
-
-        return false;  //To change body of implemented methods use File | Settings | File Templates.
+    public LocalDate getEffectiveStartDate() {
+        return new LocalDate(subscriptionBase.getStartDate(), accountTimeZone);
     }
 
     @Override
-    public boolean unblock(final String serviceName, final LocalDate effectiveDate, final CallContext context) throws EntitlementApiException {
-        return false;  //To change body of implemented methods use File | Settings | File Templates.
+    public LocalDate getEffectiveEndDate() {
+        if (entitlementBlockingState != null && entitlementBlockingState.getStateName().equals(DefaultEntitlementApi.ENT_STATE_CANCELLED)) {
+            return new LocalDate(entitlementBlockingState.getCreatedDate(), accountTimeZone);
+        }
+        return new LocalDate(subscriptionBase.getEndDate(), accountTimeZone);
     }
 
-
     @Override
-    public UUID getBaseEntitlementId() {
-        return subscriptionBase.getId();
+    public LocalDate getRequestedEndDate() {
+        // STEPH_ENT
+        return null; //subscriptionBase.;
     }
 
     @Override
-    public UUID getBundleId() {
-        return subscriptionBase.getBundleId();
+    public Product getProduct() {
+        return subscriptionBase.getCurrentPlan().getProduct();
     }
 
     @Override
-    public UUID getAccountId() {
-        return accountId;
+    public Plan getPlan() {
+        return subscriptionBase.getCurrentPlan();
     }
 
-    // STEPH_ENT should be remove but beatrix tests need to be changed
-    public SubscriptionBase getSubscriptionBase() {
-        return subscriptionBase;
+    @Override
+    public PriceList getPriceList() {
+        return subscriptionBase.getCurrentPriceList();
     }
 
     @Override
-    public String getExternalKey() {
-        return externalKey;
+    public PlanPhase getCurrentPhase() {
+        return subscriptionBase.getCurrentPhase();
     }
 
     @Override
-    public EntitlementState getState() {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    public ProductCategory getProductCategory() {
+        return subscriptionBase.getCategory();
     }
 
     @Override
-    public EntitlementSourceType getSourceType() {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    public Product getLastActiveProduct() {
+        return subscriptionBase.getLastActiveProduct();
     }
 
     @Override
-    public LocalDate getEffectiveStartDate() {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    public Plan getLastActivePlan() {
+        return subscriptionBase.getLastActivePlan();
     }
 
     @Override
-    public LocalDate getEffectiveEndDate() {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    public PriceList getLastActivePriceList() {
+        return subscriptionBase.getLastActivePriceList();
     }
 
     @Override
-    public LocalDate getRequestedEndDate() {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    public ProductCategory getLastActiveProductCategory() {
+        return subscriptionBase.getLastActiveCategory();
     }
 
+
     @Override
-    public Product getProduct() {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    public boolean cancelEntitlementWithDate(final LocalDate localDate, final CallContext callContext) throws EntitlementApiException {
+
+        final InternalCallContext context = internalCallContextFactory.createInternalCallContext(accountId, callContext);
+        final DateTime requestedDate = fromLocalDateAndReferenceTime(localDate, subscriptionBase.getStartDate(), clock, context);
+        try {
+            return subscriptionBase.cancel(requestedDate, callContext);
+        } catch (SubscriptionBaseApiException e) {
+            throw new EntitlementApiException(e);
+        }
     }
 
+
     @Override
-    public Plan getPlan() {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    public boolean cancelEntitlementWithPolicy(final EntitlementActionPolicy entitlementBillingActionPolicy, final CallContext callContext) throws EntitlementApiException {
+        return false;
     }
 
     @Override
-    public PriceList getPriceList() {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    public boolean cancelEntitlementWithDateOverrideBillingPolicy(final LocalDate effectiveDate, final BillingActionPolicy billingPolicy, final CallContext context) throws EntitlementApiException {
+        return false;  //To change body of implemented methods use File | Settings | File Templates.
     }
 
     @Override
-    public PlanPhase getCurrentPhase() {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    public boolean cancelEntitlementWithPolicyOverrideBillingPolicy(final EntitlementActionPolicy policy, final BillingActionPolicy billingPolicy, final CallContext context) throws EntitlementApiException {
+        return false;  //To change body of implemented methods use File | Settings | File Templates.
     }
 
     @Override
-    public ProductCategory getProductCategory() {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    public void uncancel(final CallContext context) throws EntitlementApiException {
+        //To change body of implemented methods use File | Settings | File Templates.
     }
 
+
     @Override
-    public Product getLastActiveProduct() {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    public boolean changePlan(final String productName, final BillingPeriod billingPeriod, final String priceList, final LocalDate localDate, final CallContext callContext) throws EntitlementApiException {
+
+        final InternalCallContext context = internalCallContextFactory.createInternalCallContext(accountId, callContext);
+        final DateTime requestedDate = fromLocalDateAndReferenceTime(localDate, subscriptionBase.getStartDate(), clock, context);
+        try {
+            checker.checkBlockedChange(subscriptionBase, context);
+            return subscriptionBase.changePlan(productName, billingPeriod, priceList, requestedDate, callContext);
+        } catch (BlockingApiException e) {
+            throw new EntitlementApiException(e, e.getCode(), e.getMessage());
+        } catch (SubscriptionBaseApiException e) {
+            throw new EntitlementApiException(e);
+        }
     }
 
     @Override
-    public Plan getLastActivePlan() {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    public boolean changePlanOverrideBillingPolicy(final String productName, final BillingPeriod billingPeriod, final String priceList, final LocalDate localDate, final BillingActionPolicy actionPolicy, final CallContext callContext) throws EntitlementApiException {
+        final InternalCallContext context = internalCallContextFactory.createInternalCallContext(accountId, callContext);
+        final DateTime requestedDate = fromLocalDateAndReferenceTime(localDate, subscriptionBase.getStartDate(), clock, context);
+        try {
+            checker.checkBlockedChange(subscriptionBase, context);
+            return subscriptionBase.changePlanWithPolicy(productName, billingPeriod, priceList, requestedDate, actionPolicy, callContext);
+        } catch (BlockingApiException e) {
+            throw new EntitlementApiException(e, e.getCode(), e.getMessage());
+        } catch (SubscriptionBaseApiException e) {
+            throw new EntitlementApiException(e);
+        }
     }
 
     @Override
-    public PriceList getLastActivePriceList() {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    public boolean block(final String serviceName, final LocalDate effectiveDate, final CallContext context) throws EntitlementApiException {
+
+
+
+        return false;  //To change body of implemented methods use File | Settings | File Templates.
     }
 
     @Override
-    public String getLastActiveProductCategory() {
-        return null;  //To change body of implemented methods use File | Settings | File Templates.
+    public boolean unblock(final String serviceName, final LocalDate effectiveDate, final CallContext context) throws EntitlementApiException {
+        return false;  //To change body of implemented methods use File | Settings | File Templates.
     }
 
 
+
     /**
      * Returns a DateTime that is equals or beforeNow and whose LocalDate using the account timeZone is the one provided
      * <p/>
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultEntitlementApi.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultEntitlementApi.java
index 855f8e1..1ac038a 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultEntitlementApi.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/DefaultEntitlementApi.java
@@ -24,7 +24,10 @@ import javax.annotation.Nullable;
 import javax.inject.Inject;
 
 import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
 import org.joda.time.LocalDate;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.ning.billing.ErrorCode;
 import com.ning.billing.account.api.Account;
@@ -34,7 +37,9 @@ import com.ning.billing.catalog.api.PlanPhaseSpecifier;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.clock.Clock;
 import com.ning.billing.entitlement.EntitlementService;
+import com.ning.billing.entitlement.api.Entitlement.EntitlementState;
 import com.ning.billing.entitlement.block.BlockingChecker;
+import com.ning.billing.entitlement.block.BlockingChecker.BlockingAggregator;
 import com.ning.billing.entitlement.dao.BlockingStateDao;
 import com.ning.billing.subscription.api.SubscriptionBase;
 import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
@@ -56,8 +61,11 @@ import com.google.common.collect.ImmutableList;
 
 public class DefaultEntitlementApi implements EntitlementApi {
 
-    public final String ENT_STATE_BLOCKED = "ENT_BLOCKED";
-    public final String ENT_STATE_CLEAR = "ENT_CLEAR";
+    private static final Logger log = LoggerFactory.getLogger(DefaultEntitlementApi.class);
+
+    public static final String ENT_STATE_BLOCKED = "ENT_BLOCKED";
+    public static final String ENT_STATE_CLEAR = "ENT_CLEAR";
+    public static final String ENT_STATE_CANCELLED = "ENT_CANCELLED";
 
     private final SubscriptionBaseInternalApi subscriptionInternalApi;
     private final AccountInternalApi accountApi;
@@ -82,11 +90,14 @@ public class DefaultEntitlementApi implements EntitlementApi {
     public Entitlement createBaseEntitlement(final UUID accountId, final PlanPhaseSpecifier planPhaseSpecifier, final String externalKey, final CallContext callContext) throws EntitlementApiException {
         final InternalCallContext context = internalCallContextFactory.createInternalCallContext(callContext);
         try {
+            final Account account = accountApi.getAccountById(accountId, context);
             final SubscriptionBaseBundle bundle = subscriptionInternalApi.createBundleForAccount(accountId, externalKey, context);
             final SubscriptionBase subscription = subscriptionInternalApi.createSubscription(bundle.getId(), planPhaseSpecifier, clock.getUTCNow(), context);
-            return new DefaultEntitlement(accountApi, subscription, accountId, bundle.getExternalKey(), internalCallContextFactory, clock, checker);
+            return new DefaultEntitlement(accountApi, subscription, accountId, bundle.getExternalKey(), false, null, account.getTimeZone(), internalCallContextFactory, clock, checker);
         } catch (SubscriptionBaseApiException e) {
             throw new EntitlementApiException(e);
+        } catch (AccountApiException e) {
+            throw new EntitlementApiException(e);
         }
     }
 
@@ -97,20 +108,32 @@ public class DefaultEntitlementApi implements EntitlementApi {
             final SubscriptionBaseBundle bundle = subscriptionInternalApi.getBundleFromId(bundleId, context);
             final SubscriptionBase baseSubscription = subscriptionInternalApi.getBaseSubscription(bundleId, context);
             if (baseSubscription.getCategory() != ProductCategory.BASE ||
-                baseSubscription.getState() != SubscriptionState.ACTIVE) {
+                baseSubscription.getState() != EntitlementState.ACTIVE) {
                 throw new EntitlementApiException(ErrorCode.SUB_GET_NO_SUCH_BASE_SUBSCRIPTION, baseSubscription.getBundleId());
             }
 
             final InternalCallContext contextWithValidAccountRecordId = internalCallContextFactory.createInternalCallContext(bundle.getAccountId(), callContext);
-            checker.checkBlockedChange(baseSubscription, contextWithValidAccountRecordId);
+            final BlockingAggregator blocking = checker.getBlockedStatus(baseSubscription, contextWithValidAccountRecordId);
+            if (blocking.isBlockChange()) {
+                throw new EntitlementApiException(new BlockingApiException(ErrorCode.BLOCK_BLOCKED_ACTION, BlockingChecker.ACTION_CHANGE, BlockingChecker.TYPE_SUBSCRIPTION, baseSubscription.getId().toString()));
+            }
+
+            final BlockingState currentState =  blockingStateDao.getBlockingStateForService(baseSubscription.getId(), EntitlementService.ENTITLEMENT_SERVICE_NAME, contextWithValidAccountRecordId);
+            if (currentState != null && currentState.getStateName().equals(ENT_STATE_CANCELLED)) {
+                throw new EntitlementApiException(new BlockingApiException(ErrorCode.BLOCK_BLOCKED_ACTION, BlockingChecker.ACTION_CHANGE, BlockingChecker.TYPE_SUBSCRIPTION, baseSubscription.getId().toString()));
+            }
+
+            final Account account = accountApi.getAccountById(bundle.getAccountId(), context);
 
             final DateTime requestedDate = fromNowAndReferenceTime(baseSubscription.getStartDate(), contextWithValidAccountRecordId);
             final SubscriptionBase subscription = subscriptionInternalApi.createSubscription(baseSubscription.getBundleId(), planPhaseSpecifier, requestedDate, context);
-            return new DefaultEntitlement(accountApi, subscription, bundle.getAccountId(), bundle.getExternalKey(), internalCallContextFactory, clock, checker);
+            return new DefaultEntitlement(accountApi, subscription, bundle.getAccountId(), bundle.getExternalKey(), blocking.isBlockEntitlement(), null, account.getTimeZone(), internalCallContextFactory, clock, checker);
         } catch (SubscriptionBaseApiException e) {
             throw new EntitlementApiException(e);
         } catch (BlockingApiException e) {
             throw new EntitlementApiException(e);
+        } catch (AccountApiException e) {
+            throw new EntitlementApiException(e);
         }
     }
 
@@ -120,9 +143,18 @@ public class DefaultEntitlementApi implements EntitlementApi {
         try {
             final SubscriptionBase subscription = subscriptionInternalApi.getSubscriptionFromId(uuid, context);
             final SubscriptionBaseBundle bundle = subscriptionInternalApi.getBundleFromId(subscription.getBundleId(), context);
-            return new DefaultEntitlement(accountApi, subscription, bundle.getAccountId(), bundle.getExternalKey(), internalCallContextFactory, clock, checker);
+            final BlockingAggregator blocking = checker.getBlockedStatus(subscription, context);
+
+            final Account account = accountApi.getAccountById(bundle.getAccountId(), context);
+            final BlockingState currentState =  blockingStateDao.getBlockingStateForService(subscription.getId(), EntitlementService.ENTITLEMENT_SERVICE_NAME, context);
+
+            return new DefaultEntitlement(accountApi, subscription, bundle.getAccountId(), bundle.getExternalKey(), blocking.isBlockEntitlement(), currentState, account.getTimeZone(), internalCallContextFactory, clock, checker);
         } catch (SubscriptionBaseApiException e) {
             throw new EntitlementApiException(e);
+        } catch (BlockingApiException e) {
+            throw new EntitlementApiException(e);
+        } catch (AccountApiException e) {
+            throw new EntitlementApiException(e);
         }
     }
 
@@ -161,15 +193,33 @@ public class DefaultEntitlementApi implements EntitlementApi {
         return result;
     }
 
-    private List<Entitlement> getAllEntitlementsForBundleId(final UUID bundleId, final UUID accountId, final String externalKey, final InternalTenantContext context) {
-        final List<SubscriptionBase> subscriptions = subscriptionInternalApi.getSubscriptionsForBundle(bundleId, context);
-        return ImmutableList.<Entitlement>copyOf(Collections2.transform(subscriptions, new Function<SubscriptionBase, Entitlement>() {
-            @Nullable
-            @Override
-            public Entitlement apply(@Nullable final SubscriptionBase input) {
-                return new DefaultEntitlement(accountApi, input, accountId, externalKey, internalCallContextFactory, clock, checker);
-            }
-        }));
+    private List<Entitlement> getAllEntitlementsForBundleId(final UUID bundleId, final UUID accountId, final String externalKey, final InternalTenantContext context) throws EntitlementApiException {
+
+        try {
+            final Account account = accountApi.getAccountById(bundleId, context);
+            final List<SubscriptionBase> subscriptions = subscriptionInternalApi.getSubscriptionsForBundle(bundleId, context);
+            return ImmutableList.<Entitlement>copyOf(Collections2.transform(subscriptions, new Function<SubscriptionBase, Entitlement>() {
+                @Nullable
+                @Override
+                public Entitlement apply(@Nullable final SubscriptionBase input) {
+                    BlockingAggregator blocking = null;
+                    try {
+                        blocking = checker.getBlockedStatus(input, context);
+                    } catch (BlockingApiException e) {
+                        log.warn("Failed to extract blocking state for subscription " + input.getId().toString());
+                    }
+                    final BlockingState currentState =  blockingStateDao.getBlockingStateForService(input.getId(), EntitlementService.ENTITLEMENT_SERVICE_NAME, context);
+
+                    return new DefaultEntitlement(accountApi, input, accountId, externalKey,
+                                                  (blocking != null ? blocking.isBlockEntitlement() : false),
+                                                  currentState,
+                                                  account.getTimeZone(),
+                                                  internalCallContextFactory, clock, checker);
+                }
+            }));
+        } catch (AccountApiException e) {
+            throw new EntitlementApiException(e);
+        }
     }
 
     @Override
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/block/BlockingChecker.java b/entitlement/src/main/java/com/ning/billing/entitlement/block/BlockingChecker.java
index eb167b0..017970d 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/block/BlockingChecker.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/block/BlockingChecker.java
@@ -22,6 +22,24 @@ import com.ning.billing.util.callcontext.InternalTenantContext;
 
 public interface BlockingChecker {
 
+    public static final Object TYPE_SUBSCRIPTION = "Subscription";
+    public static final Object TYPE_BUNDLE = "Bundle";
+    public static final Object TYPE_ACCOUNT = "Account";
+
+    public static final Object ACTION_CHANGE = "Change";
+    public static final Object ACTION_ENTITLEMENT = "Entitlement";
+    public static final Object ACTION_BILLING = "Billing";
+
+
+    public interface BlockingAggregator {
+        public boolean isBlockChange();
+        public boolean isBlockEntitlement();
+        public boolean isBlockBilling();
+    }
+
+    // Only throws if we can't find the blockable enties
+    public BlockingAggregator getBlockedStatus(Blockable blockable, InternalTenantContext context) throws BlockingApiException;
+
     public void checkBlockedChange(Blockable blockable, InternalTenantContext context) throws BlockingApiException;
 
     public void checkBlockedEntitlement(Blockable blockable, InternalTenantContext context) throws BlockingApiException;
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/block/DefaultBlockingChecker.java b/entitlement/src/main/java/com/ning/billing/entitlement/block/DefaultBlockingChecker.java
index aafe0de..346b443 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/block/DefaultBlockingChecker.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/block/DefaultBlockingChecker.java
@@ -35,7 +35,7 @@ import com.google.inject.Inject;
 
 public class DefaultBlockingChecker implements BlockingChecker {
 
-    private static class BlockingAggregator {
+    private static class DefaultBlockingAggregator implements BlockingAggregator {
 
         private boolean blockChange = false;
         private boolean blockEntitlement = false;
@@ -50,7 +50,7 @@ public class DefaultBlockingChecker implements BlockingChecker {
             blockBilling = blockBilling || state.isBlockBilling();
         }
 
-        public void or(final BlockingAggregator state) {
+        public void or(final DefaultBlockingAggregator state) {
             if (state == null) {
                 return;
             }
@@ -59,28 +59,22 @@ public class DefaultBlockingChecker implements BlockingChecker {
             blockBilling = blockBilling || state.isBlockBilling();
         }
 
+        @Override
         public boolean isBlockChange() {
             return blockChange;
         }
 
+        @Override
         public boolean isBlockEntitlement() {
             return blockEntitlement;
         }
 
+        @Override
         public boolean isBlockBilling() {
             return blockBilling;
         }
-
     }
 
-    private static final Object TYPE_SUBSCRIPTION = "Subscription";
-    private static final Object TYPE_BUNDLE = "Bundle";
-    private static final Object TYPE_ACCOUNT = "Account";
-
-    private static final Object ACTION_CHANGE = "Change";
-    private static final Object ACTION_ENTITLEMENT = "Entitlement";
-    private static final Object ACTION_BILLING = "Billing";
-
     private final SubscriptionBaseInternalApi subscriptionApi;
     private final BlockingStateDao dao;
 
@@ -90,15 +84,20 @@ public class DefaultBlockingChecker implements BlockingChecker {
         this.dao = dao;
     }
 
-    private BlockingAggregator getBlockedStateSubscriptionId(final UUID subscriptionId, final InternalTenantContext context) throws SubscriptionBaseApiException {
-        final SubscriptionBase subscription = subscriptionApi.getSubscriptionFromId(subscriptionId, context);
-        return getBlockedStateSubscription(subscription, context);
+    private DefaultBlockingAggregator getBlockedStateSubscriptionId(final UUID subscriptionId, final InternalTenantContext context) throws BlockingApiException {
+        final SubscriptionBase subscription;
+        try {
+            subscription = subscriptionApi.getSubscriptionFromId(subscriptionId, context);
+            return getBlockedStateSubscription(subscription, context);
+        } catch (SubscriptionBaseApiException e) {
+            throw new BlockingApiException(e, ErrorCode.fromCode(e.getCode()));
+        }
     }
 
-    private BlockingAggregator getBlockedStateSubscription(final SubscriptionBase subscription, final InternalTenantContext context) throws SubscriptionBaseApiException {
-        final BlockingAggregator result = new BlockingAggregator();
+    private DefaultBlockingAggregator getBlockedStateSubscription(final SubscriptionBase subscription, final InternalTenantContext context) throws BlockingApiException {
+        final DefaultBlockingAggregator result = new DefaultBlockingAggregator();
         if (subscription != null) {
-            final BlockingAggregator subscriptionState = getBlockedStateForId(subscription.getId(), context);
+            final DefaultBlockingAggregator subscriptionState = getBlockedStateForId(subscription.getId(), context);
             if (subscriptionState != null) {
                 result.or(subscriptionState);
             }
@@ -111,35 +110,42 @@ public class DefaultBlockingChecker implements BlockingChecker {
     }
 
 
-    private BlockingAggregator getBlockedStateBundleId(final UUID bundleId, final InternalTenantContext context) throws SubscriptionBaseApiException {
-        final SubscriptionBaseBundle bundle = subscriptionApi.getBundleFromId(bundleId, context);
-        return getBlockedStateBundle(bundle, context);
+    private DefaultBlockingAggregator getBlockedStateBundleId(final UUID bundleId, final InternalTenantContext context) throws BlockingApiException {
+
+        final SubscriptionBaseBundle bundle;
+        try {
+            bundle = subscriptionApi.getBundleFromId(bundleId, context);
+            return getBlockedStateBundle(bundle, context);
+        } catch (SubscriptionBaseApiException e) {
+            throw new BlockingApiException(e, ErrorCode.fromCode(e.getCode()));
+        }
     }
 
 
-    private BlockingAggregator getBlockedStateBundle(final SubscriptionBaseBundle bundle, final InternalTenantContext context) {
-        final BlockingAggregator result = getBlockedStateAccountId(bundle.getAccountId(), context);
-        final BlockingAggregator bundleState = getBlockedStateForId(bundle.getId(), context);
+    private DefaultBlockingAggregator getBlockedStateBundle(final SubscriptionBaseBundle bundle, final InternalTenantContext context) {
+        final DefaultBlockingAggregator result = getBlockedStateAccountId(bundle.getAccountId(), context);
+        final DefaultBlockingAggregator bundleState = getBlockedStateForId(bundle.getId(), context);
         if (bundleState != null) {
             result.or(bundleState);
         }
         return result;
     }
 
-    private BlockingAggregator getBlockedStateAccount(final Account account, final InternalTenantContext context) {
+    private DefaultBlockingAggregator getBlockedStateAccount(final Account account, final InternalTenantContext context) {
         if (account != null) {
             return getBlockedStateForId(account.getId(), context);
         }
-        return new BlockingAggregator();
+        return new DefaultBlockingAggregator();
     }
 
-    private BlockingAggregator getBlockedStateAccountId(final UUID accountId, final InternalTenantContext context) {
+    private DefaultBlockingAggregator getBlockedStateAccountId(final UUID accountId, final InternalTenantContext context) {
         return getBlockedStateForId(accountId, context);
     }
 
-    private BlockingAggregator getBlockedStateForId(final UUID blockableId, final InternalTenantContext context) {
-        final BlockingAggregator result = new BlockingAggregator();
+    private DefaultBlockingAggregator getBlockedStateForId(final UUID blockableId, final InternalTenantContext context) {
+        final DefaultBlockingAggregator result = new DefaultBlockingAggregator();
         if (blockableId != null) {
+            // Last states across services
             final List<BlockingState> blockableState = dao.getBlockingState(blockableId, context);
             for (BlockingState cur : blockableState) {
                 result.or(cur);
@@ -149,48 +155,46 @@ public class DefaultBlockingChecker implements BlockingChecker {
     }
 
     @Override
+    public BlockingAggregator getBlockedStatus(final Blockable blockable, final InternalTenantContext context) throws BlockingApiException {
+        if (blockable instanceof SubscriptionBase) {
+            return getBlockedStateSubscription((SubscriptionBase) blockable, context);
+        } else if (blockable instanceof SubscriptionBaseBundle) {
+            return getBlockedStateBundle((SubscriptionBaseBundle) blockable, context);
+        } else { //(blockable instanceof Account) {
+            return getBlockedStateAccount((Account) blockable, context);
+        }
+    }
+
+    @Override
     public void checkBlockedChange(final Blockable blockable, final InternalTenantContext context) throws BlockingApiException {
-        try {
-            if (blockable instanceof SubscriptionBase && getBlockedStateSubscription((SubscriptionBase) blockable, context).isBlockChange()) {
-                throw new BlockingApiException(ErrorCode.BLOCK_BLOCKED_ACTION, ACTION_CHANGE, TYPE_SUBSCRIPTION, blockable.getId().toString());
-            } else if (blockable instanceof SubscriptionBaseBundle && getBlockedStateBundle((SubscriptionBaseBundle) blockable, context).isBlockChange()) {
-                throw new BlockingApiException(ErrorCode.BLOCK_BLOCKED_ACTION, ACTION_CHANGE, TYPE_BUNDLE, blockable.getId().toString());
-            } else if (blockable instanceof Account && getBlockedStateAccount((Account) blockable, context).isBlockChange()) {
-                throw new BlockingApiException(ErrorCode.BLOCK_BLOCKED_ACTION, ACTION_CHANGE, TYPE_ACCOUNT, blockable.getId().toString());
-            }
-        } catch (SubscriptionBaseApiException e) {
-            throw new BlockingApiException(e, ErrorCode.fromCode(e.getCode()));
+        if (blockable instanceof SubscriptionBase && getBlockedStateSubscription((SubscriptionBase) blockable, context).isBlockChange()) {
+            throw new BlockingApiException(ErrorCode.BLOCK_BLOCKED_ACTION, ACTION_CHANGE, TYPE_SUBSCRIPTION, blockable.getId().toString());
+        } else if (blockable instanceof SubscriptionBaseBundle && getBlockedStateBundle((SubscriptionBaseBundle) blockable, context).isBlockChange()) {
+            throw new BlockingApiException(ErrorCode.BLOCK_BLOCKED_ACTION, ACTION_CHANGE, TYPE_BUNDLE, blockable.getId().toString());
+        } else if (blockable instanceof Account && getBlockedStateAccount((Account) blockable, context).isBlockChange()) {
+            throw new BlockingApiException(ErrorCode.BLOCK_BLOCKED_ACTION, ACTION_CHANGE, TYPE_ACCOUNT, blockable.getId().toString());
         }
     }
 
     @Override
     public void checkBlockedEntitlement(final Blockable blockable, final InternalTenantContext context) throws BlockingApiException {
-        try {
-            // STEPH_ENT
-            if (blockable instanceof SubscriptionBase && getBlockedStateSubscription((SubscriptionBase) blockable, context).isBlockEntitlement()) {
-                throw new BlockingApiException(ErrorCode.BLOCK_BLOCKED_ACTION, ACTION_ENTITLEMENT, TYPE_SUBSCRIPTION, blockable.getId().toString());
-            } else if (blockable instanceof SubscriptionBaseBundle && getBlockedStateBundle((SubscriptionBaseBundle) blockable, context).isBlockEntitlement()) {
-                throw new BlockingApiException(ErrorCode.BLOCK_BLOCKED_ACTION, ACTION_ENTITLEMENT, TYPE_BUNDLE, blockable.getId().toString());
-            } else if (blockable instanceof Account && getBlockedStateAccount((Account) blockable, context).isBlockEntitlement()) {
-                throw new BlockingApiException(ErrorCode.BLOCK_BLOCKED_ACTION, ACTION_ENTITLEMENT, TYPE_ACCOUNT, blockable.getId().toString());
-            }
-        } catch (SubscriptionBaseApiException e) {
-            throw new BlockingApiException(e, ErrorCode.fromCode(e.getCode()));
+        if (blockable instanceof SubscriptionBase && getBlockedStateSubscription((SubscriptionBase) blockable, context).isBlockEntitlement()) {
+            throw new BlockingApiException(ErrorCode.BLOCK_BLOCKED_ACTION, ACTION_ENTITLEMENT, TYPE_SUBSCRIPTION, blockable.getId().toString());
+        } else if (blockable instanceof SubscriptionBaseBundle && getBlockedStateBundle((SubscriptionBaseBundle) blockable, context).isBlockEntitlement()) {
+            throw new BlockingApiException(ErrorCode.BLOCK_BLOCKED_ACTION, ACTION_ENTITLEMENT, TYPE_BUNDLE, blockable.getId().toString());
+        } else if (blockable instanceof Account && getBlockedStateAccount((Account) blockable, context).isBlockEntitlement()) {
+            throw new BlockingApiException(ErrorCode.BLOCK_BLOCKED_ACTION, ACTION_ENTITLEMENT, TYPE_ACCOUNT, blockable.getId().toString());
         }
     }
 
     @Override
     public void checkBlockedBilling(final Blockable blockable, final InternalTenantContext context) throws BlockingApiException {
-        try {
-            if (blockable instanceof SubscriptionBase && getBlockedStateSubscription((SubscriptionBase) blockable, context).isBlockBilling()) {
-                throw new BlockingApiException(ErrorCode.BLOCK_BLOCKED_ACTION, ACTION_BILLING, TYPE_SUBSCRIPTION, blockable.getId().toString());
-            } else if (blockable instanceof SubscriptionBaseBundle && getBlockedStateBundle((SubscriptionBaseBundle) blockable, context).isBlockBilling()) {
-                throw new BlockingApiException(ErrorCode.BLOCK_BLOCKED_ACTION, ACTION_BILLING, TYPE_BUNDLE, blockable.getId().toString());
-            } else if (blockable instanceof Account && getBlockedStateAccount((Account) blockable, context).isBlockBilling()) {
-                throw new BlockingApiException(ErrorCode.BLOCK_BLOCKED_ACTION, ACTION_BILLING, TYPE_ACCOUNT, blockable.getId().toString());
-            }
-        } catch (SubscriptionBaseApiException e) {
-            throw new BlockingApiException(e, ErrorCode.fromCode(e.getCode()));
+        if (blockable instanceof SubscriptionBase && getBlockedStateSubscription((SubscriptionBase) blockable, context).isBlockBilling()) {
+            throw new BlockingApiException(ErrorCode.BLOCK_BLOCKED_ACTION, ACTION_BILLING, TYPE_SUBSCRIPTION, blockable.getId().toString());
+        } else if (blockable instanceof SubscriptionBaseBundle && getBlockedStateBundle((SubscriptionBaseBundle) blockable, context).isBlockBilling()) {
+            throw new BlockingApiException(ErrorCode.BLOCK_BLOCKED_ACTION, ACTION_BILLING, TYPE_BUNDLE, blockable.getId().toString());
+        } else if (blockable instanceof Account && getBlockedStateAccount((Account) blockable, context).isBlockBilling()) {
+            throw new BlockingApiException(ErrorCode.BLOCK_BLOCKED_ACTION, ACTION_BILLING, TYPE_ACCOUNT, blockable.getId().toString());
         }
     }
 }
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/TestDefaultEntitlementApi.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/TestDefaultEntitlementApi.java
index f08808b..d6aeaa5 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/TestDefaultEntitlementApi.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/TestDefaultEntitlementApi.java
@@ -2,20 +2,24 @@ package com.ning.billing.entitlement.api;
 
 import java.util.UUID;
 
+import org.joda.time.LocalDate;
 import org.mockito.Mockito;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
-import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.PlanPhaseSpecifier;
 import com.ning.billing.catalog.api.PriceListSet;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.entitlement.EntitlementTestSuiteWithEmbeddedDB;
+import com.ning.billing.entitlement.api.Entitlement.EntitlementSourceType;
+import com.ning.billing.entitlement.api.Entitlement.EntitlementState;
 import com.ning.billing.util.callcontext.InternalTenantContext;
-import com.ning.billing.util.callcontext.TenantContext;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNull;
 
 
 public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedDB {
@@ -24,6 +28,8 @@ public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedD
     public void test1() {
 
         try {
+            final LocalDate initialDate = new LocalDate(2013, 8, 7);
+            clock.setDay(initialDate);
             final UUID accountId = UUID.randomUUID();
             final String externalKey = "externalKey";
             final Account account = Mockito.mock(Account.class);
@@ -31,7 +37,29 @@ public class TestDefaultEntitlementApi extends EntitlementTestSuiteWithEmbeddedD
             Mockito.when(accountInternalApi.getAccountById(Mockito.<UUID>any(), Mockito.<InternalTenantContext>any())).thenReturn(account);
 
             final PlanPhaseSpecifier spec = new PlanPhaseSpecifier("Shotgun", ProductCategory.BASE, BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, null);
-            entitlementApi.createBaseEntitlement(accountId, spec, externalKey,  callContext);
+
+            final Entitlement entitlement = entitlementApi.createBaseEntitlement(accountId, spec, externalKey, callContext);
+            assertEquals(entitlement.getAccountId(), accountId);
+            assertEquals(entitlement.getExternalKey(), externalKey);
+
+            assertEquals(entitlement.getRequestedEndDate(), initialDate);
+            assertEquals(entitlement.getEffectiveStartDate(), initialDate);
+            assertNull(entitlement.getEffectiveStartDate());
+
+            assertEquals(entitlement.getPriceList().getName(), PriceListSet.DEFAULT_PRICELIST_NAME);
+            assertEquals(entitlement.getProduct().getName(), "Shotgun");
+            assertEquals(entitlement.getCurrentPhase().getName(), "shotgun-monthly-trial");
+            assertEquals(entitlement.getPlan().getName(), "shotgun-monthly");
+            assertEquals(entitlement.getProductCategory(), ProductCategory.BASE);
+
+            assertEquals(entitlement.getState(), EntitlementState.ACTIVE);
+            assertEquals(entitlement.getSourceType(), EntitlementSourceType.NATIVE);
+
+            assertEquals(entitlement.getLastActivePlan(), null);
+            assertEquals(entitlement.getLastActivePriceList(), null);
+            assertEquals(entitlement.getLastActiveProduct(), null);
+            assertEquals(entitlement.getLastActiveProductCategory(), null);
+
         } catch (EntitlementApiException e) {
             Assert.fail("Test failed " + e.getMessage());
         } catch (AccountApiException e) {
diff --git a/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillingApi.java b/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillingApi.java
index c6d01b7..05e72d8 100644
--- a/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillingApi.java
+++ b/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillingApi.java
@@ -30,6 +30,7 @@ import com.ning.billing.catalog.api.PlanPhase;
 import com.ning.billing.catalog.api.PriceList;
 import com.ning.billing.catalog.api.PriceListSet;
 import com.ning.billing.entitlement.api.BlockingStateType;
+import com.ning.billing.entitlement.api.Entitlement.EntitlementState;
 import com.ning.billing.entitlement.dao.MockBlockingStateDao;
 import com.ning.billing.junction.JunctionTestSuiteNoDB;
 import com.ning.billing.entitlement.api.BlockingState;
@@ -277,7 +278,7 @@ public class TestBillingApi extends JunctionTestSuiteNoDB {
         final PriceList nextPriceList = catalog.findPriceList(PriceListSet.DEFAULT_PRICELIST_NAME, now);
 
         final EffectiveSubscriptionInternalEvent t = new MockEffectiveSubscriptionEvent(
-                eventId, subId, bunId, then, now, null, null, null, null, SubscriptionState.ACTIVE,
+                eventId, subId, bunId, then, now, null, null, null, null, EntitlementState.ACTIVE,
                 nextPlan.getName(), nextPhase.getName(),
                 nextPriceList.getName(), 1L,
                 SubscriptionBaseTransitionType.CREATE, 1, null, 1L, 2L, null);
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/svcs/DefaultSubscriptionInternalApi.java b/subscription/src/main/java/com/ning/billing/subscription/api/svcs/DefaultSubscriptionInternalApi.java
index 888f084..5b1199d 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/svcs/DefaultSubscriptionInternalApi.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/svcs/DefaultSubscriptionInternalApi.java
@@ -37,6 +37,7 @@ import com.ning.billing.catalog.api.PriceListSet;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.clock.Clock;
 import com.ning.billing.clock.DefaultClock;
+import com.ning.billing.entitlement.api.Entitlement.EntitlementState;
 import com.ning.billing.subscription.api.SubscriptionApiBase;
 import com.ning.billing.subscription.api.user.DefaultEffectiveSubscriptionEvent;
 import com.ning.billing.subscription.api.user.DefaultSubscriptionBase;
@@ -111,7 +112,7 @@ public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implemen
             switch (plan.getProduct().getCategory()) {
                 case BASE:
                     if (baseSubscription != null) {
-                        if (baseSubscription.getState() == SubscriptionState.ACTIVE) {
+                        if (baseSubscription.getState() == EntitlementState.ACTIVE) {
                             throw new SubscriptionBaseApiException(ErrorCode.SUB_CREATE_BP_EXISTS, bundleId);
                         } else {
                             // If we do create on an existing CANCELLED BP, this is equivalent to call recreate on that SubscriptionBase.
@@ -277,7 +278,7 @@ public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implemen
             }
 
             // If ADDON is cancelled, skip
-            if (cur.getState() == SubscriptionState.CANCELLED) {
+            if (cur.getState() == EntitlementState.CANCELLED) {
                 continue;
             }
 
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/timeline/SubscriptionDataRepair.java b/subscription/src/main/java/com/ning/billing/subscription/api/timeline/SubscriptionDataRepair.java
index eaf759e..1216410 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/timeline/SubscriptionDataRepair.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/timeline/SubscriptionDataRepair.java
@@ -30,6 +30,7 @@ import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhaseSpecifier;
 import com.ning.billing.catalog.api.Product;
 import com.ning.billing.catalog.api.ProductCategory;
+import com.ning.billing.entitlement.api.Entitlement.EntitlementState;
 import com.ning.billing.subscription.api.SubscriptionBaseApiService;
 import com.ning.billing.subscription.api.SubscriptionBaseTransitionType;
 import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
@@ -155,7 +156,7 @@ public class SubscriptionDataRepair extends DefaultSubscriptionBase {
             return;
         }
 
-        final Product baseProduct = (getState() == SubscriptionState.CANCELLED) ?
+        final Product baseProduct = (getState() == EntitlementState.CANCELLED) ?
                                     null : getCurrentPlan().getProduct();
         addAddonCancellationIfRequired(addOnSubscriptionInRepair, baseProduct, effectiveDate, context);
     }
@@ -167,7 +168,7 @@ public class SubscriptionDataRepair extends DefaultSubscriptionBase {
         final Iterator<SubscriptionDataRepair> it = addOnSubscriptionInRepair.iterator();
         while (it.hasNext()) {
             final SubscriptionDataRepair cur = it.next();
-            if (cur.getState() == SubscriptionState.CANCELLED ||
+            if (cur.getState() == EntitlementState.CANCELLED ||
                 cur.getCategory() != ProductCategory.ADD_ON) {
                 continue;
             }
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/transfer/DefaultSubscriptionBaseTransferApi.java b/subscription/src/main/java/com/ning/billing/subscription/api/transfer/DefaultSubscriptionBaseTransferApi.java
index 16e7bd9..ea2cb92 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/transfer/DefaultSubscriptionBaseTransferApi.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/transfer/DefaultSubscriptionBaseTransferApi.java
@@ -29,6 +29,7 @@ import com.ning.billing.catalog.api.CatalogService;
 import com.ning.billing.catalog.api.PlanPhase;
 import com.ning.billing.catalog.api.PlanPhaseSpecifier;
 import com.ning.billing.catalog.api.ProductCategory;
+import com.ning.billing.entitlement.api.Entitlement.EntitlementState;
 import com.ning.billing.subscription.api.SubscriptionApiBase;
 import com.ning.billing.subscription.api.SubscriptionBaseApiService;
 import com.ning.billing.subscription.api.migration.AccountMigrationData.BundleMigrationData;
@@ -218,7 +219,7 @@ public class DefaultSubscriptionBaseTransferApi extends SubscriptionApiBase impl
             for (final SubscriptionBaseTimeline cur : bundleBaseTimeline.getSubscriptions()) {
                 final DefaultSubscriptionBase oldSubscription = (DefaultSubscriptionBase) dao.getSubscriptionFromId(cur.getId(), fromInternalCallContext);
                 // Skip already cancelled subscriptions
-                if (oldSubscription.getState() == SubscriptionState.CANCELLED) {
+                if (oldSubscription.getState() == EntitlementState.CANCELLED) {
                     continue;
                 }
                 final List<ExistingEvent> existingEvents = cur.getExistingEvents();
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultEffectiveSubscriptionEvent.java b/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultEffectiveSubscriptionEvent.java
index ed03f52..375d381 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultEffectiveSubscriptionEvent.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultEffectiveSubscriptionEvent.java
@@ -20,6 +20,7 @@ import java.util.UUID;
 
 import org.joda.time.DateTime;
 
+import com.ning.billing.entitlement.api.Entitlement.EntitlementState;
 import com.ning.billing.subscription.api.SubscriptionBaseTransitionType;
 import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 
@@ -38,11 +39,11 @@ public class DefaultEffectiveSubscriptionEvent extends DefaultSubscriptionEvent 
                                              @JsonProperty("bundleId") final UUID bundleId,
                                              @JsonProperty("requestedTransitionTime") final DateTime requestedTransitionTime,
                                              @JsonProperty("effectiveTransitionTime") final DateTime effectiveTransitionTime,
-                                             @JsonProperty("previousState") final SubscriptionState previousState,
+                                             @JsonProperty("previousState") final EntitlementState previousState,
                                              @JsonProperty("previousPlan") final String previousPlan,
                                              @JsonProperty("previousPhase") final String previousPhase,
                                              @JsonProperty("previousPriceList") final String previousPriceList,
-                                             @JsonProperty("nextState") final SubscriptionState nextState,
+                                             @JsonProperty("nextState") final EntitlementState nextState,
                                              @JsonProperty("nextPlan") final String nextPlan,
                                              @JsonProperty("nextPhase") final String nextPhase,
                                              @JsonProperty("nextPriceList") final String nextPriceList,
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultRequestedSubscriptionEvent.java b/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultRequestedSubscriptionEvent.java
index d59e5e4..e87cb26 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultRequestedSubscriptionEvent.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultRequestedSubscriptionEvent.java
@@ -20,6 +20,7 @@ import java.util.UUID;
 
 import org.joda.time.DateTime;
 
+import com.ning.billing.entitlement.api.Entitlement.EntitlementState;
 import com.ning.billing.subscription.api.SubscriptionBaseTransitionType;
 import com.ning.billing.subscription.events.SubscriptionBaseEvent;
 import com.ning.billing.util.events.RequestedSubscriptionInternalEvent;
@@ -35,11 +36,11 @@ public class DefaultRequestedSubscriptionEvent extends DefaultSubscriptionEvent 
                                              @JsonProperty("bundleId") final UUID bundleId,
                                              @JsonProperty("requestedTransitionTime") final DateTime requestedTransitionTime,
                                              @JsonProperty("effectiveTransitionTime") final DateTime effectiveTransitionTime,
-                                             @JsonProperty("previousState") final SubscriptionState previousState,
+                                             @JsonProperty("previousState") final EntitlementState previousState,
                                              @JsonProperty("previousPlan") final String previousPlan,
                                              @JsonProperty("previousPhase") final String previousPhase,
                                              @JsonProperty("previousPriceList") final String previousPriceList,
-                                             @JsonProperty("nextState") final SubscriptionState nextState,
+                                             @JsonProperty("nextState") final EntitlementState nextState,
                                              @JsonProperty("nextPlan") final String nextPlan,
                                              @JsonProperty("nextPhase") final String nextPhase,
                                              @JsonProperty("nextPriceList") final String nextPriceList,
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionBase.java b/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionBase.java
index 0afaeec..4329d22 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionBase.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionBase.java
@@ -36,9 +36,12 @@ import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
 import com.ning.billing.catalog.api.PlanPhaseSpecifier;
 import com.ning.billing.catalog.api.PriceList;
+import com.ning.billing.catalog.api.Product;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.clock.Clock;
 import com.ning.billing.entitlement.api.BlockingState;
+import com.ning.billing.entitlement.api.Entitlement.EntitlementSourceType;
+import com.ning.billing.entitlement.api.Entitlement.EntitlementState;
 import com.ning.billing.subscription.api.SubscriptionBaseApiService;
 import com.ning.billing.subscription.api.SubscriptionBase;
 import com.ning.billing.subscription.api.SubscriptionBaseTransitionType;
@@ -138,13 +141,13 @@ public class DefaultSubscriptionBase extends EntityBase implements SubscriptionB
     }
 
     @Override
-    public SubscriptionState getState() {
+    public EntitlementState getState() {
         return (getPreviousTransition() == null) ? null
                                                  : getPreviousTransition().getNextState();
     }
 
     @Override
-    public SubscriptionSourceType getSourceType() {
+    public EntitlementSourceType getSourceType() {
         if (transitions == null) {
             return null;
         }
@@ -152,11 +155,11 @@ public class DefaultSubscriptionBase extends EntityBase implements SubscriptionB
         switch (initialTransition.getApiEventType()) {
             case MIGRATE_BILLING:
             case MIGRATE_ENTITLEMENT:
-                return SubscriptionSourceType.MIGRATED;
+                return EntitlementSourceType.MIGRATED;
             case TRANSFER:
-                return SubscriptionSourceType.TRANSFERED;
+                return EntitlementSourceType.TRANSFERRED;
             default:
-                return SubscriptionSourceType.NATIVE;
+                return EntitlementSourceType.NATIVE;
         }
     }
 
@@ -182,7 +185,7 @@ public class DefaultSubscriptionBase extends EntityBase implements SubscriptionB
     @Override
     public DateTime getEndDate() {
         final SubscriptionBaseTransition latestTransition = getPreviousTransition();
-        if (latestTransition.getNextState() == SubscriptionState.CANCELLED) {
+        if (latestTransition.getNextState() == EntitlementState.CANCELLED) {
             return latestTransition.getEffectiveTransitionTime();
         }
         return null;
@@ -257,38 +260,38 @@ public class DefaultSubscriptionBase extends EntityBase implements SubscriptionB
     }
 
     @Override
-    public String getLastActiveProductName() {
-        if (getState() == SubscriptionState.CANCELLED) {
+    public Product getLastActiveProduct() {
+        if (getState() == EntitlementState.CANCELLED) {
             final SubscriptionBaseTransition data = getPreviousTransition();
-            return data.getPreviousPlan().getProduct().getName();
+            return data.getPreviousPlan().getProduct();
         } else {
-            return getCurrentPlan().getProduct().getName();
+            return getCurrentPlan().getProduct();
         }
     }
 
     @Override
-    public String getLastActivePriceListName() {
-        if (getState() == SubscriptionState.CANCELLED) {
+    public PriceList getLastActivePriceList() {
+        if (getState() == EntitlementState.CANCELLED) {
             final SubscriptionBaseTransition data = getPreviousTransition();
-            return data.getPreviousPriceList().getName();
+            return data.getPreviousPriceList();
         } else {
-            return getCurrentPriceList().getName();
+            return getCurrentPriceList();
         }
     }
 
     @Override
-    public String getLastActiveCategoryName() {
-        if (getState() == SubscriptionState.CANCELLED) {
+    public ProductCategory getLastActiveCategory() {
+        if (getState() == EntitlementState.CANCELLED) {
             final SubscriptionBaseTransition data = getPreviousTransition();
-            return data.getPreviousPlan().getProduct().getCategory().name();
+            return data.getPreviousPlan().getProduct().getCategory();
         } else {
-            return getCurrentPlan().getProduct().getCategory().name();
+            return getCurrentPlan().getProduct().getCategory();
         }
     }
 
     @Override
     public Plan getLastActivePlan() {
-        if (getState() == SubscriptionState.CANCELLED) {
+        if (getState() == EntitlementState.CANCELLED) {
             final SubscriptionBaseTransition data = getPreviousTransition();
             return data.getPreviousPlan();
         } else {
@@ -297,12 +300,12 @@ public class DefaultSubscriptionBase extends EntityBase implements SubscriptionB
     }
 
     @Override
-    public String getLastActiveBillingPeriod() {
-        if (getState() == SubscriptionState.CANCELLED) {
+    public BillingPeriod getLastActiveBillingPeriod() {
+        if (getState() == EntitlementState.CANCELLED) {
             final SubscriptionBaseTransition data = getPreviousTransition();
-            return data.getPreviousPlan().getBillingPeriod().name();
+            return data.getPreviousPlan().getBillingPeriod();
         } else {
-            return getCurrentPlan().getBillingPeriod().name();
+            return getCurrentPlan().getBillingPeriod();
         }
     }
 
@@ -534,14 +537,14 @@ public class DefaultSubscriptionBase extends EntityBase implements SubscriptionB
 
         UUID nextEventId = null;
         DateTime nextCreatedDate = null;
-        SubscriptionState nextState = null;
+        EntitlementState nextState = null;
         String nextPlanName = null;
         String nextPhaseName = null;
         String nextPriceListName = null;
 
         UUID prevEventId = null;
         DateTime prevCreatedDate = null;
-        SubscriptionState previousState = null;
+        EntitlementState previousState = null;
         PriceList previousPriceList = null;
         Plan previousPlan = null;
         PlanPhase previousPhase = null;
@@ -585,7 +588,7 @@ public class DefaultSubscriptionBase extends EntityBase implements SubscriptionB
                             previousPlan = null;
                             previousPhase = null;
                             previousPriceList = null;
-                            nextState = SubscriptionState.ACTIVE;
+                            nextState = EntitlementState.ACTIVE;
                             nextPlanName = userEV.getEventPlan();
                             nextPhaseName = userEV.getEventPlanPhase();
                             nextPriceListName = userEV.getPriceList();
@@ -596,7 +599,7 @@ public class DefaultSubscriptionBase extends EntityBase implements SubscriptionB
                             nextPriceListName = userEV.getPriceList();
                             break;
                         case CANCEL:
-                            nextState = SubscriptionState.CANCELLED;
+                            nextState = EntitlementState.CANCELLED;
                             nextPlanName = null;
                             nextPhaseName = null;
                             break;
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionBaseApiService.java b/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionBaseApiService.java
index 9430c2e..1c6ee1b 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionBaseApiService.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionBaseApiService.java
@@ -39,6 +39,7 @@ import com.ning.billing.catalog.api.PriceList;
 import com.ning.billing.catalog.api.PriceListSet;
 import com.ning.billing.catalog.api.Product;
 import com.ning.billing.catalog.api.ProductCategory;
+import com.ning.billing.entitlement.api.Entitlement.EntitlementState;
 import com.ning.billing.subscription.alignment.PlanAligner;
 import com.ning.billing.subscription.alignment.TimedPhase;
 import com.ning.billing.subscription.api.SubscriptionBaseApiService;
@@ -99,8 +100,8 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
     @Override
     public boolean recreatePlan(final DefaultSubscriptionBase subscription, final PlanPhaseSpecifier spec, final DateTime requestedDateWithMs, final CallContext context)
             throws SubscriptionBaseApiException {
-        final SubscriptionState currentState = subscription.getState();
-        if (currentState != null && currentState != SubscriptionState.CANCELLED) {
+        final EntitlementState currentState = subscription.getState();
+        if (currentState != null && currentState != EntitlementState.CANCELLED) {
             throw new SubscriptionBaseApiException(ErrorCode.SUB_RECREATE_BAD_STATE, subscription.getId(), currentState);
         }
 
@@ -170,8 +171,8 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
     @Override
     public boolean cancel(final DefaultSubscriptionBase subscription, final DateTime requestedDateWithMs, final CallContext context) throws SubscriptionBaseApiException {
         try {
-            final SubscriptionState currentState = subscription.getState();
-            if (currentState != SubscriptionState.ACTIVE) {
+            final EntitlementState currentState = subscription.getState();
+            if (currentState != EntitlementState.ACTIVE) {
                 throw new SubscriptionBaseApiException(ErrorCode.SUB_CANCEL_BAD_STATE, subscription.getId(), currentState);
             }
             final DateTime now = clock.getUTCNow();
@@ -194,8 +195,8 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
 
     @Override
     public boolean cancelWithPolicy(final DefaultSubscriptionBase subscription, final DateTime requestedDateWithMs, final BillingActionPolicy policy, final CallContext context) throws SubscriptionBaseApiException {
-        final SubscriptionState currentState = subscription.getState();
-        if (currentState != SubscriptionState.ACTIVE) {
+        final EntitlementState currentState = subscription.getState();
+        if (currentState != EntitlementState.ACTIVE) {
             throw new SubscriptionBaseApiException(ErrorCode.SUB_CANCEL_BAD_STATE, subscription.getId(), currentState);
         }
         final DateTime now = clock.getUTCNow();
@@ -373,7 +374,7 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
             return 0;
         }
 
-        final Product baseProduct = (baseSubscription.getState() == SubscriptionState.CANCELLED) ? null : baseSubscription.getCurrentPlan().getProduct();
+        final Product baseProduct = (baseSubscription.getState() == EntitlementState.CANCELLED) ? null : baseSubscription.getCurrentPlan().getProduct();
 
         final List<SubscriptionBase> subscriptions = dao.getSubscriptions(baseSubscription.getBundleId(), context);
 
@@ -382,7 +383,7 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
 
         for (final SubscriptionBase subscription : subscriptions) {
             final DefaultSubscriptionBase cur = (DefaultSubscriptionBase) subscription;
-            if (cur.getState() == SubscriptionState.CANCELLED ||
+            if (cur.getState() == EntitlementState.CANCELLED ||
                 cur.getCategory() != ProductCategory.ADD_ON) {
                 continue;
             }
@@ -425,8 +426,8 @@ public class DefaultSubscriptionBaseApiService implements SubscriptionBaseApiSer
     }
 
     private void validateSubscriptionState(final DefaultSubscriptionBase subscription) throws SubscriptionBaseApiException {
-        final SubscriptionState currentState = subscription.getState();
-        if (currentState != SubscriptionState.ACTIVE) {
+        final EntitlementState currentState = subscription.getState();
+        if (currentState != EntitlementState.ACTIVE) {
             throw new SubscriptionBaseApiException(ErrorCode.SUB_CHANGE_NON_ACTIVE, subscription.getId(), currentState);
         }
         if (subscription.isSubscriptionFutureCancelled()) {
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionEvent.java b/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionEvent.java
index de67a43..adf5bf2 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionEvent.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionEvent.java
@@ -20,6 +20,7 @@ import java.util.UUID;
 
 import org.joda.time.DateTime;
 
+import com.ning.billing.entitlement.api.Entitlement.EntitlementState;
 import com.ning.billing.subscription.api.SubscriptionBaseTransitionType;
 import com.ning.billing.util.events.BusEventBase;
 import com.ning.billing.util.events.SubscriptionInternalEvent;
@@ -36,11 +37,11 @@ public abstract class DefaultSubscriptionEvent extends BusEventBase implements S
     private final UUID eventId;
     private final DateTime requestedTransitionTime;
     private final DateTime effectiveTransitionTime;
-    private final SubscriptionState previousState;
+    private final EntitlementState previousState;
     private final String previousPriceList;
     private final String previousPlan;
     private final String previousPhase;
-    private final SubscriptionState nextState;
+    private final EntitlementState nextState;
     private final String nextPriceList;
     private final String nextPlan;
     private final String nextPhase;
@@ -80,11 +81,11 @@ public abstract class DefaultSubscriptionEvent extends BusEventBase implements S
                                     @JsonProperty("bundleId") final UUID bundleId,
                                     @JsonProperty("requestedTransitionTime") final DateTime requestedTransitionTime,
                                     @JsonProperty("effectiveTransitionTime") final DateTime effectiveTransitionTime,
-                                    @JsonProperty("previousState") final SubscriptionState previousState,
+                                    @JsonProperty("previousState") final EntitlementState previousState,
                                     @JsonProperty("previousPlan") final String previousPlan,
                                     @JsonProperty("previousPhase") final String previousPhase,
                                     @JsonProperty("previousPriceList") final String previousPriceList,
-                                    @JsonProperty("nextState") final SubscriptionState nextState,
+                                    @JsonProperty("nextState") final EntitlementState nextState,
                                     @JsonProperty("nextPlan") final String nextPlan,
                                     @JsonProperty("nextPhase") final String nextPhase,
                                     @JsonProperty("nextPriceList") final String nextPriceList,
@@ -138,7 +139,7 @@ public abstract class DefaultSubscriptionEvent extends BusEventBase implements S
     }
 
     @Override
-    public SubscriptionState getPreviousState() {
+    public EntitlementState getPreviousState() {
         return previousState;
     }
 
@@ -163,7 +164,7 @@ public abstract class DefaultSubscriptionEvent extends BusEventBase implements S
     }
 
     @Override
-    public SubscriptionState getNextState() {
+    public EntitlementState getNextState() {
         return nextState;
     }
 
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/user/SubscriptionBaseTransitionData.java b/subscription/src/main/java/com/ning/billing/subscription/api/user/SubscriptionBaseTransitionData.java
index 1e0be32..7216940 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/user/SubscriptionBaseTransitionData.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/user/SubscriptionBaseTransitionData.java
@@ -23,6 +23,7 @@ import org.joda.time.DateTime;
 import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
 import com.ning.billing.catalog.api.PriceList;
+import com.ning.billing.entitlement.api.Entitlement.EntitlementState;
 import com.ning.billing.subscription.api.SubscriptionBaseTransitionType;
 import com.ning.billing.subscription.events.SubscriptionBaseEvent.EventType;
 import com.ning.billing.subscription.events.user.ApiEventType;
@@ -37,7 +38,7 @@ public class SubscriptionBaseTransitionData implements SubscriptionBaseTransitio
     private final ApiEventType apiEventType;
     private final DateTime requestedTransitionTime;
     private final DateTime effectiveTransitionTime;
-    private final SubscriptionState previousState;
+    private final EntitlementState previousState;
     private final PriceList previousPriceList;
     private final UUID previousEventId;
     private final DateTime previousEventCreatedDate;
@@ -45,7 +46,7 @@ public class SubscriptionBaseTransitionData implements SubscriptionBaseTransitio
     private final PlanPhase previousPhase;
     private final UUID nextEventId;
     private final DateTime nextEventCreatedDate;
-    private final SubscriptionState nextState;
+    private final EntitlementState nextState;
     private final PriceList nextPriceList;
     private final Plan nextPlan;
     private final PlanPhase nextPhase;
@@ -62,13 +63,13 @@ public class SubscriptionBaseTransitionData implements SubscriptionBaseTransitio
                                           final DateTime effectiveTransitionTime,
                                           final UUID previousEventId,
                                           final DateTime previousEventCreatedDate,
-                                          final SubscriptionState previousState,
+                                          final EntitlementState previousState,
                                           final Plan previousPlan,
                                           final PlanPhase previousPhase,
                                           final PriceList previousPriceList,
                                           final UUID nextEventId,
                                           final DateTime nextEventCreatedDate,
-                                          final SubscriptionState nextState,
+                                          final EntitlementState nextState,
                                           final Plan nextPlan,
                                           final PlanPhase nextPhase,
                                           final PriceList nextPriceList,
@@ -147,7 +148,7 @@ public class SubscriptionBaseTransitionData implements SubscriptionBaseTransitio
     }
 
     @Override
-    public SubscriptionState getPreviousState() {
+    public EntitlementState getPreviousState() {
         return previousState;
     }
 
@@ -182,7 +183,7 @@ public class SubscriptionBaseTransitionData implements SubscriptionBaseTransitio
     }
 
     @Override
-    public SubscriptionState getNextState() {
+    public EntitlementState getNextState() {
         return nextState;
     }
 
diff --git a/subscription/src/main/java/com/ning/billing/subscription/engine/addon/AddonUtils.java b/subscription/src/main/java/com/ning/billing/subscription/engine/addon/AddonUtils.java
index 3687a05..e930644 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/engine/addon/AddonUtils.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/engine/addon/AddonUtils.java
@@ -23,6 +23,7 @@ import com.ning.billing.catalog.api.CatalogApiException;
 import com.ning.billing.catalog.api.CatalogService;
 import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.Product;
+import com.ning.billing.entitlement.api.Entitlement.EntitlementState;
 import com.ning.billing.subscription.api.user.DefaultSubscriptionBase;
 import com.ning.billing.subscription.exceptions.SubscriptionBaseError;
 import com.ning.billing.subscription.api.user.SubscriptionState;
@@ -41,7 +42,7 @@ public class AddonUtils {
     public void checkAddonCreationRights(final DefaultSubscriptionBase baseSubscription, final Plan targetAddOnPlan)
             throws SubscriptionBaseApiException, CatalogApiException {
 
-        if (baseSubscription.getState() != SubscriptionState.ACTIVE) {
+        if (baseSubscription.getState() != EntitlementState.ACTIVE) {
             throw new SubscriptionBaseApiException(ErrorCode.SUB_CREATE_AO_BP_NON_ACTIVE, targetAddOnPlan.getName());
         }
 
diff --git a/subscription/src/test/java/com/ning/billing/subscription/api/TestEventJson.java b/subscription/src/test/java/com/ning/billing/subscription/api/TestEventJson.java
index 38e42e3..8d1b4ad 100644
--- a/subscription/src/test/java/com/ning/billing/subscription/api/TestEventJson.java
+++ b/subscription/src/test/java/com/ning/billing/subscription/api/TestEventJson.java
@@ -23,6 +23,7 @@ import org.testng.Assert;
 import org.testng.annotations.Test;
 
 import com.ning.billing.GuicyKillbillTestSuiteNoDB;
+import com.ning.billing.entitlement.api.Entitlement.EntitlementState;
 import com.ning.billing.subscription.api.timeline.DefaultRepairSubscriptionEvent;
 import com.ning.billing.subscription.api.user.DefaultEffectiveSubscriptionEvent;
 import com.ning.billing.subscription.api.user.SubscriptionState;
@@ -38,7 +39,7 @@ public class TestEventJson extends GuicyKillbillTestSuiteNoDB {
     public void testSubscriptionEvent() throws Exception {
 
         final EffectiveSubscriptionInternalEvent e = new DefaultEffectiveSubscriptionEvent(UUID.randomUUID(), UUID.randomUUID(), UUID.randomUUID(), new DateTime(), new DateTime(),
-                                                                                           SubscriptionState.ACTIVE, "pro", "TRIAL", "DEFAULT", SubscriptionState.CANCELLED, null, null, null, 3L,
+                                                                                           EntitlementState.ACTIVE, "pro", "TRIAL", "DEFAULT", EntitlementState.CANCELLED, null, null, null, 3L,
                                                                                            SubscriptionBaseTransitionType.CANCEL, 0, new DateTime(), 1L, 2L, null);
 
         final String json = mapper.writeValueAsString(e);
diff --git a/subscription/src/test/java/com/ning/billing/subscription/api/transfer/TestTransfer.java b/subscription/src/test/java/com/ning/billing/subscription/api/transfer/TestTransfer.java
index fc165c3..0e16f92 100644
--- a/subscription/src/test/java/com/ning/billing/subscription/api/transfer/TestTransfer.java
+++ b/subscription/src/test/java/com/ning/billing/subscription/api/transfer/TestTransfer.java
@@ -31,6 +31,7 @@ import com.ning.billing.catalog.api.PhaseType;
 import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PriceListSet;
 import com.ning.billing.catalog.api.Product;
+import com.ning.billing.entitlement.api.Entitlement.EntitlementState;
 import com.ning.billing.subscription.SubscriptionTestSuiteWithEmbeddedDB;
 import com.ning.billing.subscription.api.migration.SubscriptionBaseMigrationApi.AccountMigration;
 import com.ning.billing.subscription.api.migration.SubscriptionBaseMigrationApiException;
@@ -97,7 +98,7 @@ public class TestTransfer extends SubscriptionTestSuiteWithEmbeddedDB {
             assertTrue(testListener.isCompleted(3000));
 
             final SubscriptionBase oldBaseSubscription = subscriptionInternalApi.getBaseSubscription(bundle.getId(), internalCallContext);
-            assertTrue(oldBaseSubscription.getState() == SubscriptionState.CANCELLED);
+            assertTrue(oldBaseSubscription.getState() == EntitlementState.CANCELLED);
             // The MIGRATE_BILLING event should have been invalidated
             assertEquals(subscriptionInternalApi.getBillingTransitions(oldBaseSubscription, internalCallContext).size(), 0);
             //assertEquals(subscriptionInternalApi.getBillingTransitions(oldBaseSubscription, internalCallContext).get(0).getTransitionType(), SubscriptionBaseTransitionType.CANCEL);
diff --git a/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiCancel.java b/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiCancel.java
index 6c610d3..40b6335 100644
--- a/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiCancel.java
+++ b/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiCancel.java
@@ -59,10 +59,10 @@ public class TestUserApiCancel extends SubscriptionTestSuiteWithEmbeddedDB {
             final DateTime future = clock.getUTCNow();
             testListener.pushExpectedEvent(NextEvent.CANCEL);
 
-            assertEquals(subscription.getLastActiveProductName(), prod);
-            assertEquals(subscription.getLastActivePriceListName(), planSet);
+            assertEquals(subscription.getLastActiveProduct(), prod);
+            assertEquals(subscription.getLastActivePriceList(), planSet);
             assertEquals(subscription.getLastActiveBillingPeriod(), term.toString());
-            assertEquals(subscription.getLastActiveCategoryName(), "BASE");
+            assertEquals(subscription.getLastActiveCategory(), "BASE");
 
 
             // CANCEL in trial period to get IMM policy
@@ -70,10 +70,10 @@ public class TestUserApiCancel extends SubscriptionTestSuiteWithEmbeddedDB {
             currentPhase = subscription.getCurrentPhase();
             testListener.isCompleted(3000);
 
-            assertEquals(subscription.getLastActiveProductName(), prod);
-            assertEquals(subscription.getLastActivePriceListName(), planSet);
+            assertEquals(subscription.getLastActiveProduct(), prod);
+            assertEquals(subscription.getLastActivePriceList(), planSet);
             assertEquals(subscription.getLastActiveBillingPeriod(), term.toString());
-            assertEquals(subscription.getLastActiveCategoryName(), "BASE");
+            assertEquals(subscription.getLastActiveCategory(), "BASE");
 
 
             assertNull(currentPhase);
@@ -116,10 +116,10 @@ public class TestUserApiCancel extends SubscriptionTestSuiteWithEmbeddedDB {
             subscriptionInternalApi.setChargedThroughDate(subscription.getId(), newChargedThroughDate, internalCallContext);
             subscription = (DefaultSubscriptionBase) subscriptionInternalApi.getSubscriptionFromId(subscription.getId(), internalCallContext);
 
-            assertEquals(subscription.getLastActiveProductName(), prod);
-            assertEquals(subscription.getLastActivePriceListName(), planSet);
+            assertEquals(subscription.getLastActiveProduct(), prod);
+            assertEquals(subscription.getLastActivePriceList(), planSet);
             assertEquals(subscription.getLastActiveBillingPeriod(), term.toString());
-            assertEquals(subscription.getLastActiveCategoryName(), "BASE");
+            assertEquals(subscription.getLastActiveCategory(), "BASE");
 
             // CANCEL
             testListener.setNonExpectedMode();
@@ -129,10 +129,10 @@ public class TestUserApiCancel extends SubscriptionTestSuiteWithEmbeddedDB {
             testListener.reset();
 
 
-            assertEquals(subscription.getLastActiveProductName(), prod);
-            assertEquals(subscription.getLastActivePriceListName(), planSet);
+            assertEquals(subscription.getLastActiveProduct(), prod);
+            assertEquals(subscription.getLastActivePriceList(), planSet);
             assertEquals(subscription.getLastActiveBillingPeriod(), term.toString());
-            assertEquals(subscription.getLastActiveCategoryName(), "BASE");
+            assertEquals(subscription.getLastActiveCategory(), "BASE");
 
             final DateTime futureEndDate = subscription.getFutureEndDate();
             Assert.assertNotNull(futureEndDate);
@@ -150,10 +150,10 @@ public class TestUserApiCancel extends SubscriptionTestSuiteWithEmbeddedDB {
             assertNull(currentPhase);
             testUtil.checkNextPhaseChange(subscription, 0, null);
 
-            assertEquals(subscription.getLastActiveProductName(), prod);
-            assertEquals(subscription.getLastActivePriceListName(), planSet);
+            assertEquals(subscription.getLastActiveProduct(), prod);
+            assertEquals(subscription.getLastActivePriceList(), planSet);
             assertEquals(subscription.getLastActiveBillingPeriod(), term.toString());
-            assertEquals(subscription.getLastActiveCategoryName(), "BASE");
+            assertEquals(subscription.getLastActiveCategory(), "BASE");
 
 
             assertListenerStatus();
diff --git a/util/src/main/java/com/ning/billing/util/events/SubscriptionInternalEvent.java b/util/src/main/java/com/ning/billing/util/events/SubscriptionInternalEvent.java
index 1a2a0c4..2d71d09 100644
--- a/util/src/main/java/com/ning/billing/util/events/SubscriptionInternalEvent.java
+++ b/util/src/main/java/com/ning/billing/util/events/SubscriptionInternalEvent.java
@@ -20,6 +20,7 @@ import java.util.UUID;
 
 import org.joda.time.DateTime;
 
+import com.ning.billing.entitlement.api.Entitlement.EntitlementState;
 import com.ning.billing.subscription.api.SubscriptionBaseTransitionType;
 import com.ning.billing.subscription.api.user.SubscriptionState;
 
@@ -38,7 +39,7 @@ public interface SubscriptionInternalEvent extends BusInternalEvent {
 
     DateTime getEffectiveTransitionTime();
 
-    SubscriptionState getPreviousState();
+    EntitlementState getPreviousState();
 
     String getPreviousPlan();
 
@@ -50,7 +51,7 @@ public interface SubscriptionInternalEvent extends BusInternalEvent {
 
     String getNextPhase();
 
-    SubscriptionState getNextState();
+    EntitlementState getNextState();
 
     String getNextPriceList();
 
diff --git a/util/src/main/java/com/ning/billing/util/svcapi/junction/DefaultBlockingState.java b/util/src/main/java/com/ning/billing/util/svcapi/junction/DefaultBlockingState.java
index e345e44..a340815 100644
--- a/util/src/main/java/com/ning/billing/util/svcapi/junction/DefaultBlockingState.java
+++ b/util/src/main/java/com/ning/billing/util/svcapi/junction/DefaultBlockingState.java
@@ -57,8 +57,8 @@ public class DefaultBlockingState extends EntityBase implements BlockingState {
                                 final boolean blockChange,
                                 final boolean blockEntitlement,
                                 final boolean blockBilling,
-                                final DateTime timestamp,
-                                final DateTime createDate) {
+                                final DateTime createDate,
+                                final DateTime updatedDate) {
         super(id, createDate, null);
         this.blockingId = blockingId;
         this.type = type;
@@ -67,7 +67,7 @@ public class DefaultBlockingState extends EntityBase implements BlockingState {
         this.blockChange = blockChange;
         this.blockEntitlement = blockEntitlement;
         this.blockBilling = blockBilling;
-        this.timestamp = timestamp;
+        this.timestamp = updatedDate;
     }
 
     public DefaultBlockingState(final UUID blockingId,
diff --git a/util/src/test/java/com/ning/billing/mock/MockEffectiveSubscriptionEvent.java b/util/src/test/java/com/ning/billing/mock/MockEffectiveSubscriptionEvent.java
index 40c80e1..4658e5a 100644
--- a/util/src/test/java/com/ning/billing/mock/MockEffectiveSubscriptionEvent.java
+++ b/util/src/test/java/com/ning/billing/mock/MockEffectiveSubscriptionEvent.java
@@ -20,6 +20,7 @@ import java.util.UUID;
 
 import org.joda.time.DateTime;
 
+import com.ning.billing.entitlement.api.Entitlement.EntitlementState;
 import com.ning.billing.subscription.api.SubscriptionBaseTransitionType;
 import com.ning.billing.subscription.api.user.SubscriptionState;
 import com.ning.billing.util.events.BusEventBase;
@@ -37,11 +38,11 @@ public class MockEffectiveSubscriptionEvent extends BusEventBase implements Effe
     private final UUID eventId;
     private final DateTime requestedTransitionTime;
     private final DateTime effectiveTransitionTime;
-    private final SubscriptionState previousState;
+    private final EntitlementState previousState;
     private final String previousPriceList;
     private final String previousPlan;
     private final String previousPhase;
-    private final SubscriptionState nextState;
+    private final EntitlementState nextState;
     private final String nextPriceList;
     private final String nextPlan;
     private final String nextPhase;
@@ -57,11 +58,11 @@ public class MockEffectiveSubscriptionEvent extends BusEventBase implements Effe
                                           @JsonProperty("bundleId") final UUID bundleId,
                                           @JsonProperty("requestedTransitionTime") final DateTime requestedTransitionTime,
                                           @JsonProperty("effectiveTransitionTime") final DateTime effectiveTransitionTime,
-                                          @JsonProperty("previousState") final SubscriptionState previousState,
+                                          @JsonProperty("previousState") final EntitlementState previousState,
                                           @JsonProperty("previousPlan") final String previousPlan,
                                           @JsonProperty("previousPhase") final String previousPhase,
                                           @JsonProperty("previousPriceList") final String previousPriceList,
-                                          @JsonProperty("nextState") final SubscriptionState nextState,
+                                          @JsonProperty("nextState") final EntitlementState nextState,
                                           @JsonProperty("nextPlan") final String nextPlan,
                                           @JsonProperty("nextPhase") final String nextPhase,
                                           @JsonProperty("nextPriceList") final String nextPriceList,
@@ -117,7 +118,7 @@ public class MockEffectiveSubscriptionEvent extends BusEventBase implements Effe
 
 
     @Override
-    public SubscriptionState getPreviousState() {
+    public EntitlementState getPreviousState() {
         return previousState;
     }
 
@@ -142,7 +143,7 @@ public class MockEffectiveSubscriptionEvent extends BusEventBase implements Effe
     }
 
     @Override
-    public SubscriptionState getNextState() {
+    public EntitlementState getNextState() {
         return nextState;
     }
 
diff --git a/util/src/test/java/com/ning/billing/mock/MockSubscription.java b/util/src/test/java/com/ning/billing/mock/MockSubscription.java
index 6233101..eafc219 100644
--- a/util/src/test/java/com/ning/billing/mock/MockSubscription.java
+++ b/util/src/test/java/com/ning/billing/mock/MockSubscription.java
@@ -29,12 +29,13 @@ import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
 import com.ning.billing.catalog.api.PlanPhaseSpecifier;
 import com.ning.billing.catalog.api.PriceList;
+import com.ning.billing.catalog.api.Product;
 import com.ning.billing.catalog.api.ProductCategory;
+import com.ning.billing.entitlement.api.Entitlement.EntitlementSourceType;
+import com.ning.billing.entitlement.api.Entitlement.EntitlementState;
 import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
 import com.ning.billing.subscription.api.SubscriptionBase;
 import com.ning.billing.subscription.api.user.SubscriptionBaseTransition;
-import com.ning.billing.subscription.api.user.SubscriptionSourceType;
-import com.ning.billing.subscription.api.user.SubscriptionState;
 import com.ning.billing.entitlement.api.BlockingState;
 import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
@@ -45,7 +46,7 @@ public class MockSubscription implements SubscriptionBase {
 
     private final UUID id;
     private final UUID bundleId;
-    private final SubscriptionState state;
+    private final EntitlementState state;
     private Plan plan;
     private final PlanPhase phase;
     private final DateTime startDate;
@@ -54,14 +55,14 @@ public class MockSubscription implements SubscriptionBase {
     public MockSubscription(final UUID id, final UUID bundleId, final Plan plan, final DateTime startDate, final List<EffectiveSubscriptionInternalEvent> transitions) {
         this.id = id;
         this.bundleId = bundleId;
-        this.state = SubscriptionState.ACTIVE;
+        this.state = EntitlementState.ACTIVE;
         this.plan = plan;
         this.phase = null;
         this.startDate = startDate;
         this.transitions = transitions;
     }
 
-    public MockSubscription(final SubscriptionState state, final Plan plan, final PlanPhase phase) {
+    public MockSubscription(final EntitlementState state, final Plan plan, final PlanPhase phase) {
         this.id = UUID.randomUUID();
         this.bundleId = UUID.randomUUID();
         this.state = state;
@@ -129,7 +130,7 @@ public class MockSubscription implements SubscriptionBase {
     }
 
     @Override
-    public SubscriptionState getState() {
+    public EntitlementState getState() {
         return state;
     }
 
@@ -184,27 +185,27 @@ public class MockSubscription implements SubscriptionBase {
     }
 
     @Override
-    public SubscriptionSourceType getSourceType() {
+    public EntitlementSourceType getSourceType() {
         return sub.getSourceType();
     }
 
     @Override
-    public String getLastActiveProductName() {
-        return sub.getLastActiveProductName();
+    public Product getLastActiveProduct() {
+        return sub.getLastActiveProduct();
     }
 
     @Override
-    public String getLastActivePriceListName() {
-        return sub.getLastActivePriceListName();
+    public PriceList getLastActivePriceList() {
+        return sub.getLastActivePriceList();
     }
 
     @Override
-    public String getLastActiveCategoryName() {
-        return sub.getLastActiveCategoryName();
+    public ProductCategory getLastActiveCategory() {
+        return sub.getLastActiveCategory();
     }
 
     @Override
-    public String getLastActiveBillingPeriod() {
+    public BillingPeriod getLastActiveBillingPeriod() {
         return null;
     }