killbill-aplcache

Changes

Details

diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscription.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscription.java
index 71e3402..5df945e 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscription.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscription.java
@@ -91,7 +91,7 @@ public class BusinessSubscription
      */
     BusinessSubscription(final Subscription subscription, final Currency currency)
     {
-        this(subscription.getCurrentPriceList(), subscription.getCurrentPlan(), subscription.getCurrentPhase(), currency, subscription.getStartDate(), subscription.getState(), subscription.getId(), subscription.getBundleId());
+        this(subscription.getCurrentPriceList().getName(), subscription.getCurrentPlan(), subscription.getCurrentPhase(), currency, subscription.getStartDate(), subscription.getState(), subscription.getId(), subscription.getBundleId());
     }
 
     public BusinessSubscription(final String priceList, final Plan currentPlan, final PlanPhase currentPhase, final Currency currency, final DateTime startDate, final SubscriptionState state, final UUID subscriptionId, final UUID bundleId)
diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java
index 09fbc96..f95b75c 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java
@@ -115,7 +115,7 @@ public class BusinessSubscriptionTransitionRecorder
             prevSubscription = null;
         }
         else {
-            prevSubscription = new BusinessSubscription(transition.getPreviousPriceList(), transition.getPreviousPlan(), transition.getPreviousPhase(), currency, previousEffectiveTransitionTime, transition.getPreviousState(), transition.getSubscriptionId(), transition.getBundleId());
+            prevSubscription = new BusinessSubscription(transition.getPreviousPriceList().getName(), transition.getPreviousPlan(), transition.getPreviousPhase(), currency, previousEffectiveTransitionTime, transition.getPreviousState(), transition.getSubscriptionId(), transition.getBundleId());
         }
         final BusinessSubscription nextSubscription;
 
@@ -124,7 +124,7 @@ public class BusinessSubscriptionTransitionRecorder
             nextSubscription = null;
         }
         else {
-            nextSubscription = new BusinessSubscription(transition.getNextPriceList(), transition.getNextPlan(), transition.getNextPhase(), currency, transition.getEffectiveTransitionTime(), transition.getNextState(), transition.getSubscriptionId(), transition.getBundleId());
+            nextSubscription = new BusinessSubscription(transition.getNextPriceList().getName(), transition.getNextPlan(), transition.getNextPhase(), currency, transition.getEffectiveTransitionTime(), transition.getNextState(), transition.getSubscriptionId(), transition.getBundleId());
         }
 
         record(transition.getId(), transitionKey, accountKey, transition.getRequestedTransitionTime(), event, prevSubscription, nextSubscription);
diff --git a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
index 14654d2..059efaa 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
@@ -51,10 +51,12 @@ import com.ning.billing.analytics.MockPlan;
 import com.ning.billing.analytics.MockProduct;
 import com.ning.billing.analytics.dao.BusinessAccountDao;
 import com.ning.billing.analytics.dao.BusinessSubscriptionTransitionDao;
+import com.ning.billing.catalog.MockPriceList;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.catalog.api.PhaseType;
 import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
+import com.ning.billing.catalog.api.PriceList;
 import com.ning.billing.catalog.api.Product;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.dbi.MysqlTestingHelper;
