killbill-aplcache

Changes

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 e2ab37a..6595dd6 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
@@ -5,7 +5,7 @@ import java.util.UUID;
 
 import org.joda.time.DateTime;
 
-import com.ning.billing.catalog.api.ActionPolicy;
+import com.ning.billing.catalog.api.BillingActionPolicy;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
@@ -13,10 +13,10 @@ import com.ning.billing.catalog.api.PlanPhaseSpecifier;
 import com.ning.billing.catalog.api.PriceList;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.entitlement.api.Blockable;
+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.subscription.api.user.SubscriptionTransition;
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
 import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.entity.Entity;
 
@@ -24,23 +24,23 @@ public interface SubscriptionBase extends Entity, Blockable {
 
 
     public boolean cancel(final DateTime requestedDate, final CallContext context)
-            throws SubscriptionUserApiException;
+            throws SubscriptionBaseApiException;
 
-    public boolean cancelWithPolicy(final DateTime requestedDate, final ActionPolicy policy, final CallContext context)
-            throws SubscriptionUserApiException;
+    public boolean cancelWithPolicy(final DateTime requestedDate, final BillingActionPolicy policy, final CallContext context)
+            throws SubscriptionBaseApiException;
 
     public boolean uncancel(final CallContext context)
-            throws SubscriptionUserApiException;
+            throws SubscriptionBaseApiException;
 
     public boolean changePlan(final String productName, final BillingPeriod term, final String priceList, final DateTime requestedDate, final CallContext context)
-            throws SubscriptionUserApiException;
+            throws SubscriptionBaseApiException;
 
     public boolean changePlanWithPolicy(final String productName, final BillingPeriod term, final String priceList, final DateTime requestedDate,
-                                        final ActionPolicy policy, final CallContext context)
-            throws SubscriptionUserApiException;
+                                        final BillingActionPolicy policy, final CallContext context)
+            throws SubscriptionBaseApiException;
 
     public boolean recreate(final PlanPhaseSpecifier spec, final DateTime requestedDate, final CallContext context)
-            throws SubscriptionUserApiException;
+            throws SubscriptionBaseApiException;
 
     public UUID getBundleId();
 
@@ -76,9 +76,9 @@ public interface SubscriptionBase extends Entity, Blockable {
 
     public ProductCategory getCategory();
 
-    public SubscriptionTransition getPendingTransition();
+    public SubscriptionBaseTransition getPendingTransition();
 
-    public SubscriptionTransition getPreviousTransition();
+    public SubscriptionBaseTransition getPreviousTransition();
 
-    public List<SubscriptionTransition> getAllTransitions();
+    public List<SubscriptionBaseTransition> getAllTransitions();
 }