@@ -204,7 +206,7 @@ public class TestAnalyticsService {
         final UUID subscriptionId = UUID.randomUUID();
         final DateTime effectiveTransitionTime = clock.getUTCNow();
         final DateTime requestedTransitionTime = clock.getUTCNow();
-        final String priceList = "something";
+        final PriceList priceList = new MockPriceList().setName("something");
 
         transition = new SubscriptionTransitionData(
                 ID,
@@ -232,7 +234,7 @@ public class TestAnalyticsService {
                 requestedTransitionTime,
                 BusinessSubscriptionEvent.subscriptionCreated(plan),
                 null,
-                new BusinessSubscription(priceList, plan, phase, ACCOUNT_CURRENCY, effectiveTransitionTime, Subscription.SubscriptionState.ACTIVE, subscriptionId, bundle.getId())
+                new BusinessSubscription(priceList.getName(), plan, phase, ACCOUNT_CURRENCY, effectiveTransitionTime, Subscription.SubscriptionState.ACTIVE, subscriptionId, bundle.getId())
         );
     }
 
diff --git a/analytics/src/test/java/com/ning/billing/analytics/MockSubscription.java b/analytics/src/test/java/com/ning/billing/analytics/MockSubscription.java
index 357caad..9d7b5c3 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/MockSubscription.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/MockSubscription.java
@@ -16,22 +16,23 @@
 
 package com.ning.billing.analytics;
 
+import java.util.List;
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+
 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.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.entitlement.api.user.SubscriptionTransition;
 import com.ning.billing.util.customfield.CustomField;
 
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
-
-import java.util.List;
-import java.util.UUID;
-
 public class MockSubscription implements Subscription
 {
     private static final UUID ID = UUID.randomUUID();
@@ -105,7 +106,7 @@ public class MockSubscription implements Subscription
     }
 
     @Override
-    public String getCurrentPriceList()
+    public PriceList getCurrentPriceList()
     {
         return null;
     }
diff --git a/analytics/src/test/java/com/ning/billing/analytics/TestAnalyticsListener.java b/analytics/src/test/java/com/ning/billing/analytics/TestAnalyticsListener.java
index 0b420f0..f24b8f2 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/TestAnalyticsListener.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/TestAnalyticsListener.java
@@ -17,10 +17,19 @@
 package com.ning.billing.analytics;
 
 
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+import org.joda.time.DateTimeZone;
+import org.testng.Assert;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.catalog.api.PhaseType;
 import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
+import com.ning.billing.catalog.api.PriceList;
 import com.ning.billing.catalog.api.Product;
 import com.ning.billing.catalog.api.ProductCategory;
 import com.ning.billing.entitlement.api.user.Subscription;
@@ -28,13 +37,6 @@ import com.ning.billing.entitlement.api.user.SubscriptionTransitionData;
 import com.ning.billing.entitlement.events.EntitlementEvent;
 import com.ning.billing.entitlement.events.user.ApiEventType;
 import com.ning.billing.util.clock.ClockMock;
-import org.joda.time.DateTime;
-import org.joda.time.DateTimeZone;
-import org.testng.Assert;
-import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.Test;
-
-import java.util.UUID;
 
 
 public class TestAnalyticsListener
@@ -49,7 +51,7 @@ public class TestAnalyticsListener
     private final Product product = new MockProduct("platinium", "subscription", ProductCategory.BASE);
     private final Plan plan = new MockPlan("platinum-monthly", product);
     private final PlanPhase phase = new MockPhase(PhaseType.EVERGREEN, plan, MockDuration.UNLIMITED(), 25.95);
-    private final String priceList = null;
+    private final PriceList priceList = null;
 
     private AnalyticsListener listener;
 
diff --git a/api/src/main/java/com/ning/billing/catalog/api/Catalog.java b/api/src/main/java/com/ning/billing/catalog/api/Catalog.java
index 694fdf1..924a5e4 100644
--- a/api/src/main/java/com/ning/billing/catalog/api/Catalog.java
+++ b/api/src/main/java/com/ning/billing/catalog/api/Catalog.java
@@ -18,9 +18,6 @@ package com.ning.billing.catalog.api;
 
 import org.joda.time.DateTime;
 
-import com.ning.billing.catalog.api.overdue.OverdueStateSet;
-import com.ning.billing.entitlement.api.user.SubscriptionBundle;
-
 public interface Catalog {
 	//
     // Simple getters
@@ -59,6 +56,11 @@ public interface Catalog {
     public abstract PlanPhase findPhase(String name, DateTime requestedDate, DateTime subscriptionStartDate) throws CatalogApiException;
 
     //
+    // Find a priceList
+    //  
+    public abstract PriceList findPriceList(String name, DateTime requestedDate) throws CatalogApiException;
+
+    //
     // Rules
     //
 	public abstract ActionPolicy planChangePolicy(PlanPhaseSpecifier from,
diff --git a/api/src/main/java/com/ning/billing/catalog/api/StaticCatalog.java b/api/src/main/java/com/ning/billing/catalog/api/StaticCatalog.java
index e1ee020..fb2d2a6 100644
--- a/api/src/main/java/com/ning/billing/catalog/api/StaticCatalog.java
+++ b/api/src/main/java/com/ning/billing/catalog/api/StaticCatalog.java
@@ -55,7 +55,12 @@ public interface StaticCatalog {
     //
     // Find a phase
     //
-    public abstract PlanPhase findCurrentPhase(String name) throws CatalogApiException;
+    public abstract  PlanPhase findCurrentPhase(String name) throws CatalogApiException;
+    
+    //
+    // Find a pricelist
+    //
+    public abstract PriceList findCurrentPricelist(String name) throws CatalogApiException;
     
     //
     //  
diff --git a/api/src/main/java/com/ning/billing/entitlement/api/user/Subscription.java b/api/src/main/java/com/ning/billing/entitlement/api/user/Subscription.java
index 83d0b68..2ed8b14 100644
--- a/api/src/main/java/com/ning/billing/entitlement/api/user/Subscription.java
+++ b/api/src/main/java/com/ning/billing/entitlement/api/user/Subscription.java
@@ -16,18 +16,18 @@
 
 package com.ning.billing.entitlement.api.user;
 
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+
 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.util.customfield.CustomizableEntity;
 
-import org.joda.time.DateTime;
-
-import java.util.List;
-import java.util.UUID;
-
 
 public interface Subscription extends CustomizableEntity {
 
@@ -58,7 +58,7 @@ public interface Subscription extends CustomizableEntity {
 
     public Plan getCurrentPlan();
 
-    public String getCurrentPriceList();
+    public PriceList getCurrentPriceList();
 
     public PlanPhase getCurrentPhase();
 
diff --git a/api/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransition.java b/api/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransition.java
index 80b836a..7577616 100644
--- a/api/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransition.java
+++ b/api/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransition.java
@@ -16,13 +16,15 @@
 
 package com.ning.billing.entitlement.api.user;
 
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+
 import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
+import com.ning.billing.catalog.api.PriceList;
 import com.ning.billing.entitlement.api.user.Subscription.SubscriptionState;
 import com.ning.billing.util.bus.BusEvent;
-import org.joda.time.DateTime;
-
-import java.util.UUID;
 
 public interface SubscriptionTransition extends BusEvent {
 
@@ -53,7 +55,7 @@ public interface SubscriptionTransition extends BusEvent {
 
     Plan getPreviousPlan();
 
-    String getPreviousPriceList();
+    PriceList getPreviousPriceList();
 
     PlanPhase getPreviousPhase();
 
@@ -63,5 +65,5 @@ public interface SubscriptionTransition extends BusEvent {
 
     SubscriptionState getNextState();
 
-    String getNextPriceList();
+    PriceList getNextPriceList();
 }
diff --git a/catalog/src/main/java/com/ning/billing/catalog/DefaultPriceListSet.java b/catalog/src/main/java/com/ning/billing/catalog/DefaultPriceListSet.java
index f0636dd..83d810b 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/DefaultPriceListSet.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/DefaultPriceListSet.java
@@ -48,7 +48,7 @@ public class DefaultPriceListSet extends ValidatingConfig<StandaloneCatalog> {
 		this.childPriceLists = childPriceLists;
 	}
 
-	public DefaultPlan getPlanListFrom(String priceListName, Product product,
+	public DefaultPlan getPlanFrom(String priceListName, Product product,
 			BillingPeriod period) throws CatalogApiException {
 		DefaultPlan result = null;
 		DefaultPriceList pl = findPriceListFrom(priceListName);
diff --git a/catalog/src/main/java/com/ning/billing/catalog/overdue/DefaultOverdueState.java b/catalog/src/main/java/com/ning/billing/catalog/overdue/DefaultOverdueState.java
index fd70790..7e73da9 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/overdue/DefaultOverdueState.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/overdue/DefaultOverdueState.java
@@ -20,6 +20,7 @@ import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
 import javax.xml.bind.annotation.XmlAttribute;
 import javax.xml.bind.annotation.XmlElement;
+import javax.xml.bind.annotation.XmlID;
 import javax.xml.bind.annotation.XmlIDREF;
 
 import com.ning.billing.catalog.api.overdue.OverdueState;
@@ -32,8 +33,8 @@ public class DefaultOverdueState<T extends Overdueable> implements OverdueState<
 	private DefaultCondition<T> condition;
 
 	@XmlAttribute(required=true, name="name")
-	@XmlIDREF
-	private String name; 
+    @XmlID
+    private String name; 
 
 	@XmlElement(required=false, name="externalMessage")
 	private String externalMessage = "";
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 3aa1420..0e7e658 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/StandaloneCatalog.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/StandaloneCatalog.java
@@ -39,6 +39,7 @@ import com.ning.billing.catalog.api.PlanChangeResult;
 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.PriceList;
 import com.ning.billing.catalog.api.Product;
 import com.ning.billing.catalog.api.StaticCatalog;
 import com.ning.billing.catalog.api.overdue.OverdueStateSet;
@@ -71,7 +72,7 @@ public class StandaloneCatalog extends ValidatingConfig<StandaloneCatalog> imple
 	@XmlElement(name="rules", required=true)
 	private PlanRules planRules;
 
-    @XmlElement(name="overdueRules", required=true)
+    @XmlElement(name="overdueRules", required=false)
     private OverdueRules overdueRules;
 
 	@XmlElementWrapper(name="plans", required=true)
@@ -147,7 +148,7 @@ public class StandaloneCatalog extends ValidatingConfig<StandaloneCatalog> imple
 			throw new CatalogApiException(ErrorCode.CAT_PRICE_LIST_NOT_FOUND,priceListName);
 		}
 		Product product = findCurrentProduct(productName);
-		DefaultPlan result = priceLists.getPlanListFrom(priceListName, product, period);
+		DefaultPlan result = priceLists.getPlanFrom(priceListName, product, period);
 		if ( result == null) {
 			String periodString = (period == null) ? "NULL" :  period.toString();
 			throw new CatalogApiException(ErrorCode.CAT_PLAN_NOT_FOUND, productName, periodString, priceListName);
@@ -192,6 +193,16 @@ public class StandaloneCatalog extends ValidatingConfig<StandaloneCatalog> imple
 		return plan.findPhase(name);
 	}
 
+    @Override
+    public PriceList findCurrentPricelist(String name)
+            throws CatalogApiException {
+        if (name == null || priceLists == null) {
+            throw new CatalogApiException(ErrorCode.CAT_PRICE_LIST_NOT_FOUND, name);
+        }
+        
+        return priceLists.findPriceListFrom(name);
+    }
+
 
 
 	//////////////////////////////////////////////////////////////////////////////
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 5718d35..00fd66c 100644
--- a/catalog/src/main/java/com/ning/billing/catalog/VersionedCatalog.java
+++ b/catalog/src/main/java/com/ning/billing/catalog/VersionedCatalog.java
@@ -46,6 +46,7 @@ import com.ning.billing.catalog.api.PlanChangeResult;
 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.PriceList;
 import com.ning.billing.catalog.api.Product;
 import com.ning.billing.catalog.api.StaticCatalog;
 import com.ning.billing.catalog.api.overdue.OverdueStateSet;
@@ -162,6 +163,8 @@ public class VersionedCatalog extends ValidatingConfig<StandaloneCatalog> implem
 		throw new CatalogApiException(ErrorCode.CAT_NO_CATALOG_FOR_GIVEN_DATE, requestedDate.toDate().toString());
 	}
 	
+	
+	
 	//
 	// Public methods not exposed in interface
 	//
@@ -272,6 +275,17 @@ public class VersionedCatalog extends ValidatingConfig<StandaloneCatalog> implem
 		return plan.findPhase(phaseName);
 	}
 	
+	
+	//
+    // Find a price list
+    //
+    @Override
+    public PriceList findPriceList(String name, DateTime requestedDate)
+            throws CatalogApiException {
+        return versionForDate(requestedDate).findCurrentPriceList(name);
+    }
+
+ 
     //
     // Rules
     //
@@ -383,6 +397,13 @@ public class VersionedCatalog extends ValidatingConfig<StandaloneCatalog> implem
 	public PlanPhase findCurrentPhase(String name) throws CatalogApiException {
 		return versionForDate(clock.getUTCNow()).findCurrentPhase(name);
 	}
+	
+
+    @Override
+    public PriceList findCurrentPricelist(String name)
+            throws CatalogApiException {
+        return versionForDate(clock.getUTCNow()).findCurrentPriceList(name);
+    }
 
 	@Override
 	public ActionPolicy planChangePolicy(PlanPhaseSpecifier from,
@@ -432,6 +453,6 @@ public class VersionedCatalog extends ValidatingConfig<StandaloneCatalog> implem
         return versionForDate(clock.getUTCNow()).currentBundleOverdueStateSet();
     }
 
- 
+
  
 }
diff --git a/catalog/src/test/java/com/ning/billing/catalog/TestPriceListSet.java b/catalog/src/test/java/com/ning/billing/catalog/TestPriceListSet.java
index 3cb8d2f..a26ce10 100644
--- a/catalog/src/test/java/com/ning/billing/catalog/TestPriceListSet.java
+++ b/catalog/src/test/java/com/ning/billing/catalog/TestPriceListSet.java
@@ -50,10 +50,10 @@ public class TestPriceListSet {
 		};
 		DefaultPriceListSet set = new DefaultPriceListSet(defaultPriceList, childPriceLists);
 		
-		Assert.assertEquals(set.getPlanListFrom(PriceListSet.DEFAULT_PRICELIST_NAME, foo, BillingPeriod.ANNUAL).getFinalPhase().getPhaseType(), PhaseType.EVERGREEN);
-		Assert.assertEquals(set.getPlanListFrom(PriceListSet.DEFAULT_PRICELIST_NAME, foo, BillingPeriod.MONTHLY).getFinalPhase().getPhaseType(), PhaseType.EVERGREEN);
-		Assert.assertEquals(set.getPlanListFrom("child", foo, BillingPeriod.ANNUAL).getFinalPhase().getPhaseType(), PhaseType.DISCOUNT);
-		Assert.assertEquals(set.getPlanListFrom("child", foo, BillingPeriod.MONTHLY).getFinalPhase().getPhaseType(), PhaseType.EVERGREEN);
+		Assert.assertEquals(set.getPlanFrom(PriceListSet.DEFAULT_PRICELIST_NAME, foo, BillingPeriod.ANNUAL).getFinalPhase().getPhaseType(), PhaseType.EVERGREEN);
+		Assert.assertEquals(set.getPlanFrom(PriceListSet.DEFAULT_PRICELIST_NAME, foo, BillingPeriod.MONTHLY).getFinalPhase().getPhaseType(), PhaseType.EVERGREEN);
+		Assert.assertEquals(set.getPlanFrom("child", foo, BillingPeriod.ANNUAL).getFinalPhase().getPhaseType(), PhaseType.DISCOUNT);
+		Assert.assertEquals(set.getPlanFrom("child", foo, BillingPeriod.MONTHLY).getFinalPhase().getPhaseType(), PhaseType.EVERGREEN);
 	}
 	
 	public void testForNullBillingPeriod() throws CatalogApiException {
@@ -76,10 +76,10 @@ public class TestPriceListSet {
 		};
 		DefaultPriceListSet set = new DefaultPriceListSet(defaultPriceList, childPriceLists);
 		
-		Assert.assertEquals(set.getPlanListFrom("child", foo, BillingPeriod.ANNUAL).getFinalPhase().getPhaseType(), PhaseType.DISCOUNT);
-		Assert.assertEquals(set.getPlanListFrom("child", foo, BillingPeriod.MONTHLY).getFinalPhase().getPhaseType(), PhaseType.EVERGREEN);
-		Assert.assertEquals(set.getPlanListFrom(PriceListSet.DEFAULT_PRICELIST_NAME, foo, BillingPeriod.ANNUAL).getFinalPhase().getPhaseType(), PhaseType.EVERGREEN);
-		Assert.assertEquals(set.getPlanListFrom(PriceListSet.DEFAULT_PRICELIST_NAME, foo, BillingPeriod.MONTHLY).getFinalPhase().getPhaseType(), PhaseType.EVERGREEN);
+		Assert.assertEquals(set.getPlanFrom("child", foo, BillingPeriod.ANNUAL).getFinalPhase().getPhaseType(), PhaseType.DISCOUNT);
+		Assert.assertEquals(set.getPlanFrom("child", foo, BillingPeriod.MONTHLY).getFinalPhase().getPhaseType(), PhaseType.EVERGREEN);
+		Assert.assertEquals(set.getPlanFrom(PriceListSet.DEFAULT_PRICELIST_NAME, foo, BillingPeriod.ANNUAL).getFinalPhase().getPhaseType(), PhaseType.EVERGREEN);
+		Assert.assertEquals(set.getPlanFrom(PriceListSet.DEFAULT_PRICELIST_NAME, foo, BillingPeriod.MONTHLY).getFinalPhase().getPhaseType(), PhaseType.EVERGREEN);
 	}
 
 }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/alignment/PlanAligner.java b/entitlement/src/main/java/com/ning/billing/entitlement/alignment/PlanAligner.java
index 82a83bf..a55dcb7 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/alignment/PlanAligner.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/alignment/PlanAligner.java
@@ -133,7 +133,7 @@ public class PlanAligner  {
                         subscription.getBundleStartDate(),
                         lastPlanTransition.getNextPlan(),
                         lastPlanTransition.getNextPhase().getPhaseType(),
-                        lastPlanTransition.getNextPriceList(),
+                        lastPlanTransition.getNextPriceList().getName(),
                         requestedDate);
                 return getTimedPhase(timedPhases, effectiveDate, WhichPhase.NEXT);
             // If we went through Plan changes, borrow the logics for changePlan alignement
@@ -142,9 +142,9 @@ public class PlanAligner  {
                         subscription.getBundleStartDate(),
                         lastPlanTransition.getPreviousPhase(),
                         lastPlanTransition.getPreviousPlan(),
-                        lastPlanTransition.getPreviousPriceList(),
+                        lastPlanTransition.getPreviousPriceList().getName(),
                         lastPlanTransition.getNextPlan(),
-                        lastPlanTransition.getNextPriceList(),
+                        lastPlanTransition.getNextPriceList().getName(),
                         requestedDate,
                         effectiveDate,
                         WhichPhase.NEXT);
@@ -192,7 +192,7 @@ public class PlanAligner  {
                 subscription.getBundleStartDate(),
                 subscription.getCurrentPhase(),
                 subscription.getCurrentPlan(),
-                subscription.getCurrentPriceList(),
+                subscription.getCurrentPriceList().getName(),
                 nextPlan,
                 nextPriceList,
                 requestedDate,
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/BillCycleDayCalculator.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/BillCycleDayCalculator.java
index fd015d7..6cbc05f 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/BillCycleDayCalculator.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/BillCycleDayCalculator.java
@@ -61,7 +61,7 @@ public class BillCycleDayCalculator {
 								new PlanPhaseSpecifier(product.getName(),
 										product.getCategory(),
 										phase.getBillingPeriod(),
-										transition.getNextPriceList(),
+										transition.getNextPriceList().getName(),
 										phase.getPhaseType()),
 										transition.getRequestedTransitionTime());
 						int result = -1;
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionApiService.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionApiService.java
index e1b1502..4c9b01e 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionApiService.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionApiService.java
@@ -152,7 +152,7 @@ public class SubscriptionApiService {
             PlanPhaseSpecifier planPhase = new PlanPhaseSpecifier(currentPlan.getProduct().getName(),
                     currentPlan.getProduct().getCategory(),
                     subscription.getCurrentPlan().getBillingPeriod(),
-                    subscription.getCurrentPriceList(),
+                    subscription.getCurrentPriceList().getName(),
                     subscription.getCurrentPhase().getPhaseType());
 
             ActionPolicy policy = null;
@@ -216,7 +216,7 @@ public class SubscriptionApiService {
             requestedDate = (requestedDate != null) ? DefaultClock.truncateMs(requestedDate) : now;
             validateRequestedDate(subscription, now, requestedDate);
 
-            String currentPriceList = subscription.getCurrentPriceList();
+            PriceList currentPriceList = subscription.getCurrentPriceList();
 
             SubscriptionState currentState = subscription.getState();
             if (currentState != SubscriptionState.ACTIVE) {
@@ -234,7 +234,7 @@ public class SubscriptionApiService {
                 PlanPhaseSpecifier fromPlanPhase = new PlanPhaseSpecifier(currentPlan.getProduct().getName(),
                         currentPlan.getProduct().getCategory(),
                         currentPlan.getBillingPeriod(),
-                        currentPriceList, subscription.getCurrentPhase().getPhaseType());
+                        currentPriceList.getName(), subscription.getCurrentPhase().getPhaseType());
                 PlanSpecifier toPlanPhase = new PlanSpecifier(productName,
                         destProduct.getCategory(),
                         term,
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionData.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionData.java
index ee7bb5a..a2ed14c 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionData.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionData.java
@@ -16,6 +16,16 @@
 
 package com.ning.billing.entitlement.api.user;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.UUID;
+
+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.BillingPeriod;
 import com.ning.billing.catalog.api.Catalog;
@@ -23,6 +33,7 @@ import com.ning.billing.catalog.api.CatalogApiException;
 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.entitlement.api.user.SubscriptionFactory.SubscriptionBuilder;
 import com.ning.billing.entitlement.api.user.SubscriptionTransition.SubscriptionTransitionType;
@@ -31,7 +42,6 @@ import com.ning.billing.entitlement.api.user.SubscriptionTransitionDataIterator.
 import com.ning.billing.entitlement.api.user.SubscriptionTransitionDataIterator.TimeLimit;
 import com.ning.billing.entitlement.api.user.SubscriptionTransitionDataIterator.Visibility;
 import com.ning.billing.entitlement.events.EntitlementEvent;
-import com.ning.billing.entitlement.events.EntitlementEvent.EventType;
 import com.ning.billing.entitlement.events.phase.PhaseEvent;
 import com.ning.billing.entitlement.events.user.ApiEvent;
 import com.ning.billing.entitlement.events.user.ApiEventType;
@@ -40,16 +50,6 @@ import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.customfield.CustomField;
 import com.ning.billing.util.customfield.CustomizableEntityBase;
 
-import org.joda.time.DateTime;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.UUID;
-
 public class SubscriptionData extends CustomizableEntityBase implements Subscription {
 
     private final static Logger log = LoggerFactory.getLogger(SubscriptionData.class);
@@ -169,7 +169,7 @@ public class SubscriptionData extends CustomizableEntityBase implements Subscrip
     }
 
     @Override
-    public String getCurrentPriceList() {
+    public PriceList getCurrentPriceList() {
         return (getPreviousTransition() == null) ? null : getPreviousTransition().getNextPriceList();
     }
 
@@ -358,10 +358,10 @@ public class SubscriptionData extends CustomizableEntityBase implements Subscrip
         SubscriptionState nextState = null;
         String nextPlanName = null;
         String nextPhaseName = null;
-        String nextPriceList = null;
-
+        String nextPriceListName = null; 
+        
         SubscriptionState previousState = null;
-        String previousPriceList = null;
+        PriceList previousPriceList = null;
 
         transitions = new LinkedList<SubscriptionTransitionData>();
         Plan previousPlan = null;
@@ -400,12 +400,12 @@ public class SubscriptionData extends CustomizableEntityBase implements Subscrip
                     nextState = SubscriptionState.ACTIVE;
                     nextPlanName = userEV.getEventPlan();
                     nextPhaseName = userEV.getEventPlanPhase();
-                    nextPriceList = userEV.getPriceList();
+                    nextPriceListName = userEV.getPriceList();
                     break;
                 case CHANGE:
                     nextPlanName = userEV.getEventPlan();
                     nextPhaseName = userEV.getEventPlanPhase();
-                    nextPriceList = userEV.getPriceList();
+                    nextPriceListName = userEV.getPriceList();
                     break;
                 case CANCEL:
                     nextState = SubscriptionState.CANCELLED;
@@ -427,9 +427,12 @@ public class SubscriptionData extends CustomizableEntityBase implements Subscrip
 
             Plan nextPlan = null;
             PlanPhase nextPhase = null;
+            PriceList nextPriceList = null;
+
             try {
                 nextPlan = (nextPlanName != null) ? catalog.findPlan(nextPlanName, cur.getRequestedDate(), getStartDate()) : null;
                 nextPhase = (nextPhaseName != null) ? catalog.findPhase(nextPhaseName, cur.getRequestedDate(), getStartDate()) : null;
+                nextPriceList = (nextPriceListName != null) ? catalog.findPriceList(nextPriceListName, cur.getRequestedDate()) : null;
             } catch (CatalogApiException e) {
                 log.error(String.format("Failed to build transition for subscription %s", id), e);
             }
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransitionData.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransitionData.java
index f03193b..f420e98 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransitionData.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/SubscriptionTransitionData.java
@@ -16,15 +16,17 @@
 
 package com.ning.billing.entitlement.api.user;
 
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+
 import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
+import com.ning.billing.catalog.api.PriceList;
 import com.ning.billing.entitlement.api.user.Subscription.SubscriptionState;
 import com.ning.billing.entitlement.events.EntitlementEvent.EventType;
 import com.ning.billing.entitlement.events.user.ApiEventType;
 import com.ning.billing.entitlement.exceptions.EntitlementError;
-import org.joda.time.DateTime;
-
-import java.util.UUID;
 
 public class SubscriptionTransitionData implements SubscriptionTransition {
 
@@ -38,19 +40,19 @@ public class SubscriptionTransitionData implements SubscriptionTransition {
     private final DateTime requestedTransitionTime;
     private final DateTime effectiveTransitionTime;
     private final SubscriptionState previousState;
-    private final String previousPriceList;
+    private final PriceList previousPriceList;
     private final Plan previousPlan;
     private final PlanPhase previousPhase;
     private final SubscriptionState nextState;
-    private final String nextPriceList;
+    private final PriceList nextPriceList;
     private final Plan nextPlan;
     private final PlanPhase nextPhase;
     private final boolean isFromDisk;
 
     public SubscriptionTransitionData(UUID eventId, UUID subscriptionId, UUID bundleId, EventType eventType,
             ApiEventType apiEventType, DateTime requestedTransitionTime, DateTime effectiveTransitionTime,
-            SubscriptionState previousState, Plan previousPlan, PlanPhase previousPhase, String previousPriceList,
-            SubscriptionState nextState, Plan nextPlan, PlanPhase nextPhase, String nextPriceList,
+            SubscriptionState previousState, Plan previousPlan, PlanPhase previousPhase, PriceList previousPriceList,
+            SubscriptionState nextState, Plan nextPlan, PlanPhase nextPhase, PriceList nextPriceList,
             long totalOrdering, boolean isFromDisk) {
         super();
         this.eventId = eventId;
@@ -120,12 +122,12 @@ public class SubscriptionTransitionData implements SubscriptionTransition {
 
 
     @Override
-    public String getPreviousPriceList() {
+    public PriceList getPreviousPriceList() {
         return previousPriceList;
     }
 
     @Override
-    public String getNextPriceList() {
+    public PriceList getNextPriceList() {
         return nextPriceList;
     }
 
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/billing/TestDefaultEntitlementBillingApi.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/billing/TestDefaultEntitlementBillingApi.java
index c5868b3..24294a4 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/billing/TestDefaultEntitlementBillingApi.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/billing/TestDefaultEntitlementBillingApi.java
@@ -43,6 +43,7 @@ import com.ning.billing.catalog.api.CatalogService;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.catalog.api.Plan;
 import com.ning.billing.catalog.api.PlanPhase;
+import com.ning.billing.catalog.api.PriceList;
 import com.ning.billing.catalog.api.PriceListSet;
 import com.ning.billing.catalog.glue.CatalogModule;
 import com.ning.billing.entitlement.api.TestApiBase;
@@ -145,7 +146,7 @@ public class TestDefaultEntitlementBillingApi {
 		DateTime then = now.minusDays(1);
 		Plan nextPlan = catalogService.getFullCatalog().findPlan("shotgun-annual", now);
 		PlanPhase nextPhase = nextPlan.getAllPhases()[0]; // The trial has no billing period
-		String nextPriceList = PriceListSet.DEFAULT_PRICELIST_NAME;
+        PriceList nextPriceList = catalogService.getFullCatalog().findPriceList(PriceListSet.DEFAULT_PRICELIST_NAME, now);
 		SubscriptionTransition t = new SubscriptionTransitionData(
 				zeroId, oneId, twoId, EventType.API_USER, ApiEventType.CREATE, then, now, null, null, null, null, SubscriptionState.ACTIVE, nextPlan, nextPhase, nextPriceList, 1, true);
 		transitions.add(t);
@@ -169,7 +170,7 @@ public class TestDefaultEntitlementBillingApi {
 		DateTime then = now.minusDays(1);
 		Plan nextPlan = catalogService.getFullCatalog().findPlan("shotgun-annual", now);
 		PlanPhase nextPhase = nextPlan.getAllPhases()[1];
-		String nextPriceList = PriceListSet.DEFAULT_PRICELIST_NAME;
+		PriceList nextPriceList = catalogService.getFullCatalog().findPriceList(PriceListSet.DEFAULT_PRICELIST_NAME, now);
 		SubscriptionTransition t = new SubscriptionTransitionData(
 				zeroId, oneId, twoId, EventType.API_USER, ApiEventType.CREATE, then, now, null, null, null, null, SubscriptionState.ACTIVE, nextPlan, nextPhase, nextPriceList, 1, true);
 		transitions.add(t);
@@ -194,7 +195,7 @@ public class TestDefaultEntitlementBillingApi {
 		DateTime then = now.minusDays(1);
 		Plan nextPlan = catalogService.getFullCatalog().findPlan("shotgun-monthly", now);
 		PlanPhase nextPhase = nextPlan.getAllPhases()[1];
-		String nextPriceList = PriceListSet.DEFAULT_PRICELIST_NAME;
+        PriceList nextPriceList = catalogService.getFullCatalog().findPriceList(PriceListSet.DEFAULT_PRICELIST_NAME, now);
 		SubscriptionTransition t = new SubscriptionTransitionData(
 				zeroId, oneId, twoId, EventType.API_USER, ApiEventType.CREATE, then, now, null, null, null, null, SubscriptionState.ACTIVE, nextPlan, nextPhase, nextPriceList, 1, true);
 		transitions.add(t);
@@ -217,7 +218,7 @@ public class TestDefaultEntitlementBillingApi {
 		DateTime then = now.minusDays(1);
 		Plan nextPlan = catalogService.getFullCatalog().findPlan("laser-scope-monthly", now);
 		PlanPhase nextPhase = nextPlan.getAllPhases()[0];
-		String nextPriceList = PriceListSet.DEFAULT_PRICELIST_NAME;
+        PriceList nextPriceList = catalogService.getFullCatalog().findPriceList(PriceListSet.DEFAULT_PRICELIST_NAME, now);
 		SubscriptionTransition t = new SubscriptionTransitionData(
 				zeroId, oneId, twoId, EventType.API_USER, ApiEventType.CREATE, then, now, null, null, null, null, SubscriptionState.ACTIVE, nextPlan, nextPhase, nextPriceList, 1, true);
 		transitions.add(t);
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/migration/TestMigration.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/migration/TestMigration.java
index 4868bf7..75dfc89 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/migration/TestMigration.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/migration/TestMigration.java
@@ -70,7 +70,7 @@ public abstract class TestMigration extends TestApiBase {
             Subscription subscription = subscriptions.get(0);
             assertDateWithin(subscription.getStartDate(), beforeMigration, afterMigration);
             assertEquals(subscription.getEndDate(), null);
-            assertEquals(subscription.getCurrentPriceList(), PriceListSet.DEFAULT_PRICELIST_NAME);
+            assertEquals(subscription.getCurrentPriceList().getName(), PriceListSet.DEFAULT_PRICELIST_NAME);
             assertEquals(subscription.getCurrentPhase().getPhaseType(), PhaseType.EVERGREEN);
             assertEquals(subscription.getState(), SubscriptionState.ACTIVE);
             assertEquals(subscription.getCurrentPlan().getName(), "assault-rifle-annual");
@@ -105,7 +105,7 @@ public abstract class TestMigration extends TestApiBase {
                     subscriptions.get(0) : subscriptions.get(1);
             assertDateWithin(baseSubscription.getStartDate(), beforeMigration, afterMigration);
             assertEquals(baseSubscription.getEndDate(), null);
-            assertEquals(baseSubscription.getCurrentPriceList(), PriceListSet.DEFAULT_PRICELIST_NAME);
+            assertEquals(baseSubscription.getCurrentPriceList().getName(), PriceListSet.DEFAULT_PRICELIST_NAME);
             assertEquals(baseSubscription.getCurrentPhase().getPhaseType(), PhaseType.EVERGREEN);
             assertEquals(baseSubscription.getState(), SubscriptionState.ACTIVE);
             assertEquals(baseSubscription.getCurrentPlan().getName(), "shotgun-annual");
@@ -115,7 +115,7 @@ public abstract class TestMigration extends TestApiBase {
                     subscriptions.get(0) : subscriptions.get(1);
             assertEquals(aoSubscription.getStartDate(), initalAddonStart);
             assertEquals(aoSubscription.getEndDate(), null);
-            assertEquals(aoSubscription.getCurrentPriceList(), PriceListSet.DEFAULT_PRICELIST_NAME);
+            assertEquals(aoSubscription.getCurrentPriceList().getName(), PriceListSet.DEFAULT_PRICELIST_NAME);
             assertEquals(aoSubscription.getCurrentPhase().getPhaseType(), PhaseType.DISCOUNT);
             assertEquals(aoSubscription.getState(), SubscriptionState.ACTIVE);
             assertEquals(aoSubscription.getCurrentPlan().getName(), "telescopic-scope-monthly");
@@ -149,7 +149,7 @@ public abstract class TestMigration extends TestApiBase {
             assertEquals(subscriptions.size(), 1);
             Subscription subscription = subscriptions.get(0);
             assertDateWithin(subscription.getStartDate(), beforeMigration, afterMigration);
-            assertEquals(subscription.getCurrentPriceList(), PriceListSet.DEFAULT_PRICELIST_NAME);
+            assertEquals(subscription.getCurrentPriceList().getName(), PriceListSet.DEFAULT_PRICELIST_NAME);
             assertEquals(subscription.getCurrentPhase().getPhaseType(), PhaseType.EVERGREEN);
             assertEquals(subscription.getState(), SubscriptionState.ACTIVE);
             assertEquals(subscription.getCurrentPlan().getName(), "assault-rifle-annual");
@@ -164,7 +164,7 @@ public abstract class TestMigration extends TestApiBase {
             assertDateWithin(subscription.getStartDate(), beforeMigration, afterMigration);
             assertNotNull(subscription.getEndDate());
             assertTrue(subscription.getEndDate().isAfterNow());
-            assertEquals(subscription.getCurrentPriceList(), PriceListSet.DEFAULT_PRICELIST_NAME);
+            assertEquals(subscription.getCurrentPriceList().getName(), PriceListSet.DEFAULT_PRICELIST_NAME);
             assertEquals(subscription.getCurrentPhase(), null);
             assertEquals(subscription.getState(), SubscriptionState.CANCELLED);
             assertNull(subscription.getCurrentPlan());
@@ -196,7 +196,7 @@ public abstract class TestMigration extends TestApiBase {
 
             assertEquals(subscription.getStartDate(), trialDate);
             assertEquals(subscription.getEndDate(), null);
-            assertEquals(subscription.getCurrentPriceList(), PriceListSet.DEFAULT_PRICELIST_NAME);
+            assertEquals(subscription.getCurrentPriceList().getName(), PriceListSet.DEFAULT_PRICELIST_NAME);
             assertEquals(subscription.getCurrentPhase().getPhaseType(), PhaseType.TRIAL);
             assertEquals(subscription.getState(), SubscriptionState.ACTIVE);
             assertEquals(subscription.getCurrentPlan().getName(), "assault-rifle-monthly");
@@ -210,7 +210,7 @@ public abstract class TestMigration extends TestApiBase {
 
             assertEquals(subscription.getStartDate(), trialDate);
             assertEquals(subscription.getEndDate(), null);
-            assertEquals(subscription.getCurrentPriceList(), PriceListSet.DEFAULT_PRICELIST_NAME);
+            assertEquals(subscription.getCurrentPriceList().getName(), PriceListSet.DEFAULT_PRICELIST_NAME);
             assertEquals(subscription.getCurrentPhase().getPhaseType(), PhaseType.EVERGREEN);
             assertEquals(subscription.getState(), SubscriptionState.ACTIVE);
             assertEquals(subscription.getCurrentPlan().getName(), "assault-rifle-monthly");
@@ -242,7 +242,7 @@ public abstract class TestMigration extends TestApiBase {
             Subscription subscription = subscriptions.get(0);
             assertDateWithin(subscription.getStartDate(), beforeMigration, afterMigration);
             assertEquals(subscription.getEndDate(), null);
-            assertEquals(subscription.getCurrentPriceList(), PriceListSet.DEFAULT_PRICELIST_NAME);
+            assertEquals(subscription.getCurrentPriceList().getName(), PriceListSet.DEFAULT_PRICELIST_NAME);
             assertEquals(subscription.getCurrentPhase().getPhaseType(), PhaseType.EVERGREEN);
             assertEquals(subscription.getState(), SubscriptionState.ACTIVE);
             assertEquals(subscription.getCurrentPlan().getName(), "assault-rifle-monthly");
@@ -254,7 +254,7 @@ public abstract class TestMigration extends TestApiBase {
 
             assertDateWithin(subscription.getStartDate(), beforeMigration, afterMigration);
             assertEquals(subscription.getEndDate(), null);
-            assertEquals(subscription.getCurrentPriceList(), PriceListSet.DEFAULT_PRICELIST_NAME);
+            assertEquals(subscription.getCurrentPriceList().getName(), PriceListSet.DEFAULT_PRICELIST_NAME);
 
             assertEquals(subscription.getCurrentPhase().getPhaseType(), PhaseType.EVERGREEN);
             assertEquals(subscription.getState(), SubscriptionState.ACTIVE);
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiDemos.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiDemos.java
index 7fceab9..996306a 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiDemos.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiDemos.java
@@ -174,7 +174,7 @@ public class TestUserApiDemos extends TestApiBase {
 
         Plan currentPlan = subscription.getCurrentPlan();
         PlanPhase currentPhase = subscription.getCurrentPhase();
-        String priceList = subscription.getCurrentPriceList();
+        String priceList = subscription.getCurrentPriceList().getName();
         System.out.println("");
         System.out.println("\t CURRENT TIME = " + clock.getUTCNow());
         System.out.println("");
diff --git a/overdue/src/main/java/com/ning/billing/overdue/calculator/BillingStateCalculator.java b/overdue/src/main/java/com/ning/billing/overdue/calculator/BillingStateCalculator.java
index c2e5efd..1ccf2eb 100644
--- a/overdue/src/main/java/com/ning/billing/overdue/calculator/BillingStateCalculator.java
+++ b/overdue/src/main/java/com/ning/billing/overdue/calculator/BillingStateCalculator.java
@@ -16,10 +16,32 @@
 
 package com.ning.billing.overdue.calculator;
 
+import java.math.BigDecimal;
+import java.util.SortedSet;
+import java.util.UUID;
+
+import org.joda.time.DateTime;
+
 import com.ning.billing.catalog.api.overdue.BillingState;
 import com.ning.billing.catalog.api.overdue.Overdueable;
+import com.ning.billing.invoice.api.Invoice;
+
+public abstract class BillingStateCalculator<T extends Overdueable> {
+
+    public abstract BillingState<T> calculateBillingState(T overdueable);
+    
+    protected DateTime earliest(SortedSet<Invoice> unpaidInvoices) {
+        // TODO Auto-generated method stub
+        return null;
+    }
 
-public interface BillingStateCalculator<T extends Overdueable> {
+    protected BigDecimal sumBalance(SortedSet<Invoice> unpaidInvoices) {
+        // TODO Auto-generated method stub
+        return null;
+    }
 
-    public BillingState<T> calculateBillingState(T overdueable);
+    protected SortedSet<Invoice> unpaidInvoicesFor(UUID id) {
+        // TODO Auto-generated method stub
+        return null;
+    }
 }
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 1abe865..caccf62 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
@@ -16,16 +16,68 @@
 
 package com.ning.billing.overdue.calculator;
 
-import org.apache.commons.lang.NotImplementedException;
+import java.math.BigDecimal;
+import java.util.SortedSet;
+import java.util.UUID;
 
+import org.joda.time.DateTime;
+
+import com.google.inject.Inject;
+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.catalog.api.overdue.BillingState;
+import com.ning.billing.catalog.api.overdue.BillingStateBundle;
+import com.ning.billing.catalog.api.overdue.PaymentResponse;
+import com.ning.billing.entitlement.api.user.EntitlementUserApi;
+import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
+import com.ning.billing.invoice.api.Invoice;
+import com.ning.billing.invoice.api.InvoiceUserApi;
+import com.ning.billing.util.tag.Tag;
 
-public class BillingStateCalculatorBundle  implements BillingStateCalculator<SubscriptionBundle>{
+public class BillingStateCalculatorBundle  extends BillingStateCalculator<SubscriptionBundle>{
 
-    @Override
-    public BillingState<SubscriptionBundle> calculateBillingState(SubscriptionBundle overdueable) {
-        throw new NotImplementedException();
+    private EntitlementUserApi entitlementApi;
+    private InvoiceUserApi invoiceApi;
+
+    @Inject 
+    public BillingStateCalculatorBundle(EntitlementUserApi entitlementApi, InvoiceUserApi invoiceApi) {
+        this.entitlementApi = entitlementApi;
+        this.invoiceApi = invoiceApi;
     }
+    
+    @Override
+    public BillingState<SubscriptionBundle> calculateBillingState(SubscriptionBundle bundle) {
+        
+        SortedSet<Invoice> unpaidInvoices = unpaidInvoicesFor(bundle.getId());
+        Subscription basePlan = null;
+        
+        UUID id = bundle.getId();
+        int numberOfUnpaidInvoices = unpaidInvoices.size(); 
+        BigDecimal unpaidInvoiceBalance = sumBalance(unpaidInvoices);
+        DateTime dateOfEarliestUnpaidInvoice = earliest(unpaidInvoices);
+        PaymentResponse responseForLastFailedPayment;
+        Tag[] tags = new Tag[]{}; //TODO
+        Product basePlanProduct = basePlan.getCurrentPlan().getProduct();
+        BillingPeriod basePlanBillingPeriod = basePlan.getCurrentPlan().getBillingPeriod();
+        PriceList basePlanPriceList = basePlan.getCurrentPriceList();
+        PhaseType basePlanPhaseType = basePlan.getCurrentPhase().getPhaseType();
+        
 
+//        return new BillingStateBundle( 
+//            id, 
+//            numberOfUnpaidInvoices, 
+//            unpaidInvoiceBalance,
+//            dateOfEarliestUnpaidInvoice,
+//            responseForLastFailedPayment,
+//            tags, 
+//            basePlanProduct,
+//            basePlanBillingPeriod, 
+//            basePlanPriceList, 
+//            basePlanPhaseType);
+        
+        return null;
+    }
 }