diff --git a/api/src/main/java/com/ning/billing/subscription/api/timeline/SubscriptionRepairException.java b/api/src/main/java/com/ning/billing/subscription/api/timeline/SubscriptionRepairException.java
index 0c949ab..4424e69 100644
--- a/api/src/main/java/com/ning/billing/subscription/api/timeline/SubscriptionRepairException.java
+++ b/api/src/main/java/com/ning/billing/subscription/api/timeline/SubscriptionRepairException.java
@@ -19,13 +19,13 @@ package com.ning.billing.subscription.api.timeline;
 import com.ning.billing.BillingExceptionBase;
 import com.ning.billing.ErrorCode;
 import com.ning.billing.catalog.api.CatalogApiException;
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
+import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
 
 public class SubscriptionRepairException extends BillingExceptionBase {
 
     private static final long serialVersionUID = 19067233L;
 
-    public SubscriptionRepairException(final SubscriptionUserApiException e) {
+    public SubscriptionRepairException(final SubscriptionBaseApiException e) {
         super(e, e.getCode(), e.getMessage());
     }
 
diff --git a/api/src/main/java/com/ning/billing/subscription/api/user/Subscription.java b/api/src/main/java/com/ning/billing/subscription/api/user/Subscription.java
index 15ac615..8feaf20 100644
--- a/api/src/main/java/com/ning/billing/subscription/api/user/Subscription.java
+++ b/api/src/main/java/com/ning/billing/subscription/api/user/Subscription.java
@@ -21,7 +21,7 @@ import java.util.UUID;
 
 import org.joda.time.DateTime;
 
-import com.ning.billing.catalog.api.ActionPolicy;
+import com.ning.billing.catalog.api.BillingActionPolicy;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
@@ -35,23 +35,23 @@ import com.ning.billing.util.entity.Entity;
 public interface Subscription extends Entity, Blockable {
 
     public boolean cancel(final DateTime requestedDate, final CallContext context)
-            throws SubscriptionUserApiException;
+            throws SubscriptionBaseApiException;
 
-    public boolean cancelWithPolicy(final DateTime requestedDate, final ActionPolicy policy, final CallContext context)
-            throws SubscriptionUserApiException;
+    public boolean cancelWithPolicy(final DateTime requestedDate, final BillingActionPolicy policy, final CallContext context)
+            throws SubscriptionBaseApiException;
 
     public boolean uncancel(final CallContext context)
-            throws SubscriptionUserApiException;
+            throws SubscriptionBaseApiException;
 
     public boolean changePlan(final String productName, final BillingPeriod term, final String priceList, final DateTime requestedDate, final CallContext context)
-            throws SubscriptionUserApiException;
+            throws SubscriptionBaseApiException;
 
     public boolean changePlanWithPolicy(final String productName, final BillingPeriod term, final String priceList, final DateTime requestedDate,
-                                        final ActionPolicy policy, final CallContext context)
-            throws SubscriptionUserApiException;
+                                        final BillingActionPolicy policy, final CallContext context)
+            throws SubscriptionBaseApiException;
 
     public boolean recreate(final PlanPhaseSpecifier spec, final DateTime requestedDate, final CallContext context)
-            throws SubscriptionUserApiException;
+            throws SubscriptionBaseApiException;
 
     public UUID getBundleId();
 
@@ -87,9 +87,9 @@ public interface Subscription extends Entity, Blockable {
 
     public ProductCategory getCategory();
 
-    public SubscriptionTransition getPendingTransition();
+    public SubscriptionBaseTransition getPendingTransition();
 
-    public SubscriptionTransition getPreviousTransition();
+    public SubscriptionBaseTransition getPreviousTransition();
 
-    public List<SubscriptionTransition> getAllTransitions();
+    public List<SubscriptionBaseTransition> getAllTransitions();
 }
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestCustomFieldApi.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestCustomFieldApi.java
index 5d1c8f3..a3f4003 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestCustomFieldApi.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestCustomFieldApi.java
@@ -29,14 +29,11 @@ import com.ning.billing.ObjectType;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.api.TestApiListener.NextEvent;
 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.api.DefaultEntitlement;
-import com.ning.billing.subscription.api.user.SubscriptionData;
+import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
 import com.ning.billing.invoice.api.Invoice;
-import com.ning.billing.subscription.api.user.SubscriptionBundle;
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
 import com.ning.billing.util.api.CustomFieldApiException;
 import com.ning.billing.util.api.CustomFieldUserApi;
 import com.ning.billing.util.customfield.CustomField;
@@ -80,7 +77,7 @@ public class TestCustomFieldApi extends TestIntegrationBase {
 
 
     @Test(groups = "slow")
-    public void testCustomFieldForInvoice() throws CustomFieldApiException, SubscriptionUserApiException {
+    public void testCustomFieldForInvoice() throws CustomFieldApiException, SubscriptionBaseApiException {
 
         //
         // Create necessary logic to end up with an Invoice object on that account.
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationBase.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationBase.java
index e47d93c..70f2f4d 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationBase.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationBase.java
@@ -54,7 +54,7 @@ import com.ning.billing.beatrix.util.PaymentChecker;
 import com.ning.billing.beatrix.util.RefundChecker;
 import com.ning.billing.beatrix.util.SubscriptionChecker;
 import com.ning.billing.bus.api.PersistentBus;
-import com.ning.billing.catalog.api.ActionPolicy;
+import com.ning.billing.catalog.api.BillingActionPolicy;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.catalog.api.PlanPhaseSpecifier;
@@ -525,7 +525,7 @@ public class TestIntegrationBase extends BeatrixTestSuiteWithEmbeddedDB implemen
     protected DefaultEntitlement changeEntitlementAndCheckForCompletion(final Entitlement entitlement,
                                                                         final String productName,
                                                                         final BillingPeriod billingPeriod,
-                                                                        final ActionPolicy billingPolicy,
+                                                                        final BillingActionPolicy billingPolicy,
                                                                         final NextEvent... events) {
         return (DefaultEntitlement) doCallAndCheckForCompletion(new Function<Void, Entitlement>() {
             @Override
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationInvoiceWithRepairLogic.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationInvoiceWithRepairLogic.java
index 9243b2a..cff123b 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationInvoiceWithRepairLogic.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestIntegrationInvoiceWithRepairLogic.java
@@ -33,7 +33,7 @@ import com.ning.billing.account.api.Account;
 import com.ning.billing.api.TestApiListener.NextEvent;
 import com.ning.billing.beatrix.util.InvoiceChecker.ExpectedInvoiceItemCheck;
 import com.ning.billing.beatrix.util.PaymentChecker.ExpectedPaymentCheck;
-import com.ning.billing.catalog.api.ActionPolicy;
+import com.ning.billing.catalog.api.BillingActionPolicy;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.catalog.api.PriceListSet;
@@ -138,7 +138,7 @@ public class TestIntegrationInvoiceWithRepairLogic extends TestIntegrationBase {
         //
         // Force a plan change
         //
-        changeEntitlementAndCheckForCompletion(bpEntitlement, "Blowdart", term, ActionPolicy.IMMEDIATE, NextEvent.CHANGE, NextEvent.INVOICE, NextEvent.INVOICE_ADJUSTMENT);
+        changeEntitlementAndCheckForCompletion(bpEntitlement, "Blowdart", term, BillingActionPolicy.IMMEDIATE, NextEvent.CHANGE, NextEvent.INVOICE, NextEvent.INVOICE_ADJUSTMENT);
 
         invoices = invoiceUserApi.getInvoicesByAccount(account.getId(), callContext);
         assertEquals(invoices.size(), 3);
@@ -196,7 +196,7 @@ public class TestIntegrationInvoiceWithRepairLogic extends TestIntegrationBase {
         //
         // Change plan in trial - there is no repair
         //
-        changeEntitlementAndCheckForCompletion(bpEntitlement, "Assault-Rifle", term, ActionPolicy.IMMEDIATE, NextEvent.CHANGE, NextEvent.INVOICE);
+        changeEntitlementAndCheckForCompletion(bpEntitlement, "Assault-Rifle", term, BillingActionPolicy.IMMEDIATE, NextEvent.CHANGE, NextEvent.INVOICE);
 
         invoices = invoiceUserApi.getInvoicesByAccount(account.getId(), callContext);
         assertEquals(invoices.size(), 2);
@@ -238,7 +238,7 @@ public class TestIntegrationInvoiceWithRepairLogic extends TestIntegrationBase {
         //
         // Move the clock to 2012-05-07
         clock.addDays(5);
-        changeEntitlementAndCheckForCompletion(bpEntitlement, "Blowdart", term, ActionPolicy.IMMEDIATE, NextEvent.CHANGE, NextEvent.INVOICE, NextEvent.INVOICE_ADJUSTMENT);
+        changeEntitlementAndCheckForCompletion(bpEntitlement, "Blowdart", term, BillingActionPolicy.IMMEDIATE, NextEvent.CHANGE, NextEvent.INVOICE, NextEvent.INVOICE_ADJUSTMENT);
 
         invoices = invoiceUserApi.getInvoicesByAccount(account.getId(), callContext);
         assertEquals(invoices.size(), 4);
@@ -267,7 +267,7 @@ public class TestIntegrationInvoiceWithRepairLogic extends TestIntegrationBase {
         //
         // Move the clock to 2012-05-08
         clock.addDays(1);
-        changeEntitlementAndCheckForCompletion(bpEntitlement, "Pistol", term, ActionPolicy.IMMEDIATE, NextEvent.CHANGE, NextEvent.INVOICE, NextEvent.INVOICE_ADJUSTMENT);
+        changeEntitlementAndCheckForCompletion(bpEntitlement, "Pistol", term, BillingActionPolicy.IMMEDIATE, NextEvent.CHANGE, NextEvent.INVOICE, NextEvent.INVOICE_ADJUSTMENT);
 
         invoices = invoiceUserApi.getInvoicesByAccount(account.getId(), callContext);
         assertEquals(invoices.size(), 5);
@@ -429,7 +429,7 @@ public class TestIntegrationInvoiceWithRepairLogic extends TestIntegrationBase {
         //
         // FORCE AN IMMEDIATE CHANGE OF THE BILLING PERIOD
         //
-        bpEntitlement = changeEntitlementAndCheckForCompletion(bpEntitlement, productName, term, ActionPolicy.IMMEDIATE, NextEvent.CHANGE, NextEvent.INVOICE, NextEvent.INVOICE_ADJUSTMENT);
+        bpEntitlement = changeEntitlementAndCheckForCompletion(bpEntitlement, productName, term, BillingActionPolicy.IMMEDIATE, NextEvent.CHANGE, NextEvent.INVOICE, NextEvent.INVOICE_ADJUSTMENT);
 
         assertEquals(bpEntitlement.getSubscription().getCurrentPlan().getBillingPeriod(), BillingPeriod.MONTHLY);
 
@@ -543,7 +543,7 @@ public class TestIntegrationInvoiceWithRepairLogic extends TestIntegrationBase {
         //
         // FORCE AN IMMEDIATE CHANGE OF THE BILLING PERIOD
         //
-        changeEntitlementAndCheckForCompletion(bpEntitlement, productName, BillingPeriod.MONTHLY, ActionPolicy.IMMEDIATE, NextEvent.CHANGE, NextEvent.INVOICE, NextEvent.INVOICE_ADJUSTMENT);
+        changeEntitlementAndCheckForCompletion(bpEntitlement, productName, BillingPeriod.MONTHLY, BillingActionPolicy.IMMEDIATE, NextEvent.CHANGE, NextEvent.INVOICE, NextEvent.INVOICE_ADJUSTMENT);
 
         assertTrue(busHandler.isCompleted(DELAY));
         assertListenerStatus();
@@ -676,7 +676,7 @@ public class TestIntegrationInvoiceWithRepairLogic extends TestIntegrationBase {
         //
         // FORCE AN IMMEDIATE CHANGE OF THE BILLING PERIOD
         //
-        changeEntitlementAndCheckForCompletion(bpEntitlement, productName, BillingPeriod.MONTHLY, ActionPolicy.IMMEDIATE, NextEvent.CHANGE, NextEvent.INVOICE, NextEvent.INVOICE_ADJUSTMENT);
+        changeEntitlementAndCheckForCompletion(bpEntitlement, productName, BillingPeriod.MONTHLY, BillingActionPolicy.IMMEDIATE, NextEvent.CHANGE, NextEvent.INVOICE, NextEvent.INVOICE_ADJUSTMENT);
 
         invoices = invoiceUserApi.getInvoicesByAccount(account.getId(), callContext);
         assertEquals(invoices.size(), 3);
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestSubscription.java b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestSubscription.java
index a6e8096..81a1e52 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestSubscription.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/integration/TestSubscription.java
@@ -26,7 +26,7 @@ import org.testng.annotations.Test;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.api.TestApiListener.NextEvent;
 import com.ning.billing.beatrix.util.InvoiceChecker.ExpectedInvoiceItemCheck;
-import com.ning.billing.catalog.api.ActionPolicy;
+import com.ning.billing.catalog.api.BillingActionPolicy;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.PlanPhaseSpecifier;
 import com.ning.billing.catalog.api.PriceListSet;
@@ -84,7 +84,7 @@ public class TestSubscription extends TestIntegrationBase {
         //
         // FORCE AN IMMEDIATE CHANGE OF THE BILLING PERIOD
         //
-        changeEntitlementAndCheckForCompletion(bpEntitlement, productName, BillingPeriod.MONTHLY, ActionPolicy.IMMEDIATE, NextEvent.CHANGE, NextEvent.INVOICE, NextEvent.INVOICE_ADJUSTMENT);
+        changeEntitlementAndCheckForCompletion(bpEntitlement, productName, BillingPeriod.MONTHLY, BillingActionPolicy.IMMEDIATE, NextEvent.CHANGE, NextEvent.INVOICE, NextEvent.INVOICE_ADJUSTMENT);
 
         invoices = invoiceUserApi.getInvoicesByAccount(account.getId(), callContext);
         assertEquals(invoices.size(), 3);
@@ -103,7 +103,7 @@ public class TestSubscription extends TestIntegrationBase {
         //
         // FORCE ANOTHER CHANGE
         //
-        changeEntitlementAndCheckForCompletion(bpEntitlement, productName, BillingPeriod.ANNUAL, ActionPolicy.IMMEDIATE, NextEvent.CHANGE, NextEvent.INVOICE, NextEvent.INVOICE_ADJUSTMENT);
+        changeEntitlementAndCheckForCompletion(bpEntitlement, productName, BillingPeriod.ANNUAL, BillingActionPolicy.IMMEDIATE, NextEvent.CHANGE, NextEvent.INVOICE, NextEvent.INVOICE_ADJUSTMENT);
 
         invoices = invoiceUserApi.getInvoicesByAccount(account.getId(), callContext);
         assertEquals(invoices.size(), 4);
diff --git a/beatrix/src/test/java/com/ning/billing/beatrix/util/SubscriptionChecker.java b/beatrix/src/test/java/com/ning/billing/beatrix/util/SubscriptionChecker.java
index 4c1f57c..0e506f0 100644
--- a/beatrix/src/test/java/com/ning/billing/beatrix/util/SubscriptionChecker.java
+++ b/beatrix/src/test/java/com/ning/billing/beatrix/util/SubscriptionChecker.java
@@ -26,29 +26,29 @@ import org.slf4j.LoggerFactory;
 import org.testng.Assert;
 
 import com.ning.billing.subscription.api.SubscriptionBase;
+import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
+import com.ning.billing.subscription.api.user.SubscriptionBaseTransition;
 import com.ning.billing.subscription.api.user.SubscriptionBundle;
-import com.ning.billing.subscription.api.user.SubscriptionTransition;
-import com.ning.billing.subscription.api.user.SubscriptionTransitionData;
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
+import com.ning.billing.subscription.api.user.SubscriptionBaseTransitionData;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 
 public class SubscriptionChecker {
 
 
     private static final Logger log = LoggerFactory.getLogger(SubscriptionChecker.class);
 
-    private final SubscriptionInternalApi subscriptionApi;
+    private final SubscriptionBaseInternalApi subscriptionApi;
     private final AuditChecker auditChecker;
 
     @Inject
-    public SubscriptionChecker(final SubscriptionInternalApi subscriptionApi, final AuditChecker auditChecker) {
+    public SubscriptionChecker(final SubscriptionBaseInternalApi subscriptionApi, final AuditChecker auditChecker) {
         this.subscriptionApi = subscriptionApi;
         this.auditChecker = auditChecker;
     }
 
-    public SubscriptionBundle checkBundleNoAudits(final UUID bundleId, final UUID expectedAccountId, final String expectedKey, final InternalTenantContext context) throws SubscriptionUserApiException {
+    public SubscriptionBundle checkBundleNoAudits(final UUID bundleId, final UUID expectedAccountId, final String expectedKey, final InternalTenantContext context) throws SubscriptionBaseApiException {
         final SubscriptionBundle bundle = subscriptionApi.getBundleFromId(bundleId, context);
         Assert.assertNotNull(bundle);
         Assert.assertEquals(bundle.getAccountId(), expectedAccountId);
@@ -56,26 +56,26 @@ public class SubscriptionChecker {
         return bundle;
     }
 
-    public SubscriptionBundle checkBundleAuditUpdated(final UUID bundleId, final InternalCallContext context) throws SubscriptionUserApiException {
+    public SubscriptionBundle checkBundleAuditUpdated(final UUID bundleId, final InternalCallContext context) throws SubscriptionBaseApiException {
         final SubscriptionBundle bundle = subscriptionApi.getBundleFromId(bundleId, context);
         auditChecker.checkBundleUpdated(bundle.getId(), context.toCallContext());
         return bundle;
     }
 
-    public SubscriptionBase checkSubscriptionCreated(final UUID subscriptionId, final InternalCallContext context) throws SubscriptionUserApiException {
+    public SubscriptionBase checkSubscriptionCreated(final UUID subscriptionId, final InternalCallContext context) throws SubscriptionBaseApiException {
         final SubscriptionBase subscription = subscriptionApi.getSubscriptionFromId(subscriptionId, context);
         Assert.assertNotNull(subscription);
         auditChecker.checkSubscriptionCreated(subscription.getBundleId(), subscriptionId, context.toCallContext());
 
-        List<SubscriptionTransition> subscriptionEvents = getSubscriptionEvents(subscription);
+        List<SubscriptionBaseTransition> subscriptionEvents = getSubscriptionEvents(subscription);
         Assert.assertTrue(subscriptionEvents.size() >= 1);
-        auditChecker.checkSubscriptionEventCreated(subscription.getBundleId(), ((SubscriptionTransitionData) subscriptionEvents.get(0)).getId(), context.toCallContext());
+        auditChecker.checkSubscriptionEventCreated(subscription.getBundleId(), ((SubscriptionBaseTransitionData) subscriptionEvents.get(0)).getId(), context.toCallContext());
 
         auditChecker.checkBundleCreated(subscription.getBundleId(), context.toCallContext());
         return subscription;
     }
 
-    private List<SubscriptionTransition> getSubscriptionEvents(final SubscriptionBase subscription) {
+    private List<SubscriptionBaseTransition> getSubscriptionEvents(final SubscriptionBase subscription) {
         // STEPH_ENT
         return subscription.getAllTransitions();
     }
diff --git a/catalog/src/main/java/com/ning/billing/catalog/rules/CaseCancelPolicy.java b/catalog/src/main/java/com/ning/billing/catalog/rules/CaseCancelPolicy.java
index 73cab5b..839eea4 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/rules/CaseCancelPolicy.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/rules/CaseCancelPolicy.java
@@ -18,19 +18,19 @@ package com.ning.billing.catalog.rules;
 
 import javax.xml.bind.annotation.XmlElement;
 
-import com.ning.billing.catalog.api.ActionPolicy;
+import com.ning.billing.catalog.api.BillingActionPolicy;
 
-public class CaseCancelPolicy extends CasePhase<ActionPolicy> {
+public class CaseCancelPolicy extends CasePhase<BillingActionPolicy> {
 
     @XmlElement(required = true)
-    private ActionPolicy policy;
+    private BillingActionPolicy policy;
 
     @Override
-    protected ActionPolicy getResult() {
+    protected BillingActionPolicy getResult() {
         return policy;
     }
 
-    protected CaseCancelPolicy setPolicy(final ActionPolicy policy) {
+    protected CaseCancelPolicy setPolicy(final BillingActionPolicy policy) {
         this.policy = policy;
         return this;
     }
diff --git a/catalog/src/main/java/com/ning/billing/catalog/rules/CaseChangePlanPolicy.java b/catalog/src/main/java/com/ning/billing/catalog/rules/CaseChangePlanPolicy.java
index ef5d1f7..e9b06a9 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/rules/CaseChangePlanPolicy.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/rules/CaseChangePlanPolicy.java
@@ -19,20 +19,20 @@ package com.ning.billing.catalog.rules;
 import javax.xml.bind.annotation.XmlElement;
 import javax.xml.bind.annotation.XmlSeeAlso;
 
-import com.ning.billing.catalog.api.ActionPolicy;
+import com.ning.billing.catalog.api.BillingActionPolicy;
 
 @XmlSeeAlso(CaseChange.class)
-public class CaseChangePlanPolicy extends CaseChange<ActionPolicy> {
+public class CaseChangePlanPolicy extends CaseChange<BillingActionPolicy> {
 
     @XmlElement(required = true)
-    private ActionPolicy policy;
+    private BillingActionPolicy policy;
 
     @Override
-    protected ActionPolicy getResult() {
+    protected BillingActionPolicy getResult() {
         return policy;
     }
 
-    protected CaseChangePlanPolicy setPolicy(final ActionPolicy policy) {
+    protected CaseChangePlanPolicy setPolicy(final BillingActionPolicy policy) {
         this.policy = policy;
         return this;
     }
diff --git a/catalog/src/main/java/com/ning/billing/catalog/rules/PlanRules.java b/catalog/src/main/java/com/ning/billing/catalog/rules/PlanRules.java
index 0c6a7cf..f3dc6f9 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/rules/PlanRules.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/rules/PlanRules.java
@@ -23,7 +23,7 @@ import javax.xml.bind.annotation.XmlElementWrapper;
 
 import com.ning.billing.catalog.DefaultPriceList;
 import com.ning.billing.catalog.StandaloneCatalog;
-import com.ning.billing.catalog.api.ActionPolicy;
+import com.ning.billing.catalog.api.BillingActionPolicy;
 import com.ning.billing.catalog.api.BillingAlignment;
 import com.ning.billing.catalog.api.CatalogApiException;
 import com.ning.billing.catalog.api.IllegalPlanChange;
@@ -66,7 +66,7 @@ public class PlanRules extends ValidatingConfig<StandaloneCatalog> {
         return Case.getResult(createAlignmentCase, specifier, catalog);
     }
 
-    public ActionPolicy getPlanCancelPolicy(final PlanPhaseSpecifier planPhase, final StandaloneCatalog catalog) throws CatalogApiException {
+    public BillingActionPolicy getPlanCancelPolicy(final PlanPhaseSpecifier planPhase, final StandaloneCatalog catalog) throws CatalogApiException {
         return CasePhase.getResult(cancelCase, planPhase, catalog);
     }
 
@@ -83,8 +83,8 @@ public class PlanRules extends ValidatingConfig<StandaloneCatalog> {
             toPriceList = catalog.findCurrentPriceList(to.getPriceListName());
         }
 
-        final ActionPolicy policy = getPlanChangePolicy(from, to, catalog);
-        if (policy == ActionPolicy.ILLEGAL) {
+        final BillingActionPolicy policy = getPlanChangePolicy(from, to, catalog);
+        if (policy == BillingActionPolicy.ILLEGAL) {
             throw new IllegalPlanChange(from, to);
         }
 
@@ -98,12 +98,12 @@ public class PlanRules extends ValidatingConfig<StandaloneCatalog> {
         return CaseChange.getResult(changeAlignmentCase, from, to, catalog);
     }
 
-    public ActionPolicy getPlanChangePolicy(final PlanPhaseSpecifier from,
+    public BillingActionPolicy getPlanChangePolicy(final PlanPhaseSpecifier from,
                                             final PlanSpecifier to, final StandaloneCatalog catalog) throws CatalogApiException {
         if (from.getProductName().equals(to.getProductName()) &&
                 from.getBillingPeriod() == to.getBillingPeriod() &&
                 from.getPriceListName().equals(to.getPriceListName())) {
-            return ActionPolicy.ILLEGAL;
+            return BillingActionPolicy.ILLEGAL;
         }
         //Plan toPlan = catalog.findPlan()
 
diff --git a/catalog/src/main/java/com/ning/billing/catalog/StandaloneCatalog.java b/catalog/src/main/java/com/ning/billing/catalog/StandaloneCatalog.java
index f1488a3..b8c4234 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/StandaloneCatalog.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/StandaloneCatalog.java
@@ -29,7 +29,7 @@ import javax.xml.bind.annotation.XmlElementWrapper;
 import javax.xml.bind.annotation.XmlRootElement;
 
 import com.ning.billing.ErrorCode;
-import com.ning.billing.catalog.api.ActionPolicy;
+import com.ning.billing.catalog.api.BillingActionPolicy;
 import com.ning.billing.catalog.api.BillingAlignment;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.CatalogApiException;
@@ -221,7 +221,7 @@ public class StandaloneCatalog extends ValidatingConfig<StandaloneCatalog> imple
     //
     //////////////////////////////////////////////////////////////////////////////
     @Override
-    public ActionPolicy planChangePolicy(final PlanPhaseSpecifier from, final PlanSpecifier to) throws CatalogApiException {
+    public BillingActionPolicy planChangePolicy(final PlanPhaseSpecifier from, final PlanSpecifier to) throws CatalogApiException {
         return planRules.getPlanChangePolicy(from, to, this);
     }
 
@@ -231,7 +231,7 @@ public class StandaloneCatalog extends ValidatingConfig<StandaloneCatalog> imple
     }
 
     @Override
-    public ActionPolicy planCancelPolicy(final PlanPhaseSpecifier planPhase) throws CatalogApiException {
+    public BillingActionPolicy planCancelPolicy(final PlanPhaseSpecifier planPhase) throws CatalogApiException {
         return planRules.getPlanCancelPolicy(planPhase, this);
     }
 
diff --git a/catalog/src/main/java/com/ning/billing/catalog/VersionedCatalog.java b/catalog/src/main/java/com/ning/billing/catalog/VersionedCatalog.java
index af592d1..5bd2eb4 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/VersionedCatalog.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/VersionedCatalog.java
@@ -31,7 +31,7 @@ import javax.xml.bind.annotation.XmlRootElement;
 import org.joda.time.DateTime;
 
 import com.ning.billing.ErrorCode;
-import com.ning.billing.catalog.api.ActionPolicy;
+import com.ning.billing.catalog.api.BillingActionPolicy;
 import com.ning.billing.catalog.api.BillingAlignment;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.Catalog;
@@ -286,13 +286,13 @@ public class VersionedCatalog extends ValidatingConfig<StandaloneCatalog> implem
     // Rules
     //
     @Override
-    public ActionPolicy planChangePolicy(final PlanPhaseSpecifier from,
+    public BillingActionPolicy planChangePolicy(final PlanPhaseSpecifier from,
                                          final PlanSpecifier to, final DateTime requestedDate) throws CatalogApiException {
         return versionForDate(requestedDate).planChangePolicy(from, to);
     }
 
     @Override
-    public ActionPolicy planCancelPolicy(final PlanPhaseSpecifier planPhase, final DateTime requestedDate) throws CatalogApiException {
+    public BillingActionPolicy planCancelPolicy(final PlanPhaseSpecifier planPhase, final DateTime requestedDate) throws CatalogApiException {
         return versionForDate(requestedDate).planCancelPolicy(planPhase);
     }
 
@@ -406,7 +406,7 @@ public class VersionedCatalog extends ValidatingConfig<StandaloneCatalog> implem
     }
 
     @Override
-    public ActionPolicy planChangePolicy(final PlanPhaseSpecifier from,
+    public BillingActionPolicy planChangePolicy(final PlanPhaseSpecifier from,
                                          final PlanSpecifier to) throws CatalogApiException {
         return versionForDate(clock.getUTCNow()).planChangePolicy(from, to);
     }
@@ -418,7 +418,7 @@ public class VersionedCatalog extends ValidatingConfig<StandaloneCatalog> implem
     }
 
     @Override
-    public ActionPolicy planCancelPolicy(final PlanPhaseSpecifier planPhase)
+    public BillingActionPolicy planCancelPolicy(final PlanPhaseSpecifier planPhase)
             throws CatalogApiException {
         return versionForDate(clock.getUTCNow()).planCancelPolicy(planPhase);
     }
diff --git a/catalog/src/test/java/com/ning/billing/catalog/MockCatalog.java b/catalog/src/test/java/com/ning/billing/catalog/MockCatalog.java
index b51983e..71125ca 100644
--- a/catalog/src/test/java/com/ning/billing/catalog/MockCatalog.java
+++ b/catalog/src/test/java/com/ning/billing/catalog/MockCatalog.java
@@ -20,7 +20,7 @@ import java.util.Date;
 
 import org.joda.time.DateTime;
 
-import com.ning.billing.catalog.api.ActionPolicy;
+import com.ning.billing.catalog.api.BillingActionPolicy;
 import com.ning.billing.catalog.api.BillingAlignment;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.Catalog;
@@ -141,7 +141,7 @@ public class MockCatalog extends StandaloneCatalog implements Catalog {
     }
 
     @Override
-    public ActionPolicy planChangePolicy(final PlanPhaseSpecifier from, final PlanSpecifier to, final DateTime requestedDate)
+    public BillingActionPolicy planChangePolicy(final PlanPhaseSpecifier from, final PlanSpecifier to, final DateTime requestedDate)
             throws CatalogApiException {
         return planChangePolicy(from, to);
     }
@@ -153,7 +153,7 @@ public class MockCatalog extends StandaloneCatalog implements Catalog {
     }
 
     @Override
-    public ActionPolicy planCancelPolicy(final PlanPhaseSpecifier planPhase, final DateTime requestedDate)
+    public BillingActionPolicy planCancelPolicy(final PlanPhaseSpecifier planPhase, final DateTime requestedDate)
             throws CatalogApiException {
         return planCancelPolicy(planPhase);
     }
@@ -182,7 +182,7 @@ public class MockCatalog extends StandaloneCatalog implements Catalog {
     }
 
     @Override
-    public ActionPolicy planChangePolicy(final PlanPhaseSpecifier from, final PlanSpecifier to) throws CatalogApiException {
+    public BillingActionPolicy planChangePolicy(final PlanPhaseSpecifier from, final PlanSpecifier to) throws CatalogApiException {
         return super.planChangePolicy(from, to);
     }
 
@@ -193,7 +193,7 @@ public class MockCatalog extends StandaloneCatalog implements Catalog {
     }
 
     @Override
-    public ActionPolicy planCancelPolicy(final PlanPhaseSpecifier planPhase) throws CatalogApiException {
+    public BillingActionPolicy planCancelPolicy(final PlanPhaseSpecifier planPhase) throws CatalogApiException {
         return super.planCancelPolicy(planPhase);
     }
 
diff --git a/catalog/src/test/java/com/ning/billing/catalog/rules/TestPlanRules.java b/catalog/src/test/java/com/ning/billing/catalog/rules/TestPlanRules.java
index 3bae0a7..973ada8 100644
--- a/catalog/src/test/java/com/ning/billing/catalog/rules/TestPlanRules.java
+++ b/catalog/src/test/java/com/ning/billing/catalog/rules/TestPlanRules.java
@@ -25,7 +25,7 @@ import com.ning.billing.catalog.CatalogTestSuiteNoDB;
 import com.ning.billing.catalog.DefaultPriceList;
 import com.ning.billing.catalog.DefaultProduct;
 import com.ning.billing.catalog.MockCatalog;
-import com.ning.billing.catalog.api.ActionPolicy;
+import com.ning.billing.catalog.api.BillingActionPolicy;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.CatalogApiException;
 import com.ning.billing.catalog.api.IllegalPlanChange;
@@ -46,7 +46,7 @@ public class TestPlanRules extends CatalogTestSuiteNoDB {
 
         final DefaultPriceList priceList2 = cat.getPriceLists().getChildPriceLists()[0];
 
-        final CaseChangePlanPolicy casePolicy = new CaseChangePlanPolicy().setPolicy(ActionPolicy.END_OF_TERM);
+        final CaseChangePlanPolicy casePolicy = new CaseChangePlanPolicy().setPolicy(BillingActionPolicy.END_OF_TERM);
         final CaseChangePlanAlignment caseAlignment = new CaseChangePlanAlignment().setAlignment(PlanAlignmentChange.START_OF_SUBSCRIPTION);
         final CasePriceList casePriceList = new CasePriceList().setToPriceList(priceList2);
 
@@ -91,7 +91,7 @@ public class TestPlanRules extends CatalogTestSuiteNoDB {
             Assert.fail("", e);
         }
 
-        Assert.assertEquals(result.getPolicy(), ActionPolicy.END_OF_TERM);
+        Assert.assertEquals(result.getPolicy(), BillingActionPolicy.END_OF_TERM);
         Assert.assertEquals(result.getAlignment(), PlanAlignmentChange.START_OF_SUBSCRIPTION);
         Assert.assertEquals(result.getNewPriceList(), priceList1);
     }
@@ -115,7 +115,7 @@ public class TestPlanRules extends CatalogTestSuiteNoDB {
             Assert.fail("", e);
         }
 
-        Assert.assertEquals(result.getPolicy(), ActionPolicy.END_OF_TERM);
+        Assert.assertEquals(result.getPolicy(), BillingActionPolicy.END_OF_TERM);
         Assert.assertEquals(result.getAlignment(), PlanAlignmentChange.START_OF_SUBSCRIPTION);
         Assert.assertEquals(result.getNewPriceList(), priceList2);
     }
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 0ee3ee0..f3a163f 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
@@ -23,7 +23,7 @@ import org.joda.time.LocalDate;
 
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
-import com.ning.billing.catalog.api.ActionPolicy;
+import com.ning.billing.catalog.api.BillingActionPolicy;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
@@ -33,7 +33,7 @@ import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.clock.Clock;
 import com.ning.billing.entitlement.block.BlockingChecker;
 import com.ning.billing.subscription.api.SubscriptionBase;
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
+import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
 import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
@@ -66,24 +66,24 @@ public class DefaultEntitlement implements Entitlement {
         final DateTime requestedDate = fromLocalDateAndReferenceTime(localDate, subscription.getStartDate(), clock, context);
         try {
             return subscription.cancel(requestedDate, callContext);
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             throw new EntitlementApiException(e);
         }
     }
 
 
     @Override
-    public boolean cancelEntitlementWithPolicy(final EntitlementActionPolicy entitlementActionPolicy, final CallContext callContext) throws EntitlementApiException {
+    public boolean cancelEntitlementWithPolicy(final EntitlementActionPolicy entitlementBillingActionPolicy, final CallContext callContext) throws EntitlementApiException {
         return false;
     }
 
     @Override
-    public boolean cancelEntitlementWithDateOverrideBillingPolicy(final LocalDate effectiveDate, final ActionPolicy billingPolicy, final CallContext context) throws EntitlementApiException {
+    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 boolean cancelEntitlementWithPolicyOverrideBillingPolicy(final EntitlementActionPolicy policy, final ActionPolicy billingPolicy, final CallContext context) throws EntitlementApiException {
+    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.
     }
 
@@ -98,13 +98,13 @@ public class DefaultEntitlement implements Entitlement {
             return subscription.changePlan(productName, billingPeriod, priceList, requestedDate, callContext);
         } catch (BlockingApiException e) {
             throw new EntitlementApiException(e, e.getCode(), e.getMessage());
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             throw new EntitlementApiException(e);
         }
     }
 
     @Override
-    public boolean changePlanOverrideBillingPolicy(final String productName, final BillingPeriod billingPeriod, final String priceList, final LocalDate localDate, final ActionPolicy actionPolicy, final CallContext callContext) throws EntitlementApiException {
+    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, subscription.getStartDate(), clock, context);
         try {
@@ -112,7 +112,7 @@ public class DefaultEntitlement implements Entitlement {
             return subscription.changePlanWithPolicy(productName, billingPeriod, priceList, requestedDate, actionPolicy, callContext);
         } catch (BlockingApiException e) {
             throw new EntitlementApiException(e, e.getCode(), e.getMessage());
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             throw new EntitlementApiException(e);
         }
     }
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 43df964..64e25a7 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
@@ -29,23 +29,22 @@ import org.joda.time.LocalDate;
 import com.ning.billing.ErrorCode;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
-import com.ning.billing.catalog.api.ActionPolicy;
+import com.ning.billing.catalog.api.BillingActionPolicy;
 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.block.BlockingChecker;
-import com.ning.billing.entitlement.dao.BlockingStateDao;
 import com.ning.billing.subscription.api.SubscriptionBase;
 import com.ning.billing.subscription.api.user.SubscriptionBundle;
 import com.ning.billing.subscription.api.user.SubscriptionState;
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
+import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
 import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.callcontext.TenantContext;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 import com.ning.billing.util.timezone.DateAndTimeZoneContext;
 
 import com.google.common.base.Function;
@@ -54,14 +53,14 @@ import com.google.common.collect.ImmutableList;
 
 public class DefaultEntitlementApi implements EntitlementApi {
 
-    private final SubscriptionInternalApi subscriptionInternalApi;
+    private final SubscriptionBaseInternalApi subscriptionInternalApi;
     private final AccountInternalApi accountApi;
     private final Clock clock;
     private final InternalCallContextFactory internalCallContextFactory;
     private final BlockingChecker checker;
 
     @Inject
-    public DefaultEntitlementApi(final InternalCallContextFactory internalCallContextFactory, final SubscriptionInternalApi subscriptionInternalApi, final AccountInternalApi accountApi, final Clock clock, final BlockingChecker checker) {
+    public DefaultEntitlementApi(final InternalCallContextFactory internalCallContextFactory, final SubscriptionBaseInternalApi subscriptionInternalApi, final AccountInternalApi accountApi, final Clock clock, final BlockingChecker checker) {
         this.internalCallContextFactory = internalCallContextFactory;
         this.subscriptionInternalApi = subscriptionInternalApi;
         this.accountApi = accountApi;
@@ -77,7 +76,7 @@ public class DefaultEntitlementApi implements EntitlementApi {
             final SubscriptionBundle bundle = subscriptionInternalApi.createBundleForAccount(accountId, externalKey, context);
             final SubscriptionBase subscription = subscriptionInternalApi.createSubscription(bundle.getId(), planPhaseSpecifier, clock.getUTCNow(), context);
             return new DefaultEntitlement(accountApi, subscription, accountId, internalCallContextFactory, clock, checker);
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             throw new EntitlementApiException(e);
         }
     }
@@ -98,7 +97,7 @@ public class DefaultEntitlementApi implements EntitlementApi {
             final DateTime requestedDate = fromNowAndReferenceTime(baseSubscription.getStartDate(), contextWithValidAccountRecordId);
             final SubscriptionBase subscription = subscriptionInternalApi.createSubscription(baseSubscription.getBundleId(), planPhaseSpecifier, requestedDate, context);
             return new DefaultEntitlement(accountApi, subscription, bundle.getAccountId(), internalCallContextFactory, clock, checker);
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             throw new EntitlementApiException(e);
         }
     }
@@ -120,7 +119,7 @@ public class DefaultEntitlementApi implements EntitlementApi {
             final SubscriptionBase subscription = subscriptionInternalApi.getSubscriptionFromId(uuid, context);
             final SubscriptionBundle bundle = subscriptionInternalApi.getBundleFromId(subscription.getBundleId(), context);
             return new DefaultEntitlement(accountApi, subscription, bundle.getAccountId(), internalCallContextFactory, clock, checker);
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             throw new EntitlementApiException(e);
         }
     }
@@ -132,7 +131,7 @@ public class DefaultEntitlementApi implements EntitlementApi {
             final SubscriptionBase baseSubscription = subscriptionInternalApi.getSubscriptionFromId(baseSubscriptionId, context);
             final SubscriptionBundle bundle = subscriptionInternalApi.getBundleFromId(baseSubscription.getBundleId(), context);
             return getAllEntitlementsFromBundleId(baseSubscription.getBundleId(), bundle.getAccountId(), context);
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             //throw new EntitlementApiException(e);
             return ImmutableList.<Entitlement>of();
         }
@@ -145,7 +144,7 @@ public class DefaultEntitlementApi implements EntitlementApi {
         try {
             final SubscriptionBundle bundle = subscriptionInternalApi.getBundleForAccountAndKey(accountId, externalKey, context);
             return getAllEntitlementsFromBundleId(bundle.getId(), bundle.getAccountId(), context);
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             throw new EntitlementApiException(e);
         }
     }
@@ -182,7 +181,7 @@ public class DefaultEntitlementApi implements EntitlementApi {
     }
 
     @Override
-    public UUID transferEntitlementsOverrideBillingPolicy(final UUID sourceAccountId, final UUID destAccountId, final String externalKey, final LocalDate effectiveDate, final ActionPolicy billingPolicy, final CallContext context) throws EntitlementApiException {
+    public UUID transferEntitlementsOverrideBillingPolicy(final UUID sourceAccountId, final UUID destAccountId, final String externalKey, final LocalDate effectiveDate, final BillingActionPolicy billingPolicy, final CallContext context) throws EntitlementApiException {
         return null;  //To change body of implemented methods use File | Settings | File Templates.
     }
 
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 32c6907..8f5a928 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
@@ -26,10 +26,10 @@ import com.ning.billing.entitlement.api.BlockingState;
 import com.ning.billing.entitlement.api.Type;
 import com.ning.billing.entitlement.dao.BlockingStateDao;
 import com.ning.billing.subscription.api.SubscriptionBase;
+import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
 import com.ning.billing.subscription.api.user.SubscriptionBundle;
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
 import com.ning.billing.util.callcontext.InternalTenantContext;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 
 import com.google.inject.Inject;
 
@@ -81,21 +81,21 @@ public class DefaultBlockingChecker implements BlockingChecker {
     private static final Object ACTION_ENTITLEMENT = "Entitlement";
     private static final Object ACTION_BILLING = "Billing";
 
-    private final SubscriptionInternalApi subscriptionApi;
+    private final SubscriptionBaseInternalApi subscriptionApi;
     private final BlockingStateDao dao;
 
     @Inject
-    public DefaultBlockingChecker(final SubscriptionInternalApi subscriptionApi, final BlockingStateDao dao) {
+    public DefaultBlockingChecker(final SubscriptionBaseInternalApi subscriptionApi, final BlockingStateDao dao) {
         this.subscriptionApi = subscriptionApi;
         this.dao = dao;
     }
 
-    private BlockingAggregator getBlockedStateSubscriptionId(final UUID subscriptionId, final InternalTenantContext context) throws SubscriptionUserApiException {
+    private BlockingAggregator getBlockedStateSubscriptionId(final UUID subscriptionId, final InternalTenantContext context) throws SubscriptionBaseApiException {
         final SubscriptionBase subscription = subscriptionApi.getSubscriptionFromId(subscriptionId, context);
         return getBlockedStateSubscription(subscription, context);
     }
 
-    private BlockingAggregator getBlockedStateSubscription(final SubscriptionBase subscription, final InternalTenantContext context) throws SubscriptionUserApiException {
+    private BlockingAggregator getBlockedStateSubscription(final SubscriptionBase subscription, final InternalTenantContext context) throws SubscriptionBaseApiException {
         final BlockingAggregator result = new BlockingAggregator();
         if (subscription != null) {
             final BlockingAggregator subscriptionState = getBlockedStateForId(subscription.getId(), context);
@@ -111,7 +111,7 @@ public class DefaultBlockingChecker implements BlockingChecker {
     }
 
 
-    private BlockingAggregator getBlockedStateBundleId(final UUID bundleId, final InternalTenantContext context) throws SubscriptionUserApiException {
+    private BlockingAggregator getBlockedStateBundleId(final UUID bundleId, final InternalTenantContext context) throws SubscriptionBaseApiException {
         final SubscriptionBundle bundle = subscriptionApi.getBundleFromId(bundleId, context);
         return getBlockedStateBundle(bundle, context);
     }
@@ -156,7 +156,7 @@ public class DefaultBlockingChecker implements BlockingChecker {
             } 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 (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             throw new BlockingApiException(e, ErrorCode.fromCode(e.getCode()));
         }
     }
@@ -172,7 +172,7 @@ public class DefaultBlockingChecker implements BlockingChecker {
             } 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 (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             throw new BlockingApiException(e, ErrorCode.fromCode(e.getCode()));
         }
     }
@@ -187,7 +187,7 @@ public class DefaultBlockingChecker implements BlockingChecker {
             } 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 (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             throw new BlockingApiException(e, ErrorCode.fromCode(e.getCode()));
         }
     }
@@ -204,7 +204,7 @@ public class DefaultBlockingChecker implements BlockingChecker {
                 throw new BlockingApiException(ErrorCode.BLOCK_BLOCKED_ACTION, ACTION_CHANGE, TYPE_ACCOUNT, blockableId.toString());
 
             }
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             throw new BlockingApiException(e, ErrorCode.fromCode(e.getCode()));
         }
     }
@@ -219,7 +219,7 @@ public class DefaultBlockingChecker implements BlockingChecker {
             } else if (type == Type.ACCOUNT && getBlockedStateAccountId(blockableId, context).isBlockEntitlement()) {
                 throw new BlockingApiException(ErrorCode.BLOCK_BLOCKED_ACTION, ACTION_ENTITLEMENT, TYPE_ACCOUNT, blockableId.toString());
             }
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             throw new BlockingApiException(e, ErrorCode.fromCode(e.getCode()));
         }
     }
@@ -234,7 +234,7 @@ public class DefaultBlockingChecker implements BlockingChecker {
             } else if (type == Type.ACCOUNT && getBlockedStateAccountId(blockableId, context).isBlockBilling()) {
                 throw new BlockingApiException(ErrorCode.BLOCK_BLOCKED_ACTION, ACTION_BILLING, TYPE_ACCOUNT, blockableId.toString());
             }
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             throw new BlockingApiException(e, ErrorCode.fromCode(e.getCode()));
         }
     }
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/block/TestBlockingChecker.java b/entitlement/src/test/java/com/ning/billing/entitlement/block/TestBlockingChecker.java
index 00bbfd7..3d15e82 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/block/TestBlockingChecker.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/block/TestBlockingChecker.java
@@ -25,9 +25,8 @@ import com.ning.billing.entitlement.api.BlockingState;
 import com.ning.billing.entitlement.api.Type;
 import com.ning.billing.subscription.api.SubscriptionBase;
 import com.ning.billing.subscription.api.user.SubscriptionBundle;
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
+import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
 import com.ning.billing.util.callcontext.InternalTenantContext;
-import com.ning.billing.util.callcontext.TenantContext;
 import com.ning.billing.util.svcapi.junction.DefaultBlockingState;
 import org.mockito.Mockito;
 import org.testng.Assert;
@@ -59,7 +58,7 @@ public class TestBlockingChecker extends EntitlementTestSuiteNoDB {
 
         try {
             Mockito.when(subscriptionInternalApi.getBundleFromId(Mockito.<UUID>any(), Mockito.<InternalTenantContext>any())).thenReturn(bundle);
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             Assert.fail(e.toString());
         }
 
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/EntitlementTestSuiteNoDB.java b/entitlement/src/test/java/com/ning/billing/entitlement/EntitlementTestSuiteNoDB.java
index 8fc864e..15ac2a1 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/EntitlementTestSuiteNoDB.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/EntitlementTestSuiteNoDB.java
@@ -28,7 +28,7 @@ import com.ning.billing.entitlement.dao.BlockingStateDao;
 import com.ning.billing.entitlement.glue.TestEntitlementModuleNoDB;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
 import com.ning.billing.util.svcapi.junction.BlockingInternalApi;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 import com.ning.billing.util.svcapi.tag.TagInternalApi;
 import com.ning.billing.util.tag.dao.TagDao;
 
@@ -47,7 +47,7 @@ public abstract class EntitlementTestSuiteNoDB extends GuicyKillbillTestSuiteNoD
     @Inject
     protected CatalogService catalogService;
     @Inject
-    protected SubscriptionInternalApi subscriptionInternalApi;
+    protected SubscriptionBaseInternalApi subscriptionInternalApi;
     @Inject
     protected PersistentBus bus;
     @Inject
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/EntitlementTestSuiteWithEmbeddedDB.java b/entitlement/src/test/java/com/ning/billing/entitlement/EntitlementTestSuiteWithEmbeddedDB.java
index a2bf904..8a26360 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/EntitlementTestSuiteWithEmbeddedDB.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/EntitlementTestSuiteWithEmbeddedDB.java
@@ -27,7 +27,7 @@ import com.ning.billing.entitlement.dao.BlockingStateDao;
 import com.ning.billing.entitlement.glue.TestEntitlementModuleWithEmbeddedDB;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
 import com.ning.billing.util.svcapi.junction.BlockingInternalApi;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 import com.ning.billing.util.svcapi.tag.TagInternalApi;
 import com.ning.billing.util.tag.dao.TagDao;
 
@@ -47,7 +47,7 @@ public class EntitlementTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteWi
     @Inject
     protected CatalogService catalogService;
     @Inject
-    protected SubscriptionInternalApi subscriptionInternalApi;
+    protected SubscriptionBaseInternalApi subscriptionInternalApi;
     @Inject
     protected PersistentBus bus;
     @Inject
diff --git a/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java b/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
index 1425ff5..5ad6816 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
@@ -39,7 +39,7 @@ import com.ning.billing.account.api.AccountApiException;
 import com.ning.billing.bus.api.PersistentBus;
 import com.ning.billing.bus.api.PersistentBus.EventBusException;
 import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
+import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.api.InvoiceItem;
@@ -68,7 +68,7 @@ import com.ning.billing.util.globallocker.GlobalLocker;
 import com.ning.billing.util.globallocker.GlobalLocker.LockerType;
 import com.ning.billing.util.globallocker.LockFailedException;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 import com.ning.billing.util.svcapi.junction.BillingEventSet;
 import com.ning.billing.util.svcapi.junction.BillingInternalApi;
 import com.ning.billing.util.timezone.DateAndTimeZoneContext;
@@ -87,7 +87,7 @@ public class InvoiceDispatcher {
     private final InvoiceGenerator generator;
     private final BillingInternalApi billingApi;
     private final AccountInternalApi accountApi;
-    private final SubscriptionInternalApi subscriptionApi;
+    private final SubscriptionBaseInternalApi subscriptionApi;
     private final InvoiceDao invoiceDao;
     private final InvoiceNotifier invoiceNotifier;
     private final GlobalLocker locker;
@@ -97,7 +97,7 @@ public class InvoiceDispatcher {
     @Inject
     public InvoiceDispatcher(final InvoiceGenerator generator, final AccountInternalApi accountApi,
                              final BillingInternalApi billingApi,
-                             final SubscriptionInternalApi SubscriptionApi,
+                             final SubscriptionBaseInternalApi SubscriptionApi,
                              final InvoiceDao invoiceDao,
                              final InvoiceNotifier invoiceNotifier,
                              final GlobalLocker locker,
@@ -129,7 +129,7 @@ public class InvoiceDispatcher {
             }
             final UUID accountId = subscriptionApi.getAccountIdFromSubscriptionId(subscriptionId, context);
             processAccount(accountId, targetDate, false, context);
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             log.error("Failed handling SubscriptionBase change.",
                       new InvoiceApiException(ErrorCode.INVOICE_NO_ACCOUNT_ID_FOR_SUBSCRIPTION_ID, subscriptionId.toString()));
         }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java b/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
index 9e87e37..0d97a45 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceListener.java
@@ -68,7 +68,7 @@ public class InvoiceListener {
                 || event.getRemainingEventsForUserOperation() > 0) {
                 return;
             }
-            final InternalCallContext context = internalCallContextFactory.createInternalCallContext(event.getSearchKey2(), event.getSearchKey1(), "SubscriptionTransition", CallOrigin.INTERNAL, UserType.SYSTEM, event.getUserToken());
+            final InternalCallContext context = internalCallContextFactory.createInternalCallContext(event.getSearchKey2(), event.getSearchKey1(), "SubscriptionBaseTransition", CallOrigin.INTERNAL, UserType.SYSTEM, event.getUserToken());
             dispatcher.processSubscription(event, context);
         } catch (InvoiceApiException e) {
             log.error(e.getMessage());
diff --git a/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDateNotifier.java b/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDateNotifier.java
index 28f6ceb..8d28e12 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDateNotifier.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/notification/DefaultNextBillingDateNotifier.java
@@ -22,7 +22,7 @@ import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
+import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
 import com.ning.billing.subscription.api.SubscriptionBase;
 import com.ning.billing.invoice.InvoiceListener;
 import com.ning.billing.invoice.api.DefaultInvoiceService;
@@ -34,7 +34,7 @@ import com.ning.billing.notificationq.api.NotificationQueueService.NotificationQ
 import com.ning.billing.notificationq.api.NotificationQueueService.NotificationQueueHandler;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.config.InvoiceConfig;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 
 import com.google.inject.Inject;
 
@@ -46,7 +46,7 @@ public class DefaultNextBillingDateNotifier implements NextBillingDateNotifier {
 
     private final NotificationQueueService notificationQueueService;
     private final InvoiceConfig config;
-    private final SubscriptionInternalApi subscriptionApi;
+    private final SubscriptionBaseInternalApi subscriptionApi;
     private final InvoiceListener listener;
     private final InternalCallContextFactory callContextFactory;
 
@@ -55,7 +55,7 @@ public class DefaultNextBillingDateNotifier implements NextBillingDateNotifier {
     @Inject
     public DefaultNextBillingDateNotifier(final NotificationQueueService notificationQueueService,
                                           final InvoiceConfig config,
-                                          final SubscriptionInternalApi subscriptionApi,
+                                          final SubscriptionBaseInternalApi subscriptionApi,
                                           final InvoiceListener listener,
                                           final InternalCallContextFactory callContextFactory) {
         this.notificationQueueService = notificationQueueService;
@@ -85,7 +85,7 @@ public class DefaultNextBillingDateNotifier implements NextBillingDateNotifier {
                         } else {
                             processEvent(key.getUuidKey(), eventDate, userToken, accountRecordId, tenantRecordId);
                         }
-                    } catch (SubscriptionUserApiException e) {
+                    } catch (SubscriptionBaseApiException e) {
                         log.warn("Next Billing Date Notification Queue handled spurious notification (key: " + key + ")", e);
                     }
                 } catch (IllegalArgumentException e) {
diff --git a/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModule.java b/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModule.java
index ccbea40..d51aa36 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModule.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/glue/TestInvoiceModule.java
@@ -29,7 +29,7 @@ import com.ning.billing.util.glue.CustomFieldModule;
 import com.ning.billing.util.glue.NotificationQueueModule;
 import com.ning.billing.util.glue.TagStoreModule;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 import com.ning.billing.util.svcapi.junction.BillingInternalApi;
 
 
@@ -40,7 +40,7 @@ public class TestInvoiceModule extends DefaultInvoiceModule {
     }
 
     private void installExternalApis() {
-        bind(SubscriptionInternalApi.class).toInstance(Mockito.mock(SubscriptionInternalApi.class));
+        bind(SubscriptionBaseInternalApi.class).toInstance(Mockito.mock(SubscriptionBaseInternalApi.class));
         bind(AccountInternalApi.class).toInstance(Mockito.mock(AccountInternalApi.class));
         bind(BillingInternalApi.class).toInstance(Mockito.mock(BillingInternalApi.class));
     }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteNoDB.java b/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteNoDB.java
index 1b2d56d..9e4cfe7 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteNoDB.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteNoDB.java
@@ -39,7 +39,7 @@ import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.clock.Clock;
 import com.ning.billing.util.globallocker.GlobalLocker;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 import com.ning.billing.util.svcapi.invoice.InvoiceInternalApi;
 import com.ning.billing.util.svcapi.junction.BillingInternalApi;
 import com.ning.billing.util.svcsapi.bus.BusService;
@@ -69,7 +69,7 @@ public abstract class InvoiceTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
     @Inject
     protected AccountInternalApi accountApi;
     @Inject
-    protected SubscriptionInternalApi subscriptionApi;
+    protected SubscriptionBaseInternalApi subscriptionApi;
     @Inject
     protected BusService busService;
     @Inject
diff --git a/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteWithEmbeddedDB.java b/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteWithEmbeddedDB.java
index cbb2d96..061c9b2 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteWithEmbeddedDB.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/InvoiceTestSuiteWithEmbeddedDB.java
@@ -44,7 +44,7 @@ import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.clock.Clock;
 import com.ning.billing.util.globallocker.GlobalLocker;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 import com.ning.billing.util.svcapi.invoice.InvoiceInternalApi;
 import com.ning.billing.util.svcapi.junction.BillingInternalApi;
 import com.ning.billing.util.svcsapi.bus.BusService;
@@ -78,7 +78,7 @@ public abstract class InvoiceTestSuiteWithEmbeddedDB extends GuicyKillbillTestSu
     @Inject
     protected AccountInternalApi accountApi;
     @Inject
-    protected SubscriptionInternalApi subscriptionApi;
+    protected SubscriptionBaseInternalApi subscriptionApi;
     @Inject
     protected BusService busService;
     @Inject
diff --git a/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceHelper.java b/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceHelper.java
index d77f4db..bdcf674 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceHelper.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceHelper.java
@@ -55,14 +55,14 @@ import com.ning.billing.invoice.dao.InvoicePaymentSqlDao;
 import com.ning.billing.invoice.generator.InvoiceGenerator;
 import com.ning.billing.invoice.model.InvoicingConfiguration;
 import com.ning.billing.invoice.notification.NullInvoiceNotifier;
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
+import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.clock.Clock;
 import com.ning.billing.util.entity.EntityPersistenceException;
 import com.ning.billing.util.globallocker.GlobalLocker;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 import com.ning.billing.util.svcapi.junction.BillingEvent;
 import com.ning.billing.util.svcapi.junction.BillingEventSet;
 import com.ning.billing.util.svcapi.junction.BillingInternalApi;
@@ -129,7 +129,7 @@ public class TestInvoiceHelper {
     private final InvoiceGenerator generator;
     private final BillingInternalApi billingApi;
     private final AccountInternalApi accountApi;
-    private final SubscriptionInternalApi subscriptionApi;
+    private final SubscriptionBaseInternalApi subscriptionApi;
     private final  BusService busService;
     private final  InvoiceDao invoiceDao;
     private final  GlobalLocker locker;
@@ -144,7 +144,7 @@ public class TestInvoiceHelper {
 
     @Inject
     public TestInvoiceHelper(final InvoiceGenerator generator, final IDBI dbi,
-                             final BillingInternalApi billingApi, final AccountInternalApi accountApi, final SubscriptionInternalApi subscriptionApi, final BusService busService,
+                             final BillingInternalApi billingApi, final AccountInternalApi accountApi, final SubscriptionBaseInternalApi subscriptionApi, final BusService busService,
                              final InvoiceDao invoiceDao, final GlobalLocker locker, final Clock clock, final InternalCallContext internalCallContext) {
         this.generator = generator;
         this.billingApi = billingApi;
@@ -195,7 +195,7 @@ public class TestInvoiceHelper {
         return invoice.getId();
     }
 
-    public SubscriptionBase createSubscription() throws SubscriptionUserApiException {
+    public SubscriptionBase createSubscription() throws SubscriptionBaseApiException {
         UUID uuid = UUID.randomUUID();
         final SubscriptionBase subscription = Mockito.mock(SubscriptionBase.class);
         Mockito.when(subscription.getId()).thenReturn(uuid);
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/mappers/SubscriptionUserApiExceptionMapper.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/mappers/SubscriptionUserApiExceptionMapper.java
index da9315b..7a1bd20 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/mappers/SubscriptionUserApiExceptionMapper.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/mappers/SubscriptionUserApiExceptionMapper.java
@@ -24,11 +24,11 @@ import javax.ws.rs.ext.ExceptionMapper;
 import javax.ws.rs.ext.Provider;
 
 import com.ning.billing.ErrorCode;
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
+import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
 
 @Singleton
 @Provider
-public class SubscriptionUserApiExceptionMapper extends ExceptionMapperBase implements ExceptionMapper<SubscriptionUserApiException> {
+public class SubscriptionUserApiExceptionMapper extends ExceptionMapperBase implements ExceptionMapper<SubscriptionBaseApiException> {
 
     private final UriInfo uriInfo;
 
@@ -37,7 +37,7 @@ public class SubscriptionUserApiExceptionMapper extends ExceptionMapperBase impl
     }
 
     @Override
-    public Response toResponse(final SubscriptionUserApiException exception) {
+    public Response toResponse(final SubscriptionBaseApiException exception) {
         if (exception.getCode() == ErrorCode.SUB_ACCOUNT_IS_OVERDUE_BLOCKED.getCode()) {
             return buildBadRequestResponse(exception, uriInfo);
         } else if (exception.getCode() == ErrorCode.SUB_BUNDLE_IS_OVERDUE_BLOCKED.getCode()) {
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/AccountResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/AccountResource.java
index da9131b..6d0df85 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/AccountResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/AccountResource.java
@@ -148,7 +148,7 @@ public class AccountResource extends JaxRsResourceBase {
     @Produces(APPLICATION_JSON)
     public Response getAccountBundles(@PathParam("accountId") final String accountId,
                                       @QueryParam(QUERY_EXTERNAL_KEY) final String externalKey,
-                                      @javax.ws.rs.core.Context final HttpServletRequest request) throws AccountApiException, SubscriptionUserApiException {
+                                      @javax.ws.rs.core.Context final HttpServletRequest request) throws AccountApiException, SubscriptionBaseApiException {
         final TenantContext tenantContext = context.createContext(request);
 
         final UUID uuid = UUID.fromString(accountId);
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/BundleResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/BundleResource.java
index 8b5202e..fa31483 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/BundleResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/BundleResource.java
@@ -47,8 +47,8 @@ import com.ning.billing.jaxrs.util.JaxrsUriBuilder;
 import com.ning.billing.subscription.api.SubscriptionBase;
 import com.ning.billing.subscription.api.transfer.SubscriptionTransferApi;
 import com.ning.billing.subscription.api.transfer.SubscriptionTransferApiException;
+import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
 import com.ning.billing.subscription.api.user.SubscriptionBundle;
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
 import com.ning.billing.util.api.AuditUserApi;
 import com.ning.billing.util.api.CustomFieldApiException;
 import com.ning.billing.util.api.CustomFieldUserApi;
@@ -88,7 +88,7 @@ public class BundleResource extends JaxRsResourceBase {
     @Path("/{bundleId:" + UUID_PATTERN + "}")
     @Produces(APPLICATION_JSON)
     public Response getBundle(@PathParam("bundleId") final String bundleId,
-                              @javax.ws.rs.core.Context final HttpServletRequest request) throws SubscriptionUserApiException {
+                              @javax.ws.rs.core.Context final HttpServletRequest request) throws SubscriptionBaseApiException {
         final SubscriptionBundle bundle = null; // STEPH_ENT subscriptionApi.getBundleFromId(UUID.fromString(bundleId), context.createContext(request));
         final BundleJsonNoSubscriptions json = new BundleJsonNoSubscriptions(bundle);
         return Response.status(Status.OK).entity(json).build();
@@ -101,7 +101,7 @@ public class BundleResource extends JaxRsResourceBase {
                                  @HeaderParam(HDR_CREATED_BY) final String createdBy,
                                  @HeaderParam(HDR_REASON) final String reason,
                                  @HeaderParam(HDR_COMMENT) final String comment,
-                                 @javax.ws.rs.core.Context final HttpServletRequest request) throws SubscriptionUserApiException {
+                                 @javax.ws.rs.core.Context final HttpServletRequest request) throws SubscriptionBaseApiException {
         final UUID accountId = UUID.fromString(json.getAccountId());
         final SubscriptionBundle bundle = null; // STEPH_ENT subscriptionApi.createBundleForAccount(accountId, json.getExternalKey(),
         //context.createContext(createdBy, reason, comment, request));
@@ -112,7 +112,7 @@ public class BundleResource extends JaxRsResourceBase {
     @Path("/{bundleId:" + UUID_PATTERN + "}/" + SUBSCRIPTIONS)
     @Produces(APPLICATION_JSON)
     public Response getBundleSubscriptions(@PathParam("bundleId") final String bundleId,
-                                           @javax.ws.rs.core.Context final HttpServletRequest request) throws SubscriptionUserApiException {
+                                           @javax.ws.rs.core.Context final HttpServletRequest request) throws SubscriptionBaseApiException {
         final TenantContext tenantContext = context.createContext(request);
         final UUID uuid = UUID.fromString(bundleId);
         final SubscriptionBundle bundle = null; // STEPH_ENT subscriptionApi.getBundleFromId(uuid, tenantContext);
@@ -187,7 +187,7 @@ public class BundleResource extends JaxRsResourceBase {
                                    @HeaderParam(HDR_REASON) final String reason,
                                    @HeaderParam(HDR_COMMENT) final String comment,
                                    @javax.ws.rs.core.Context final UriInfo uriInfo,
-                                   @javax.ws.rs.core.Context final HttpServletRequest request) throws SubscriptionUserApiException, SubscriptionTransferApiException {
+                                   @javax.ws.rs.core.Context final HttpServletRequest request) throws SubscriptionBaseApiException, SubscriptionTransferApiException {
         final CallContext callContext = context.createContext(createdBy, reason, comment, request);
         final SubscriptionBundle bundle = null; // STEPH_ENT subscriptionApi.getBundleFromId(UUID.fromString(id), callContext);
         final DateTime inputDate = (requestedDate != null) ? DATE_TIME_FORMATTER.parseDateTime(requestedDate) : null;
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/OverdueResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/OverdueResource.java
index e8b6d32..cc21a92 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/OverdueResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/OverdueResource.java
@@ -16,8 +16,6 @@
 
 package com.ning.billing.jaxrs.resources;
 
-import java.util.UUID;
-
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
@@ -26,8 +24,6 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 
-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.jaxrs.json.OverdueStateJson;
 import com.ning.billing.jaxrs.util.Context;
@@ -38,7 +34,7 @@ import com.ning.billing.overdue.OverdueUserApi;
 import com.ning.billing.overdue.config.api.OverdueException;
 import com.ning.billing.subscription.api.SubscriptionBase;
 import com.ning.billing.subscription.api.user.SubscriptionBundle;
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
+import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
 import com.ning.billing.util.api.AuditUserApi;
 import com.ning.billing.util.api.CustomFieldUserApi;
 import com.ning.billing.util.api.TagUserApi;
@@ -91,7 +87,7 @@ public class OverdueResource extends JaxRsResourceBase {
     @Path("/" + BUNDLES + "/{bundleId:" + UUID_PATTERN + "}")
     @Produces(APPLICATION_JSON)
     public Response getOverdueBundle(@PathParam("bundleId") final String bundleId,
-                                     @javax.ws.rs.core.Context final HttpServletRequest request) throws SubscriptionUserApiException, OverdueException, OverdueApiException {
+                                     @javax.ws.rs.core.Context final HttpServletRequest request) throws SubscriptionBaseApiException, OverdueException, OverdueApiException {
         final TenantContext tenantContext = context.createContext(request);
 
         final SubscriptionBundle bundle = null; // STEPH_ENT subscriptionApi.getBundleFromId(UUID.fromString(bundleId), tenantContext);
@@ -104,7 +100,7 @@ public class OverdueResource extends JaxRsResourceBase {
     @Path("/" + SUBSCRIPTIONS + "/{subscriptionId:" + UUID_PATTERN + "}")
     @Produces(APPLICATION_JSON)
     public Response getOverdueSubscription(@PathParam("subscriptionId") final String subscriptionId,
-                                           @javax.ws.rs.core.Context final HttpServletRequest request) throws SubscriptionUserApiException, OverdueException, OverdueApiException {
+                                           @javax.ws.rs.core.Context final HttpServletRequest request) throws SubscriptionBaseApiException, OverdueException, OverdueApiException {
         final TenantContext tenantContext = context.createContext(request);
 
         final SubscriptionBase subscription = null; // STEPH_ENT subscriptionApi.getSubscriptionFromId(UUID.fromString(subscriptionId), tenantContext);
diff --git a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/SubscriptionResource.java b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/SubscriptionResource.java
index 06a7c6b..cc789f3 100644
--- a/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/SubscriptionResource.java
+++ b/jaxrs/src/main/java/com/ning/billing/jaxrs/resources/SubscriptionResource.java
@@ -42,7 +42,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.ning.billing.ObjectType;
-import com.ning.billing.catalog.api.ActionPolicy;
+import com.ning.billing.catalog.api.BillingActionPolicy;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.PlanPhaseSpecifier;
 import com.ning.billing.catalog.api.ProductCategory;
@@ -52,7 +52,7 @@ import com.ning.billing.jaxrs.util.Context;
 import com.ning.billing.jaxrs.util.JaxrsUriBuilder;
 import com.ning.billing.jaxrs.util.KillbillEventHandler;
 import com.ning.billing.subscription.api.SubscriptionBase;
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
+import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
 import com.ning.billing.util.api.AuditUserApi;
 import com.ning.billing.util.api.CustomFieldApiException;
 import com.ning.billing.util.api.CustomFieldUserApi;
@@ -96,7 +96,7 @@ public class SubscriptionResource extends JaxRsResourceBase {
     @Path("/{subscriptionId:" + UUID_PATTERN + "}")
     @Produces(APPLICATION_JSON)
     public Response getSubscription(@PathParam("subscriptionId") final String subscriptionId,
-                                    @javax.ws.rs.core.Context final HttpServletRequest request) throws SubscriptionUserApiException {
+                                    @javax.ws.rs.core.Context final HttpServletRequest request) throws SubscriptionBaseApiException {
         final UUID uuid = UUID.fromString(subscriptionId);
         final SubscriptionBase subscription = null; // STEPH_ENT  subscriptionApi.getSubscriptionFromId(uuid, context.createContext(request));
         final SubscriptionJsonNoEvents json = new SubscriptionJsonNoEvents(subscription, null);
@@ -113,12 +113,12 @@ public class SubscriptionResource extends JaxRsResourceBase {
                                        @HeaderParam(HDR_CREATED_BY) final String createdBy,
                                        @HeaderParam(HDR_REASON) final String reason,
                                        @HeaderParam(HDR_COMMENT) final String comment,
-                                       @javax.ws.rs.core.Context final HttpServletRequest request) throws SubscriptionUserApiException {
+                                       @javax.ws.rs.core.Context final HttpServletRequest request) throws SubscriptionBaseApiException {
         final CallContext callContext = context.createContext(createdBy, reason, comment, request);
 
         final SubscriptionCallCompletionCallback<SubscriptionBase> callback = new SubscriptionCallCompletionCallback<SubscriptionBase>() {
             @Override
-            public SubscriptionBase doOperation(final CallContext ctx) throws SubscriptionUserApiException, InterruptedException, TimeoutException {
+            public SubscriptionBase doOperation(final CallContext ctx) throws SubscriptionBaseApiException, InterruptedException, TimeoutException {
 
                 final DateTime inputDate = (requestedDate != null) ? DATE_TIME_FORMATTER.parseDateTime(requestedDate) : null;
                 final UUID uuid = UUID.fromString(subscription.getBundleId());
@@ -157,7 +157,7 @@ public class SubscriptionResource extends JaxRsResourceBase {
                                            @HeaderParam(HDR_CREATED_BY) final String createdBy,
                                            @HeaderParam(HDR_REASON) final String reason,
                                            @HeaderParam(HDR_COMMENT) final String comment,
-                                           @javax.ws.rs.core.Context final HttpServletRequest request) throws SubscriptionUserApiException {
+                                           @javax.ws.rs.core.Context final HttpServletRequest request) throws SubscriptionBaseApiException {
         final CallContext callContext = context.createContext(createdBy, reason, comment, request);
 
         final SubscriptionCallCompletionCallback<Response> callback = new SubscriptionCallCompletionCallback<Response>() {
@@ -165,7 +165,7 @@ public class SubscriptionResource extends JaxRsResourceBase {
             private boolean isImmediateOp = true;
 
             @Override
-            public Response doOperation(final CallContext ctx) throws SubscriptionUserApiException, InterruptedException,
+            public Response doOperation(final CallContext ctx) throws SubscriptionBaseApiException, InterruptedException,
                                                                       TimeoutException {
                 final UUID uuid = UUID.fromString(subscriptionId);
                 final SubscriptionBase current = null; // STEPH_ENT subscriptionApi.getSubscriptionFromId(uuid, callContext);
@@ -175,7 +175,7 @@ public class SubscriptionResource extends JaxRsResourceBase {
                     isImmediateOp = current.changePlan(subscription.getProductName(), BillingPeriod.valueOf(subscription.getBillingPeriod()),
                                                        subscription.getPriceList(), inputDate, ctx);
                 } else {
-                    final ActionPolicy policy = ActionPolicy.valueOf(policyString.toUpperCase());
+                    final BillingActionPolicy policy = BillingActionPolicy.valueOf(policyString.toUpperCase());
                     isImmediateOp = current.changePlanWithPolicy(subscription.getProductName(), BillingPeriod.valueOf(subscription.getBillingPeriod()),
                                                                  subscription.getPriceList(), inputDate, policy, ctx);
                 }
@@ -189,7 +189,7 @@ public class SubscriptionResource extends JaxRsResourceBase {
             }
 
             @Override
-            public Response doResponseOk(final Response operationResponse) throws SubscriptionUserApiException {
+            public Response doResponseOk(final Response operationResponse) throws SubscriptionBaseApiException {
                 if (operationResponse.getStatus() != Status.OK.getStatusCode()) {
                     return operationResponse;
                 }
@@ -209,7 +209,7 @@ public class SubscriptionResource extends JaxRsResourceBase {
                                              @HeaderParam(HDR_CREATED_BY) final String createdBy,
                                              @HeaderParam(HDR_REASON) final String reason,
                                              @HeaderParam(HDR_COMMENT) final String comment,
-                                             @javax.ws.rs.core.Context final HttpServletRequest request) throws SubscriptionUserApiException {
+                                             @javax.ws.rs.core.Context final HttpServletRequest request) throws SubscriptionBaseApiException {
         final UUID uuid = UUID.fromString(subscriptionId);
         final SubscriptionBase current = null; // STEPH_ENT  subscriptionApi.getSubscriptionFromId(uuid, context.createContext(createdBy, reason, comment, request));
 
@@ -229,7 +229,7 @@ public class SubscriptionResource extends JaxRsResourceBase {
                                            @HeaderParam(HDR_REASON) final String reason,
                                            @HeaderParam(HDR_COMMENT) final String comment,
                                            @javax.ws.rs.core.Context final UriInfo uriInfo,
-                                           @javax.ws.rs.core.Context final HttpServletRequest request) throws SubscriptionUserApiException {
+                                           @javax.ws.rs.core.Context final HttpServletRequest request) throws SubscriptionBaseApiException {
         final CallContext callContext = context.createContext(createdBy, reason, comment, request);
 
         final SubscriptionCallCompletionCallback<Response> callback = new SubscriptionCallCompletionCallback<Response>() {
@@ -238,7 +238,7 @@ public class SubscriptionResource extends JaxRsResourceBase {
 
             @Override
             public Response doOperation(final CallContext ctx)
-                    throws SubscriptionUserApiException, InterruptedException,
+                    throws SubscriptionBaseApiException, InterruptedException,
                            TimeoutException {
                 final UUID uuid = UUID.fromString(subscriptionId);
 
@@ -248,7 +248,7 @@ public class SubscriptionResource extends JaxRsResourceBase {
                 if (policyString == null) {
                     isImmediateOp = current.cancel(inputDate, ctx);
                 } else {
-                    final ActionPolicy policy = ActionPolicy.valueOf(policyString.toUpperCase());
+                    final BillingActionPolicy policy = BillingActionPolicy.valueOf(policyString.toUpperCase());
                     isImmediateOp = current.cancelWithPolicy(inputDate, policy, ctx);
                 }
                 return Response.status(Status.OK).build();
@@ -278,7 +278,7 @@ public class SubscriptionResource extends JaxRsResourceBase {
         @Override
         public void onSubscriptionTransition(final EffectiveSubscriptionInternalEvent event) {
 
-            log.info(String.format("Got event SubscriptionTransition token = %s, type = %s, remaining = %d ",
+            log.info(String.format("Got event SubscriptionBaseTransition token = %s, type = %s, remaining = %d ",
                                    event.getUserToken(), event.getTransitionType(), event.getRemainingEventsForUserOperation()));
         }
 
@@ -312,11 +312,11 @@ public class SubscriptionResource extends JaxRsResourceBase {
 
     private interface SubscriptionCallCompletionCallback<T> {
 
-        public T doOperation(final CallContext ctx) throws SubscriptionUserApiException, InterruptedException, TimeoutException;
+        public T doOperation(final CallContext ctx) throws SubscriptionBaseApiException, InterruptedException, TimeoutException;
 
         public boolean isImmOperation();
 
-        public Response doResponseOk(final T operationResponse) throws SubscriptionUserApiException;
+        public Response doResponseOk(final T operationResponse) throws SubscriptionBaseApiException;
     }
 
     private class SubscriptionCallCompletion<T> {
@@ -324,7 +324,7 @@ public class SubscriptionResource extends JaxRsResourceBase {
         public Response withSynchronization(final SubscriptionCallCompletionCallback<T> callback,
                                             final long timeoutSec,
                                             final boolean callCompletion,
-                                            final CallContext callContext) throws SubscriptionUserApiException {
+                                            final CallContext callContext) throws SubscriptionBaseApiException {
             final CompletionUserRequestSubscription waiter = callCompletion ? new CompletionUserRequestSubscription(callContext.getUserToken()) : null;
             try {
                 if (waiter != null) {
diff --git a/junction/src/main/java/com/ning/billing/junction/plumbing/billing/BillCycleDayCalculator.java b/junction/src/main/java/com/ning/billing/junction/plumbing/billing/BillCycleDayCalculator.java
index 0039fc1..4682564 100644
--- a/junction/src/main/java/com/ning/billing/junction/plumbing/billing/BillCycleDayCalculator.java
+++ b/junction/src/main/java/com/ning/billing/junction/plumbing/billing/BillCycleDayCalculator.java
@@ -36,12 +36,12 @@ import com.ning.billing.catalog.api.PlanPhase;
 import com.ning.billing.catalog.api.PlanPhaseSpecifier;
 import com.ning.billing.catalog.api.Product;
 import com.ning.billing.subscription.api.SubscriptionTransitionType;
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
+import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
 import com.ning.billing.subscription.api.SubscriptionBase;
 import com.ning.billing.subscription.api.user.SubscriptionBundle;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.inject.Inject;
@@ -51,16 +51,16 @@ public class BillCycleDayCalculator {
     private static final Logger log = LoggerFactory.getLogger(BillCycleDayCalculator.class);
 
     private final CatalogService catalogService;
-    private final SubscriptionInternalApi subscriptionApi;
+    private final SubscriptionBaseInternalApi subscriptionApi;
 
     @Inject
-    public BillCycleDayCalculator(final CatalogService catalogService, final SubscriptionInternalApi subscriptionApi) {
+    public BillCycleDayCalculator(final CatalogService catalogService, final SubscriptionBaseInternalApi subscriptionApi) {
         this.catalogService = catalogService;
         this.subscriptionApi = subscriptionApi;
     }
 
     protected int calculateBcd(final SubscriptionBundle bundle, final SubscriptionBase subscription, final EffectiveSubscriptionInternalEvent transition, final Account account, final InternalCallContext context)
-            throws CatalogApiException, AccountApiException, SubscriptionUserApiException {
+            throws CatalogApiException, AccountApiException, SubscriptionBaseApiException {
 
         final Catalog catalog = catalogService.getFullCatalog();
 
@@ -88,7 +88,7 @@ public class BillCycleDayCalculator {
 
     @VisibleForTesting
     int calculateBcdForAlignment(final BillingAlignment alignment, final SubscriptionBundle bundle, final SubscriptionBase subscription,
-                                 final Account account, final Catalog catalog, final Plan plan, final InternalCallContext context) throws AccountApiException, SubscriptionUserApiException, CatalogApiException {
+                                 final Account account, final Catalog catalog, final Plan plan, final InternalCallContext context) throws AccountApiException, SubscriptionBaseApiException, CatalogApiException {
         int result = 0;
         switch (alignment) {
             case ACCOUNT:
diff --git a/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultInternalBillingApi.java b/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultInternalBillingApi.java
index 14434f8..b1e3ca3 100644
--- a/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultInternalBillingApi.java
+++ b/junction/src/main/java/com/ning/billing/junction/plumbing/billing/DefaultInternalBillingApi.java
@@ -36,7 +36,7 @@ import com.ning.billing.subscription.api.user.SubscriptionBundle;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 import com.ning.billing.util.svcapi.junction.BillingEvent;
 import com.ning.billing.util.svcapi.junction.BillingEventSet;
 import com.ning.billing.util.svcapi.junction.BillingInternalApi;
@@ -53,7 +53,7 @@ public class DefaultInternalBillingApi implements BillingInternalApi {
     private static final Logger log = LoggerFactory.getLogger(DefaultInternalBillingApi.class);
     private final AccountInternalApi accountApi;
     private final BillCycleDayCalculator bcdCalculator;
-    private final SubscriptionInternalApi subscriptionApi;
+    private final SubscriptionBaseInternalApi subscriptionApi;
     private final CatalogService catalogService;
     private final BlockingCalculator blockCalculator;
     private final TagInternalApi tagApi;
@@ -61,7 +61,7 @@ public class DefaultInternalBillingApi implements BillingInternalApi {
     @Inject
     public DefaultInternalBillingApi(final AccountInternalApi accountApi,
                                      final BillCycleDayCalculator bcdCalculator,
-                                     final SubscriptionInternalApi subscriptionApi,
+                                     final SubscriptionBaseInternalApi subscriptionApi,
                                      final BlockingCalculator blockCalculator,
                                      final CatalogService catalogService, final TagInternalApi tagApi) {
         this.accountApi = accountApi;
diff --git a/junction/src/test/java/com/ning/billing/junction/JunctionTestSuiteNoDB.java b/junction/src/test/java/com/ning/billing/junction/JunctionTestSuiteNoDB.java
index 5987bf6..13bc7de 100644
--- a/junction/src/test/java/com/ning/billing/junction/JunctionTestSuiteNoDB.java
+++ b/junction/src/test/java/com/ning/billing/junction/JunctionTestSuiteNoDB.java
@@ -29,7 +29,7 @@ import com.ning.billing.junction.plumbing.billing.BillCycleDayCalculator;
 import com.ning.billing.junction.plumbing.billing.BlockingCalculator;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
 import com.ning.billing.util.svcapi.junction.BillingInternalApi;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 import com.ning.billing.util.svcapi.tag.TagInternalApi;
 import com.ning.billing.util.tag.dao.TagDao;
 
@@ -50,7 +50,7 @@ public abstract class JunctionTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
     @Inject
     protected CatalogService catalogService;
     @Inject
-    protected SubscriptionInternalApi subscriptionInternalApi;
+    protected SubscriptionBaseInternalApi subscriptionInternalApi;
     @Inject
     protected PersistentBus bus;
     @Inject
diff --git a/junction/src/test/java/com/ning/billing/junction/JunctionTestSuiteWithEmbeddedDB.java b/junction/src/test/java/com/ning/billing/junction/JunctionTestSuiteWithEmbeddedDB.java
index a5d4df0..f33618d 100644
--- a/junction/src/test/java/com/ning/billing/junction/JunctionTestSuiteWithEmbeddedDB.java
+++ b/junction/src/test/java/com/ning/billing/junction/JunctionTestSuiteWithEmbeddedDB.java
@@ -28,7 +28,7 @@ import com.ning.billing.junction.plumbing.billing.BlockingCalculator;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
 import com.ning.billing.util.svcapi.junction.BillingInternalApi;
 import com.ning.billing.util.svcapi.junction.BlockingInternalApi;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 import com.ning.billing.util.svcapi.tag.TagInternalApi;
 import com.ning.billing.util.tag.dao.TagDao;
 
@@ -49,7 +49,7 @@ public abstract class JunctionTestSuiteWithEmbeddedDB extends GuicyKillbillTestS
     @Inject
     protected CatalogService catalogService;
     @Inject
-    protected SubscriptionInternalApi subscriptionInternalApi;
+    protected SubscriptionBaseInternalApi subscriptionInternalApi;
     @Inject
     protected PersistentBus bus;
     @Inject
diff --git a/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillCycleDayCalculator.java b/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillCycleDayCalculator.java
index 9feacff..57ef505 100644
--- a/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillCycleDayCalculator.java
+++ b/junction/src/test/java/com/ning/billing/junction/plumbing/billing/TestBillCycleDayCalculator.java
@@ -35,7 +35,7 @@ import com.ning.billing.subscription.api.SubscriptionBase;
 import com.ning.billing.subscription.api.user.SubscriptionBundle;
 import com.ning.billing.junction.JunctionTestSuiteNoDB;
 import com.ning.billing.util.callcontext.InternalTenantContext;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 
 public class TestBillCycleDayCalculator extends JunctionTestSuiteNoDB {
 
@@ -124,7 +124,7 @@ public class TestBillCycleDayCalculator extends JunctionTestSuiteNoDB {
     }
 
     private void verifyBCDCalculation(final DateTimeZone accountTimeZone, final DateTime startDateUTC, final int bcdLocal) throws AccountApiException, CatalogApiException {
-        final BillCycleDayCalculator billCycleDayCalculator = new BillCycleDayCalculator(Mockito.mock(CatalogService.class), Mockito.mock(SubscriptionInternalApi.class));
+        final BillCycleDayCalculator billCycleDayCalculator = new BillCycleDayCalculator(Mockito.mock(CatalogService.class), Mockito.mock(SubscriptionBaseInternalApi.class));
 
         final SubscriptionBase subscription = Mockito.mock(SubscriptionBase.class);
         Mockito.when(subscription.getStartDate()).thenReturn(startDateUTC);
diff --git a/overdue/src/main/java/com/ning/billing/overdue/applicator/OverdueStateApplicator.java b/overdue/src/main/java/com/ning/billing/overdue/applicator/OverdueStateApplicator.java
index cc91d3f..a96a242 100644
--- a/overdue/src/main/java/com/ning/billing/overdue/applicator/OverdueStateApplicator.java
+++ b/overdue/src/main/java/com/ning/billing/overdue/applicator/OverdueStateApplicator.java
@@ -31,9 +31,9 @@ import com.ning.billing.ObjectType;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
 import com.ning.billing.bus.api.PersistentBus;
-import com.ning.billing.catalog.api.ActionPolicy;
+import com.ning.billing.catalog.api.BillingActionPolicy;
 import com.ning.billing.catalog.api.ProductCategory;
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
+import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
 import com.ning.billing.subscription.api.SubscriptionBase;
 import com.ning.billing.subscription.api.user.SubscriptionBundle;
 import com.ning.billing.entitlement.api.Blockable;
@@ -55,7 +55,7 @@ import com.ning.billing.util.email.EmailConfig;
 import com.ning.billing.util.email.EmailSender;
 import com.ning.billing.util.events.OverdueChangeInternalEvent;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 import com.ning.billing.util.svcapi.junction.BlockingInternalApi;
 import com.ning.billing.util.svcapi.junction.DefaultBlockingState;
 import com.ning.billing.util.svcapi.tag.TagInternalApi;
@@ -75,13 +75,13 @@ public class OverdueStateApplicator<T extends Blockable> {
     private final OverdueCheckPoster poster;
     private final PersistentBus bus;
     private final AccountInternalApi accountApi;
-    private final SubscriptionInternalApi subscriptionInternalApi;
+    private final SubscriptionBaseInternalApi subscriptionInternalApi;
     private final OverdueEmailGenerator overdueEmailGenerator;
     final TagInternalApi tagApi;
     private final EmailSender emailSender;
 
     @Inject
-    public OverdueStateApplicator(final BlockingInternalApi accessApi, final AccountInternalApi accountApi, final SubscriptionInternalApi subscriptionInternalApi,
+    public OverdueStateApplicator(final BlockingInternalApi accessApi, final AccountInternalApi accountApi, final SubscriptionBaseInternalApi subscriptionInternalApi,
                                   final Clock clock, final OverdueCheckPoster poster, final OverdueEmailGenerator overdueEmailGenerator,
                                   final EmailConfig config, final PersistentBus bus, final TagInternalApi tagApi) {
         this.blockingApi = accessApi;
@@ -207,13 +207,13 @@ public class OverdueStateApplicator<T extends Blockable> {
             return;
         }
         try {
-            final ActionPolicy actionPolicy;
+            final BillingActionPolicy actionPolicy;
             switch (nextOverdueState.getSubscriptionCancellationPolicy()) {
                 case END_OF_TERM:
-                    actionPolicy = ActionPolicy.END_OF_TERM;
+                    actionPolicy = BillingActionPolicy.END_OF_TERM;
                     break;
                 case IMMEDIATE:
-                    actionPolicy = ActionPolicy.IMMEDIATE;
+                    actionPolicy = BillingActionPolicy.IMMEDIATE;
                     break;
                 default:
                     throw new IllegalStateException("Unexpected OverdueCancellationPolicy " + nextOverdueState.getSubscriptionCancellationPolicy());
@@ -224,13 +224,13 @@ public class OverdueStateApplicator<T extends Blockable> {
                 // STEPH Need conversion toCallContext because we are calling a public API through the SubscriptionBase object
                 cur.cancelWithPolicy(clock.getUTCNow(), actionPolicy, context.toCallContext());
             }
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             throw new OverdueException(e);
         }
     }
 
     @SuppressWarnings("unchecked")
-    private void computeSubscriptionsToCancel(final T blockable, final List<SubscriptionBase> result, final InternalTenantContext context) throws SubscriptionUserApiException {
+    private void computeSubscriptionsToCancel(final T blockable, final List<SubscriptionBase> result, final InternalTenantContext context) throws SubscriptionBaseApiException {
         if (blockable instanceof SubscriptionBase) {
             result.add((SubscriptionBase) blockable);
         } else if (blockable instanceof SubscriptionBundle) {
@@ -276,7 +276,7 @@ public class OverdueStateApplicator<T extends Blockable> {
                 log.warn("Unable to retrieve account for overdueable {} (type {})", overdueable.getId(), overdueableType);
                 return;
             }
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             log.warn(String.format("Unable to retrieve account for overdueable %s (type %s)", overdueable.getId(), overdueableType), e);
             return;
         } catch (AccountApiException e) {
diff --git a/overdue/src/main/java/com/ning/billing/overdue/calculator/BillingStateCalculatorBundle.java b/overdue/src/main/java/com/ning/billing/overdue/calculator/BillingStateCalculatorBundle.java
index 28de5b6..8a3ddc7 100644
--- a/overdue/src/main/java/com/ning/billing/overdue/calculator/BillingStateCalculatorBundle.java
+++ b/overdue/src/main/java/com/ning/billing/overdue/calculator/BillingStateCalculatorBundle.java
@@ -31,7 +31,7 @@ import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.PhaseType;
 import com.ning.billing.catalog.api.PriceList;
 import com.ning.billing.catalog.api.Product;
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
+import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
 import com.ning.billing.subscription.api.SubscriptionBase;
 import com.ning.billing.subscription.api.user.SubscriptionBundle;
 import com.ning.billing.invoice.api.Invoice;
@@ -42,7 +42,7 @@ import com.ning.billing.overdue.config.api.PaymentResponse;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.clock.Clock;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 import com.ning.billing.util.svcapi.invoice.InvoiceInternalApi;
 import com.ning.billing.util.tag.Tag;
 
@@ -50,11 +50,11 @@ import com.google.inject.Inject;
 
 public class BillingStateCalculatorBundle extends BillingStateCalculator<SubscriptionBundle> {
 
-    private final SubscriptionInternalApi subscriptionApi;
+    private final SubscriptionBaseInternalApi subscriptionApi;
     private final AccountInternalApi accountApi;
 
     @Inject
-    public BillingStateCalculatorBundle(final SubscriptionInternalApi subscriptionApi, final InvoiceInternalApi invoiceApi,
+    public BillingStateCalculatorBundle(final SubscriptionBaseInternalApi subscriptionApi, final InvoiceInternalApi invoiceApi,
                                         final AccountInternalApi accountApi, final Clock clock) {
         super(invoiceApi, clock);
         this.subscriptionApi = subscriptionApi;
@@ -114,7 +114,7 @@ public class BillingStateCalculatorBundle extends BillingStateCalculator<Subscri
                                           basePlanBillingPeriod,
                                           basePlanPriceList,
                                           basePlanPhaseType);
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             throw new OverdueException(e);
         } catch (AccountApiException e) {
             throw new OverdueException(e);
@@ -133,11 +133,11 @@ public class BillingStateCalculatorBundle extends BillingStateCalculator<Subscri
         return result;
     }
 
-    private SubscriptionBase getBasePlanIfExist(UUID bundleId, final InternalTenantContext context) throws SubscriptionUserApiException {
+    private SubscriptionBase getBasePlanIfExist(UUID bundleId, final InternalTenantContext context) throws SubscriptionBaseApiException {
         try {
             final SubscriptionBase basePlan = subscriptionApi.getBaseSubscription(bundleId, context);
             return basePlan;
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             if (e.getCode() == ErrorCode.SUB_GET_NO_SUCH_BASE_SUBSCRIPTION.getCode()) {
                 // No base plan probably a STANDALONE subscription in a bundle
                 return null;
diff --git a/overdue/src/main/java/com/ning/billing/overdue/listener/OverdueDispatcher.java b/overdue/src/main/java/com/ning/billing/overdue/listener/OverdueDispatcher.java
index a10ec20..153134b 100644
--- a/overdue/src/main/java/com/ning/billing/overdue/listener/OverdueDispatcher.java
+++ b/overdue/src/main/java/com/ning/billing/overdue/listener/OverdueDispatcher.java
@@ -27,7 +27,7 @@ import com.ning.billing.subscription.api.user.SubscriptionBundle;
 import com.ning.billing.entitlement.api.Type;
 import com.ning.billing.overdue.wrapper.OverdueWrapperFactory;
 import com.ning.billing.util.callcontext.InternalCallContext;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 
 import com.google.inject.Inject;
 
@@ -35,11 +35,11 @@ public class OverdueDispatcher {
 
     Logger log = LoggerFactory.getLogger(OverdueDispatcher.class);
 
-    private final SubscriptionInternalApi subscriptionApi;
+    private final SubscriptionBaseInternalApi subscriptionApi;
     private final OverdueWrapperFactory factory;
 
     @Inject
-    public OverdueDispatcher(final SubscriptionInternalApi subscriptionApi,
+    public OverdueDispatcher(final SubscriptionBaseInternalApi subscriptionApi,
                              final OverdueWrapperFactory factory) {
         this.subscriptionApi = subscriptionApi;
         this.factory = factory;
diff --git a/overdue/src/main/java/com/ning/billing/overdue/wrapper/OverdueWrapperFactory.java b/overdue/src/main/java/com/ning/billing/overdue/wrapper/OverdueWrapperFactory.java
index 4420de4..f940553 100644
--- a/overdue/src/main/java/com/ning/billing/overdue/wrapper/OverdueWrapperFactory.java
+++ b/overdue/src/main/java/com/ning/billing/overdue/wrapper/OverdueWrapperFactory.java
@@ -22,7 +22,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.ning.billing.ErrorCode;
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
+import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
 import com.ning.billing.subscription.api.user.SubscriptionBundle;
 import com.ning.billing.entitlement.api.Blockable;
 import com.ning.billing.entitlement.api.Type;
@@ -35,7 +35,7 @@ import com.ning.billing.overdue.config.api.OverdueException;
 import com.ning.billing.overdue.config.api.OverdueStateSet;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.clock.Clock;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 import com.ning.billing.util.svcapi.junction.BlockingInternalApi;
 
 import com.google.inject.Inject;
@@ -43,7 +43,7 @@ import com.google.inject.Inject;
 public class OverdueWrapperFactory {
     private static final Logger log = LoggerFactory.getLogger(OverdueWrapperFactory.class);
 
-    private final SubscriptionInternalApi subscriptionApi;
+    private final SubscriptionBaseInternalApi subscriptionApi;
     private final BillingStateCalculatorBundle billingStateCalcuatorBundle;
     private final OverdueStateApplicator<SubscriptionBundle> overdueStateApplicatorBundle;
     private final BlockingInternalApi api;
@@ -54,7 +54,7 @@ public class OverdueWrapperFactory {
     public OverdueWrapperFactory(final BlockingInternalApi api, final Clock clock,
                                  final BillingStateCalculatorBundle billingStateCalcuatorBundle,
                                  final OverdueStateApplicator<SubscriptionBundle> overdueStateApplicatorBundle,
-                                 final SubscriptionInternalApi subscriptionApi) {
+                                 final SubscriptionBaseInternalApi subscriptionApi) {
         this.billingStateCalcuatorBundle = billingStateCalcuatorBundle;
         this.overdueStateApplicatorBundle = overdueStateApplicatorBundle;
         this.subscriptionApi = subscriptionApi;
@@ -87,7 +87,7 @@ public class OverdueWrapperFactory {
                 }
 
             }
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             throw new OverdueException(e);
         }
     }
diff --git a/overdue/src/test/java/com/ning/billing/overdue/calculator/TestBillingStateCalculatorBundle.java b/overdue/src/test/java/com/ning/billing/overdue/calculator/TestBillingStateCalculatorBundle.java
index 00d1f50..d7f0bcf 100644
--- a/overdue/src/test/java/com/ning/billing/overdue/calculator/TestBillingStateCalculatorBundle.java
+++ b/overdue/src/test/java/com/ning/billing/overdue/calculator/TestBillingStateCalculatorBundle.java
@@ -41,7 +41,7 @@ import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.overdue.config.api.BillingStateBundle;
 import com.ning.billing.overdue.config.api.PaymentResponse;
 import com.ning.billing.util.callcontext.InternalTenantContext;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 
 import com.google.common.base.Predicate;
 import com.google.common.collect.Collections2;
@@ -67,7 +67,7 @@ public class TestBillingStateCalculatorBundle extends TestBillingStateCalculator
         final SubscriptionBundle bundle = Mockito.mock(SubscriptionBundle.class);
         Mockito.when(bundle.getId()).thenReturn(bundleId);
 
-        final SubscriptionInternalApi subscriptionApi = Mockito.mock(SubscriptionInternalApi.class);
+        final SubscriptionBaseInternalApi subscriptionApi = Mockito.mock(SubscriptionBaseInternalApi.class);
         final SubscriptionBase subscription = Mockito.mock(SubscriptionBase.class);
         Mockito.when(subscriptionApi.getBaseSubscription(Mockito.eq(bundleId), Mockito.<InternalTenantContext>any())).thenReturn(subscription);
 
diff --git a/overdue/src/test/java/com/ning/billing/overdue/OverdueTestSuiteNoDB.java b/overdue/src/test/java/com/ning/billing/overdue/OverdueTestSuiteNoDB.java
index d61b8bf..36dd8cb 100644
--- a/overdue/src/test/java/com/ning/billing/overdue/OverdueTestSuiteNoDB.java
+++ b/overdue/src/test/java/com/ning/billing/overdue/OverdueTestSuiteNoDB.java
@@ -34,7 +34,7 @@ import com.ning.billing.overdue.service.DefaultOverdueService;
 import com.ning.billing.overdue.wrapper.OverdueWrapperFactory;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 import com.ning.billing.util.svcapi.invoice.InvoiceInternalApi;
 import com.ning.billing.util.svcapi.junction.BlockingInternalApi;
 import com.ning.billing.util.svcsapi.bus.BusService;
@@ -56,7 +56,7 @@ public abstract class OverdueTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
     @Inject
     protected DefaultOverdueService service;
     @Inject
-    protected SubscriptionInternalApi subscriptionApi;
+    protected SubscriptionBaseInternalApi subscriptionApi;
     @Inject
     protected PersistentBus bus;
     @Inject
diff --git a/overdue/src/test/java/com/ning/billing/overdue/OverdueTestSuiteWithEmbeddedDB.java b/overdue/src/test/java/com/ning/billing/overdue/OverdueTestSuiteWithEmbeddedDB.java
index c7194dc..a15dcf8 100644
--- a/overdue/src/test/java/com/ning/billing/overdue/OverdueTestSuiteWithEmbeddedDB.java
+++ b/overdue/src/test/java/com/ning/billing/overdue/OverdueTestSuiteWithEmbeddedDB.java
@@ -36,7 +36,7 @@ import com.ning.billing.util.cache.CacheControllerDispatcher;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.dao.NonEntityDao;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 import com.ning.billing.util.svcapi.invoice.InvoiceInternalApi;
 import com.ning.billing.util.svcapi.junction.BlockingInternalApi;
 import com.ning.billing.util.svcsapi.bus.BusService;
@@ -58,7 +58,7 @@ public abstract class OverdueTestSuiteWithEmbeddedDB extends GuicyKillbillTestSu
     @Inject
     protected DefaultOverdueService service;
     @Inject
-    protected SubscriptionInternalApi subscriptionApi;
+    protected SubscriptionBaseInternalApi subscriptionApi;
     @Inject
     protected CacheControllerDispatcher cacheControllerDispatcher;
     @Inject
diff --git a/overdue/src/test/java/com/ning/billing/overdue/TestOverdueHelper.java b/overdue/src/test/java/com/ning/billing/overdue/TestOverdueHelper.java
index 7d9ad84..bb7b5b0 100644
--- a/overdue/src/test/java/com/ning/billing/overdue/TestOverdueHelper.java
+++ b/overdue/src/test/java/com/ning/billing/overdue/TestOverdueHelper.java
@@ -36,10 +36,10 @@ import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.entitlement.api.BlockingState;
 import com.ning.billing.overdue.glue.ApplicatorMockJunctionModule.ApplicatorBlockingApi;
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
+import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.svcapi.account.AccountInternalApi;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 import com.ning.billing.util.svcapi.invoice.InvoiceInternalApi;
 import com.ning.billing.util.svcapi.junction.BlockingInternalApi;
 
@@ -93,12 +93,12 @@ public class TestOverdueHelper {
             "</overdueConfig>";
 
     private final AccountInternalApi accountInternalApi;
-    private final SubscriptionInternalApi subscriptionInternalApi;
+    private final SubscriptionBaseInternalApi subscriptionInternalApi;
     private final InvoiceInternalApi invoiceInternalApi;
     private final BlockingInternalApi blockingInternalApi;
 
     @Inject
-    public TestOverdueHelper(final AccountInternalApi accountInternalApi, final SubscriptionInternalApi subscriptionInternalApi,
+    public TestOverdueHelper(final AccountInternalApi accountInternalApi, final SubscriptionBaseInternalApi subscriptionInternalApi,
                              final InvoiceInternalApi invoiceInternalApi, final BlockingInternalApi blockingInternalApi) {
         this.accountInternalApi = accountInternalApi;
         this.subscriptionInternalApi = subscriptionInternalApi;
@@ -118,7 +118,7 @@ public class TestOverdueHelper {
         Assert.assertEquals(result.isBlockBilling(), state.disableEntitlementAndChangesBlocked());
     }
 
-    public SubscriptionBundle createBundle(final LocalDate dateOfLastUnPaidInvoice) throws SubscriptionUserApiException, AccountApiException {
+    public SubscriptionBundle createBundle(final LocalDate dateOfLastUnPaidInvoice) throws SubscriptionBaseApiException, AccountApiException {
         final SubscriptionBundle bundle = Mockito.mock(SubscriptionBundle.class);
         final UUID bundleId = UUID.randomUUID();
         Mockito.when(bundle.getId()).thenReturn(bundleId);
diff --git a/server/src/test/java/com/ning/billing/jaxrs/TestAccountTimeline.java b/server/src/test/java/com/ning/billing/jaxrs/TestAccountTimeline.java
index 35223e0..d5882b5 100644
--- a/server/src/test/java/com/ning/billing/jaxrs/TestAccountTimeline.java
+++ b/server/src/test/java/com/ning/billing/jaxrs/TestAccountTimeline.java
@@ -40,7 +40,7 @@ import com.ning.billing.util.audit.ChangeType;
 public class TestAccountTimeline extends TestJaxrsBase {
 
     private static final String PAYMENT_REQUEST_PROCESSOR = "PaymentRequestProcessor";
-    private static final String TRANSITION = "SubscriptionTransition";
+    private static final String TRANSITION = "SubscriptionBaseTransition";
 
     @Test(groups = "slow")
     public void testAccountTimeline() throws Exception {
diff --git a/subscription/src/main/java/com/ning/billing/subscription/alignment/PlanAligner.java b/subscription/src/main/java/com/ning/billing/subscription/alignment/PlanAligner.java
index f8252e0..f5cc57d 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/alignment/PlanAligner.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/alignment/PlanAligner.java
@@ -38,10 +38,10 @@ import com.ning.billing.catalog.api.PlanPhase;
 import com.ning.billing.catalog.api.PlanPhaseSpecifier;
 import com.ning.billing.catalog.api.PlanSpecifier;
 import com.ning.billing.catalog.api.ProductCategory;
+import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
+import com.ning.billing.subscription.api.user.SubscriptionBaseTransitionData;
 import com.ning.billing.subscription.api.user.SubscriptionData;
-import com.ning.billing.subscription.api.user.SubscriptionTransitionData;
 import com.ning.billing.subscription.exceptions.SubscriptionError;
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
 
 /**
  * PlanAligner offers specific APIs to return the correct {@code TimedPhase} when creating, changing Plan or to compute
@@ -72,14 +72,14 @@ public class PlanAligner extends BaseAligner {
      * @param effectiveDate the effective creation date (driven by the catalog policy, i.e. when the creation occurs)
      * @return the current and next phases
      * @throws CatalogApiException         for catalog errors
-     * @throws SubscriptionUserApiException for subscription errors
+     * @throws com.ning.billing.subscription.api.user.SubscriptionBaseApiException for subscription errors
      */
     public TimedPhase[] getCurrentAndNextTimedPhaseOnCreate(final SubscriptionData subscription,
                                                             final Plan plan,
                                                             final PhaseType initialPhase,
                                                             final String priceList,
                                                             final DateTime requestedDate,
-                                                            final DateTime effectiveDate) throws CatalogApiException, SubscriptionUserApiException {
+                                                            final DateTime effectiveDate) throws CatalogApiException, SubscriptionBaseApiException {
         final List<TimedPhase> timedPhases = getTimedPhaseOnCreate(subscription.getAlignStartDate(),
                                                                    subscription.getBundleStartDate(),
                                                                    plan,
@@ -103,13 +103,13 @@ public class PlanAligner extends BaseAligner {
      * @param effectiveDate the effective change date (driven by the catalog policy, i.e. when the change occurs)
      * @return the current phase
      * @throws CatalogApiException         for catalog errors
-     * @throws SubscriptionUserApiException for subscription errors
+     * @throws com.ning.billing.subscription.api.user.SubscriptionBaseApiException for subscription errors
      */
     public TimedPhase getCurrentTimedPhaseOnChange(final SubscriptionData subscription,
                                                    final Plan plan,
                                                    final String priceList,
                                                    final DateTime requestedDate,
-                                                   final DateTime effectiveDate) throws CatalogApiException, SubscriptionUserApiException {
+                                                   final DateTime effectiveDate) throws CatalogApiException, SubscriptionBaseApiException {
         return getTimedPhaseOnChange(subscription, plan, priceList, requestedDate, effectiveDate, WhichPhase.CURRENT);
     }
 
@@ -124,13 +124,13 @@ public class PlanAligner extends BaseAligner {
      * @param effectiveDate the effective change date (driven by the catalog policy, i.e. when the change occurs)
      * @return the next phase
      * @throws CatalogApiException         for catalog errors
-     * @throws SubscriptionUserApiException for subscription errors
+     * @throws com.ning.billing.subscription.api.user.SubscriptionBaseApiException for subscription errors
      */
     public TimedPhase getNextTimedPhaseOnChange(final SubscriptionData subscription,
                                                 final Plan plan,
                                                 final String priceList,
                                                 final DateTime requestedDate,
-                                                final DateTime effectiveDate) throws CatalogApiException, SubscriptionUserApiException {
+                                                final DateTime effectiveDate) throws CatalogApiException, SubscriptionBaseApiException {
         return getTimedPhaseOnChange(subscription, plan, priceList, requestedDate, effectiveDate, WhichPhase.NEXT);
     }
 
@@ -144,7 +144,7 @@ public class PlanAligner extends BaseAligner {
      */
     public TimedPhase getNextTimedPhase(final SubscriptionData subscription, final DateTime requestedDate, final DateTime effectiveDate) {
         try {
-            final SubscriptionTransitionData lastPlanTransition = subscription.getInitialTransitionForCurrentPlan();
+            final SubscriptionBaseTransitionData lastPlanTransition = subscription.getInitialTransitionForCurrentPlan();
             if (effectiveDate.isBefore(lastPlanTransition.getEffectiveTransitionTime())) {
                 throw new SubscriptionError(String.format("Cannot specify an effectiveDate prior to last Plan Change, subscription = %s, effectiveDate = %s",
                                                          subscription.getId(), effectiveDate));
@@ -179,7 +179,7 @@ public class PlanAligner extends BaseAligner {
                     throw new SubscriptionError(String.format("Unexpected initial transition %s for current plan %s on subscription %s",
                                                              lastPlanTransition.getTransitionType(), subscription.getCurrentPlan(), subscription.getId()));
             }
-        } catch (Exception /* SubscriptionUserApiException, CatalogApiException */ e) {
+        } catch (Exception /* SubscriptionBaseApiException, CatalogApiException */ e) {
             throw new SubscriptionError(String.format("Could not compute next phase change for subscription %s", subscription.getId()), e);
         }
     }
@@ -190,7 +190,7 @@ public class PlanAligner extends BaseAligner {
                                                    final PhaseType initialPhase,
                                                    final String priceList,
                                                    final DateTime requestedDate)
-            throws CatalogApiException, SubscriptionUserApiException {
+            throws CatalogApiException, SubscriptionBaseApiException {
         final Catalog catalog = catalogService.getFullCatalog();
 
         final PlanSpecifier planSpecifier = new PlanSpecifier(plan.getProduct().getName(),
@@ -219,7 +219,7 @@ public class PlanAligner extends BaseAligner {
                                              final String nextPriceList,
                                              final DateTime requestedDate,
                                              final DateTime effectiveDate,
-                                             final WhichPhase which) throws CatalogApiException, SubscriptionUserApiException {
+                                             final WhichPhase which) throws CatalogApiException, SubscriptionBaseApiException {
         return getTimedPhaseOnChange(subscription.getAlignStartDate(),
                                      subscription.getBundleStartDate(),
                                      subscription.getCurrentPhase(),
@@ -241,7 +241,7 @@ public class PlanAligner extends BaseAligner {
                                              final String priceList,
                                              final DateTime requestedDate,
                                              final DateTime effectiveDate,
-                                             final WhichPhase which) throws CatalogApiException, SubscriptionUserApiException {
+                                             final WhichPhase which) throws CatalogApiException, SubscriptionBaseApiException {
         final Catalog catalog = catalogService.getFullCatalog();
         final ProductCategory currentCategory = currentPlan.getProduct().getCategory();
         final PlanPhaseSpecifier fromPlanPhaseSpecifier = new PlanPhaseSpecifier(currentPlan.getProduct().getName(),
@@ -277,7 +277,7 @@ public class PlanAligner extends BaseAligner {
         return getTimedPhase(timedPhases, effectiveDate, which);
     }
 
-    private List<TimedPhase> getPhaseAlignments(final Plan plan, @Nullable final PhaseType initialPhase, final DateTime initialPhaseStartDate) throws SubscriptionUserApiException {
+    private List<TimedPhase> getPhaseAlignments(final Plan plan, @Nullable final PhaseType initialPhase, final DateTime initialPhaseStartDate) throws SubscriptionBaseApiException {
         if (plan == null) {
             return Collections.emptyList();
         }
@@ -309,7 +309,7 @@ public class PlanAligner extends BaseAligner {
         }
 
         if (initialPhase != null && curPhaseStart == null) {
-            throw new SubscriptionUserApiException(ErrorCode.SUB_CREATE_BAD_PHASE, initialPhase);
+            throw new SubscriptionBaseApiException(ErrorCode.SUB_CREATE_BAD_PHASE, initialPhase);
         }
 
         return result;
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/SubscriptionApiService.java b/subscription/src/main/java/com/ning/billing/subscription/api/SubscriptionApiService.java
index 596b771..cee9d93 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/SubscriptionApiService.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/SubscriptionApiService.java
@@ -18,14 +18,14 @@ package com.ning.billing.subscription.api;
 
 import org.joda.time.DateTime;
 
-import com.ning.billing.catalog.api.ActionPolicy;
+import com.ning.billing.catalog.api.BillingActionPolicy;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.PhaseType;
 import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhaseSpecifier;
+import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
 import com.ning.billing.subscription.api.user.SubscriptionBuilder;
 import com.ning.billing.subscription.api.user.SubscriptionData;
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
 import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.callcontext.InternalCallContext;
 
@@ -34,27 +34,27 @@ public interface SubscriptionApiService {
     public SubscriptionData createPlan(SubscriptionBuilder builder, Plan plan, PhaseType initialPhase,
                                        String realPriceList, DateTime requestedDate, DateTime effectiveDate, DateTime processedDate,
                                        CallContext context)
-            throws SubscriptionUserApiException;
+            throws SubscriptionBaseApiException;
 
     public boolean recreatePlan(SubscriptionData subscription, PlanPhaseSpecifier spec, DateTime requestedDate, CallContext context)
-            throws SubscriptionUserApiException;
+            throws SubscriptionBaseApiException;
 
     public boolean cancel(SubscriptionData subscription, DateTime requestedDate, CallContext context)
-        throws SubscriptionUserApiException;
+        throws SubscriptionBaseApiException;
 
-    public boolean cancelWithPolicy(SubscriptionData subscription, DateTime requestedDate, ActionPolicy policy, CallContext context)
-        throws SubscriptionUserApiException;
+    public boolean cancelWithPolicy(SubscriptionData subscription, DateTime requestedDate, BillingActionPolicy policy, CallContext context)
+        throws SubscriptionBaseApiException;
 
     public boolean uncancel(SubscriptionData subscription, CallContext context)
-            throws SubscriptionUserApiException;
+            throws SubscriptionBaseApiException;
 
     public boolean changePlan(SubscriptionData subscription, String productName, BillingPeriod term,
                               String priceList, DateTime requestedDate, CallContext context)
-            throws SubscriptionUserApiException;
+            throws SubscriptionBaseApiException;
 
     public boolean changePlanWithPolicy(SubscriptionData subscription, String productName, BillingPeriod term,
-                                        String priceList, DateTime requestedDate, ActionPolicy policy, CallContext context)
-            throws SubscriptionUserApiException;
+                                        String priceList, DateTime requestedDate, BillingActionPolicy policy, CallContext context)
+            throws SubscriptionBaseApiException;
 
     public int cancelAddOnsIfRequired(final SubscriptionData baseSubscription, final DateTime effectiveDate, final InternalCallContext context);
 }
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 a20d4fb..da81c46 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
@@ -42,6 +42,8 @@ import com.ning.billing.subscription.api.user.DefaultEffectiveSubscriptionEvent;
 import com.ning.billing.subscription.api.user.DefaultSubscriptionApiService;
 import com.ning.billing.subscription.api.user.DefaultSubscriptionStatusDryRun;
 import com.ning.billing.subscription.api.SubscriptionBase;
+import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
+import com.ning.billing.subscription.api.user.SubscriptionBaseTransition;
 import com.ning.billing.subscription.api.user.SubscriptionBuilder;
 import com.ning.billing.subscription.api.user.SubscriptionBundle;
 import com.ning.billing.subscription.api.user.SubscriptionBundleData;
@@ -49,23 +51,21 @@ import com.ning.billing.subscription.api.user.SubscriptionData;
 import com.ning.billing.subscription.api.user.SubscriptionState;
 import com.ning.billing.subscription.api.user.SubscriptionStatusDryRun;
 import com.ning.billing.subscription.api.user.SubscriptionStatusDryRun.DryRunChangeReason;
-import com.ning.billing.subscription.api.user.SubscriptionTransition;
-import com.ning.billing.subscription.api.user.SubscriptionTransitionData;
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
+import com.ning.billing.subscription.api.user.SubscriptionBaseTransitionData;
 import com.ning.billing.subscription.engine.addon.AddonUtils;
 import com.ning.billing.subscription.engine.dao.SubscriptionDao;
 import com.ning.billing.subscription.exceptions.SubscriptionError;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 
 import com.google.common.base.Function;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableList;
 import com.google.inject.Inject;
 
-public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implements SubscriptionInternalApi {
+public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implements SubscriptionBaseInternalApi {
 
     private final Logger log = LoggerFactory.getLogger(DefaultSubscriptionInternalApi.class);
 
@@ -82,13 +82,13 @@ public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implemen
     }
 
     @Override
-    public SubscriptionBase createSubscription(final UUID bundleId, final PlanPhaseSpecifier spec, final DateTime requestedDateWithMs, final InternalCallContext context) throws SubscriptionUserApiException {
+    public SubscriptionBase createSubscription(final UUID bundleId, final PlanPhaseSpecifier spec, final DateTime requestedDateWithMs, final InternalCallContext context) throws SubscriptionBaseApiException {
         try {
             final String realPriceList = (spec.getPriceListName() == null) ? PriceListSet.DEFAULT_PRICELIST_NAME : spec.getPriceListName();
             final DateTime now = clock.getUTCNow();
             final DateTime requestedDate = (requestedDateWithMs != null) ? DefaultClock.truncateMs(requestedDateWithMs) : now;
             if (requestedDate.isAfter(now)) {
-                throw new SubscriptionUserApiException(ErrorCode.SUB_INVALID_REQUESTED_DATE, now.toString(), requestedDate.toString());
+                throw new SubscriptionBaseApiException(ErrorCode.SUB_INVALID_REQUESTED_DATE, now.toString(), requestedDate.toString());
             }
             final DateTime effectiveDate = requestedDate;
 
@@ -103,7 +103,7 @@ public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implemen
 
             final SubscriptionBundle bundle = dao.getSubscriptionBundleFromId(bundleId, context);
             if (bundle == null) {
-                throw new SubscriptionUserApiException(ErrorCode.SUB_CREATE_NO_BUNDLE, bundleId);
+                throw new SubscriptionBaseApiException(ErrorCode.SUB_CREATE_NO_BUNDLE, bundleId);
             }
 
             DateTime bundleStartDate = null;
@@ -112,7 +112,7 @@ public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implemen
                 case BASE:
                     if (baseSubscription != null) {
                         if (baseSubscription.getState() == SubscriptionState.ACTIVE) {
-                            throw new SubscriptionUserApiException(ErrorCode.SUB_CREATE_BP_EXISTS, bundleId);
+                            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 Subscription.
                             final SubscriptionBase recreatedSubscriptionForApiUse = createSubscriptionForApiUse(baseSubscription);
@@ -124,17 +124,17 @@ public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implemen
                     break;
                 case ADD_ON:
                     if (baseSubscription == null) {
-                        throw new SubscriptionUserApiException(ErrorCode.SUB_CREATE_NO_BP, bundleId);
+                        throw new SubscriptionBaseApiException(ErrorCode.SUB_CREATE_NO_BP, bundleId);
                     }
                     if (effectiveDate.isBefore(baseSubscription.getStartDate())) {
-                        throw new SubscriptionUserApiException(ErrorCode.SUB_INVALID_REQUESTED_DATE, effectiveDate.toString(), baseSubscription.getStartDate().toString());
+                        throw new SubscriptionBaseApiException(ErrorCode.SUB_INVALID_REQUESTED_DATE, effectiveDate.toString(), baseSubscription.getStartDate().toString());
                     }
                     addonUtils.checkAddonCreationRights(baseSubscription, plan);
                     bundleStartDate = baseSubscription.getStartDate();
                     break;
                 case STANDALONE:
                     if (baseSubscription != null) {
-                        throw new SubscriptionUserApiException(ErrorCode.SUB_CREATE_BP_EXISTS, bundleId);
+                        throw new SubscriptionBaseApiException(ErrorCode.SUB_CREATE_BP_EXISTS, bundleId);
                     }
                     // Not really but we don't care, there is no alignment for STANDALONE subscriptions
                     bundleStartDate = requestedDate;
@@ -152,21 +152,21 @@ public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implemen
                                                  .setAlignStartDate(effectiveDate),
                                          plan, spec.getPhaseType(), realPriceList, requestedDate, effectiveDate, now, context.toCallContext());
         } catch (CatalogApiException e) {
-            throw new SubscriptionUserApiException(e);
+            throw new SubscriptionBaseApiException(e);
         }
     }
 
     @Override
-    public SubscriptionBundle createBundleForAccount(final UUID accountId, final String bundleName, final InternalCallContext context) throws SubscriptionUserApiException {
+    public SubscriptionBundle createBundleForAccount(final UUID accountId, final String bundleName, final InternalCallContext context) throws SubscriptionBaseApiException {
         final SubscriptionBundleData bundle = new SubscriptionBundleData(bundleName, accountId, clock.getUTCNow());
         return dao.createSubscriptionBundle(bundle, context);
     }
 
     @Override
-    public SubscriptionBundle getBundleForAccountAndKey(final UUID accountId, final String bundleKey, final InternalTenantContext context) throws SubscriptionUserApiException {
+    public SubscriptionBundle getBundleForAccountAndKey(final UUID accountId, final String bundleKey, final InternalTenantContext context) throws SubscriptionBaseApiException {
         final SubscriptionBundle result = dao.getSubscriptionBundleFromAccountAndKey(accountId, bundleKey, context);
         if (result == null) {
-            throw new SubscriptionUserApiException(ErrorCode.SUB_GET_INVALID_BUNDLE_KEY, bundleKey);
+            throw new SubscriptionBaseApiException(ErrorCode.SUB_GET_INVALID_BUNDLE_KEY, bundleKey);
         }
         return result;
     }
@@ -185,10 +185,10 @@ public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implemen
 
     @Override
     public SubscriptionBase getBaseSubscription(UUID bundleId,
-                                            InternalTenantContext context) throws SubscriptionUserApiException {
+                                            InternalTenantContext context) throws SubscriptionBaseApiException {
         final SubscriptionBase result = dao.getBaseSubscription(bundleId, context);
         if (result == null) {
-            throw new SubscriptionUserApiException(ErrorCode.SUB_GET_NO_SUCH_BASE_SUBSCRIPTION, bundleId);
+            throw new SubscriptionBaseApiException(ErrorCode.SUB_GET_NO_SUCH_BASE_SUBSCRIPTION, bundleId);
         }
         return createSubscriptionForApiUse(result);
     }
@@ -196,25 +196,25 @@ public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implemen
     @Override
 
     public SubscriptionBase getSubscriptionFromId(UUID id,
-                                              InternalTenantContext context) throws SubscriptionUserApiException {
+                                              InternalTenantContext context) throws SubscriptionBaseApiException {
         final SubscriptionBase result = dao.getSubscriptionFromId(id, context);
         if (result == null) {
-            throw new SubscriptionUserApiException(ErrorCode.SUB_INVALID_SUBSCRIPTION_ID, id);
+            throw new SubscriptionBaseApiException(ErrorCode.SUB_INVALID_SUBSCRIPTION_ID, id);
         }
         return createSubscriptionForApiUse(result);
     }
 
     @Override
-    public SubscriptionBundle getBundleFromId(final UUID id, final InternalTenantContext context) throws SubscriptionUserApiException {
+    public SubscriptionBundle getBundleFromId(final UUID id, final InternalTenantContext context) throws SubscriptionBaseApiException {
         final SubscriptionBundle result = dao.getSubscriptionBundleFromId(id, context);
         if (result == null) {
-            throw new SubscriptionUserApiException(ErrorCode.SUB_GET_INVALID_BUNDLE_ID, id.toString());
+            throw new SubscriptionBaseApiException(ErrorCode.SUB_GET_INVALID_BUNDLE_ID, id.toString());
         }
         return result;
     }
 
     @Override
-    public UUID getAccountIdFromSubscriptionId(final UUID subscriptionId, final InternalTenantContext context) throws SubscriptionUserApiException {
+    public UUID getAccountIdFromSubscriptionId(final UUID subscriptionId, final InternalTenantContext context) throws SubscriptionBaseApiException {
         return dao.getAccountIdFromSubscriptionId(subscriptionId, context);
     }
 
@@ -231,13 +231,13 @@ public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implemen
 
     @Override
     public List<EffectiveSubscriptionInternalEvent> getAllTransitions(final SubscriptionBase subscription, final InternalTenantContext context) {
-        final List<SubscriptionTransition> transitions = ((SubscriptionData) subscription).getAllTransitions();
+        final List<SubscriptionBaseTransition> transitions = ((SubscriptionData) subscription).getAllTransitions();
         return convertEffectiveSubscriptionInternalEventFromSubscriptionTransitions(subscription, context, transitions);
     }
 
     @Override
     public List<EffectiveSubscriptionInternalEvent> getBillingTransitions(final SubscriptionBase subscription, final InternalTenantContext context) {
-        final List<SubscriptionTransition> transitions = ((SubscriptionData) subscription).getBillingTransitions();
+        final List<SubscriptionBaseTransition> transitions = ((SubscriptionData) subscription).getBillingTransitions();
         return convertEffectiveSubscriptionInternalEventFromSubscriptionTransitions(subscription, context, transitions);
     }
 
@@ -259,13 +259,13 @@ public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implemen
     }
 
     @Override
-    public List<SubscriptionStatusDryRun> getDryRunChangePlanStatus(final UUID subscriptionId, @Nullable final String baseProductName, final DateTime requestedDate, final InternalTenantContext context) throws SubscriptionUserApiException {
+    public List<SubscriptionStatusDryRun> getDryRunChangePlanStatus(final UUID subscriptionId, @Nullable final String baseProductName, final DateTime requestedDate, final InternalTenantContext context) throws SubscriptionBaseApiException {
         final SubscriptionBase subscription = dao.getSubscriptionFromId(subscriptionId, context);
         if (subscription == null) {
-            throw new SubscriptionUserApiException(ErrorCode.SUB_INVALID_SUBSCRIPTION_ID, subscriptionId);
+            throw new SubscriptionBaseApiException(ErrorCode.SUB_INVALID_SUBSCRIPTION_ID, subscriptionId);
         }
         if (subscription.getCategory() != ProductCategory.BASE) {
-            throw new SubscriptionUserApiException(ErrorCode.SUB_CHANGE_DRY_RUN_NOT_BP);
+            throw new SubscriptionBaseApiException(ErrorCode.SUB_CHANGE_DRY_RUN_NOT_BP);
         }
 
         final List<SubscriptionStatusDryRun> result = new LinkedList<SubscriptionStatusDryRun>();
@@ -301,12 +301,12 @@ public class DefaultSubscriptionInternalApi extends SubscriptionApiBase implemen
     }
 
     private List<EffectiveSubscriptionInternalEvent> convertEffectiveSubscriptionInternalEventFromSubscriptionTransitions(final SubscriptionBase subscription,
-                                                                                                                          final InternalTenantContext context, final List<SubscriptionTransition> transitions) {
-        return ImmutableList.<EffectiveSubscriptionInternalEvent>copyOf(Collections2.transform(transitions, new Function<SubscriptionTransition, EffectiveSubscriptionInternalEvent>() {
+                                                                                                                          final InternalTenantContext context, final List<SubscriptionBaseTransition> transitions) {
+        return ImmutableList.<EffectiveSubscriptionInternalEvent>copyOf(Collections2.transform(transitions, new Function<SubscriptionBaseTransition, EffectiveSubscriptionInternalEvent>() {
             @Override
             @Nullable
-            public EffectiveSubscriptionInternalEvent apply(@Nullable SubscriptionTransition input) {
-                return new DefaultEffectiveSubscriptionEvent((SubscriptionTransitionData) input, ((SubscriptionData) subscription).getAlignStartDate(), null, context.getAccountRecordId(), context.getTenantRecordId());
+            public EffectiveSubscriptionInternalEvent apply(@Nullable SubscriptionBaseTransition input) {
+                return new DefaultEffectiveSubscriptionEvent((SubscriptionBaseTransitionData) input, ((SubscriptionData) subscription).getAlignStartDate(), null, context.getAccountRecordId(), context.getTenantRecordId());
             }
         }));
     }
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/timeline/DefaultSubscriptionTimeline.java b/subscription/src/main/java/com/ning/billing/subscription/api/timeline/DefaultSubscriptionTimeline.java
index 2d892de..04ef467 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/timeline/DefaultSubscriptionTimeline.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/timeline/DefaultSubscriptionTimeline.java
@@ -32,7 +32,7 @@ import com.ning.billing.catalog.api.PhaseType;
 import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhaseSpecifier;
 import com.ning.billing.catalog.api.ProductCategory;
-import com.ning.billing.subscription.api.user.SubscriptionTransitionData;
+import com.ning.billing.subscription.api.user.SubscriptionBaseTransitionData;
 import com.ning.billing.subscription.events.SubscriptionEvent;
 import com.ning.billing.subscription.events.phase.PhaseEvent;
 import com.ning.billing.subscription.events.user.ApiEvent;
@@ -131,7 +131,7 @@ public class DefaultSubscriptionTimeline implements SubscriptionTimeline {
                     break;
             }
 
-            final SubscriptionTransitionType transitionType = SubscriptionTransitionData.toSubscriptionTransitionType(cur.getType(), apiType);
+            final SubscriptionTransitionType transitionType = SubscriptionBaseTransitionData.toSubscriptionTransitionType(cur.getType(), apiType);
 
             final String planPhaseNameWithClosure = planPhaseName;
             final PlanPhaseSpecifier spec = new PlanPhaseSpecifier(productName, category, billingPeriod, priceListName, phaseType);
@@ -226,7 +226,7 @@ public class DefaultSubscriptionTimeline implements SubscriptionTimeline {
                 break;
             }
 
-            final SubscriptionTransitionType transitionType = SubscriptionTransitionData.toSubscriptionTransitionType(cur.getType(), apiType);
+            final SubscriptionTransitionType transitionType = SubscriptionBaseTransitionData.toSubscriptionTransitionType(cur.getType(), apiType);
 
             final PlanPhaseSpecifier spec = new PlanPhaseSpecifier(productName, category, billingPeriod, priceListName, phaseType);
             result.add(new ExistingEvent() {
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/timeline/DefaultSubscriptionTimelineApi.java b/subscription/src/main/java/com/ning/billing/subscription/api/timeline/DefaultSubscriptionTimelineApi.java
index f0d78ce..158e18c 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/timeline/DefaultSubscriptionTimelineApi.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/timeline/DefaultSubscriptionTimelineApi.java
@@ -36,10 +36,11 @@ import com.ning.billing.catalog.api.CatalogService;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.subscription.api.SubscriptionApiBase;
 import com.ning.billing.subscription.api.SubscriptionApiService;
+import com.ning.billing.subscription.api.user.SubscriptionBaseTransition;
 import com.ning.billing.subscription.api.user.SubscriptionBuilder;
 import com.ning.billing.subscription.api.user.SubscriptionBundleData;
 import com.ning.billing.subscription.api.user.SubscriptionData;
-import com.ning.billing.subscription.api.user.SubscriptionTransitionData;
+import com.ning.billing.subscription.api.user.SubscriptionBaseTransitionData;
 import com.ning.billing.subscription.engine.addon.AddonUtils;
 import com.ning.billing.subscription.engine.dao.SubscriptionDao;
 import com.ning.billing.subscription.events.SubscriptionEvent;
@@ -48,7 +49,6 @@ import com.ning.billing.subscription.api.SubscriptionTransitionType;
 import com.ning.billing.subscription.api.timeline.SubscriptionTimeline.NewEvent;
 import com.ning.billing.subscription.api.SubscriptionBase;
 import com.ning.billing.subscription.api.user.SubscriptionBundle;
-import com.ning.billing.subscription.api.user.SubscriptionTransition;
 import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.callcontext.InternalTenantContext;
@@ -375,8 +375,8 @@ public class DefaultSubscriptionTimelineApi extends SubscriptionApiBase implemen
         if (nbDeleted != deletedEvents.size()) {
             for (final SubscriptionTimeline.DeletedEvent d : deletedEvents) {
                 boolean found = false;
-                for (final SubscriptionTransition cur : data.getAllTransitions()) {
-                    if (((SubscriptionTransitionData) cur).getId().equals(d.getEventId())) {
+                for (final SubscriptionBaseTransition cur : data.getAllTransitions()) {
+                    if (((SubscriptionBaseTransitionData) cur).getId().equals(d.getEventId())) {
                         found = true;
                     }
                 }
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 1c95208..ed54cb4 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
@@ -31,6 +31,8 @@ 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.subscription.api.SubscriptionApiService;
+import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
+import com.ning.billing.subscription.api.user.SubscriptionBaseTransition;
 import com.ning.billing.subscription.api.user.SubscriptionBuilder;
 import com.ning.billing.subscription.api.user.SubscriptionData;
 import com.ning.billing.subscription.engine.addon.AddonUtils;
@@ -41,8 +43,6 @@ import com.ning.billing.subscription.events.user.ApiEventBuilder;
 import com.ning.billing.subscription.events.user.ApiEventCancel;
 import com.ning.billing.subscription.api.SubscriptionTransitionType;
 import com.ning.billing.subscription.api.user.SubscriptionState;
-import com.ning.billing.subscription.api.user.SubscriptionTransition;
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
 import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.clock.Clock;
@@ -125,7 +125,7 @@ public class SubscriptionDataRepair extends SubscriptionData {
                 default:
                     throw new SubscriptionRepairException(ErrorCode.SUB_REPAIR_UNKNOWN_TYPE, input.getSubscriptionTransitionType(), id);
             }
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             throw new SubscriptionRepairException(e);
         } catch (CatalogApiException e) {
             throw new SubscriptionRepairException(e);
@@ -138,7 +138,7 @@ public class SubscriptionDataRepair extends SubscriptionData {
             return;
         }
 
-        final SubscriptionTransition pendingTransition = getPendingTransition();
+        final SubscriptionBaseTransition pendingTransition = getPendingTransition();
         if (pendingTransition == null) {
             return;
         }
@@ -149,7 +149,7 @@ public class SubscriptionDataRepair extends SubscriptionData {
     }
 
     private void trickleDownBPEffectForAddon(final List<SubscriptionDataRepair> addOnSubscriptionInRepair, final DateTime effectiveDate, final CallContext context)
-            throws SubscriptionUserApiException {
+            throws SubscriptionBaseApiException {
 
         if (getCategory() != ProductCategory.BASE) {
             return;
@@ -190,7 +190,7 @@ public class SubscriptionDataRepair extends SubscriptionData {
     }
 
     private void checkAddonRights(final SubscriptionDataRepair baseSubscription)
-            throws SubscriptionUserApiException, CatalogApiException {
+            throws SubscriptionBaseApiException, CatalogApiException {
         if (getCategory() == ProductCategory.ADD_ON) {
             addonUtils.checkAddonCreationRights(baseSubscription, getCurrentPlan());
         }
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 95b6150..3c4e6f0 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
@@ -28,7 +28,7 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 
 public class DefaultEffectiveSubscriptionEvent extends DefaultSubscriptionEvent implements EffectiveSubscriptionInternalEvent {
 
-    public DefaultEffectiveSubscriptionEvent(final SubscriptionTransitionData in, final DateTime startDate, final UUID userToken, final Long accountRecordId, final Long tenantRecordId) {
+    public DefaultEffectiveSubscriptionEvent(final SubscriptionBaseTransitionData in, final DateTime startDate, final UUID userToken, final Long accountRecordId, final Long tenantRecordId) {
         super(in, startDate, accountRecordId, tenantRecordId, userToken);
     }
 
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionApiService.java b/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionApiService.java
index fe39c2c..b4f0121 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionApiService.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/user/DefaultSubscriptionApiService.java
@@ -25,7 +25,7 @@ import org.joda.time.DateTime;
 
 import com.ning.billing.ErrorCode;
 import com.ning.billing.ObjectType;
-import com.ning.billing.catalog.api.ActionPolicy;
+import com.ning.billing.catalog.api.BillingActionPolicy;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.CatalogApiException;
 import com.ning.billing.catalog.api.CatalogService;
@@ -89,7 +89,7 @@ public class DefaultSubscriptionApiService implements SubscriptionApiService {
     @Override
     public SubscriptionData createPlan(final SubscriptionBuilder builder, final Plan plan, final PhaseType initialPhase,
                                        final String realPriceList, final DateTime requestedDate, final DateTime effectiveDate, final DateTime processedDate,
-                                       final CallContext context) throws SubscriptionUserApiException {
+                                       final CallContext context) throws SubscriptionBaseApiException {
         final SubscriptionData subscription = new SubscriptionData(builder, this, clock);
 
         createFromSubscription(subscription, plan, initialPhase, realPriceList, requestedDate, effectiveDate, processedDate, false, context);
@@ -98,10 +98,10 @@ public class DefaultSubscriptionApiService implements SubscriptionApiService {
 
     @Override
     public boolean recreatePlan(final SubscriptionData subscription, final PlanPhaseSpecifier spec, final DateTime requestedDateWithMs, final CallContext context)
-            throws SubscriptionUserApiException {
+            throws SubscriptionBaseApiException {
         final SubscriptionState currentState = subscription.getState();
         if (currentState != null && currentState != SubscriptionState.CANCELLED) {
-            throw new SubscriptionUserApiException(ErrorCode.SUB_RECREATE_BAD_STATE, subscription.getId(), currentState);
+            throw new SubscriptionBaseApiException(ErrorCode.SUB_RECREATE_BAD_STATE, subscription.getId(), currentState);
         }
 
         final DateTime now = clock.getUTCNow();
@@ -123,13 +123,13 @@ public class DefaultSubscriptionApiService implements SubscriptionApiService {
             createFromSubscription(subscription, plan, spec.getPhaseType(), realPriceList, requestedDate, effectiveDate, processedDate, true, context);
             return true;
         } catch (CatalogApiException e) {
-            throw new SubscriptionUserApiException(e);
+            throw new SubscriptionBaseApiException(e);
         }
     }
 
     private void createFromSubscription(final SubscriptionData subscription, final Plan plan, final PhaseType initialPhase,
                                         final String realPriceList, final DateTime requestedDate, final DateTime effectiveDate, final DateTime processedDate,
-                                        final boolean reCreate, final CallContext context) throws SubscriptionUserApiException {
+                                        final boolean reCreate, final CallContext context) throws SubscriptionBaseApiException {
         final InternalCallContext internalCallContext = createCallContextFromBundleId(subscription.getBundleId(), context);
 
         try {
@@ -163,16 +163,16 @@ public class DefaultSubscriptionApiService implements SubscriptionApiService {
             }
             subscription.rebuildTransitions(dao.getEventsForSubscription(subscription.getId(), internalCallContext), catalogService.getFullCatalog());
         } catch (CatalogApiException e) {
-            throw new SubscriptionUserApiException(e);
+            throw new SubscriptionBaseApiException(e);
         }
     }
 
     @Override
-    public boolean cancel(final SubscriptionData subscription, final DateTime requestedDateWithMs, final CallContext context) throws SubscriptionUserApiException {
+    public boolean cancel(final SubscriptionData subscription, final DateTime requestedDateWithMs, final CallContext context) throws SubscriptionBaseApiException {
         try {
             final SubscriptionState currentState = subscription.getState();
             if (currentState != SubscriptionState.ACTIVE) {
-                throw new SubscriptionUserApiException(ErrorCode.SUB_CANCEL_BAD_STATE, subscription.getId(), currentState);
+                throw new SubscriptionBaseApiException(ErrorCode.SUB_CANCEL_BAD_STATE, subscription.getId(), currentState);
             }
             final DateTime now = clock.getUTCNow();
             final DateTime requestedDate = (requestedDateWithMs != null) ? DefaultClock.truncateMs(requestedDateWithMs) : now;
@@ -184,25 +184,25 @@ public class DefaultSubscriptionApiService implements SubscriptionApiService {
                                                                         subscription.getCurrentPriceList().getName(),
                                                                         subscription.getCurrentPhase().getPhaseType());
 
-            final ActionPolicy policy = catalogService.getFullCatalog().planCancelPolicy(planPhase, requestedDate);
+            final BillingActionPolicy policy = catalogService.getFullCatalog().planCancelPolicy(planPhase, requestedDate);
 
             return doCancelPlan(subscription, requestedDateWithMs, now, policy, context);
         } catch (CatalogApiException e) {
-            throw new SubscriptionUserApiException(e);
+            throw new SubscriptionBaseApiException(e);
         }
     }
 
     @Override
-    public boolean cancelWithPolicy(final SubscriptionData subscription, final DateTime requestedDateWithMs, final ActionPolicy policy, final CallContext context) throws SubscriptionUserApiException {
+    public boolean cancelWithPolicy(final SubscriptionData subscription, final DateTime requestedDateWithMs, final BillingActionPolicy policy, final CallContext context) throws SubscriptionBaseApiException {
         final SubscriptionState currentState = subscription.getState();
         if (currentState != SubscriptionState.ACTIVE) {
-            throw new SubscriptionUserApiException(ErrorCode.SUB_CANCEL_BAD_STATE, subscription.getId(), currentState);
+            throw new SubscriptionBaseApiException(ErrorCode.SUB_CANCEL_BAD_STATE, subscription.getId(), currentState);
         }
         final DateTime now = clock.getUTCNow();
         return doCancelPlan(subscription, requestedDateWithMs, now, policy, context);
     }
 
-    private boolean doCancelPlan(final SubscriptionData subscription, final DateTime requestedDateWithMs, final DateTime now, final ActionPolicy policy, final CallContext context) throws SubscriptionUserApiException {
+    private boolean doCancelPlan(final SubscriptionData subscription, final DateTime requestedDateWithMs, final DateTime now, final BillingActionPolicy policy, final CallContext context) throws SubscriptionBaseApiException {
 
         final DateTime requestedDate = (requestedDateWithMs != null) ? DefaultClock.truncateMs(requestedDateWithMs) : now;
         validateRequestedDate(subscription, now, requestedDate);
@@ -222,13 +222,13 @@ public class DefaultSubscriptionApiService implements SubscriptionApiService {
 
         cancelAddOnsIfRequired(subscription, effectiveDate, internalCallContext);
 
-        return (policy == ActionPolicy.IMMEDIATE);
+        return (policy == BillingActionPolicy.IMMEDIATE);
     }
 
     @Override
-    public boolean uncancel(final SubscriptionData subscription, final CallContext context) throws SubscriptionUserApiException {
+    public boolean uncancel(final SubscriptionData subscription, final CallContext context) throws SubscriptionBaseApiException {
         if (!subscription.isSubscriptionFutureCancelled()) {
-            throw new SubscriptionUserApiException(ErrorCode.SUB_UNCANCEL_BAD_STATE, subscription.getId().toString());
+            throw new SubscriptionBaseApiException(ErrorCode.SUB_UNCANCEL_BAD_STATE, subscription.getId().toString());
         }
 
         final DateTime now = clock.getUTCNow();
@@ -261,7 +261,7 @@ public class DefaultSubscriptionApiService implements SubscriptionApiService {
     @Override
     public boolean changePlan(final SubscriptionData subscription, final String productName, final BillingPeriod term,
                               final String priceList, final DateTime requestedDateWithMs, final CallContext context)
-            throws SubscriptionUserApiException {
+            throws SubscriptionBaseApiException {
         final DateTime now = clock.getUTCNow();
         final DateTime requestedDate = (requestedDateWithMs != null) ? DefaultClock.truncateMs(requestedDateWithMs) : now;
 
@@ -269,19 +269,19 @@ public class DefaultSubscriptionApiService implements SubscriptionApiService {
         validateSubscriptionState(subscription);
 
         final PlanChangeResult planChangeResult = getPlanChangeResult(subscription, productName, term, priceList, requestedDate);
-        final ActionPolicy policy = planChangeResult.getPolicy();
+        final BillingActionPolicy policy = planChangeResult.getPolicy();
 
         try {
             return doChangePlan(subscription, planChangeResult, now, requestedDate, productName, term, policy, context);
         } catch (CatalogApiException e) {
-            throw new SubscriptionUserApiException(e);
+            throw new SubscriptionBaseApiException(e);
         }
     }
 
     @Override
     public boolean changePlanWithPolicy(final SubscriptionData subscription, final String productName, final BillingPeriod term,
-                                        final String priceList, final DateTime requestedDateWithMs, final ActionPolicy policy, final CallContext context)
-            throws SubscriptionUserApiException {
+                                        final String priceList, final DateTime requestedDateWithMs, final BillingActionPolicy policy, final CallContext context)
+            throws SubscriptionBaseApiException {
         final DateTime now = clock.getUTCNow();
         final DateTime requestedDate = (requestedDateWithMs != null) ? DefaultClock.truncateMs(requestedDateWithMs) : now;
 
@@ -293,12 +293,12 @@ public class DefaultSubscriptionApiService implements SubscriptionApiService {
         try {
             return doChangePlan(subscription, planChangeResult, now, requestedDate, productName, term, policy, context);
         } catch (CatalogApiException e) {
-            throw new SubscriptionUserApiException(e);
+            throw new SubscriptionBaseApiException(e);
         }
     }
 
     private PlanChangeResult getPlanChangeResult(final SubscriptionData subscription, final String productName,
-                                                 final BillingPeriod term, final String priceList, final DateTime requestedDate) throws SubscriptionUserApiException {
+                                                 final BillingPeriod term, final String priceList, final DateTime requestedDate) throws SubscriptionBaseApiException {
         final PlanChangeResult planChangeResult;
         try {
             final Product destProduct = catalogService.getFullCatalog().findProduct(productName, requestedDate);
@@ -316,7 +316,7 @@ public class DefaultSubscriptionApiService implements SubscriptionApiService {
 
             planChangeResult = catalogService.getFullCatalog().planChange(fromPlanPhase, toPlanPhase, requestedDate);
         } catch (CatalogApiException e) {
-            throw new SubscriptionUserApiException(e);
+            throw new SubscriptionBaseApiException(e);
         }
 
         return planChangeResult;
@@ -324,7 +324,7 @@ public class DefaultSubscriptionApiService implements SubscriptionApiService {
 
     private boolean doChangePlan(final SubscriptionData subscription, final PlanChangeResult planChangeResult,
                                  final DateTime now, final DateTime requestedDate, final String productName,
-                                 final BillingPeriod term, final ActionPolicy policy, final CallContext context) throws SubscriptionUserApiException, CatalogApiException {
+                                 final BillingPeriod term, final BillingActionPolicy policy, final CallContext context) throws SubscriptionBaseApiException, CatalogApiException {
         final PriceList newPriceList = planChangeResult.getNewPriceList();
 
         final Plan newPlan = catalogService.getFullCatalog().findPlan(productName, term, newPriceList.getName(), requestedDate, subscription.getStartDate());
@@ -361,7 +361,7 @@ public class DefaultSubscriptionApiService implements SubscriptionApiService {
 
         cancelAddOnsIfRequired(subscription, effectiveDate, internalCallContext);
 
-        return (policy == ActionPolicy.IMMEDIATE);
+        return (policy == BillingActionPolicy.IMMEDIATE);
     }
 
 
@@ -411,26 +411,26 @@ public class DefaultSubscriptionApiService implements SubscriptionApiService {
     }
 
     private void validateRequestedDate(final SubscriptionData subscription, final DateTime now, final DateTime requestedDate)
-            throws SubscriptionUserApiException {
+            throws SubscriptionBaseApiException {
 
         if (requestedDate.isAfter(now)) {
-            throw new SubscriptionUserApiException(ErrorCode.SUB_INVALID_REQUESTED_FUTURE_DATE, requestedDate.toString());
+            throw new SubscriptionBaseApiException(ErrorCode.SUB_INVALID_REQUESTED_FUTURE_DATE, requestedDate.toString());
         }
 
-        final SubscriptionTransition previousTransition = subscription.getPreviousTransition();
+        final SubscriptionBaseTransition previousTransition = subscription.getPreviousTransition();
         if (previousTransition != null && previousTransition.getEffectiveTransitionTime().isAfter(requestedDate)) {
-            throw new SubscriptionUserApiException(ErrorCode.SUB_INVALID_REQUESTED_DATE,
+            throw new SubscriptionBaseApiException(ErrorCode.SUB_INVALID_REQUESTED_DATE,
                                                   requestedDate.toString(), previousTransition.getEffectiveTransitionTime());
         }
     }
 
-    private void validateSubscriptionState(final SubscriptionData subscription) throws SubscriptionUserApiException {
+    private void validateSubscriptionState(final SubscriptionData subscription) throws SubscriptionBaseApiException {
         final SubscriptionState currentState = subscription.getState();
         if (currentState != SubscriptionState.ACTIVE) {
-            throw new SubscriptionUserApiException(ErrorCode.SUB_CHANGE_NON_ACTIVE, subscription.getId(), currentState);
+            throw new SubscriptionBaseApiException(ErrorCode.SUB_CHANGE_NON_ACTIVE, subscription.getId(), currentState);
         }
         if (subscription.isSubscriptionFutureCancelled()) {
-            throw new SubscriptionUserApiException(ErrorCode.SUB_CHANGE_FUTURE_CANCELLED, subscription.getId());
+            throw new SubscriptionBaseApiException(ErrorCode.SUB_CHANGE_FUTURE_CANCELLED, subscription.getId());
         }
     }
 
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 92862fd..58ee2a9 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
@@ -48,7 +48,7 @@ public abstract class DefaultSubscriptionEvent extends BusEventBase implements S
     private final SubscriptionTransitionType transitionType;
     private final DateTime startDate;
 
-    public DefaultSubscriptionEvent(final SubscriptionTransitionData in, final DateTime startDate,
+    public DefaultSubscriptionEvent(final SubscriptionBaseTransitionData in, final DateTime startDate,
                                     final Long searchKey1,
                                     final Long searchKey2,
                                     final UUID userToken) {
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/user/SubscriptionData.java b/subscription/src/main/java/com/ning/billing/subscription/api/user/SubscriptionData.java
index 5c701db..57dbd93 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/user/SubscriptionData.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/user/SubscriptionData.java
@@ -28,7 +28,7 @@ import org.joda.time.DateTime;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.ning.billing.catalog.api.ActionPolicy;
+import com.ning.billing.catalog.api.BillingActionPolicy;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.Catalog;
 import com.ning.billing.catalog.api.CatalogApiException;
@@ -83,7 +83,7 @@ public class SubscriptionData extends EntityBase implements SubscriptionBase {
     // so the user holding that subscription object get the correct state when
     // the call completes
     //
-    private LinkedList<SubscriptionTransition> transitions;
+    private LinkedList<SubscriptionBaseTransition> transitions;
 
     // Low level events are ONLY used for Repair APIs
     protected List<SubscriptionEvent> events;
@@ -123,7 +123,7 @@ public class SubscriptionData extends EntityBase implements SubscriptionBase {
         this.activeVersion = internalSubscription.getActiveVersion();
         this.chargedThroughDate = internalSubscription.getChargedThroughDate();
         this.paidThroughDate = internalSubscription.getPaidThroughDate();
-        this.transitions = new LinkedList<SubscriptionTransition>(internalSubscription.getAllTransitions());
+        this.transitions = new LinkedList<SubscriptionBaseTransition>(internalSubscription.getAllTransitions());
         this.events = internalSubscription.getEvents();
     }
 
@@ -148,7 +148,7 @@ public class SubscriptionData extends EntityBase implements SubscriptionBase {
         if (transitions == null) {
             return null;
         }
-        final SubscriptionTransitionData initialTransition = (SubscriptionTransitionData) transitions.get(0);
+        final SubscriptionBaseTransitionData initialTransition = (SubscriptionBaseTransitionData) transitions.get(0);
         switch (initialTransition.getApiEventType()) {
             case MIGRATE_BILLING:
             case MIGRATE_ENTITLEMENT:
@@ -181,7 +181,7 @@ public class SubscriptionData extends EntityBase implements SubscriptionBase {
 
     @Override
     public DateTime getEndDate() {
-        final SubscriptionTransition latestTransition = getPreviousTransition();
+        final SubscriptionBaseTransition latestTransition = getPreviousTransition();
         if (latestTransition.getNextState() == SubscriptionState.CANCELLED) {
             return latestTransition.getEffectiveTransitionTime();
         }
@@ -198,7 +198,7 @@ public class SubscriptionData extends EntityBase implements SubscriptionBase {
                 clock, transitions, Order.ASC_FROM_PAST, Kind.SUBSCRIPTION,
                 Visibility.ALL, TimeLimit.FUTURE_ONLY);
         while (it.hasNext()) {
-            final SubscriptionTransition cur = it.next();
+            final SubscriptionBaseTransition cur = it.next();
             if (cur.getTransitionType() == SubscriptionTransitionType.CANCEL) {
                 return cur.getEffectiveTransitionTime();
             }
@@ -207,36 +207,36 @@ public class SubscriptionData extends EntityBase implements SubscriptionBase {
     }
 
     @Override
-    public boolean cancel(final DateTime requestedDate, final CallContext context) throws SubscriptionUserApiException {
+    public boolean cancel(final DateTime requestedDate, final CallContext context) throws SubscriptionBaseApiException {
         return apiService.cancel(this, requestedDate, context);
     }
 
     @Override
-    public boolean cancelWithPolicy(final DateTime requestedDate, final ActionPolicy policy, final CallContext context) throws SubscriptionUserApiException {
+    public boolean cancelWithPolicy(final DateTime requestedDate, final BillingActionPolicy policy, final CallContext context) throws SubscriptionBaseApiException {
         return apiService.cancelWithPolicy(this, requestedDate, policy, context);
     }
 
     @Override
     public boolean uncancel(final CallContext context)
-            throws SubscriptionUserApiException {
+            throws SubscriptionBaseApiException {
         return apiService.uncancel(this, context);
     }
 
     @Override
     public boolean changePlan(final String productName, final BillingPeriod term, final String priceList,
-                              final DateTime requestedDate, final CallContext context) throws SubscriptionUserApiException {
+                              final DateTime requestedDate, final CallContext context) throws SubscriptionBaseApiException {
         return apiService.changePlan(this, productName, term, priceList, requestedDate, context);
     }
 
     @Override
     public boolean changePlanWithPolicy(final String productName, final BillingPeriod term, final String priceList,
-                                        final DateTime requestedDate, final ActionPolicy policy, final CallContext context) throws SubscriptionUserApiException {
+                                        final DateTime requestedDate, final BillingActionPolicy policy, final CallContext context) throws SubscriptionBaseApiException {
         return apiService.changePlanWithPolicy(this, productName, term, priceList, requestedDate, policy, context);
     }
 
     @Override
     public boolean recreate(final PlanPhaseSpecifier spec, final DateTime requestedDate,
-                            final CallContext context) throws SubscriptionUserApiException {
+                            final CallContext context) throws SubscriptionBaseApiException {
         return apiService.recreatePlan(this, spec, requestedDate, context);
     }
 
@@ -246,7 +246,7 @@ public class SubscriptionData extends EntityBase implements SubscriptionBase {
     }
 
     @Override
-    public SubscriptionTransition getPendingTransition() {
+    public SubscriptionBaseTransition getPendingTransition() {
         if (transitions == null) {
             return null;
         }
@@ -259,7 +259,7 @@ public class SubscriptionData extends EntityBase implements SubscriptionBase {
     @Override
     public String getLastActiveProductName() {
         if (getState() == SubscriptionState.CANCELLED) {
-            final SubscriptionTransition data = getPreviousTransition();
+            final SubscriptionBaseTransition data = getPreviousTransition();
             return data.getPreviousPlan().getProduct().getName();
         } else {
             return getCurrentPlan().getProduct().getName();
@@ -269,7 +269,7 @@ public class SubscriptionData extends EntityBase implements SubscriptionBase {
     @Override
     public String getLastActivePriceListName() {
         if (getState() == SubscriptionState.CANCELLED) {
-            final SubscriptionTransition data = getPreviousTransition();
+            final SubscriptionBaseTransition data = getPreviousTransition();
             return data.getPreviousPriceList().getName();
         } else {
             return getCurrentPriceList().getName();
@@ -279,7 +279,7 @@ public class SubscriptionData extends EntityBase implements SubscriptionBase {
     @Override
     public String getLastActiveCategoryName() {
         if (getState() == SubscriptionState.CANCELLED) {
-            final SubscriptionTransition data = getPreviousTransition();
+            final SubscriptionBaseTransition data = getPreviousTransition();
             return data.getPreviousPlan().getProduct().getCategory().name();
         } else {
             return getCurrentPlan().getProduct().getCategory().name();
@@ -289,7 +289,7 @@ public class SubscriptionData extends EntityBase implements SubscriptionBase {
     @Override
     public Plan getLastActivePlan() {
         if (getState() == SubscriptionState.CANCELLED) {
-            final SubscriptionTransition data = getPreviousTransition();
+            final SubscriptionBaseTransition data = getPreviousTransition();
             return data.getPreviousPlan();
         } else {
             return getCurrentPlan();
@@ -299,7 +299,7 @@ public class SubscriptionData extends EntityBase implements SubscriptionBase {
     @Override
     public String getLastActiveBillingPeriod() {
         if (getState() == SubscriptionState.CANCELLED) {
-            final SubscriptionTransition data = getPreviousTransition();
+            final SubscriptionBaseTransition data = getPreviousTransition();
             return data.getPreviousPlan().getBillingPeriod().name();
         } else {
             return getCurrentPlan().getBillingPeriod().name();
@@ -307,7 +307,7 @@ public class SubscriptionData extends EntityBase implements SubscriptionBase {
     }
 
     @Override
-    public SubscriptionTransition getPreviousTransition() {
+    public SubscriptionBaseTransition getPreviousTransition() {
         if (transitions == null) {
             return null;
         }
@@ -337,11 +337,11 @@ public class SubscriptionData extends EntityBase implements SubscriptionBase {
     }
 
     @Override
-    public List<SubscriptionTransition> getAllTransitions() {
+    public List<SubscriptionBaseTransition> getAllTransitions() {
         if (transitions == null) {
             return Collections.emptyList();
         }
-        final List<SubscriptionTransition> result = new ArrayList<SubscriptionTransition>();
+        final List<SubscriptionBaseTransition> result = new ArrayList<SubscriptionBaseTransition>();
         final SubscriptionTransitionDataIterator it = new SubscriptionTransitionDataIterator(clock, transitions, Order.ASC_FROM_PAST, Kind.ALL, Visibility.ALL, TimeLimit.ALL);
         while (it.hasNext()) {
             result.add(it.next());
@@ -381,16 +381,16 @@ public class SubscriptionData extends EntityBase implements SubscriptionBase {
     }
 
 
-    public SubscriptionTransitionData getTransitionFromEvent(final SubscriptionEvent event, final int seqId) {
+    public SubscriptionBaseTransitionData getTransitionFromEvent(final SubscriptionEvent event, final int seqId) {
         if (transitions == null || event == null) {
             return null;
         }
-        SubscriptionTransitionData prev = null;
-        for (final SubscriptionTransition cur : transitions) {
-            final SubscriptionTransitionData curData = (SubscriptionTransitionData) cur;
+        SubscriptionBaseTransitionData prev = null;
+        for (final SubscriptionBaseTransition cur : transitions) {
+            final SubscriptionBaseTransitionData curData = (SubscriptionBaseTransitionData) cur;
             if (curData.getId().equals(event.getId())) {
 
-                final SubscriptionTransitionData withSeq = new SubscriptionTransitionData(curData, seqId);
+                final SubscriptionBaseTransitionData withSeq = new SubscriptionBaseTransitionData(curData, seqId);
                 return withSeq;
             }
             if (curData.getTotalOrdering() < event.getTotalOrdering()) {
@@ -400,7 +400,7 @@ public class SubscriptionData extends EntityBase implements SubscriptionBase {
         // Since UNCANCEL are not part of the transitions, we compute a new 'UNCANCEL' transition based on the event right before that UNCANCEL
         // This is used to be able to send a bus event for uncancellation
         if (prev != null && event.getType() == EventType.API_USER && ((ApiEvent) event).getEventType() == ApiEventType.UNCANCEL) {
-            final SubscriptionTransitionData withSeq = new SubscriptionTransitionData((SubscriptionTransitionData) prev, EventType.API_USER, ApiEventType.UNCANCEL, seqId);
+            final SubscriptionBaseTransitionData withSeq = new SubscriptionBaseTransitionData((SubscriptionBaseTransitionData) prev, EventType.API_USER, ApiEventType.UNCANCEL, seqId);
             return withSeq;
         }
         return null;
@@ -414,26 +414,26 @@ public class SubscriptionData extends EntityBase implements SubscriptionBase {
         final SubscriptionTransitionDataIterator it = new SubscriptionTransitionDataIterator(
                 clock, transitions, Order.DESC_FROM_FUTURE, Kind.SUBSCRIPTION,
                 Visibility.FROM_DISK_ONLY, TimeLimit.ALL);
-        return it.hasNext() ? ((SubscriptionTransitionData) it.next()).getTotalOrdering() : -1L;
+        return it.hasNext() ? ((SubscriptionBaseTransitionData) it.next()).getTotalOrdering() : -1L;
     }
 
     public long getActiveVersion() {
         return activeVersion;
     }
 
-    public List<SubscriptionTransition> getBillingTransitions() {
+    public List<SubscriptionBaseTransition> getBillingTransitions() {
 
         if (transitions == null) {
             return Collections.emptyList();
         }
-        final List<SubscriptionTransition> result = new ArrayList<SubscriptionTransition>();
+        final List<SubscriptionBaseTransition> result = new ArrayList<SubscriptionBaseTransition>();
         final SubscriptionTransitionDataIterator it = new SubscriptionTransitionDataIterator(
                 clock, transitions, Order.ASC_FROM_PAST, Kind.BILLING,
                 Visibility.ALL, TimeLimit.ALL);
         // Remove anything prior to first CREATE or MIGRATE_BILLING
         boolean foundInitialEvent = false;
         while (it.hasNext()) {
-            final SubscriptionTransitionData curTransition = (SubscriptionTransitionData) it.next();
+            final SubscriptionBaseTransitionData curTransition = (SubscriptionBaseTransitionData) it.next();
             if (!foundInitialEvent) {
                 foundInitialEvent = curTransition.getEventType() == EventType.API_USER &&
                                     (curTransition.getApiEventType() == ApiEventType.CREATE ||
@@ -448,7 +448,7 @@ public class SubscriptionData extends EntityBase implements SubscriptionBase {
     }
 
 
-    public SubscriptionTransitionData getInitialTransitionForCurrentPlan() {
+    public SubscriptionBaseTransitionData getInitialTransitionForCurrentPlan() {
         if (transitions == null) {
             throw new SubscriptionError(String.format("No transitions for subscription %s", getId()));
         }
@@ -461,7 +461,7 @@ public class SubscriptionData extends EntityBase implements SubscriptionBase {
                                                                                              TimeLimit.PAST_OR_PRESENT_ONLY);
 
         while (it.hasNext()) {
-            final SubscriptionTransitionData cur = (SubscriptionTransitionData) it.next();
+            final SubscriptionBaseTransitionData cur = (SubscriptionBaseTransitionData) it.next();
             if (cur.getTransitionType() == SubscriptionTransitionType.CREATE
                 || cur.getTransitionType() == SubscriptionTransitionType.RE_CREATE
                 || cur.getTransitionType() == SubscriptionTransitionType.TRANSFER
@@ -478,13 +478,13 @@ public class SubscriptionData extends EntityBase implements SubscriptionBase {
         return getFutureEndDate() != null;
     }
 
-    public DateTime getPlanChangeEffectiveDate(final ActionPolicy policy,
+    public DateTime getPlanChangeEffectiveDate(final BillingActionPolicy policy,
                                                final DateTime requestedDate) {
 
-        if (policy == ActionPolicy.IMMEDIATE) {
+        if (policy == BillingActionPolicy.IMMEDIATE) {
             return requestedDate;
         }
-        if (policy != ActionPolicy.END_OF_TERM) {
+        if (policy != BillingActionPolicy.END_OF_TERM) {
             throw new SubscriptionError(String.format(
                     "Unexpected policy type %s", policy.toString()));
         }
@@ -507,7 +507,7 @@ public class SubscriptionData extends EntityBase implements SubscriptionBase {
                 clock, transitions, Order.DESC_FROM_FUTURE, Kind.SUBSCRIPTION,
                 Visibility.ALL, TimeLimit.PAST_OR_PRESENT_ONLY);
         while (it.hasNext()) {
-            final SubscriptionTransitionData cur = (SubscriptionTransitionData) it.next();
+            final SubscriptionBaseTransitionData cur = (SubscriptionBaseTransitionData) it.next();
 
             if (cur.getTransitionType() == SubscriptionTransitionType.PHASE
                 || cur.getTransitionType() == SubscriptionTransitionType.TRANSFER
@@ -546,7 +546,7 @@ public class SubscriptionData extends EntityBase implements SubscriptionBase {
         Plan previousPlan = null;
         PlanPhase previousPhase = null;
 
-        transitions = new LinkedList<SubscriptionTransition>();
+        transitions = new LinkedList<SubscriptionBaseTransition>();
 
         for (final SubscriptionEvent cur : inputEvents) {
 
@@ -624,7 +624,7 @@ public class SubscriptionData extends EntityBase implements SubscriptionBase {
                 log.error(String.format("Failed to build transition for subscription %s", id), e);
             }
 
-            final SubscriptionTransitionData transition = new SubscriptionTransitionData(
+            final SubscriptionBaseTransitionData transition = new SubscriptionBaseTransitionData(
                     cur.getId(), id, bundleId, cur.getType(), apiEventType,
                     cur.getRequestedDate(), cur.getEffectiveDate(),
                     prevEventId, prevCreatedDate,
diff --git a/subscription/src/main/java/com/ning/billing/subscription/api/user/SubscriptionTransitionDataIterator.java b/subscription/src/main/java/com/ning/billing/subscription/api/user/SubscriptionTransitionDataIterator.java
index 93a5aa9..78210d7 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/api/user/SubscriptionTransitionDataIterator.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/api/user/SubscriptionTransitionDataIterator.java
@@ -23,15 +23,15 @@ import com.ning.billing.subscription.exceptions.SubscriptionError;
 import com.ning.billing.subscription.api.SubscriptionTransitionType;
 import com.ning.billing.clock.Clock;
 
-public class SubscriptionTransitionDataIterator implements Iterator<SubscriptionTransition> {
+public class SubscriptionTransitionDataIterator implements Iterator<SubscriptionBaseTransition> {
 
     private final Clock clock;
-    private final Iterator<SubscriptionTransition> it;
+    private final Iterator<SubscriptionBaseTransition> it;
     private final Kind kind;
     private final TimeLimit timeLimit;
     private final Visibility visibility;
 
-    private SubscriptionTransition next;
+    private SubscriptionBaseTransition next;
 
     public enum Order {
         ASC_FROM_PAST,
@@ -55,7 +55,7 @@ public class SubscriptionTransitionDataIterator implements Iterator<Subscription
         ALL
     }
 
-    public SubscriptionTransitionDataIterator(final Clock clock, final LinkedList<SubscriptionTransition> transitions,
+    public SubscriptionTransitionDataIterator(final Clock clock, final LinkedList<SubscriptionBaseTransition> transitions,
                                               final Order order, final Kind kind, final Visibility visibility, final TimeLimit timeLimit) {
         this.it = (order == Order.DESC_FROM_FUTURE) ? transitions.descendingIterator() : transitions.iterator();
         this.clock = clock;
@@ -77,12 +77,12 @@ public class SubscriptionTransitionDataIterator implements Iterator<Subscription
         return true;
     }
 
-    private boolean shouldSkip(final SubscriptionTransition input) {
-        if (visibility == Visibility.FROM_DISK_ONLY && ! ((SubscriptionTransitionData) input).isFromDisk()) {
+    private boolean shouldSkip(final SubscriptionBaseTransition input) {
+        if (visibility == Visibility.FROM_DISK_ONLY && ! ((SubscriptionBaseTransitionData) input).isFromDisk()) {
             return true;
         }
-        if ((kind == Kind.SUBSCRIPTION && shouldSkipForSubscriptionEvents((SubscriptionTransitionData) input)) ||
-            (kind == Kind.BILLING && shouldSkipForBillingEvents((SubscriptionTransitionData) input))) {
+        if ((kind == Kind.SUBSCRIPTION && shouldSkipForSubscriptionEvents((SubscriptionBaseTransitionData) input)) ||
+            (kind == Kind.BILLING && shouldSkipForBillingEvents((SubscriptionBaseTransitionData) input))) {
             return true;
         }
         if ((timeLimit == TimeLimit.FUTURE_ONLY && !input.getEffectiveTransitionTime().isAfter(clock.getUTCNow())) ||
@@ -92,19 +92,19 @@ public class SubscriptionTransitionDataIterator implements Iterator<Subscription
         return false;
     }
 
-    private boolean shouldSkipForSubscriptionEvents(final SubscriptionTransitionData input) {
+    private boolean shouldSkipForSubscriptionEvents(final SubscriptionBaseTransitionData input) {
         // SubscriptionBase system knows about all events except for MIGRATE_BILLING
         return (input.getTransitionType() == SubscriptionTransitionType.MIGRATE_BILLING);
     }
 
-    private boolean shouldSkipForBillingEvents(final SubscriptionTransitionData input) {
+    private boolean shouldSkipForBillingEvents(final SubscriptionBaseTransitionData input) {
         // Junction system knows about all events except for MIGRATE_ENTITLEMENT
         return input.getTransitionType() == SubscriptionTransitionType.MIGRATE_ENTITLEMENT;
     }
 
 
     @Override
-    public SubscriptionTransition next() {
+    public SubscriptionBaseTransition next() {
         return next;
     }
 
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 97f8fad..4efafe0 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
@@ -26,7 +26,7 @@ import com.ning.billing.catalog.api.Product;
 import com.ning.billing.subscription.api.user.SubscriptionData;
 import com.ning.billing.subscription.exceptions.SubscriptionError;
 import com.ning.billing.subscription.api.user.SubscriptionState;
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
+import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
 
 import com.google.inject.Inject;
 
@@ -39,20 +39,20 @@ public class AddonUtils {
     }
 
     public void checkAddonCreationRights(final SubscriptionData baseSubscription, final Plan targetAddOnPlan)
-            throws SubscriptionUserApiException, CatalogApiException {
+            throws SubscriptionBaseApiException, CatalogApiException {
 
         if (baseSubscription.getState() != SubscriptionState.ACTIVE) {
-            throw new SubscriptionUserApiException(ErrorCode.SUB_CREATE_AO_BP_NON_ACTIVE, targetAddOnPlan.getName());
+            throw new SubscriptionBaseApiException(ErrorCode.SUB_CREATE_AO_BP_NON_ACTIVE, targetAddOnPlan.getName());
         }
 
         final Product baseProduct = baseSubscription.getCurrentPlan().getProduct();
         if (isAddonIncluded(baseProduct, targetAddOnPlan)) {
-            throw new SubscriptionUserApiException(ErrorCode.SUB_CREATE_AO_ALREADY_INCLUDED,
+            throw new SubscriptionBaseApiException(ErrorCode.SUB_CREATE_AO_ALREADY_INCLUDED,
                                                   targetAddOnPlan.getName(), baseSubscription.getCurrentPlan().getProduct().getName());
         }
 
         if (!isAddonAvailable(baseProduct, targetAddOnPlan)) {
-            throw new SubscriptionUserApiException(ErrorCode.SUB_CREATE_AO_NOT_AVAILABLE,
+            throw new SubscriptionBaseApiException(ErrorCode.SUB_CREATE_AO_NOT_AVAILABLE,
                                                   targetAddOnPlan.getName(), baseSubscription.getCurrentPlan().getProduct().getName());
         }
     }
diff --git a/subscription/src/main/java/com/ning/billing/subscription/engine/core/DefaultSubscriptionService.java b/subscription/src/main/java/com/ning/billing/subscription/engine/core/DefaultSubscriptionService.java
index 3db6358..88d98e2 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/engine/core/DefaultSubscriptionService.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/engine/core/DefaultSubscriptionService.java
@@ -31,7 +31,7 @@ import com.ning.billing.subscription.api.SubscriptionApiService;
 import com.ning.billing.subscription.api.SubscriptionService;
 import com.ning.billing.subscription.api.user.DefaultEffectiveSubscriptionEvent;
 import com.ning.billing.subscription.api.user.SubscriptionData;
-import com.ning.billing.subscription.api.user.SubscriptionTransitionData;
+import com.ning.billing.subscription.api.user.SubscriptionBaseTransitionData;
 import com.ning.billing.subscription.engine.addon.AddonUtils;
 import com.ning.billing.subscription.engine.dao.SubscriptionDao;
 import com.ning.billing.subscription.events.SubscriptionEvent;
@@ -167,7 +167,7 @@ public class DefaultSubscriptionService implements EventListener, SubscriptionSe
         }
 
         try {
-            final SubscriptionTransitionData transition = (subscription.getTransitionFromEvent(event, theRealSeqId));
+            final SubscriptionBaseTransitionData transition = (subscription.getTransitionFromEvent(event, theRealSeqId));
             final EffectiveSubscriptionInternalEvent busEvent = new DefaultEffectiveSubscriptionEvent(transition, subscription.getAlignStartDate(),
                                                                                                       context.getUserToken(),
                                                                                                       context.getAccountRecordId(), context.getTenantRecordId());
diff --git a/subscription/src/main/java/com/ning/billing/subscription/engine/dao/DefaultSubscriptionDao.java b/subscription/src/main/java/com/ning/billing/subscription/engine/dao/DefaultSubscriptionDao.java
index c0c5de2..449941d 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/engine/dao/DefaultSubscriptionDao.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/engine/dao/DefaultSubscriptionDao.java
@@ -54,7 +54,7 @@ import com.ning.billing.subscription.api.user.DefaultRequestedSubscriptionEvent;
 import com.ning.billing.subscription.api.user.SubscriptionBuilder;
 import com.ning.billing.subscription.api.user.SubscriptionBundleData;
 import com.ning.billing.subscription.api.user.SubscriptionData;
-import com.ning.billing.subscription.api.user.SubscriptionTransitionData;
+import com.ning.billing.subscription.api.user.SubscriptionBaseTransitionData;
 import com.ning.billing.subscription.engine.addon.AddonUtils;
 import com.ning.billing.subscription.engine.core.DefaultSubscriptionService;
 import com.ning.billing.subscription.engine.core.SubscriptionNotificationKey;
@@ -905,7 +905,7 @@ public class DefaultSubscriptionDao implements SubscriptionDao {
         try {
             final SubscriptionData upToDateSubscription = createSubscriptionWithNewEvent(subscription, immediateEvent);
 
-            final SubscriptionTransitionData transition = upToDateSubscription.getTransitionFromEvent(immediateEvent, seqId);
+            final SubscriptionBaseTransitionData transition = upToDateSubscription.getTransitionFromEvent(immediateEvent, seqId);
             final EffectiveSubscriptionInternalEvent busEvent = new DefaultEffectiveSubscriptionEvent(transition, upToDateSubscription.getAlignStartDate(),
                                                                                                       context.getUserToken(),
                                                                                                       context.getAccountRecordId(), context.getTenantRecordId());
diff --git a/subscription/src/main/java/com/ning/billing/subscription/glue/DefaultSubscriptionModule.java b/subscription/src/main/java/com/ning/billing/subscription/glue/DefaultSubscriptionModule.java
index b27de62..d70a398 100644
--- a/subscription/src/main/java/com/ning/billing/subscription/glue/DefaultSubscriptionModule.java
+++ b/subscription/src/main/java/com/ning/billing/subscription/glue/DefaultSubscriptionModule.java
@@ -40,7 +40,7 @@ import com.ning.billing.subscription.engine.dao.DefaultSubscriptionDao;
 import com.ning.billing.subscription.engine.dao.RepairSubscriptionDao;
 import com.ning.billing.subscription.engine.dao.SubscriptionDao;
 import com.ning.billing.util.config.SubscriptionConfig;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.name.Names;
@@ -109,7 +109,7 @@ public class DefaultSubscriptionModule extends AbstractModule implements Subscri
 
     @Override
     public void installSubscriptionInternalApi() {
-        bind(SubscriptionInternalApi.class).to(DefaultSubscriptionInternalApi.class).asEagerSingleton();
+        bind(SubscriptionBaseInternalApi.class).to(DefaultSubscriptionInternalApi.class).asEagerSingleton();
     }
 
     @Override
diff --git a/subscription/src/test/java/com/ning/billing/subscription/alignment/TestPlanAligner.java b/subscription/src/test/java/com/ning/billing/subscription/alignment/TestPlanAligner.java
index e3cf356..181d532 100644
--- a/subscription/src/test/java/com/ning/billing/subscription/alignment/TestPlanAligner.java
+++ b/subscription/src/test/java/com/ning/billing/subscription/alignment/TestPlanAligner.java
@@ -34,6 +34,8 @@ import com.ning.billing.catalog.api.PriceListSet;
 import com.ning.billing.catalog.io.VersionedCatalogLoader;
 import com.ning.billing.clock.DefaultClock;
 import com.ning.billing.subscription.SubscriptionTestSuiteNoDB;
+import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
+import com.ning.billing.subscription.api.user.SubscriptionBaseTransition;
 import com.ning.billing.subscription.api.user.SubscriptionBuilder;
 import com.ning.billing.subscription.api.user.SubscriptionData;
 import com.ning.billing.subscription.events.SubscriptionEvent;
@@ -41,8 +43,6 @@ import com.ning.billing.subscription.events.user.ApiEventBase;
 import com.ning.billing.subscription.events.user.ApiEventBuilder;
 import com.ning.billing.subscription.events.user.ApiEventType;
 import com.ning.billing.subscription.exceptions.SubscriptionError;
-import com.ning.billing.subscription.api.user.SubscriptionTransition;
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
 import com.ning.billing.util.config.CatalogConfig;
 
 import com.google.common.collect.ImmutableList;
@@ -206,7 +206,7 @@ public class TestPlanAligner extends SubscriptionTestSuiteNoDB {
 
         subscriptionData.rebuildTransitions(ImmutableList.<SubscriptionEvent>of(previousEvent, event), catalogService.getFullCatalog());
 
-        final List<SubscriptionTransition> newTransitions = subscriptionData.getAllTransitions();
+        final List<SubscriptionBaseTransition> newTransitions = subscriptionData.getAllTransitions();
         Assert.assertEquals(newTransitions.size(), 2);
         Assert.assertNull(newTransitions.get(0).getPreviousPhase());
         Assert.assertEquals(newTransitions.get(0).getNextPhase(), newTransitions.get(1).getPreviousPhase());
@@ -234,7 +234,7 @@ public class TestPlanAligner extends SubscriptionTestSuiteNoDB {
 
     private TimedPhase getNextTimedPhaseOnChange(final SubscriptionData subscriptionData,
                                                  final String newProductName,
-                                                 final DateTime effectiveChangeDate) throws CatalogApiException, SubscriptionUserApiException {
+                                                 final DateTime effectiveChangeDate) throws CatalogApiException, SubscriptionBaseApiException {
         // The date is used for different catalog versions - we don't care here
         final Plan newPlan = catalogService.getFullCatalog().findPlan(newProductName, clock.getUTCNow());
 
@@ -244,7 +244,7 @@ public class TestPlanAligner extends SubscriptionTestSuiteNoDB {
     private TimedPhase[] getTimedPhasesOnCreate(final String productName,
                                                 final PhaseType initialPhase,
                                                 final SubscriptionData subscriptionData,
-                                                final DateTime effectiveDate) throws CatalogApiException, SubscriptionUserApiException {
+                                                final DateTime effectiveDate) throws CatalogApiException, SubscriptionBaseApiException {
         // The date is used for different catalog versions - we don't care here
         final Plan plan = catalogService.getFullCatalog().findPlan(productName, clock.getUTCNow());
 
diff --git a/subscription/src/test/java/com/ning/billing/subscription/api/migration/TestMigration.java b/subscription/src/test/java/com/ning/billing/subscription/api/migration/TestMigration.java
index 107f8f7..d90826f 100644
--- a/subscription/src/test/java/com/ning/billing/subscription/api/migration/TestMigration.java
+++ b/subscription/src/test/java/com/ning/billing/subscription/api/migration/TestMigration.java
@@ -30,13 +30,13 @@ import com.ning.billing.catalog.api.PriceListSet;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.subscription.SubscriptionTestSuiteWithEmbeddedDB;
 import com.ning.billing.subscription.api.migration.SubscriptionMigrationApi.AccountMigration;
+import com.ning.billing.subscription.api.user.SubscriptionBaseTransition;
 import com.ning.billing.subscription.api.user.SubscriptionData;
-import com.ning.billing.subscription.api.user.SubscriptionTransitionData;
+import com.ning.billing.subscription.api.user.SubscriptionBaseTransitionData;
 import com.ning.billing.subscription.events.user.ApiEventType;
 import com.ning.billing.subscription.api.SubscriptionBase;
 import com.ning.billing.subscription.api.user.SubscriptionBundle;
 import com.ning.billing.subscription.api.user.SubscriptionState;
-import com.ning.billing.subscription.api.user.SubscriptionTransition;
 
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
@@ -291,28 +291,28 @@ public class TestMigration extends SubscriptionTestSuiteWithEmbeddedDB {
             assertEquals(subscriptions.size(), 1);
             final SubscriptionData subscription = (SubscriptionData) subscriptions.get(0);
 
-            final List<SubscriptionTransition> transitions = subscription.getAllTransitions();
+            final List<SubscriptionBaseTransition> transitions = subscription.getAllTransitions();
             assertEquals(transitions.size(), 2);
-            final SubscriptionTransitionData initialMigrateBilling = (SubscriptionTransitionData) transitions.get(1);
+            final SubscriptionBaseTransitionData initialMigrateBilling = (SubscriptionBaseTransitionData) transitions.get(1);
             assertEquals(initialMigrateBilling.getApiEventType(), ApiEventType.MIGRATE_BILLING);
             assertTrue(initialMigrateBilling.getEffectiveTransitionTime().compareTo(subscription.getChargedThroughDate()) == 0);
             assertEquals(initialMigrateBilling.getNextPlan().getName(), "shotgun-annual");
             assertEquals(initialMigrateBilling.getNextPhase().getName(), "shotgun-annual-evergreen");
 
-            final List<SubscriptionTransition> billingTransitions = subscription.getBillingTransitions();
+            final List<SubscriptionBaseTransition> billingTransitions = subscription.getBillingTransitions();
             assertEquals(billingTransitions.size(), 1);
             assertEquals(billingTransitions.get(0), initialMigrateBilling);
 
             // Now make an IMMEDIATE change of plan
             subscription.changePlan("Assault-Rifle", BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, clock.getUTCNow(), callContext);
 
-            final List<SubscriptionTransition> newTransitions = subscription.getAllTransitions();
+            final List<SubscriptionBaseTransition> newTransitions = subscription.getAllTransitions();
             assertEquals(newTransitions.size(), 3);
 
-            final SubscriptionTransitionData changeTransition = (SubscriptionTransitionData) newTransitions.get(1);
+            final SubscriptionBaseTransitionData changeTransition = (SubscriptionBaseTransitionData) newTransitions.get(1);
             assertEquals(changeTransition.getApiEventType(), ApiEventType.CHANGE);
 
-            final SubscriptionTransitionData newMigrateBilling = (SubscriptionTransitionData) newTransitions.get(2);
+            final SubscriptionBaseTransitionData newMigrateBilling = (SubscriptionBaseTransitionData) newTransitions.get(2);
             assertEquals(newMigrateBilling.getApiEventType(), ApiEventType.MIGRATE_BILLING);
             assertTrue(newMigrateBilling.getEffectiveTransitionTime().compareTo(subscription.getChargedThroughDate()) == 0);
             assertTrue(newMigrateBilling.getEffectiveTransitionTime().compareTo(initialMigrateBilling.getEffectiveTransitionTime()) == 0);
@@ -320,7 +320,7 @@ public class TestMigration extends SubscriptionTestSuiteWithEmbeddedDB {
             assertEquals(newMigrateBilling.getNextPhase().getName(), "assault-rifle-monthly-evergreen");
 
 
-            final List<SubscriptionTransition> newBillingTransitions = subscription.getBillingTransitions();
+            final List<SubscriptionBaseTransition> newBillingTransitions = subscription.getBillingTransitions();
             assertEquals(newBillingTransitions.size(), 1);
             assertEquals(newBillingTransitions.get(0), newMigrateBilling);
 
diff --git a/subscription/src/test/java/com/ning/billing/subscription/api/timeline/TestRepairBP.java b/subscription/src/test/java/com/ning/billing/subscription/api/timeline/TestRepairBP.java
index 46fd410..02427b5 100644
--- a/subscription/src/test/java/com/ning/billing/subscription/api/timeline/TestRepairBP.java
+++ b/subscription/src/test/java/com/ning/billing/subscription/api/timeline/TestRepairBP.java
@@ -45,7 +45,7 @@ import com.ning.billing.subscription.api.timeline.SubscriptionTimeline.ExistingE
 import com.ning.billing.subscription.api.timeline.SubscriptionTimeline.NewEvent;
 import com.ning.billing.subscription.api.SubscriptionBase;
 import com.ning.billing.subscription.api.user.SubscriptionState;
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
+import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
 
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
@@ -640,7 +640,7 @@ public class TestRepairBP extends SubscriptionTestSuiteWithEmbeddedDB {
 
         test.withException(new TestWithExceptionCallback() {
             @Override
-            public void doTest() throws SubscriptionRepairException, SubscriptionUserApiException {
+            public void doTest() throws SubscriptionRepairException, SubscriptionBaseApiException {
 
                 final BundleTimeline bundleRepair = repairApi.getBundleTimeline(bundle.getId(), callContext);
                 testUtil.sortEventsOnBundle(bundleRepair);
@@ -673,7 +673,7 @@ public class TestRepairBP extends SubscriptionTestSuiteWithEmbeddedDB {
 
         test.withException(new TestWithExceptionCallback() {
             @Override
-            public void doTest() throws SubscriptionRepairException, SubscriptionUserApiException {
+            public void doTest() throws SubscriptionRepairException, SubscriptionBaseApiException {
 
                 final BundleTimeline bundleRepair = repairApi.getBundleTimeline(bundle.getId(), callContext);
                 testUtil.sortEventsOnBundle(bundleRepair);
diff --git a/subscription/src/test/java/com/ning/billing/subscription/api/timeline/TestRepairWithError.java b/subscription/src/test/java/com/ning/billing/subscription/api/timeline/TestRepairWithError.java
index a6d9070..567fdac 100644
--- a/subscription/src/test/java/com/ning/billing/subscription/api/timeline/TestRepairWithError.java
+++ b/subscription/src/test/java/com/ning/billing/subscription/api/timeline/TestRepairWithError.java
@@ -34,6 +34,7 @@ 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.subscription.SubscriptionTestSuiteNoDB;
+import com.ning.billing.subscription.api.user.SubscriptionBaseApiException;
 import com.ning.billing.subscription.api.user.SubscriptionData;
 import com.ning.billing.subscription.api.user.TestSubscriptionHelper.TestWithException;
 import com.ning.billing.subscription.api.user.TestSubscriptionHelper.TestWithExceptionCallback;
@@ -41,7 +42,6 @@ import com.ning.billing.subscription.api.SubscriptionTransitionType;
 import com.ning.billing.subscription.api.timeline.SubscriptionTimeline.DeletedEvent;
 import com.ning.billing.subscription.api.timeline.SubscriptionTimeline.NewEvent;
 import com.ning.billing.subscription.api.SubscriptionBase;
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
 
 import static org.testng.Assert.assertTrue;
 import static org.testng.AssertJUnit.assertEquals;
@@ -92,7 +92,7 @@ public class TestRepairWithError extends SubscriptionTestSuiteNoDB {
     public void testENT_REPAIR_INVALID_DELETE_SET() throws Exception {
         test.withException(new TestWithExceptionCallback() {
             @Override
-            public void doTest() throws SubscriptionRepairException, SubscriptionUserApiException {
+            public void doTest() throws SubscriptionRepairException, SubscriptionBaseApiException {
 
                 Interval it = new Interval(clock.getUTCNow(), clock.getUTCNow().plusDays(3));
                 clock.addDeltaFromReality(it.toDurationMillis());
@@ -203,7 +203,7 @@ public class TestRepairWithError extends SubscriptionTestSuiteNoDB {
     public void testENT_REPAIR_AO_CREATE_BEFORE_BP_START() throws Exception {
         test.withException(new TestWithExceptionCallback() {
             @Override
-            public void doTest() throws SubscriptionRepairException, SubscriptionUserApiException {
+            public void doTest() throws SubscriptionRepairException, SubscriptionBaseApiException {
                 // MOVE CLOCK A LITTLE BIT-- STILL IN TRIAL
                 Interval it = new Interval(clock.getUTCNow(), clock.getUTCNow().plusDays(4));
                 clock.addDeltaFromReality(it.toDurationMillis());
@@ -245,7 +245,7 @@ public class TestRepairWithError extends SubscriptionTestSuiteNoDB {
     public void testENT_REPAIR_NEW_EVENT_BEFORE_LAST_AO_REMAINING() throws Exception {
         test.withException(new TestWithExceptionCallback() {
             @Override
-            public void doTest() throws SubscriptionRepairException, SubscriptionUserApiException {
+            public void doTest() throws SubscriptionRepairException, SubscriptionBaseApiException {
 
                 // MOVE CLOCK A LITTLE BIT-- STILL IN TRIAL
                 Interval it = new Interval(clock.getUTCNow(), clock.getUTCNow().plusDays(4));
@@ -286,7 +286,7 @@ public class TestRepairWithError extends SubscriptionTestSuiteNoDB {
     public void testENT_REPAIR_BP_RECREATE_MISSING_AO() throws Exception {
         test.withException(new TestWithExceptionCallback() {
             @Override
-            public void doTest() throws SubscriptionRepairException, SubscriptionUserApiException {
+            public void doTest() throws SubscriptionRepairException, SubscriptionBaseApiException {
 
                 //testListener.pushExpectedEvent(NextEvent.PHASE);
 
@@ -326,7 +326,7 @@ public class TestRepairWithError extends SubscriptionTestSuiteNoDB {
     public void testENT_REPAIR_BP_RECREATE_MISSING_AO_CREATE() throws Exception {
         test.withException(new TestWithExceptionCallback() {
             @Override
-            public void doTest() throws SubscriptionRepairException, SubscriptionUserApiException {
+            public void doTest() throws SubscriptionRepairException, SubscriptionBaseApiException {
                 /*
               //testListener.pushExpectedEvent(NextEvent.PHASE);
 
@@ -372,7 +372,7 @@ public class TestRepairWithError extends SubscriptionTestSuiteNoDB {
     public void testENT_REPAIR_MISSING_AO_DELETE_EVENT() throws Exception {
         test.withException(new TestWithExceptionCallback() {
             @Override
-            public void doTest() throws SubscriptionRepairException, SubscriptionUserApiException {
+            public void doTest() throws SubscriptionRepairException, SubscriptionBaseApiException {
 
                 /*
                 // MOVE CLOCK -- JUST BEFORE END OF TRIAL
diff --git a/subscription/src/test/java/com/ning/billing/subscription/api/user/TestSubscriptionHelper.java b/subscription/src/test/java/com/ning/billing/subscription/api/user/TestSubscriptionHelper.java
index 725145b..c655e84 100644
--- a/subscription/src/test/java/com/ning/billing/subscription/api/user/TestSubscriptionHelper.java
+++ b/subscription/src/test/java/com/ning/billing/subscription/api/user/TestSubscriptionHelper.java
@@ -61,7 +61,7 @@ import com.ning.billing.subscription.api.timeline.SubscriptionTimeline.ExistingE
 import com.ning.billing.subscription.api.timeline.SubscriptionTimeline.NewEvent;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
@@ -72,7 +72,7 @@ public class TestSubscriptionHelper {
 
     private final Logger log = LoggerFactory.getLogger(TestSubscriptionHelper.class);
 
-    private final SubscriptionInternalApi subscriptionApi;
+    private final SubscriptionBaseInternalApi subscriptionApi;
 
     private final Clock clock;
 
@@ -84,7 +84,7 @@ public class TestSubscriptionHelper {
 
 
     @Inject
-    public TestSubscriptionHelper(final SubscriptionInternalApi subscriptionApi, final Clock clock, final InternalCallContext callContext, final TestApiListener testListener, final SubscriptionDao dao) {
+    public TestSubscriptionHelper(final SubscriptionBaseInternalApi subscriptionApi, final Clock clock, final InternalCallContext callContext, final TestApiListener testListener, final SubscriptionDao dao) {
         this.subscriptionApi = subscriptionApi;
         this.clock = clock;
         this.callContext = callContext;
@@ -94,17 +94,17 @@ public class TestSubscriptionHelper {
 
 
     public SubscriptionData createSubscription(final SubscriptionBundle bundle, final String productName, final BillingPeriod term, final String planSet, final DateTime requestedDate)
-            throws SubscriptionUserApiException {
+            throws SubscriptionBaseApiException {
         return createSubscriptionWithBundle(bundle.getId(), productName, term, planSet, requestedDate);
     }
 
     public SubscriptionData createSubscription(final SubscriptionBundle bundle, final String productName, final BillingPeriod term, final String planSet)
-            throws SubscriptionUserApiException {
+            throws SubscriptionBaseApiException {
         return createSubscriptionWithBundle(bundle.getId(), productName, term, planSet, null);
     }
 
     public SubscriptionData createSubscriptionWithBundle(final UUID bundleId, final String productName, final BillingPeriod term, final String planSet, final DateTime requestedDate)
-            throws SubscriptionUserApiException {
+            throws SubscriptionBaseApiException {
         testListener.pushExpectedEvent(NextEvent.CREATE);
         final SubscriptionData subscription = (SubscriptionData) subscriptionApi.createSubscription(bundleId,
                                                                                                    new PlanPhaseSpecifier(productName, ProductCategory.BASE, term, planSet, null),
@@ -665,7 +665,7 @@ public class TestSubscriptionHelper {
 
     public interface TestWithExceptionCallback {
 
-        public void doTest() throws SubscriptionRepairException, SubscriptionUserApiException;
+        public void doTest() throws SubscriptionRepairException, SubscriptionBaseApiException;
     }
 
     public static class TestWithException {
diff --git a/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiAddOn.java b/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiAddOn.java
index a8cba5b..e5db2bc 100644
--- a/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiAddOn.java
+++ b/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiAddOn.java
@@ -130,7 +130,7 @@ public class TestUserApiAddOn extends SubscriptionTestSuiteWithEmbeddedDB {
             assertTrue(baseSubscription.isSubscriptionFutureCancelled());
 
             aoSubscription = (SubscriptionData) subscriptionInternalApi.getSubscriptionFromId(aoSubscription.getId(), internalCallContext);
-            List<SubscriptionTransition> aoTransitions =  aoSubscription.getAllTransitions();
+            List<SubscriptionBaseTransition> aoTransitions =  aoSubscription.getAllTransitions();
             assertEquals(aoTransitions.size(), 3);
             assertEquals(aoTransitions.get(0).getTransitionType(), SubscriptionTransitionType.CREATE);
             assertEquals(aoTransitions.get(1).getTransitionType(), SubscriptionTransitionType.PHASE);
@@ -509,7 +509,7 @@ public class TestUserApiAddOn extends SubscriptionTestSuiteWithEmbeddedDB {
             assertEquals(aoSubscription.getBundleStartDate(), baseSubscription.getBundleStartDate());
 
             // CHECK next AO PHASE EVENT IS INDEED A MONTH AFTER BP STARTED => BUNDLE ALIGNMENT
-            SubscriptionTransition aoPendingTranstion = aoSubscription.getPendingTransition();
+            SubscriptionBaseTransition aoPendingTranstion = aoSubscription.getPendingTransition();
             if (expAlignement == PlanAlignmentCreate.START_OF_BUNDLE) {
                 assertEquals(aoPendingTranstion.getEffectiveTransitionTime(), baseSubscription.getStartDate().plusMonths(1));
             } else {
@@ -542,7 +542,7 @@ public class TestUserApiAddOn extends SubscriptionTestSuiteWithEmbeddedDB {
             aoSubscription = (SubscriptionData) subscriptionInternalApi.getSubscriptionFromId(aoSubscription.getId(), internalCallContext);
             aoPendingTranstion = aoSubscription.getPendingTransition();
             assertNull(aoPendingTranstion);
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             Assert.fail(e.getMessage());
         }
     }
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 7e0b299..3911d5c 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
@@ -80,7 +80,7 @@ public class TestUserApiCancel extends SubscriptionTestSuiteWithEmbeddedDB {
             testUtil.checkNextPhaseChange(subscription, 0, null);
 
             assertListenerStatus();
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             Assert.fail(e.getMessage());
         }
     }
@@ -157,7 +157,7 @@ public class TestUserApiCancel extends SubscriptionTestSuiteWithEmbeddedDB {
 
 
             assertListenerStatus();
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             Assert.fail(e.getMessage());
         }
     }
@@ -198,7 +198,7 @@ public class TestUserApiCancel extends SubscriptionTestSuiteWithEmbeddedDB {
             testUtil.checkNextPhaseChange(subscription, 0, null);
 
             assertListenerStatus();
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             Assert.fail(e.getMessage());
         }
     }
@@ -253,7 +253,7 @@ public class TestUserApiCancel extends SubscriptionTestSuiteWithEmbeddedDB {
             assertEquals(currentPhase.getPhaseType(), PhaseType.EVERGREEN);
 
             assertListenerStatus();
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             Assert.fail(e.getMessage());
         }
     }
diff --git a/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiChangePlan.java b/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiChangePlan.java
index 5bd1c1f..aab03fb 100644
--- a/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiChangePlan.java
+++ b/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiChangePlan.java
@@ -91,7 +91,7 @@ public class TestUserApiChangePlan extends SubscriptionTestSuiteWithEmbeddedDB {
             checkChangePlan(subscription, toProd, ProductCategory.BASE, toTerm, PhaseType.EVERGREEN);
 
             assertListenerStatus();
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             Assert.fail(e.getMessage());
         }
     }
@@ -154,7 +154,7 @@ public class TestUserApiChangePlan extends SubscriptionTestSuiteWithEmbeddedDB {
             checkChangePlan(subscription, toProd, ProductCategory.BASE, toTerm, PhaseType.DISCOUNT);
 
             assertListenerStatus();
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             Assert.fail(e.getMessage());
         }
     }
@@ -195,7 +195,7 @@ public class TestUserApiChangePlan extends SubscriptionTestSuiteWithEmbeddedDB {
             assertTrue(testListener.isCompleted(5000));
 
             assertListenerStatus();
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             Assert.fail(e.getMessage());
         }
     }
@@ -282,7 +282,7 @@ public class TestUserApiChangePlan extends SubscriptionTestSuiteWithEmbeddedDB {
             assertTrue(testListener.isCompleted(5000));
 
             assertListenerStatus();
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             Assert.fail(e.getMessage());
         }
     }
@@ -334,7 +334,7 @@ public class TestUserApiChangePlan extends SubscriptionTestSuiteWithEmbeddedDB {
             assertEquals(currentPhase.getPhaseType(), PhaseType.DISCOUNT);
 
             assertListenerStatus();
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             Assert.fail(e.getMessage());
         }
     }
@@ -420,7 +420,7 @@ public class TestUserApiChangePlan extends SubscriptionTestSuiteWithEmbeddedDB {
             assertEquals(currentPhase.getPhaseType(), PhaseType.EVERGREEN);
 
             assertListenerStatus();
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             Assert.fail(e.getMessage());
         }
     }
@@ -467,14 +467,14 @@ public class TestUserApiChangePlan extends SubscriptionTestSuiteWithEmbeddedDB {
             subscription = (SubscriptionData) subscriptionInternalApi.getSubscriptionFromId(subscription.getId(), internalCallContext);
 
             final DateTime expectedNextPhaseDate = subscription.getStartDate().plusDays(30).plusMonths(6);
-            final SubscriptionTransition nextPhase = subscription.getPendingTransition();
+            final SubscriptionBaseTransition nextPhase = subscription.getPendingTransition();
 
             final DateTime nextPhaseEffectiveDate = nextPhase.getEffectiveTransitionTime();
             assertEquals(nextPhaseEffectiveDate, expectedNextPhaseDate);
 
             assertListenerStatus();
 
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             Assert.fail(e.getMessage());
         }
     }
diff --git a/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiCreate.java b/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiCreate.java
index 474088e..2d87693 100644
--- a/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiCreate.java
+++ b/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiCreate.java
@@ -62,8 +62,8 @@ public class TestUserApiCreate extends SubscriptionTestSuiteWithEmbeddedDB {
             assertNotNull(subscription);
 
             //
-            // In addition to Alignment phase we also test SubscriptionTransition eventIds and created dates.
-            // Keep tracks of row events to compare with ids and created dates returned by SubscriptionTransition later.
+            // In addition to Alignment phase we also test SubscriptionBaseTransition eventIds and created dates.
+            // Keep tracks of row events to compare with ids and created dates returned by SubscriptionBaseTransition later.
             //
             final List<SubscriptionEvent> events = subscription.getEvents();
             Assert.assertEquals(events.size(), 2);
@@ -80,7 +80,7 @@ public class TestUserApiCreate extends SubscriptionTestSuiteWithEmbeddedDB {
             assertTrue(testListener.isCompleted(5000));
             assertListenerStatus();
 
-            final SubscriptionTransition transition = subscription.getPreviousTransition();
+            final SubscriptionBaseTransition transition = subscription.getPreviousTransition();
 
             assertEquals(transition.getPreviousEventId(), trialEvent.getId());
             assertEquals(transition.getNextEventId(), phaseEvent.getId());
@@ -88,7 +88,7 @@ public class TestUserApiCreate extends SubscriptionTestSuiteWithEmbeddedDB {
             assertEquals(transition.getPreviousEventCreatedDate().compareTo(trialEvent.getCreatedDate()), 0);
             assertEquals(transition.getNextEventCreatedDate().compareTo(phaseEvent.getCreatedDate()), 0);
 
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             log.error("Unexpected exception", e);
             Assert.fail(e.getMessage());
         }
@@ -127,7 +127,7 @@ public class TestUserApiCreate extends SubscriptionTestSuiteWithEmbeddedDB {
 
             assertListenerStatus();
 
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             Assert.fail(e.getMessage());
         }
     }
@@ -184,7 +184,7 @@ public class TestUserApiCreate extends SubscriptionTestSuiteWithEmbeddedDB {
             assertTrue(testListener.isCompleted(5000));
 
             assertListenerStatus();
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             Assert.fail(e.getMessage());
         }
     }
@@ -229,7 +229,7 @@ public class TestUserApiCreate extends SubscriptionTestSuiteWithEmbeddedDB {
             assertEquals(currentPhase.getPhaseType(), PhaseType.EVERGREEN);
 
             assertListenerStatus();
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             Assert.fail(e.getMessage());
         }
     }
@@ -248,7 +248,7 @@ public class TestUserApiCreate extends SubscriptionTestSuiteWithEmbeddedDB {
             assertNotNull(subscription);
 
             assertListenerStatus();
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             Assert.fail(e.getMessage());
         }
     }
diff --git a/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiError.java b/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiError.java
index 64f1575..745cac3 100644
--- a/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiError.java
+++ b/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiError.java
@@ -28,7 +28,7 @@ import org.testng.annotations.Test;
 
 import com.ning.billing.ErrorCode;
 import com.ning.billing.api.TestApiListener.NextEvent;
-import com.ning.billing.catalog.api.ActionPolicy;
+import com.ning.billing.catalog.api.BillingActionPolicy;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.Duration;
 import com.ning.billing.catalog.api.PlanPhase;
@@ -87,7 +87,7 @@ public class TestUserApiError extends SubscriptionTestSuiteNoDB {
             try {
                 subscription.recreate(testUtil.getProductSpecifier("Pistol", PriceListSet.DEFAULT_PRICELIST_NAME, BillingPeriod.MONTHLY, null), clock.getUTCNow(), callContext);
                 Assert.assertFalse(true);
-            } catch (SubscriptionUserApiException e) {
+            } catch (SubscriptionBaseApiException e) {
                 assertEquals(e.getCode(), ErrorCode.SUB_RECREATE_BAD_STATE.getCode());
             }
         } catch (Exception e) {
@@ -127,7 +127,7 @@ public class TestUserApiError extends SubscriptionTestSuiteNoDB {
                                               testUtil.getProductSpecifier(productName, planSet, term, null),
                                               clock.getUTCNow(), internalCallContext);
             Assert.fail("Exception expected, error code: " + expected);
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             assertEquals(e.getCode(), expected.getCode());
             try {
                 log.info(e.getMessage());
@@ -146,7 +146,7 @@ public class TestUserApiError extends SubscriptionTestSuiteNoDB {
             subscription.cancel(clock.getUTCNow(), callContext);
             try {
                 subscription.changePlan("Pistol", BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, clock.getUTCNow(), callContext);
-            } catch (SubscriptionUserApiException e) {
+            } catch (SubscriptionBaseApiException e) {
                 assertEquals(e.getCode(), ErrorCode.SUB_CHANGE_NON_ACTIVE.getCode());
                 try {
                     log.info(e.getMessage());
@@ -164,14 +164,14 @@ public class TestUserApiError extends SubscriptionTestSuiteNoDB {
         final SubscriptionBase subscription = testUtil.createSubscription(bundle, "Shotgun", BillingPeriod.ANNUAL, PriceListSet.DEFAULT_PRICELIST_NAME);
 
         try {
-            subscription.changePlanWithPolicy("Shotgun", BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, clock.getUTCNow(), ActionPolicy.ILLEGAL, callContext);
+            subscription.changePlanWithPolicy("Shotgun", BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, clock.getUTCNow(), BillingActionPolicy.ILLEGAL, callContext);
             Assert.fail();
         } catch (SubscriptionError error) {
             assertTrue(true);
             assertEquals(subscriptionInternalApi.getSubscriptionFromId(subscription.getId(), internalCallContext).getCurrentPlan().getBillingPeriod(), BillingPeriod.ANNUAL);
         }
 
-        assertTrue(subscription.changePlanWithPolicy("Shotgun", BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, clock.getUTCNow(), ActionPolicy.IMMEDIATE, callContext));
+        assertTrue(subscription.changePlanWithPolicy("Shotgun", BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, clock.getUTCNow(), BillingActionPolicy.IMMEDIATE, callContext));
         assertEquals(subscriptionInternalApi.getSubscriptionFromId(subscription.getId(), internalCallContext).getCurrentPlan().getBillingPeriod(), BillingPeriod.MONTHLY);
     }
 
@@ -199,7 +199,7 @@ public class TestUserApiError extends SubscriptionTestSuiteNoDB {
             subscription.cancel(clock.getUTCNow(), callContext);
             try {
                 subscription.changePlan("Pistol", BillingPeriod.MONTHLY, PriceListSet.DEFAULT_PRICELIST_NAME, clock.getUTCNow(), callContext);
-            } catch (SubscriptionUserApiException e) {
+            } catch (SubscriptionBaseApiException e) {
                 assertEquals(e.getCode(), ErrorCode.SUB_CHANGE_FUTURE_CANCELLED.getCode());
                 try {
                     log.info(e.getMessage());
@@ -225,7 +225,7 @@ public class TestUserApiError extends SubscriptionTestSuiteNoDB {
 
             try {
                 subscription.uncancel(callContext);
-            } catch (SubscriptionUserApiException e) {
+            } catch (SubscriptionBaseApiException e) {
                 assertEquals(e.getCode(), ErrorCode.SUB_UNCANCEL_BAD_STATE.getCode());
                 try {
                     log.info(e.getMessage());
diff --git a/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiRecreate.java b/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiRecreate.java
index 5d9f8c1..6a30a74 100644
--- a/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiRecreate.java
+++ b/subscription/src/test/java/com/ning/billing/subscription/api/user/TestUserApiRecreate.java
@@ -40,7 +40,7 @@ public abstract class TestUserApiRecreate extends SubscriptionTestSuiteWithEmbed
         try {
             testCreateAndRecreate(false);
             assertListenerStatus();
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             log.error("Unexpected exception", e);
             Assert.fail(e.getMessage());
         }
@@ -51,13 +51,13 @@ public abstract class TestUserApiRecreate extends SubscriptionTestSuiteWithEmbed
         try {
             testCreateAndRecreate(true);
             assertListenerStatus();
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             log.error("Unexpected exception", e);
             Assert.fail(e.getMessage());
         }
     }
 
-    private SubscriptionData testCreateAndRecreate(final boolean fromUserAPi) throws SubscriptionUserApiException {
+    private SubscriptionData testCreateAndRecreate(final boolean fromUserAPi) throws SubscriptionBaseApiException {
         final DateTime init = clock.getUTCNow();
         final DateTime requestedDate = init.minusYears(1);
 
@@ -90,7 +90,7 @@ public abstract class TestUserApiRecreate extends SubscriptionTestSuiteWithEmbed
                 subscription.recreate(testUtil.getProductSpecifier(productName, planSetName, term, null), requestedDate, callContext);
             }
             Assert.fail("Expected Create API to fail since BP already exists");
-        } catch (SubscriptionUserApiException e) {
+        } catch (SubscriptionBaseApiException e) {
             assertTrue(true);
         }
 
diff --git a/subscription/src/test/java/com/ning/billing/subscription/DefaultSubscriptionTestInitializer.java b/subscription/src/test/java/com/ning/billing/subscription/DefaultSubscriptionTestInitializer.java
index 80505f9..20b72a0 100644
--- a/subscription/src/test/java/com/ning/billing/subscription/DefaultSubscriptionTestInitializer.java
+++ b/subscription/src/test/java/com/ning/billing/subscription/DefaultSubscriptionTestInitializer.java
@@ -35,9 +35,8 @@ import com.ning.billing.mock.MockAccountBuilder;
 import com.ning.billing.subscription.api.SubscriptionService;
 import com.ning.billing.subscription.api.user.SubscriptionBundle;
 import com.ning.billing.subscription.engine.core.DefaultSubscriptionService;
-import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.callcontext.InternalCallContext;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 import com.ning.billing.util.svcsapi.bus.BusService;
 
 import static org.testng.Assert.assertNotNull;
@@ -77,7 +76,7 @@ public class DefaultSubscriptionTestInitializer implements SubscriptionTestIniti
         return accountData;
     }
 
-    public SubscriptionBundle initBundle(final SubscriptionInternalApi subscriptionApi, final InternalCallContext callContext) throws Exception {
+    public SubscriptionBundle initBundle(final SubscriptionBaseInternalApi subscriptionApi, final InternalCallContext callContext) throws Exception {
         final UUID accountId = UUID.randomUUID();
         final SubscriptionBundle bundle = subscriptionApi.createBundleForAccount(accountId, "myDefaultBundle",  callContext);
         assertNotNull(bundle);
diff --git a/subscription/src/test/java/com/ning/billing/subscription/SubscriptionTestInitializer.java b/subscription/src/test/java/com/ning/billing/subscription/SubscriptionTestInitializer.java
index f132760..ca86db9 100644
--- a/subscription/src/test/java/com/ning/billing/subscription/SubscriptionTestInitializer.java
+++ b/subscription/src/test/java/com/ning/billing/subscription/SubscriptionTestInitializer.java
@@ -25,7 +25,7 @@ import com.ning.billing.clock.ClockMock;
 import com.ning.billing.subscription.api.SubscriptionService;
 import com.ning.billing.subscription.api.user.SubscriptionBundle;
 import com.ning.billing.util.callcontext.InternalCallContext;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 import com.ning.billing.util.svcsapi.bus.BusService;
 
 public interface SubscriptionTestInitializer {
@@ -34,7 +34,7 @@ public interface SubscriptionTestInitializer {
 
     public AccountData initAccountData();
 
-    public SubscriptionBundle initBundle(final SubscriptionInternalApi subscriptionApi, final InternalCallContext callContext) throws Exception;
+    public SubscriptionBundle initBundle(final SubscriptionBaseInternalApi subscriptionApi, final InternalCallContext callContext) throws Exception;
 
     public void startTestFamework(final TestApiListener testListener,
                                   final TestListenerStatus testListenerStatus,
diff --git a/subscription/src/test/java/com/ning/billing/subscription/SubscriptionTestSuiteNoDB.java b/subscription/src/test/java/com/ning/billing/subscription/SubscriptionTestSuiteNoDB.java
index 3e1a9d5..169f4ed 100644
--- a/subscription/src/test/java/com/ning/billing/subscription/SubscriptionTestSuiteNoDB.java
+++ b/subscription/src/test/java/com/ning/billing/subscription/SubscriptionTestSuiteNoDB.java
@@ -47,7 +47,7 @@ import com.ning.billing.subscription.engine.dao.MockSubscriptionDaoMemory;
 import com.ning.billing.subscription.engine.dao.SubscriptionDao;
 import com.ning.billing.subscription.glue.TestDefaultSubscriptionModuleNoDB;
 import com.ning.billing.util.config.SubscriptionConfig;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 import com.ning.billing.util.svcsapi.bus.BusService;
 
 import com.google.inject.Guice;
@@ -61,7 +61,7 @@ public class SubscriptionTestSuiteNoDB extends GuicyKillbillTestSuiteNoDB {
     @Inject
     protected SubscriptionService subscriptionService;
     @Inject
-    protected SubscriptionInternalApi subscriptionInternalApi;
+    protected SubscriptionBaseInternalApi subscriptionInternalApi;
     @Inject
     protected SubscriptionTransferApi transferApi;
 
diff --git a/subscription/src/test/java/com/ning/billing/subscription/SubscriptionTestSuiteWithEmbeddedDB.java b/subscription/src/test/java/com/ning/billing/subscription/SubscriptionTestSuiteWithEmbeddedDB.java
index c3e7b3a..0c3744c 100644
--- a/subscription/src/test/java/com/ning/billing/subscription/SubscriptionTestSuiteWithEmbeddedDB.java
+++ b/subscription/src/test/java/com/ning/billing/subscription/SubscriptionTestSuiteWithEmbeddedDB.java
@@ -43,7 +43,7 @@ import com.ning.billing.subscription.api.user.TestSubscriptionHelper;
 import com.ning.billing.subscription.engine.dao.SubscriptionDao;
 import com.ning.billing.subscription.glue.TestDefaultSubscriptionModuleWithEmbeddedDB;
 import com.ning.billing.util.config.SubscriptionConfig;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 import com.ning.billing.util.svcsapi.bus.BusService;
 
 import com.google.inject.Guice;
@@ -57,7 +57,7 @@ public class SubscriptionTestSuiteWithEmbeddedDB extends GuicyKillbillTestSuiteW
     @Inject
     protected SubscriptionService subscriptionService;
     @Inject
-    protected SubscriptionInternalApi subscriptionInternalApi;
+    protected SubscriptionBaseInternalApi subscriptionInternalApi;
     @Inject
     protected SubscriptionTransferApi transferApi;
 
diff --git a/util/src/test/java/com/ning/billing/mock/glue/MockSubscriptionModule.java b/util/src/test/java/com/ning/billing/mock/glue/MockSubscriptionModule.java
index ea89e2a..bc73c0c 100644
--- a/util/src/test/java/com/ning/billing/mock/glue/MockSubscriptionModule.java
+++ b/util/src/test/java/com/ning/billing/mock/glue/MockSubscriptionModule.java
@@ -23,7 +23,7 @@ import com.ning.billing.subscription.api.SubscriptionService;
 import com.ning.billing.subscription.api.migration.SubscriptionMigrationApi;
 import com.ning.billing.subscription.api.timeline.SubscriptionTimelineApi;
 import com.ning.billing.subscription.api.transfer.SubscriptionTransferApi;
-import com.ning.billing.util.svcapi.subscription.SubscriptionInternalApi;
+import com.ning.billing.util.svcapi.subscription.SubscriptionBaseInternalApi;
 
 import com.google.inject.AbstractModule;
 
@@ -42,7 +42,7 @@ public class MockSubscriptionModule extends AbstractModule implements Subscripti
 
     @Override
     public void installSubscriptionInternalApi() {
-        bind(SubscriptionInternalApi.class).toInstance(Mockito.mock(SubscriptionInternalApi.class));
+        bind(SubscriptionBaseInternalApi.class).toInstance(Mockito.mock(SubscriptionBaseInternalApi.class));
     }
 
     @Override
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 c24507b..6233101 100644
--- a/util/src/test/java/com/ning/billing/mock/MockSubscription.java
+++ b/util/src/test/java/com/ning/billing/mock/MockSubscription.java
@@ -23,18 +23,18 @@ import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
 import org.mockito.Mockito;
 
-import com.ning.billing.catalog.api.ActionPolicy;
+import com.ning.billing.catalog.api.BillingActionPolicy;
 import com.ning.billing.catalog.api.BillingPeriod;
 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.ProductCategory;
-import com.ning.billing.subscription.api.user.SubscriptionUserApiException;
+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.subscription.api.user.SubscriptionTransition;
 import com.ning.billing.entitlement.api.BlockingState;
 import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.events.EffectiveSubscriptionInternalEvent;
@@ -74,37 +74,37 @@ public class MockSubscription implements SubscriptionBase {
     SubscriptionBase sub = Mockito.mock(SubscriptionBase.class);
 
     @Override
-    public boolean cancel(final DateTime requestedDate, final CallContext context) throws SubscriptionUserApiException {
+    public boolean cancel(final DateTime requestedDate, final CallContext context) throws SubscriptionBaseApiException {
         return sub.cancel(requestedDate, context);
     }
 
     @Override
     public boolean cancelWithPolicy(DateTime requestedDate,
-                                    ActionPolicy policy, CallContext context)
-            throws SubscriptionUserApiException {
+                                    BillingActionPolicy policy, CallContext context)
+            throws SubscriptionBaseApiException {
         return sub.cancelWithPolicy(requestedDate, policy, context);
     }
 
     @Override
-    public boolean uncancel(final CallContext context) throws SubscriptionUserApiException {
+    public boolean uncancel(final CallContext context) throws SubscriptionBaseApiException {
         return sub.uncancel(context);
     }
 
     @Override
     public boolean changePlan(final String productName, final BillingPeriod term, final String priceList, final DateTime requestedDate,
-                              final CallContext context) throws SubscriptionUserApiException {
+                              final CallContext context) throws SubscriptionBaseApiException {
         return sub.changePlan(productName, term, priceList, requestedDate, context);
     }
 
     @Override
     public boolean changePlanWithPolicy(final String productName, final BillingPeriod term, final String priceList,
-                                        final DateTime requestedDate, final ActionPolicy policy, final CallContext context) throws SubscriptionUserApiException {
+                                        final DateTime requestedDate, final BillingActionPolicy policy, final CallContext context) throws SubscriptionBaseApiException {
         return sub.changePlan(productName, term, priceList, requestedDate, context);
     }
 
     @Override
     public boolean recreate(final PlanPhaseSpecifier spec, final DateTime requestedDate, final CallContext context)
-            throws SubscriptionUserApiException {
+            throws SubscriptionBaseApiException {
         return sub.recreate(spec, requestedDate, context);
     }
 
@@ -218,19 +218,19 @@ public class MockSubscription implements SubscriptionBase {
     }
 
     @Override
-    public SubscriptionTransition getPendingTransition() {
+    public SubscriptionBaseTransition getPendingTransition() {
         // TODO Auto-generated method stub
         return null;
     }
 
     @Override
-    public SubscriptionTransition getPreviousTransition() {
+    public SubscriptionBaseTransition getPreviousTransition() {
         // TODO Auto-generated method stub
         return null;
     }
 
     @Override
-    public List<SubscriptionTransition> getAllTransitions() {
+    public List<SubscriptionBaseTransition> getAllTransitions() {
         return null;
     }
 }