killbill-memoizeit

Changes

Details

diff --git a/account/src/main/java/com/ning/billing/account/api/svcs/DefaultAccountInternalApi.java b/account/src/main/java/com/ning/billing/account/api/svcs/DefaultAccountInternalApi.java
index 9dd8adb..69620d7 100644
--- a/account/src/main/java/com/ning/billing/account/api/svcs/DefaultAccountInternalApi.java
+++ b/account/src/main/java/com/ning/billing/account/api/svcs/DefaultAccountInternalApi.java
@@ -16,6 +16,7 @@
 
 package com.ning.billing.account.api.svcs;
 
+import java.util.List;
 import java.util.UUID;
 
 import javax.inject.Inject;
@@ -24,6 +25,7 @@ import com.ning.billing.ErrorCode;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
 import com.ning.billing.account.api.AccountData;
+import com.ning.billing.account.api.AccountEmail;
 import com.ning.billing.account.dao.AccountDao;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
@@ -54,4 +56,32 @@ public class DefaultAccountInternalApi implements AccountInternalApi {
         // TODO Auto-generated method stub
 
     }
+
+    @Override
+    public List<AccountEmail> getEmails(UUID accountId,
+            InternalTenantContext context)  {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public Account getAccountByKey(String key, InternalTenantContext context)
+            throws AccountApiException {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    public void removePaymentMethod(UUID accountId, InternalCallContext context)
+            throws AccountApiException {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    public void updatePaymentMethod(UUID accountId, UUID paymentMethodId,
+            InternalCallContext context) throws AccountApiException {
+        // TODO Auto-generated method stub
+
+    }
 }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java b/invoice/src/main/java/com/ning/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java
index 44d2a1b..be2e650 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/migration/DefaultInvoiceMigrationApi.java
@@ -25,7 +25,6 @@ import org.slf4j.LoggerFactory;
 
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
-import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceItem;
@@ -35,19 +34,20 @@ import com.ning.billing.invoice.model.MigrationInvoiceItem;
 import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.svcapi.account.AccountInternalApi;
 
 import com.google.inject.Inject;
 
 public class DefaultInvoiceMigrationApi implements InvoiceMigrationApi {
     private static final Logger log = LoggerFactory.getLogger(DefaultInvoiceMigrationApi.class);
 
-    private final AccountUserApi accountUserApi;
+    private final AccountInternalApi accountUserApi;
     private final AuditedInvoiceDao dao;
     private final Clock clock;
     private final InternalCallContextFactory internalCallContextFactory;
 
     @Inject
-    public DefaultInvoiceMigrationApi(final AccountUserApi accountUserApi,
+    public DefaultInvoiceMigrationApi(final AccountInternalApi accountUserApi,
                                       final AuditedInvoiceDao dao,
                                       final Clock clock,
                                       final InternalCallContextFactory internalCallContextFactory) {
@@ -61,7 +61,7 @@ public class DefaultInvoiceMigrationApi implements InvoiceMigrationApi {
     public UUID createMigrationInvoice(final UUID accountId, final LocalDate targetDate, final BigDecimal balance, final Currency currency, final CallContext context) {
         final Account account;
         try {
-            account = accountUserApi.getAccountById(accountId, context);
+            account = accountUserApi.getAccountById(accountId, internalCallContextFactory.createInternalTenantContext(context));
         } catch (AccountApiException e) {
             log.warn("Unable to find account for id {}", accountId);
             return null;
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
index ab33eac..f1c2ed5 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/user/DefaultInvoiceUserApi.java
@@ -30,7 +30,6 @@ 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.account.api.AccountUserApi;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.InvoiceDispatcher;
 import com.ning.billing.invoice.api.Invoice;
@@ -43,11 +42,13 @@ import com.ning.billing.invoice.model.CreditAdjInvoiceItem;
 import com.ning.billing.invoice.model.ExternalChargeInvoiceItem;
 import com.ning.billing.invoice.template.HtmlInvoiceGenerator;
 import com.ning.billing.util.api.TagApiException;
-import com.ning.billing.util.api.TagUserApi;
 import com.ning.billing.util.callcontext.CallContext;
 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.dao.ObjectType;
+import com.ning.billing.util.svcapi.account.AccountInternalApi;
+import com.ning.billing.util.svcapi.tag.TagInternalApi;
 import com.ning.billing.util.tag.ControlTagType;
 import com.ning.billing.util.tag.Tag;
 
@@ -57,14 +58,14 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
 
     private final InvoiceDao dao;
     private final InvoiceDispatcher dispatcher;
-    private final AccountUserApi accountUserApi;
-    private final TagUserApi tagUserApi;
+    private final AccountInternalApi accountUserApi;
+    private final TagInternalApi tagUserApi;
     private final HtmlInvoiceGenerator generator;
     private final InternalCallContextFactory internalCallContextFactory;
 
     @Inject
-    public DefaultInvoiceUserApi(final InvoiceDao dao, final InvoiceDispatcher dispatcher, final AccountUserApi accountUserApi,
-                                 final TagUserApi tagUserApi, final HtmlInvoiceGenerator generator, final InternalCallContextFactory internalCallContextFactory) {
+    public DefaultInvoiceUserApi(final InvoiceDao dao, final InvoiceDispatcher dispatcher, final AccountInternalApi accountUserApi,
+                                 final TagInternalApi tagUserApi, final HtmlInvoiceGenerator generator, final InternalCallContextFactory internalCallContextFactory) {
         this.dao = dao;
         this.dispatcher = dispatcher;
         this.accountUserApi = accountUserApi;
@@ -122,7 +123,7 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
                                             final CallContext context) throws InvoiceApiException {
         final Account account;
         try {
-            account = accountUserApi.getAccountById(accountId, context);
+            account = accountUserApi.getAccountById(accountId, internalCallContextFactory.createInternalTenantContext(context));
         } catch (AccountApiException e) {
             throw new InvoiceApiException(e, ErrorCode.ACCOUNT_DOES_NOT_EXIST_FOR_ID, e.toString());
         }
@@ -247,11 +248,12 @@ public class DefaultInvoiceUserApi implements InvoiceUserApi {
             throw new InvoiceApiException(ErrorCode.INVOICE_NOT_FOUND, invoiceId);
         }
 
-        final Account account = accountUserApi.getAccountById(invoice.getAccountId(), context);
+        final InternalTenantContext internalContext =  internalCallContextFactory.createInternalTenantContext(context);
+        final Account account = accountUserApi.getAccountById(invoice.getAccountId(), internalContext);
 
         // Check if this account has the MANUAL_PAY system tag
         boolean manualPay = false;
-        final Map<String, Tag> accountTags = tagUserApi.getTags(account.getId(), ObjectType.ACCOUNT, context);
+        final Map<String, Tag> accountTags = tagUserApi.getTags(account.getId(), ObjectType.ACCOUNT, internalContext);
         for (final Tag tag : accountTags.values()) {
             if (ControlTagType.MANUAL_PAY.getId().equals(tag.getTagDefinitionId())) {
                 manualPay = true;
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/AuditedInvoiceDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/AuditedInvoiceDao.java
index 279fecb..524ec45 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/AuditedInvoiceDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/AuditedInvoiceDao.java
@@ -56,7 +56,6 @@ import com.ning.billing.invoice.model.RefundAdjInvoiceItem;
 import com.ning.billing.invoice.notification.NextBillingDatePoster;
 import com.ning.billing.util.ChangeType;
 import com.ning.billing.util.api.TagApiException;
-import com.ning.billing.util.api.TagUserApi;
 import com.ning.billing.util.bus.Bus;
 import com.ning.billing.util.bus.Bus.EventBusException;
 import com.ning.billing.util.callcontext.InternalCallContext;
@@ -65,6 +64,7 @@ import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.dao.EntityAudit;
 import com.ning.billing.util.dao.ObjectType;
 import com.ning.billing.util.dao.TableName;
+import com.ning.billing.util.svcapi.tag.TagInternalApi;
 import com.ning.billing.util.tag.ControlTagType;
 
 import com.google.common.annotations.VisibleForTesting;
@@ -80,7 +80,7 @@ public class AuditedInvoiceDao implements InvoiceDao {
 
     private final InvoiceSqlDao invoiceSqlDao;
     private final InvoicePaymentSqlDao invoicePaymentSqlDao;
-    private final TagUserApi tagUserApi;
+    private final TagInternalApi tagInternalApi;
     private final NextBillingDatePoster nextBillingDatePoster;
     private final InvoiceItemSqlDao invoiceItemSqlDao;
     private final Clock clock;
@@ -89,14 +89,14 @@ public class AuditedInvoiceDao implements InvoiceDao {
     @Inject
     public AuditedInvoiceDao(final IDBI dbi,
             final NextBillingDatePoster nextBillingDatePoster,
-            final TagUserApi tagUserApi,
+            final TagInternalApi tagInternalApi,
             final Clock clock,
             final Bus eventBus) {
         this.invoiceSqlDao = dbi.onDemand(InvoiceSqlDao.class);
         this.invoicePaymentSqlDao = dbi.onDemand(InvoicePaymentSqlDao.class);
         this.invoiceItemSqlDao = dbi.onDemand(InvoiceItemSqlDao.class);
         this.nextBillingDatePoster = nextBillingDatePoster;
-        this.tagUserApi = tagUserApi;
+        this.tagInternalApi = tagInternalApi;
         this.clock = clock;
         this.eventBus = eventBus;
     }
@@ -327,11 +327,13 @@ public class AuditedInvoiceDao implements InvoiceDao {
 
     @Override
     public void setWrittenOff(final UUID invoiceId, final InternalCallContext context) throws TagApiException {
+
+        tagInternalApi.addTag(invoiceId, ObjectType.INVOICE, ControlTagType.WRITTEN_OFF.getId(), context);
+
         invoiceSqlDao.inTransaction(new Transaction<Void, InvoiceSqlDao>() {
             @Override
             public Void inTransaction(final InvoiceSqlDao transactional, final TransactionStatus status) throws Exception {
-                // Note: the tagUserApi is audited
-                tagUserApi.addTag(invoiceId, ObjectType.INVOICE, ControlTagType.WRITTEN_OFF.getId(), context.toCallContext());
+
 
                 final Invoice invoice = transactional.getById(invoiceId.toString(), context);
                 notifyBusOfInvoiceAdjustment(transactional, invoiceId, invoice.getAccountId(), context.getUserToken());
@@ -343,11 +345,14 @@ public class AuditedInvoiceDao implements InvoiceDao {
 
     @Override
     public void removeWrittenOff(final UUID invoiceId, final InternalCallContext context) throws TagApiException {
+
+        // Note: the tagInternalApi is audited
+        tagInternalApi.removeTag(invoiceId, ObjectType.INVOICE, ControlTagType.WRITTEN_OFF.getId(), context);
+
+
         invoiceSqlDao.inTransaction(new Transaction<Void, InvoiceSqlDao>() {
             @Override
             public Void inTransaction(final InvoiceSqlDao transactional, final TransactionStatus status) throws Exception {
-                // Note: the tagUserApi is audited
-                tagUserApi.removeTag(invoiceId, ObjectType.INVOICE, ControlTagType.WRITTEN_OFF.getId(), context.toCallContext());
 
                 final Invoice invoice = transactional.getById(invoiceId.toString(), context);
                 notifyBusOfInvoiceAdjustment(transactional, invoiceId, invoice.getAccountId(), context.getUserToken());
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 3262098..269bdcb 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/InvoiceDispatcher.java
@@ -32,7 +32,6 @@ import org.slf4j.LoggerFactory;
 import com.ning.billing.ErrorCode;
 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.account.api.BillCycleDay;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.entitlement.api.user.EffectiveSubscriptionEvent;
@@ -59,9 +58,10 @@ import com.ning.billing.util.globallocker.GlobalLock;
 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.entitlement.EntitlementBillingApiException;
-import com.ning.billing.util.svcapi.junction.BillingInternalApi;
 import com.ning.billing.util.svcapi.junction.BillingEventSet;
+import com.ning.billing.util.svcapi.junction.BillingInternalApi;
 
 import com.google.common.base.Predicate;
 import com.google.common.collect.Collections2;
@@ -74,7 +74,7 @@ public class InvoiceDispatcher {
 
     private final InvoiceGenerator generator;
     private final BillingInternalApi billingApi;
-    private final AccountUserApi accountUserApi;
+    private final AccountInternalApi accountApi;
     private final InvoiceDao invoiceDao;
     private final InvoiceNotifier invoiceNotifier;
     private final GlobalLocker locker;
@@ -83,7 +83,7 @@ public class InvoiceDispatcher {
     private final InternalCallContextFactory internalCallContextFactory;
 
     @Inject
-    public InvoiceDispatcher(final InvoiceGenerator generator, final AccountUserApi accountUserApi,
+    public InvoiceDispatcher(final InvoiceGenerator generator, final AccountInternalApi accountApi,
                              final BillingInternalApi billingApi,
                              final InvoiceDao invoiceDao,
                              final InvoiceNotifier invoiceNotifier,
@@ -93,7 +93,7 @@ public class InvoiceDispatcher {
                              final InternalCallContextFactory internalCallContextFactory) {
         this.generator = generator;
         this.billingApi = billingApi;
-        this.accountUserApi = accountUserApi;
+        this.accountApi = accountApi;
         this.invoiceDao = invoiceDao;
         this.invoiceNotifier = invoiceNotifier;
         this.locker = locker;
@@ -146,10 +146,13 @@ public class InvoiceDispatcher {
     private Invoice processAccountWithLock(final UUID accountId, final DateTime targetDateTime,
                                            final boolean dryRun, final CallContext context) throws InvoiceApiException {
         try {
+
+            // API_FIX
             // Make sure to first set the BCD if needed then get the account object (to have the BCD set)
-            final BillingEventSet billingEvents = billingApi.getBillingEventsForAccountAndUpdateAccountBCD(accountId, internalCallContextFactory.createInternalCallContext(context));
+            final InternalCallContext internalCallContextNoAccounrRecordId = internalCallContextFactory.createInternalCallContext(context);
+            final BillingEventSet billingEvents = billingApi.getBillingEventsForAccountAndUpdateAccountBCD(accountId, internalCallContextNoAccounrRecordId);
 
-            final Account account = accountUserApi.getAccountById(accountId, context);
+            final Account account = accountApi.getAccountById(accountId,  internalCallContextNoAccounrRecordId);
 
             final InternalCallContext internalCallContext = internalCallContextFactory.createInternalCallContext(account.getId(), context);
 
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 8c5e122..47716df 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
@@ -24,18 +24,18 @@ import org.slf4j.LoggerFactory;
 
 import com.ning.billing.config.InvoiceConfig;
 import com.ning.billing.config.NotificationConfig;
-import com.ning.billing.entitlement.api.user.EntitlementUserApi;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.invoice.InvoiceListener;
 import com.ning.billing.invoice.api.DefaultInvoiceService;
-import com.ning.billing.util.callcontext.CallContextFactory;
+import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.notificationq.NotificationKey;
 import com.ning.billing.util.notificationq.NotificationQueue;
 import com.ning.billing.util.notificationq.NotificationQueueService;
 import com.ning.billing.util.notificationq.NotificationQueueService.NoSuchNotificationQueue;
 import com.ning.billing.util.notificationq.NotificationQueueService.NotificationQueueAlreadyExists;
 import com.ning.billing.util.notificationq.NotificationQueueService.NotificationQueueHandler;
+import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
 
 import com.google.inject.Inject;
 
@@ -47,21 +47,21 @@ public class DefaultNextBillingDateNotifier implements NextBillingDateNotifier {
 
     private final NotificationQueueService notificationQueueService;
     private final InvoiceConfig config;
-    private final EntitlementUserApi entitlementUserApi;
+    private final EntitlementInternalApi entitlementApi;
     private final InvoiceListener listener;
-    private final CallContextFactory callContextFactory;
+    private final InternalCallContextFactory callContextFactory;
 
     private NotificationQueue nextBillingQueue;
 
     @Inject
     public DefaultNextBillingDateNotifier(final NotificationQueueService notificationQueueService,
                                           final InvoiceConfig config,
-                                          final EntitlementUserApi entitlementUserApi,
+                                          final EntitlementInternalApi entitlementApi,
                                           final InvoiceListener listener,
-                                          final CallContextFactory callContextFactory) {
+                                          final InternalCallContextFactory callContextFactory) {
         this.notificationQueueService = notificationQueueService;
         this.config = config;
-        this.entitlementUserApi = entitlementUserApi;
+        this.entitlementApi = entitlementApi;
         this.listener = listener;
         this.callContextFactory = callContextFactory;
     }
@@ -91,7 +91,7 @@ public class DefaultNextBillingDateNotifier implements NextBillingDateNotifier {
 
                     final NextBillingDateNotificationKey key = (NextBillingDateNotificationKey) notificationKey;
                     try {
-                        final Subscription subscription = entitlementUserApi.getSubscriptionFromId(key.getUuidKey(), callContextFactory.createTenantContext(null));
+                        final Subscription subscription = entitlementApi.getSubscriptionFromId(key.getUuidKey(), callContextFactory.createInternalTenantContext(null));
                         if (subscription == null) {
                             log.warn("Next Billing Date Notification Queue handled spurious notification (key: " + key + ")");
                         } else {
diff --git a/invoice/src/main/java/com/ning/billing/invoice/notification/EmailInvoiceNotifier.java b/invoice/src/main/java/com/ning/billing/invoice/notification/EmailInvoiceNotifier.java
index e77eae7..c42bba9 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/notification/EmailInvoiceNotifier.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/notification/EmailInvoiceNotifier.java
@@ -21,40 +21,42 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
-import com.google.inject.Inject;
 import com.ning.billing.ErrorCode;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountEmail;
-import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.api.InvoiceNotifier;
 import com.ning.billing.invoice.template.HtmlInvoiceGenerator;
-import com.ning.billing.util.api.TagUserApi;
 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.dao.ObjectType;
 import com.ning.billing.util.email.DefaultEmailSender;
 import com.ning.billing.util.email.EmailApiException;
 import com.ning.billing.util.email.EmailConfig;
 import com.ning.billing.util.email.EmailSender;
+import com.ning.billing.util.svcapi.account.AccountInternalApi;
+import com.ning.billing.util.svcapi.tag.TagInternalApi;
 import com.ning.billing.util.tag.ControlTagType;
 import com.ning.billing.util.tag.Tag;
 
+import com.google.inject.Inject;
+
 public class EmailInvoiceNotifier implements InvoiceNotifier {
-    private final AccountUserApi accountUserApi;
-    private final TagUserApi tagUserApi;
+    private final AccountInternalApi accountApi;
+    private final TagInternalApi tagUserApi;
     private final HtmlInvoiceGenerator generator;
     private final EmailConfig config;
     private final InternalCallContextFactory internalCallContextFactory;
 
     @Inject
-    public EmailInvoiceNotifier(final AccountUserApi accountUserApi,
-                                final TagUserApi tagUserApi,
+    public EmailInvoiceNotifier(final AccountInternalApi accountApi,
+                                final TagInternalApi tagUserApi,
                                 final HtmlInvoiceGenerator generator,
                                 final EmailConfig config,
                                 final InternalCallContextFactory internalCallContextFactory) {
-        this.accountUserApi = accountUserApi;
+        this.accountApi = accountApi;
         this.tagUserApi = tagUserApi;
         this.generator = generator;
         this.config = config;
@@ -63,12 +65,12 @@ public class EmailInvoiceNotifier implements InvoiceNotifier {
 
     @Override
     public void notify(final Account account, final Invoice invoice, final TenantContext context) throws InvoiceApiException {
-        final TenantContext tenantContext = internalCallContextFactory.createInternalTenantContext(account.getId(), context).toTenantContext();
 
+        final InternalTenantContext internalTenantContext = internalCallContextFactory.createInternalTenantContext(context);
         final List<String> to = new ArrayList<String>();
         to.add(account.getEmail());
 
-        final List<AccountEmail> accountEmailList = accountUserApi.getEmails(account.getId(), tenantContext);
+        final List<AccountEmail> accountEmailList = accountApi.getEmails(account.getId(), internalTenantContext);
         final List<String> cc = new ArrayList<String>();
         for (final AccountEmail email : accountEmailList) {
             cc.add(email.getEmail());
@@ -76,7 +78,7 @@ public class EmailInvoiceNotifier implements InvoiceNotifier {
 
         // Check if this account has the MANUAL_PAY system tag
         boolean manualPay = false;
-        final Map<String, Tag> accountTags = tagUserApi.getTags(account.getId(), ObjectType.ACCOUNT, tenantContext);
+        final Map<String, Tag> accountTags = tagUserApi.getTags(account.getId(), ObjectType.ACCOUNT, internalTenantContext);
         for (final Tag tag : accountTags.values()) {
             if (ControlTagType.MANUAL_PAY.getId().equals(tag.getTagDefinitionId())) {
                 manualPay = true;
diff --git a/invoice/src/test/java/com/ning/billing/invoice/api/invoice/TestDefaultInvoicePaymentApi.java b/invoice/src/test/java/com/ning/billing/invoice/api/invoice/TestDefaultInvoicePaymentApi.java
index 7731995..bc5c182 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/api/invoice/TestDefaultInvoicePaymentApi.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/api/invoice/TestDefaultInvoicePaymentApi.java
@@ -16,6 +16,9 @@
 
 package com.ning.billing.invoice.api.invoice;
 
+import static com.ning.billing.invoice.tests.InvoiceTestUtils.createAndPersistInvoice;
+import static com.ning.billing.invoice.tests.InvoiceTestUtils.createAndPersistPayment;
+
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
@@ -44,12 +47,11 @@ import com.ning.billing.invoice.dao.InvoiceItemSqlDao;
 import com.ning.billing.invoice.dao.InvoiceSqlDao;
 import com.ning.billing.invoice.notification.MockNextBillingDatePoster;
 import com.ning.billing.invoice.notification.NextBillingDatePoster;
-import com.ning.billing.util.api.TagUserApi;
 import com.ning.billing.util.bus.Bus;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.clock.ClockMock;
-import com.ning.billing.util.tag.api.DefaultTagUserApi;
+import com.ning.billing.util.svcapi.tag.TagInternalApi;
 import com.ning.billing.util.tag.dao.MockTagDao;
 import com.ning.billing.util.tag.dao.MockTagDefinitionDao;
 import com.ning.billing.util.tag.dao.TagDao;
@@ -58,9 +60,6 @@ import com.ning.billing.util.tag.dao.TagDefinitionDao;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 
-import static com.ning.billing.invoice.tests.InvoiceTestUtils.createAndPersistInvoice;
-import static com.ning.billing.invoice.tests.InvoiceTestUtils.createAndPersistPayment;
-
 public class TestDefaultInvoicePaymentApi extends InvoiceTestSuiteWithEmbeddedDB {
 
     private static final BigDecimal THIRTY = new BigDecimal("30.00");
@@ -88,7 +87,8 @@ public class TestDefaultInvoicePaymentApi extends InvoiceTestSuiteWithEmbeddedDB
         final TagDefinitionDao tagDefinitionDao = new MockTagDefinitionDao();
         final TagDao tagDao = new MockTagDao();
         internalCallContextFactory = new InternalCallContextFactory(dbi, clock);
-        final TagUserApi tagUserApi = new DefaultTagUserApi(internalCallContextFactory, tagDefinitionDao, tagDao);
+        // API_FIX
+        final TagInternalApi tagUserApi = null ; // new DefaultTagInternalApi(internalCallContextFactory, tagDefinitionDao, tagDao);
         final InvoiceDao invoiceDao = new AuditedInvoiceDao(dbi, nextBillingDatePoster, tagUserApi, clock, Mockito.mock(Bus.class));
         invoicePaymentApi = new DefaultInvoicePaymentApi(invoiceDao, internalCallContextFactory);
     }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/api/migration/InvoiceApiTestBase.java b/invoice/src/test/java/com/ning/billing/invoice/api/migration/InvoiceApiTestBase.java
index 5f9958b..477a6ab 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/api/migration/InvoiceApiTestBase.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/api/migration/InvoiceApiTestBase.java
@@ -29,7 +29,6 @@ import org.testng.annotations.Guice;
 
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
-import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.catalog.MockPlan;
 import com.ning.billing.catalog.MockPlanPhase;
 import com.ning.billing.catalog.api.BillingPeriod;
@@ -55,8 +54,9 @@ import com.ning.billing.util.bus.DefaultBusService;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.globallocker.GlobalLocker;
-import com.ning.billing.util.svcapi.junction.BillingInternalApi;
+import com.ning.billing.util.svcapi.account.AccountInternalApi;
 import com.ning.billing.util.svcapi.junction.BillingEventSet;
+import com.ning.billing.util.svcapi.junction.BillingInternalApi;
 import com.ning.billing.util.svcapi.junction.BillingModeType;
 
 import com.google.inject.Inject;
@@ -82,7 +82,7 @@ public abstract class InvoiceApiTestBase extends InvoicingTestBase {
     protected BillingInternalApi billingApi;
 
     @Inject
-    protected AccountUserApi accountUserApi;
+    protected AccountInternalApi accountApi;
 
     @Inject
     protected BusService busService;
@@ -130,7 +130,7 @@ public abstract class InvoiceApiTestBase extends InvoicingTestBase {
         Mockito.when(billingApi.getBillingEventsForAccountAndUpdateAccountBCD(account.getId(), internalCallContext)).thenReturn(events);
 
         final InvoiceNotifier invoiceNotifier = new NullInvoiceNotifier();
-        final InvoiceDispatcher dispatcher = new InvoiceDispatcher(generator, accountUserApi, billingApi,
+        final InvoiceDispatcher dispatcher = new InvoiceDispatcher(generator, accountApi, billingApi,
                                                                    invoiceDao, invoiceNotifier, locker, busService.getBus(),
                                                                    clock, internalCallContextFactory);
 
@@ -152,7 +152,7 @@ public abstract class InvoiceApiTestBase extends InvoicingTestBase {
     protected Account createAccount() throws AccountApiException {
         final UUID accountId = UUID.randomUUID();
         final Account account = Mockito.mock(Account.class);
-        Mockito.when(accountUserApi.getAccountById(accountId, callContext)).thenReturn(account);
+        Mockito.when(accountApi.getAccountById(accountId, internalCallContext)).thenReturn(account);
         Mockito.when(account.getCurrency()).thenReturn(accountCurrency);
         Mockito.when(account.getId()).thenReturn(accountId);
         Mockito.when(account.isNotifiedForInvoices()).thenReturn(true);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTestBase.java b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTestBase.java
index 60adf50..7224afe 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTestBase.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTestBase.java
@@ -16,6 +16,9 @@
 
 package com.ning.billing.invoice.dao;
 
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
 import java.io.IOException;
 import java.net.URL;
 
@@ -32,22 +35,17 @@ import com.ning.billing.invoice.glue.InvoiceModuleWithEmbeddedDb;
 import com.ning.billing.invoice.notification.MockNextBillingDatePoster;
 import com.ning.billing.invoice.notification.NextBillingDatePoster;
 import com.ning.billing.invoice.tests.InvoicingTestBase;
-import com.ning.billing.util.api.TagUserApi;
 import com.ning.billing.util.bus.Bus;
 import com.ning.billing.util.bus.InMemoryBus;
-import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.clock.ClockMock;
-import com.ning.billing.util.tag.api.DefaultTagUserApi;
+import com.ning.billing.util.svcapi.tag.TagInternalApi;
 import com.ning.billing.util.tag.api.user.TagEventBuilder;
 import com.ning.billing.util.tag.dao.AuditedTagDao;
 import com.ning.billing.util.tag.dao.MockTagDefinitionDao;
 import com.ning.billing.util.tag.dao.TagDao;
 import com.ning.billing.util.tag.dao.TagDefinitionDao;
 
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertTrue;
-
 public class InvoiceDaoTestBase extends InvoicingTestBase {
     protected final TagEventBuilder tagEventBuilder = new TagEventBuilder();
 
@@ -107,7 +105,8 @@ public class InvoiceDaoTestBase extends InvoicingTestBase {
         final NextBillingDatePoster nextBillingDatePoster = new MockNextBillingDatePoster();
         final TagDefinitionDao tagDefinitionDao = new MockTagDefinitionDao();
         final TagDao tagDao = new AuditedTagDao(dbi, tagEventBuilder, bus);
-        final TagUserApi tagUserApi = new DefaultTagUserApi(new InternalCallContextFactory(dbi, clock), tagDefinitionDao, tagDao);
+        // API_FIX
+        final TagInternalApi tagUserApi = null; // new DefaultTagInternalApi(new InternalCallContextFactory(dbi, clock), tagDefinitionDao, tagDao);
         invoiceDao = new AuditedInvoiceDao(dbi, nextBillingDatePoster, tagUserApi, clock, bus);
         invoiceDao.test(internalCallContext);
 
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/TestDefaultInvoiceDao.java b/invoice/src/test/java/com/ning/billing/invoice/dao/TestDefaultInvoiceDao.java
index 36e1168..0fb91ad 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/TestDefaultInvoiceDao.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/TestDefaultInvoiceDao.java
@@ -35,16 +35,13 @@ import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.api.InvoicePayment;
 import com.ning.billing.invoice.notification.NextBillingDatePoster;
-import com.ning.billing.util.api.TagUserApi;
 import com.ning.billing.util.bus.Bus;
-import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.clock.Clock;
-import com.ning.billing.util.clock.ClockMock;
 import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.svcapi.tag.TagInternalApi;
 import com.ning.billing.util.tag.ControlTagType;
 import com.ning.billing.util.tag.Tag;
-import com.ning.billing.util.tag.api.DefaultTagUserApi;
 import com.ning.billing.util.tag.dao.MockTagDao;
 import com.ning.billing.util.tag.dao.MockTagDefinitionDao;
 import com.ning.billing.util.tag.dao.TagDao;
@@ -55,7 +52,7 @@ import com.google.common.collect.ImmutableMap;
 public class TestDefaultInvoiceDao extends InvoiceTestSuite {
 
     private InvoiceSqlDao invoiceSqlDao;
-    private TagUserApi tagUserApi;
+    private TagInternalApi tagInternalApi;
     private AuditedInvoiceDao dao;
 
     @BeforeMethod(groups = "fast")
@@ -80,8 +77,9 @@ public class TestDefaultInvoiceDao extends InvoiceTestSuite {
         final NextBillingDatePoster poster = Mockito.mock(NextBillingDatePoster.class);
         final TagDefinitionDao tagDefinitionDao = new MockTagDefinitionDao();
         final TagDao tagDao = new MockTagDao();
-        tagUserApi = new DefaultTagUserApi(new InternalCallContextFactory(Mockito.mock(IDBI.class), new ClockMock()), tagDefinitionDao, tagDao);
-        dao = new AuditedInvoiceDao(idbi, poster, tagUserApi, Mockito.mock(Clock.class), Mockito.mock(Bus.class));
+        // API_FIX
+        tagInternalApi = null; //new DefaultTagInternalApi(new InternalCallContextFactory(Mockito.mock(IDBI.class), new ClockMock()), tagDefinitionDao, tagDao);
+        dao = new AuditedInvoiceDao(idbi, poster, tagInternalApi, Mockito.mock(Clock.class), Mockito.mock(Bus.class));
     }
 
     @Test(groups = "fast")
@@ -139,12 +137,12 @@ public class TestDefaultInvoiceDao extends InvoiceTestSuite {
     public void testSetWrittenOff() throws Exception {
         final UUID invoiceId = UUID.randomUUID();
 
-        final Map<String, Tag> beforeTags = tagUserApi.getTags(invoiceId, ObjectType.INVOICE, callContext);
+        final Map<String, Tag> beforeTags = tagInternalApi.getTags(invoiceId, ObjectType.INVOICE, internalCallContext);
         Assert.assertEquals(beforeTags.keySet().size(), 0);
 
         dao.setWrittenOff(invoiceId, internalCallContext);
 
-        final Map<String, Tag> afterTags = tagUserApi.getTags(invoiceId, ObjectType.INVOICE, callContext);
+        final Map<String, Tag> afterTags = tagInternalApi.getTags(invoiceId, ObjectType.INVOICE, internalCallContext);
         Assert.assertEquals(afterTags.keySet().size(), 1);
         final UUID tagDefinitionId = ControlTagType.WRITTEN_OFF.getId();
         Assert.assertEquals(afterTags.values().iterator().next().getTagDefinitionId(), tagDefinitionId);
@@ -156,11 +154,11 @@ public class TestDefaultInvoiceDao extends InvoiceTestSuite {
 
         dao.setWrittenOff(invoiceId, internalCallContext);
 
-        final Map<String, Tag> beforeTags = tagUserApi.getTags(invoiceId, ObjectType.INVOICE, callContext);
+        final Map<String, Tag> beforeTags = tagInternalApi.getTags(invoiceId, ObjectType.INVOICE, internalCallContext);
         Assert.assertEquals(beforeTags.keySet().size(), 1);
         dao.removeWrittenOff(invoiceId, internalCallContext);
 
-        final Map<String, Tag> afterTags = tagUserApi.getTags(invoiceId, ObjectType.INVOICE, callContext);
+        final Map<String, Tag> afterTags = tagInternalApi.getTags(invoiceId, ObjectType.INVOICE, internalCallContext);
         Assert.assertEquals(afterTags.keySet().size(), 0);
     }
 }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/notification/TestNextBillingDateNotifier.java b/invoice/src/test/java/com/ning/billing/invoice/notification/TestNextBillingDateNotifier.java
index 4aba9db..6d287e1 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/notification/TestNextBillingDateNotifier.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/notification/TestNextBillingDateNotifier.java
@@ -16,6 +16,9 @@
 
 package com.ning.billing.invoice.notification;
 
+import static com.jayway.awaitility.Awaitility.await;
+import static java.util.concurrent.TimeUnit.MINUTES;
+
 import java.io.IOException;
 import java.sql.SQLException;
 import java.util.UUID;
@@ -38,7 +41,6 @@ import com.ning.billing.config.InvoiceConfig;
 import com.ning.billing.dbi.DBIProvider;
 import com.ning.billing.dbi.DbiConfig;
 import com.ning.billing.dbi.MysqlTestingHelper;
-import com.ning.billing.entitlement.api.user.EntitlementUserApi;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.invoice.InvoiceDispatcher;
@@ -52,7 +54,7 @@ import com.ning.billing.util.bus.Bus;
 import com.ning.billing.util.callcontext.CallContextFactory;
 import com.ning.billing.util.callcontext.DefaultCallContextFactory;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
-import com.ning.billing.util.callcontext.TenantContext;
+import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.clock.ClockMock;
 import com.ning.billing.util.email.templates.TemplateModule;
@@ -62,15 +64,13 @@ import com.ning.billing.util.glue.NotificationQueueModule;
 import com.ning.billing.util.glue.TagStoreModule;
 import com.ning.billing.util.notificationq.DummySqlTest;
 import com.ning.billing.util.notificationq.NotificationQueueService;
+import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import com.google.inject.Stage;
 
-import static com.jayway.awaitility.Awaitility.await;
-import static java.util.concurrent.TimeUnit.MINUTES;
-
 public class TestNextBillingDateNotifier extends InvoiceTestSuiteWithEmbeddedDB {
     private Clock clock;
     private DefaultNextBillingDateNotifier notifier;
@@ -140,13 +140,14 @@ public class TestNextBillingDateNotifier extends InvoiceTestSuiteWithEmbeddedDB 
         final InvoiceDispatcher dispatcher = g.getInstance(InvoiceDispatcher.class);
 
         final Subscription subscription = Mockito.mock(Subscription.class);
-        final EntitlementUserApi entitlementUserApi = Mockito.mock(EntitlementUserApi.class);
-        Mockito.when(entitlementUserApi.getSubscriptionFromId(Mockito.<UUID>any(), Mockito.<TenantContext>any())).thenReturn(subscription);
+        final EntitlementInternalApi entitlementUserApi = Mockito.mock(EntitlementInternalApi.class);
+        Mockito.when(entitlementUserApi.getSubscriptionFromId(Mockito.<UUID>any(), Mockito.<InternalTenantContext>any())).thenReturn(subscription);
 
         final CallContextFactory factory = new DefaultCallContextFactory(clock);
         listener = new InvoiceListenerMock(factory, dispatcher);
+        // API_FIX null
         notifier = new DefaultNextBillingDateNotifier(notificationQueueService, g.getInstance(InvoiceConfig.class), entitlementUserApi,
-                                                      listener, new DefaultCallContextFactory(clock));
+                                                      listener, new InternalCallContextFactory(null, clock));
     }
 
     @Test(groups = "slow")
diff --git a/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceDispatcher.java b/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceDispatcher.java
index b3b8bb1..f294a6e 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceDispatcher.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/TestInvoiceDispatcher.java
@@ -33,7 +33,6 @@ import org.testng.annotations.Test;
 
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
-import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.catalog.MockPlan;
 import com.ning.billing.catalog.MockPlanPhase;
 import com.ning.billing.catalog.api.BillingPeriod;
@@ -61,8 +60,9 @@ import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.globallocker.GlobalLocker;
-import com.ning.billing.util.svcapi.junction.BillingInternalApi;
+import com.ning.billing.util.svcapi.account.AccountInternalApi;
 import com.ning.billing.util.svcapi.junction.BillingEventSet;
+import com.ning.billing.util.svcapi.junction.BillingInternalApi;
 import com.ning.billing.util.svcapi.junction.BillingModeType;
 
 import com.google.inject.Inject;
@@ -98,7 +98,7 @@ public class TestInvoiceDispatcher extends InvoicingTestBase {
 
     private final InternalCallContextFactory internalCallContextFactory = new InternalCallContextFactory(getMysqlTestingHelper().getDBI(), clock);
 
-    private AccountUserApi accountUserApi;
+    private AccountInternalApi accountInternalApi;
     private Account account;
     private Subscription subscription;
 
@@ -109,11 +109,11 @@ public class TestInvoiceDispatcher extends InvoicingTestBase {
 
         busService.getBus().start();
 
-        accountUserApi = Mockito.mock(AccountUserApi.class);
+        accountInternalApi = Mockito.mock(AccountInternalApi.class);
         account = Mockito.mock(Account.class);
 
         final UUID accountId = UUID.randomUUID();
-        Mockito.when(accountUserApi.getAccountById(accountId, callContext)).thenReturn(account);
+        Mockito.when(accountInternalApi.getAccountById(accountId, internalCallContext)).thenReturn(account);
         Mockito.when(account.getCurrency()).thenReturn(Currency.USD);
         Mockito.when(account.getId()).thenReturn(accountId);
         Mockito.when(account.isNotifiedForInvoices()).thenReturn(true);
@@ -154,7 +154,7 @@ public class TestInvoiceDispatcher extends InvoicingTestBase {
         final DateTime target = new DateTime();
 
         final InvoiceNotifier invoiceNotifier = new NullInvoiceNotifier();
-        final InvoiceDispatcher dispatcher = new InvoiceDispatcher(generator, accountUserApi, billingApi, invoiceDao,
+        final InvoiceDispatcher dispatcher = new InvoiceDispatcher(generator, accountInternalApi, billingApi, invoiceDao,
                                                                    invoiceNotifier, locker, busService.getBus(),
                                                                    clock, new InternalCallContextFactory(getMysqlTestingHelper().getDBI(), clock));
 
@@ -208,7 +208,7 @@ public class TestInvoiceDispatcher extends InvoicingTestBase {
 
         Mockito.when(billingApi.getBillingEventsForAccountAndUpdateAccountBCD(account.getId(), internalCallContext)).thenReturn(events);
         final InvoiceNotifier invoiceNotifier = new NullInvoiceNotifier();
-        final InvoiceDispatcher dispatcher = new InvoiceDispatcher(generator, accountUserApi, billingApi, invoiceDao,
+        final InvoiceDispatcher dispatcher = new InvoiceDispatcher(generator, accountInternalApi, billingApi, invoiceDao,
                                                                    invoiceNotifier, locker, busService.getBus(),
                                                                    clock, internalCallContextFactory);
 
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/TestChargeBacks.java b/invoice/src/test/java/com/ning/billing/invoice/tests/TestChargeBacks.java
index 4ac6dbf..b3009ed 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/TestChargeBacks.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/TestChargeBacks.java
@@ -16,6 +16,13 @@
 
 package com.ning.billing.invoice.tests;
 
+import static com.ning.billing.invoice.tests.InvoiceTestUtils.createAndPersistInvoice;
+import static com.ning.billing.invoice.tests.InvoiceTestUtils.createAndPersistPayment;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.fail;
+
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.net.URL;
@@ -44,24 +51,16 @@ import com.ning.billing.invoice.dao.InvoiceSqlDao;
 import com.ning.billing.invoice.glue.InvoiceModuleWithEmbeddedDb;
 import com.ning.billing.invoice.notification.MockNextBillingDatePoster;
 import com.ning.billing.invoice.notification.NextBillingDatePoster;
-import com.ning.billing.util.api.TagUserApi;
 import com.ning.billing.util.bus.Bus;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.clock.ClockMock;
-import com.ning.billing.util.tag.api.DefaultTagUserApi;
+import com.ning.billing.util.svcapi.tag.TagInternalApi;
 import com.ning.billing.util.tag.dao.MockTagDao;
 import com.ning.billing.util.tag.dao.MockTagDefinitionDao;
 import com.ning.billing.util.tag.dao.TagDao;
 import com.ning.billing.util.tag.dao.TagDefinitionDao;
 
-import static com.ning.billing.invoice.tests.InvoiceTestUtils.createAndPersistInvoice;
-import static com.ning.billing.invoice.tests.InvoiceTestUtils.createAndPersistPayment;
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertTrue;
-import static org.testng.Assert.fail;
-
 public class TestChargeBacks extends InvoiceTestSuiteWithEmbeddedDB {
 
     private static final BigDecimal FIFTEEN = new BigDecimal("15.00");
@@ -91,7 +90,8 @@ public class TestChargeBacks extends InvoiceTestSuiteWithEmbeddedDB {
         final TagDefinitionDao tagDefinitionDao = new MockTagDefinitionDao();
         final TagDao tagDao = new MockTagDao();
         internalCallContextFactory = new InternalCallContextFactory(dbi, clock);
-        final TagUserApi tagUserApi = new DefaultTagUserApi(internalCallContextFactory, tagDefinitionDao, tagDao);
+        // API_FIX
+        final TagInternalApi tagUserApi = null; //new DefaultTagInternalApi(internalCallContextFactory, tagDefinitionDao, tagDao);
         final InvoiceDao invoiceDao = new AuditedInvoiceDao(dbi, nextBillingDatePoster, tagUserApi, clock, Mockito.mock(Bus.class));
         invoicePaymentApi = new DefaultInvoicePaymentApi(invoiceDao, internalCallContextFactory);
     }
diff --git a/junction/src/main/java/com/ning/billing/junction/block/DefaultBlockingChecker.java b/junction/src/main/java/com/ning/billing/junction/block/DefaultBlockingChecker.java
index 95038ed..4f9e26e 100644
--- a/junction/src/main/java/com/ning/billing/junction/block/DefaultBlockingChecker.java
+++ b/junction/src/main/java/com/ning/billing/junction/block/DefaultBlockingChecker.java
@@ -20,7 +20,6 @@ import java.util.UUID;
 
 import com.ning.billing.ErrorCode;
 import com.ning.billing.account.api.Account;
-import com.ning.billing.entitlement.api.user.EntitlementUserApi;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
@@ -29,6 +28,7 @@ import com.ning.billing.junction.api.BlockingApiException;
 import com.ning.billing.junction.api.BlockingState;
 import com.ning.billing.junction.dao.BlockingStateDao;
 import com.ning.billing.util.callcontext.InternalTenantContext;
+import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
 
 import com.google.inject.Inject;
 
@@ -79,17 +79,17 @@ public class DefaultBlockingChecker implements BlockingChecker {
     private static final Object ACTION_ENTITLEMENT = "Entitlement";
     private static final Object ACTION_BILLING = "Billing";
 
-    private final EntitlementUserApi entitlementApi;
+    private final EntitlementInternalApi entitlementApi;
     private final BlockingStateDao dao;
 
     @Inject
-    public DefaultBlockingChecker(final EntitlementUserApi entitlementApi, final BlockingStateDao dao) {
+    public DefaultBlockingChecker(final EntitlementInternalApi entitlementApi, final BlockingStateDao dao) {
         this.entitlementApi = entitlementApi;
         this.dao = dao;
     }
 
     public BlockingAggregator getBlockedStateSubscriptionId(final UUID subscriptionId, final InternalTenantContext context) throws EntitlementUserApiException {
-        final Subscription subscription = entitlementApi.getSubscriptionFromId(subscriptionId, context.toTenantContext());
+        final Subscription subscription = entitlementApi.getSubscriptionFromId(subscriptionId, context);
         return getBlockedStateSubscription(subscription, context);
     }
 
@@ -108,7 +108,7 @@ public class DefaultBlockingChecker implements BlockingChecker {
     }
 
     public BlockingAggregator getBlockedStateBundleId(final UUID bundleId, final InternalTenantContext context) throws EntitlementUserApiException {
-        final SubscriptionBundle bundle = entitlementApi.getBundleFromId(bundleId, context.toTenantContext());
+        final SubscriptionBundle bundle = entitlementApi.getBundleFromId(bundleId, context);
         return getBlockedStateBundle(bundle, context);
     }
 
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 8c9133b..1b849c3 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
@@ -30,15 +30,13 @@ import org.slf4j.LoggerFactory;
 import com.ning.billing.ErrorCode;
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
-import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.catalog.api.ActionPolicy;
-import com.ning.billing.entitlement.api.user.EntitlementUserApi;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
 import com.ning.billing.junction.api.Blockable;
-import com.ning.billing.junction.api.BlockingApiException;
 import com.ning.billing.junction.api.Blockable.Type;
+import com.ning.billing.junction.api.BlockingApiException;
 import com.ning.billing.ovedue.notification.OverdueCheckPoster;
 import com.ning.billing.overdue.OverdueApiException;
 import com.ning.billing.overdue.OverdueCancellationPolicicy;
@@ -55,6 +53,8 @@ import com.ning.billing.util.email.DefaultEmailSender;
 import com.ning.billing.util.email.EmailApiException;
 import com.ning.billing.util.email.EmailConfig;
 import com.ning.billing.util.email.EmailSender;
+import com.ning.billing.util.svcapi.account.AccountInternalApi;
+import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
 import com.ning.billing.util.svcapi.junction.BlockingApi;
 import com.ning.billing.util.svcapi.junction.DefaultBlockingState;
 
@@ -70,17 +70,17 @@ public class OverdueStateApplicator<T extends Blockable> {
     private final Clock clock;
     private final OverdueCheckPoster poster;
     private final Bus bus;
-    private final AccountUserApi accountUserApi;
-    private final EntitlementUserApi entitlementUserApi;
+    private final AccountInternalApi accountApi;
+    private final EntitlementInternalApi entitlementUserApi;
     private final OverdueEmailGenerator overdueEmailGenerator;
     private final EmailSender emailSender;
 
     @Inject
-    public OverdueStateApplicator(final BlockingApi accessApi, final AccountUserApi accountUserApi, final EntitlementUserApi entitlementUserApi,
+    public OverdueStateApplicator(final BlockingApi accessApi, final AccountInternalApi accountApi, final EntitlementInternalApi entitlementUserApi,
                                   final Clock clock, final OverdueCheckPoster poster, final OverdueEmailGenerator overdueEmailGenerator,
                                   final EmailConfig config, final Bus bus) {
         this.blockingApi = accessApi;
-        this.accountUserApi = accountUserApi;
+        this.accountApi = accountApi;
         this.entitlementUserApi = entitlementUserApi;
         this.clock = clock;
         this.poster = poster;
@@ -206,11 +206,11 @@ public class OverdueStateApplicator<T extends Blockable> {
         if (blockable instanceof Subscription) {
             result.add((Subscription) blockable);
         } else if (blockable instanceof SubscriptionBundle) {
-            for (final Subscription cur : entitlementUserApi.getSubscriptionsForBundle(blockable.getId(), context.toTenantContext())) {
+            for (final Subscription cur : entitlementUserApi.getSubscriptionsForBundle(blockable.getId(), context)) {
                 computeSubscriptionsToCancel((T) cur, result, context);
             }
         } else if (blockable instanceof Account) {
-            for (final SubscriptionBundle cur : entitlementUserApi.getBundlesForAccount(blockable.getId(), context.toTenantContext())) {
+            for (final SubscriptionBundle cur : entitlementUserApi.getBundlesForAccount(blockable.getId(), context)) {
                 computeSubscriptionsToCancel((T) cur, result, context);
             }
         }
@@ -233,12 +233,12 @@ public class OverdueStateApplicator<T extends Blockable> {
         try {
             if (Type.SUBSCRIPTION.equals(overdueableType)) {
                 final UUID bundleId = ((Subscription) overdueable).getBundleId();
-                final SubscriptionBundle bundle = entitlementUserApi.getBundleFromId(bundleId, context.toTenantContext());
-                account = accountUserApi.getAccountById(bundle.getAccountId(), context.toTenantContext());
+                final SubscriptionBundle bundle = entitlementUserApi.getBundleFromId(bundleId, context);
+                account = accountApi.getAccountById(bundle.getAccountId(), context);
             } else if (Type.SUBSCRIPTION_BUNDLE.equals(overdueableType)) {
                 final UUID bundleId = ((SubscriptionBundle) overdueable).getId();
-                final SubscriptionBundle bundle = entitlementUserApi.getBundleFromId(bundleId, context.toTenantContext());
-                account = accountUserApi.getAccountById(bundle.getAccountId(), context.toTenantContext());
+                final SubscriptionBundle bundle = entitlementUserApi.getBundleFromId(bundleId, context);
+                account = accountApi.getAccountById(bundle.getAccountId(), context);
             } else if (Type.ACCOUNT.equals(overdueableType)) {
                 account = (Account) overdueable;
             } else {
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 5be633a..03540d0 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
@@ -22,7 +22,6 @@ import java.util.UUID;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.ning.billing.entitlement.api.user.EntitlementUserApi;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
 import com.ning.billing.junction.api.Blockable;
@@ -30,25 +29,26 @@ import com.ning.billing.overdue.OverdueApiException;
 import com.ning.billing.overdue.config.api.OverdueException;
 import com.ning.billing.overdue.wrapper.OverdueWrapperFactory;
 import com.ning.billing.util.callcontext.InternalCallContext;
+import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
 
 import com.google.inject.Inject;
 
 public class OverdueDispatcher {
     Logger log = LoggerFactory.getLogger(OverdueDispatcher.class);
 
-    private final EntitlementUserApi entitlementUserApi;
+    private final EntitlementInternalApi entitlementApi;
     private final OverdueWrapperFactory factory;
 
     @Inject
     public OverdueDispatcher(
-            final EntitlementUserApi entitlementUserApi,
+            final EntitlementInternalApi entitlementApi,
             final OverdueWrapperFactory factory) {
-        this.entitlementUserApi = entitlementUserApi;
+        this.entitlementApi = entitlementApi;
         this.factory = factory;
     }
 
     public void processOverdueForAccount(final UUID accountId, final InternalCallContext context) {
-        final List<SubscriptionBundle> bundles = entitlementUserApi.getBundlesForAccount(accountId, context.toCallContext());
+        final List<SubscriptionBundle> bundles = entitlementApi.getBundlesForAccount(accountId, context);
         for (final SubscriptionBundle bundle : bundles) {
             processOverdue(bundle, context);
         }
@@ -56,7 +56,7 @@ public class OverdueDispatcher {
 
     public void processOverdueForBundle(final UUID bundleId, final InternalCallContext context) {
         try {
-            final SubscriptionBundle bundle = entitlementUserApi.getBundleFromId(bundleId, context.toCallContext());
+            final SubscriptionBundle bundle = entitlementApi.getBundleFromId(bundleId, context);
             processOverdue(bundle, context);
         } catch (EntitlementUserApiException e) {
             log.error("Error processing Overdue for Bundle with id: " + bundleId.toString(), e);
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 0ea6f75..a1c31df 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,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.ning.billing.ErrorCode;
-import com.ning.billing.entitlement.api.user.EntitlementUserApi;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
 import com.ning.billing.junction.api.Blockable;
@@ -35,6 +34,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.util.clock.Clock;
+import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
 import com.ning.billing.util.svcapi.junction.BlockingApi;
 
 import com.google.inject.Inject;
@@ -42,7 +42,7 @@ import com.google.inject.Inject;
 public class OverdueWrapperFactory {
     private static final Logger log = LoggerFactory.getLogger(OverdueWrapperFactory.class);
 
-    private final EntitlementUserApi entitlementApi;
+    private final EntitlementInternalApi entitlementApi;
     private final BillingStateCalculatorBundle billingStateCalcuatorBundle;
     private final OverdueStateApplicator<SubscriptionBundle> overdueStateApplicatorBundle;
     private final BlockingApi api;
@@ -53,7 +53,7 @@ public class OverdueWrapperFactory {
     public OverdueWrapperFactory(final BlockingApi api, final Clock clock,
                                  final BillingStateCalculatorBundle billingStateCalcuatorBundle,
                                  final OverdueStateApplicator<SubscriptionBundle> overdueStateApplicatorBundle,
-                                 final EntitlementUserApi entitlementApi) {
+                                 final EntitlementInternalApi entitlementApi) {
         this.billingStateCalcuatorBundle = billingStateCalcuatorBundle;
         this.overdueStateApplicatorBundle = overdueStateApplicatorBundle;
         this.entitlementApi = entitlementApi;
@@ -77,7 +77,7 @@ public class OverdueWrapperFactory {
         try {
             switch (type) {
                 case SUBSCRIPTION_BUNDLE: {
-                    final SubscriptionBundle bundle = entitlementApi.getBundleFromId(id, context.toTenantContext());
+                    final SubscriptionBundle bundle = entitlementApi.getBundleFromId(id, context);
                     return (OverdueWrapper<T>) new OverdueWrapper<SubscriptionBundle>(bundle, api, getOverdueStateSetBundle(),
                                                                                       clock, billingStateCalcuatorBundle, overdueStateApplicatorBundle);
                 }
diff --git a/payment/src/main/java/com/ning/billing/payment/bus/InvoiceHandler.java b/payment/src/main/java/com/ning/billing/payment/bus/InvoiceHandler.java
index f936f3a..c1499c6 100644
--- a/payment/src/main/java/com/ning/billing/payment/bus/InvoiceHandler.java
+++ b/payment/src/main/java/com/ning/billing/payment/bus/InvoiceHandler.java
@@ -22,7 +22,6 @@ import org.slf4j.LoggerFactory;
 import com.ning.billing.ErrorCode;
 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.invoice.api.InvoiceCreationEvent;
 import com.ning.billing.payment.api.PaymentApiException;
 import com.ning.billing.payment.core.PaymentProcessor;
@@ -30,8 +29,10 @@ import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.callcontext.CallOrigin;
 import com.ning.billing.util.callcontext.DefaultCallContext;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
+import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.callcontext.UserType;
 import com.ning.billing.util.clock.Clock;
+import com.ning.billing.util.svcapi.account.AccountInternalApi;
 
 import com.google.common.eventbus.Subscribe;
 import com.google.inject.Inject;
@@ -39,7 +40,7 @@ import com.google.inject.Inject;
 public class InvoiceHandler {
 
     private final PaymentProcessor paymentProcessor;
-    private final AccountUserApi accountUserApi;
+    private final AccountInternalApi accountApi;
     private final Clock clock;
     private final InternalCallContextFactory internalCallContextFactory;
 
@@ -47,11 +48,11 @@ public class InvoiceHandler {
 
     @Inject
     public InvoiceHandler(final Clock clock,
-                          final AccountUserApi accountUserApi,
+                          final AccountInternalApi accountApi,
                           final PaymentProcessor paymentProcessor,
                           final InternalCallContextFactory internalCallContextFactory) {
         this.clock = clock;
-        this.accountUserApi = accountUserApi;
+        this.accountApi = accountApi;
         this.paymentProcessor = paymentProcessor;
         this.internalCallContextFactory = internalCallContextFactory;
     }
@@ -64,9 +65,10 @@ public class InvoiceHandler {
 
         final Account account;
         try {
-            // TODO retrieve tenantId?
+            // API_FIX
             final CallContext context = new DefaultCallContext(null, "PaymentRequestProcessor", CallOrigin.INTERNAL, UserType.SYSTEM, event.getUserToken(), clock);
-            account = accountUserApi.getAccountById(event.getAccountId(), context);
+            final InternalTenantContext internalContext = internalCallContextFactory.createInternalCallContext(event.getAccountId(), context);
+            account = accountApi.getAccountById(event.getAccountId(), internalContext);
             paymentProcessor.createPayment(account, event.getInvoiceId(), null, internalCallContextFactory.createInternalCallContext(event.getAccountId(), context), false, false);
         } catch (AccountApiException e) {
             log.error("Failed to process invoice payment", e);
diff --git a/payment/src/main/java/com/ning/billing/payment/bus/TagHandler.java b/payment/src/main/java/com/ning/billing/payment/bus/TagHandler.java
index 5208d21..d74444c 100644
--- a/payment/src/main/java/com/ning/billing/payment/bus/TagHandler.java
+++ b/payment/src/main/java/com/ning/billing/payment/bus/TagHandler.java
@@ -23,16 +23,17 @@ import org.slf4j.LoggerFactory;
 
 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.payment.api.PaymentApiException;
 import com.ning.billing.payment.core.PaymentProcessor;
 import com.ning.billing.util.callcontext.CallContext;
 import com.ning.billing.util.callcontext.CallOrigin;
 import com.ning.billing.util.callcontext.DefaultCallContext;
 import com.ning.billing.util.callcontext.InternalCallContextFactory;
+import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.callcontext.UserType;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.dao.ObjectType;
+import com.ning.billing.util.svcapi.account.AccountInternalApi;
 import com.ning.billing.util.tag.ControlTagType;
 import com.ning.billing.util.tag.api.ControlTagDeletionEvent;
 
@@ -44,17 +45,17 @@ public class TagHandler {
     private static final Logger log = LoggerFactory.getLogger(TagHandler.class);
 
     private final Clock clock;
-    private final AccountUserApi accountUserApi;
+    private final AccountInternalApi accountApi;
     private final PaymentProcessor paymentProcessor;
     private final InternalCallContextFactory internalCallContextFactory;
 
     @Inject
     public TagHandler(final Clock clock,
-                      final AccountUserApi accountUserApi,
+                      final AccountInternalApi accountApi,
                       final PaymentProcessor paymentProcessor,
                       final InternalCallContextFactory internalCallContextFactory) {
         this.clock = clock;
-        this.accountUserApi = accountUserApi;
+        this.accountApi = accountApi;
         this.paymentProcessor = paymentProcessor;
         this.internalCallContextFactory = internalCallContextFactory;
     }
@@ -71,7 +72,8 @@ public class TagHandler {
         try {
             // TODO retrieve tenantId?
             final CallContext context = new DefaultCallContext(null, "PaymentRequestProcessor", CallOrigin.INTERNAL, UserType.SYSTEM, userToken, clock);
-            final Account account = accountUserApi.getAccountById(accountId, context);
+            final InternalTenantContext internalContext = internalCallContextFactory.createInternalCallContext(context);
+            final Account account = accountApi.getAccountById(accountId, internalContext);
 
             paymentProcessor.process_AUTO_PAY_OFF_removal(account, internalCallContextFactory.createInternalCallContext(accountId, context));
 
diff --git a/payment/src/main/java/com/ning/billing/payment/core/PaymentMethodProcessor.java b/payment/src/main/java/com/ning/billing/payment/core/PaymentMethodProcessor.java
index c91ac48..6419c15 100644
--- a/payment/src/main/java/com/ning/billing/payment/core/PaymentMethodProcessor.java
+++ b/payment/src/main/java/com/ning/billing/payment/core/PaymentMethodProcessor.java
@@ -16,6 +16,8 @@
 
 package com.ning.billing.payment.core;
 
+import static com.ning.billing.payment.glue.PaymentModule.PLUGIN_EXECUTOR_NAMED;
+
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
@@ -29,7 +31,6 @@ import org.slf4j.LoggerFactory;
 import com.ning.billing.ErrorCode;
 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.payment.api.DefaultPaymentMethod;
 import com.ning.billing.payment.api.DefaultPaymentMethodPlugin;
 import com.ning.billing.payment.api.PaymentApiException;
@@ -43,11 +44,12 @@ import com.ning.billing.payment.plugin.api.PaymentPluginApiException;
 import com.ning.billing.payment.provider.DefaultNoOpPaymentMethodPlugin;
 import com.ning.billing.payment.provider.ExternalPaymentProviderPlugin;
 import com.ning.billing.payment.provider.PaymentProviderPluginRegistry;
-import com.ning.billing.util.api.TagUserApi;
 import com.ning.billing.util.bus.Bus;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.globallocker.GlobalLocker;
+import com.ning.billing.util.svcapi.account.AccountInternalApi;
+import com.ning.billing.util.svcapi.tag.TagInternalApi;
 
 import com.google.common.base.Function;
 import com.google.common.collect.Collections2;
@@ -55,21 +57,19 @@ import com.google.common.collect.ImmutableList;
 import com.google.inject.Inject;
 import com.google.inject.name.Named;
 
-import static com.ning.billing.payment.glue.PaymentModule.PLUGIN_EXECUTOR_NAMED;
-
 public class PaymentMethodProcessor extends ProcessorBase {
 
     private static final Logger log = LoggerFactory.getLogger(PaymentMethodProcessor.class);
 
     @Inject
     public PaymentMethodProcessor(final PaymentProviderPluginRegistry pluginRegistry,
-                                  final AccountUserApi accountUserApi,
+                                  final AccountInternalApi accountInternalApi,
                                   final Bus eventBus,
                                   final PaymentDao paymentDao,
-                                  final TagUserApi tagUserApi,
+                                  final TagInternalApi tagUserApi,
                                   final GlobalLocker locker,
                                   @Named(PLUGIN_EXECUTOR_NAMED) final ExecutorService executor) {
-        super(pluginRegistry, accountUserApi, eventBus, paymentDao, tagUserApi, locker, executor);
+        super(pluginRegistry, accountInternalApi, eventBus, paymentDao, tagUserApi, locker, executor);
     }
 
     public Set<String> getAvailablePlugins() {
@@ -113,7 +113,7 @@ public class PaymentMethodProcessor extends ProcessorBase {
                     paymentDao.insertPaymentMethod(pmModel, context);
 
                     if (setDefault) {
-                        accountUserApi.updatePaymentMethod(account.getId(), pm.getId(), context.toCallContext());
+                        accountInternalApi.updatePaymentMethod(account.getId(), pm.getId(), context);
                     }
                 } catch (PaymentPluginApiException e) {
                     // STEPH all errors should also take a pluginName
@@ -301,7 +301,7 @@ public class PaymentMethodProcessor extends ProcessorBase {
                                 log.info("Setting account {} to AUTO_PAY_OFF because of default payment method deletion");
                                 setAccountAutoPayOff(account.getId(), context);
                             }
-                            accountUserApi.removePaymentMethod(account.getId(), context.toCallContext());
+                            accountInternalApi.removePaymentMethod(account.getId(), context);
                         }
                     }
                     final PaymentPluginApi pluginApi = getPluginApi(paymentMethodId, account.getId(), context);
@@ -333,7 +333,7 @@ public class PaymentMethodProcessor extends ProcessorBase {
                     final PaymentPluginApi pluginApi = getPluginApi(paymentMethodId, account.getId(), context);
 
                     pluginApi.setDefaultPaymentMethod(account.getExternalKey(), paymentMethodModel.getExternalId(), context.toCallContext());
-                    accountUserApi.updatePaymentMethod(account.getId(), paymentMethodId, context.toCallContext());
+                    accountInternalApi.updatePaymentMethod(account.getId(), paymentMethodId, context);
                     return null;
                 } catch (PaymentPluginApiException e) {
                     throw new PaymentApiException(ErrorCode.PAYMENT_UPD_PAYMENT_METHOD, account.getId(), e.getErrorMessage());
diff --git a/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java b/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java
index 12cb9d5..03f1f95 100644
--- a/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java
+++ b/payment/src/main/java/com/ning/billing/payment/core/PaymentProcessor.java
@@ -15,6 +15,8 @@
  */
 package com.ning.billing.payment.core;
 
+import static com.ning.billing.payment.glue.PaymentModule.PLUGIN_EXECUTOR_NAMED;
+
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.Collection;
@@ -34,7 +36,6 @@ import org.slf4j.LoggerFactory;
 import com.ning.billing.ErrorCode;
 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.config.PaymentConfig;
 import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.api.InvoiceApiException;
@@ -58,20 +59,19 @@ import com.ning.billing.payment.provider.PaymentProviderPluginRegistry;
 import com.ning.billing.payment.retry.AutoPayRetryService.AutoPayRetryServiceScheduler;
 import com.ning.billing.payment.retry.FailedPaymentRetryService.FailedPaymentRetryServiceScheduler;
 import com.ning.billing.payment.retry.PluginFailureRetryService.PluginFailureRetryServiceScheduler;
-import com.ning.billing.util.api.TagUserApi;
 import com.ning.billing.util.bus.Bus;
 import com.ning.billing.util.bus.BusEvent;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.clock.Clock;
 import com.ning.billing.util.globallocker.GlobalLocker;
+import com.ning.billing.util.svcapi.account.AccountInternalApi;
+import com.ning.billing.util.svcapi.tag.TagInternalApi;
 
 import com.google.common.base.Predicate;
 import com.google.common.collect.Collections2;
 import com.google.inject.name.Named;
 
-import static com.ning.billing.payment.glue.PaymentModule.PLUGIN_EXECUTOR_NAMED;
-
 public class PaymentProcessor extends ProcessorBase {
 
     private final PaymentMethodProcessor paymentMethodProcessor;
@@ -92,9 +92,9 @@ public class PaymentProcessor extends ProcessorBase {
     @Inject
     public PaymentProcessor(final PaymentProviderPluginRegistry pluginRegistry,
                             final PaymentMethodProcessor paymentMethodProcessor,
-                            final AccountUserApi accountUserApi,
+                            final AccountInternalApi accountUserApi,
                             final InvoicePaymentApi invoicePaymentApi,
-                            final TagUserApi tagUserApi,
+                            final TagInternalApi tagUserApi,
                             final FailedPaymentRetryServiceScheduler failedPaymentRetryService,
                             final PluginFailureRetryServiceScheduler pluginFailureRetryService,
                             final AutoPayRetryServiceScheduler autoPayoffRetryService,
@@ -328,7 +328,7 @@ public class PaymentProcessor extends ProcessorBase {
                 return;
             }
 
-            final Account account = accountUserApi.getAccountById(payment.getAccountId(), context.toCallContext());
+            final Account account = accountInternalApi.getAccountById(payment.getAccountId(), context);
             final PaymentPluginApi plugin = getPaymentProviderPlugin(account, context);
 
             voidPluginDispatcher.dispatchWithAccountLock(new CallableWithAccountLock<Void>(locker,
diff --git a/payment/src/main/java/com/ning/billing/payment/core/ProcessorBase.java b/payment/src/main/java/com/ning/billing/payment/core/ProcessorBase.java
index 10cbfee..6a9ab3b 100644
--- a/payment/src/main/java/com/ning/billing/payment/core/ProcessorBase.java
+++ b/payment/src/main/java/com/ning/billing/payment/core/ProcessorBase.java
@@ -27,14 +27,12 @@ import org.slf4j.LoggerFactory;
 import com.ning.billing.ErrorCode;
 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.payment.api.PaymentApiException;
 import com.ning.billing.payment.dao.PaymentDao;
 import com.ning.billing.payment.dao.PaymentMethodModelDao;
 import com.ning.billing.payment.plugin.api.PaymentPluginApi;
 import com.ning.billing.payment.provider.PaymentProviderPluginRegistry;
 import com.ning.billing.util.api.TagApiException;
-import com.ning.billing.util.api.TagUserApi;
 import com.ning.billing.util.bus.Bus;
 import com.ning.billing.util.bus.Bus.EventBusException;
 import com.ning.billing.util.bus.BusEvent;
@@ -45,6 +43,8 @@ import com.ning.billing.util.globallocker.GlobalLock;
 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.tag.TagInternalApi;
 import com.ning.billing.util.tag.ControlTagType;
 import com.ning.billing.util.tag.Tag;
 
@@ -53,33 +53,33 @@ public abstract class ProcessorBase {
     private static final int NB_LOCK_TRY = 5;
 
     protected final PaymentProviderPluginRegistry pluginRegistry;
-    protected final AccountUserApi accountUserApi;
+    protected final AccountInternalApi accountInternalApi;
     protected final Bus eventBus;
     protected final GlobalLocker locker;
     protected final ExecutorService executor;
     protected final PaymentDao paymentDao;
-    protected final TagUserApi tagUserApi;
+    protected final TagInternalApi tagInternalApi;
 
     private static final Logger log = LoggerFactory.getLogger(ProcessorBase.class);
 
     public ProcessorBase(final PaymentProviderPluginRegistry pluginRegistry,
-                         final AccountUserApi accountUserApi,
+                         final AccountInternalApi accountInternalApi,
                          final Bus eventBus,
                          final PaymentDao paymentDao,
-                         final TagUserApi tagUserApi,
+                         final TagInternalApi tagInternalApi,
                          final GlobalLocker locker,
                          final ExecutorService executor) {
         this.pluginRegistry = pluginRegistry;
-        this.accountUserApi = accountUserApi;
+        this.accountInternalApi = accountInternalApi;
         this.eventBus = eventBus;
         this.paymentDao = paymentDao;
         this.locker = locker;
         this.executor = executor;
-        this.tagUserApi = tagUserApi;
+        this.tagInternalApi = tagInternalApi;
     }
 
     protected boolean isAccountAutoPayOff(final UUID accountId, final InternalTenantContext context) {
-        final Map<String, Tag> accountTags = tagUserApi.getTags(accountId, ObjectType.ACCOUNT, context.toTenantContext());
+        final Map<String, Tag> accountTags = tagInternalApi.getTags(accountId, ObjectType.ACCOUNT, context);
         for (final Tag cur : accountTags.values()) {
             if (ControlTagType.AUTO_PAY_OFF.getId().equals(cur.getTagDefinitionId())) {
                 return true;
@@ -90,7 +90,7 @@ public abstract class ProcessorBase {
 
     protected void setAccountAutoPayOff(final UUID accountId, final InternalCallContext context) throws PaymentApiException {
         try {
-            tagUserApi.addTag(accountId, ObjectType.ACCOUNT, ControlTagType.AUTO_PAY_OFF.getId(), context.toCallContext());
+            tagInternalApi.addTag(accountId, ObjectType.ACCOUNT, ControlTagType.AUTO_PAY_OFF.getId(), context);
         } catch (TagApiException e) {
             log.error("Failed to add AUTO_PAY_OFF on account " + accountId, e);
             throw new PaymentApiException(ErrorCode.PAYMENT_INTERNAL_ERROR, "Failed to add AUTO_PAY_OFF on account " + accountId);
@@ -111,7 +111,7 @@ public abstract class ProcessorBase {
 
         final String paymentProviderName = null;
         if (accountKey != null) {
-            final Account account = accountUserApi.getAccountByKey(accountKey, context.toTenantContext());
+            final Account account = accountInternalApi.getAccountByKey(accountKey, context);
             return getPaymentProviderPlugin(account, context);
         }
         return pluginRegistry.getPlugin(paymentProviderName);
diff --git a/payment/src/main/java/com/ning/billing/payment/core/RefundProcessor.java b/payment/src/main/java/com/ning/billing/payment/core/RefundProcessor.java
index fb2986d..f536241 100644
--- a/payment/src/main/java/com/ning/billing/payment/core/RefundProcessor.java
+++ b/payment/src/main/java/com/ning/billing/payment/core/RefundProcessor.java
@@ -16,6 +16,8 @@
 
 package com.ning.billing.payment.core;
 
+import static com.ning.billing.payment.glue.PaymentModule.PLUGIN_EXECUTOR_NAMED;
+
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -34,7 +36,6 @@ import org.slf4j.LoggerFactory;
 import com.ning.billing.ErrorCode;
 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.invoice.api.InvoiceApiException;
 import com.ning.billing.invoice.api.InvoiceItem;
 import com.ning.billing.invoice.api.InvoicePaymentApi;
@@ -48,7 +49,6 @@ import com.ning.billing.payment.dao.RefundModelDao.RefundStatus;
 import com.ning.billing.payment.plugin.api.PaymentPluginApi;
 import com.ning.billing.payment.plugin.api.PaymentPluginApiException;
 import com.ning.billing.payment.provider.PaymentProviderPluginRegistry;
-import com.ning.billing.util.api.TagUserApi;
 import com.ning.billing.util.bus.Bus;
 import com.ning.billing.util.callcontext.CallOrigin;
 import com.ning.billing.util.callcontext.InternalCallContext;
@@ -56,6 +56,8 @@ import com.ning.billing.util.callcontext.InternalCallContextFactory;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.callcontext.UserType;
 import com.ning.billing.util.globallocker.GlobalLocker;
+import com.ning.billing.util.svcapi.account.AccountInternalApi;
+import com.ning.billing.util.svcapi.tag.TagInternalApi;
 
 import com.google.common.base.Function;
 import com.google.common.base.Objects;
@@ -64,8 +66,6 @@ import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableMap;
 import com.google.inject.name.Named;
 
-import static com.ning.billing.payment.glue.PaymentModule.PLUGIN_EXECUTOR_NAMED;
-
 public class RefundProcessor extends ProcessorBase {
 
     private static final Logger log = LoggerFactory.getLogger(RefundProcessor.class);
@@ -75,15 +75,15 @@ public class RefundProcessor extends ProcessorBase {
 
     @Inject
     public RefundProcessor(final PaymentProviderPluginRegistry pluginRegistry,
-                           final AccountUserApi accountUserApi,
+                           final AccountInternalApi accountApi,
                            final InvoicePaymentApi invoicePaymentApi,
                            final Bus eventBus,
                            final InternalCallContextFactory internalCallContextFactory,
-                           final TagUserApi tagUserApi,
+                           final TagInternalApi tagUserApi,
                            final PaymentDao paymentDao,
                            final GlobalLocker locker,
                            @Named(PLUGIN_EXECUTOR_NAMED) final ExecutorService executor) {
-        super(pluginRegistry, accountUserApi, eventBus, paymentDao, tagUserApi, locker, executor);
+        super(pluginRegistry, accountApi, eventBus, paymentDao, tagUserApi, locker, executor);
         this.invoicePaymentApi = invoicePaymentApi;
         this.internalCallContextFactory = internalCallContextFactory;
     }
@@ -293,7 +293,7 @@ public class RefundProcessor extends ProcessorBase {
 
         try {
             final InternalCallContext context = internalCallContextFactory.createInternalCallContext("RefundProcessor", CallOrigin.INTERNAL, UserType.SYSTEM, null);
-            final Account account = accountUserApi.getAccountById(refundsToBeFixed.iterator().next().getAccountId(), context.toCallContext());
+            final Account account = accountInternalApi.getAccountById(refundsToBeFixed.iterator().next().getAccountId(), context);
             new WithAccountLock<Void>().processAccountWithLock(locker, account.getExternalKey(), new WithAccountLockCallback<Void>() {
 
                 @Override
diff --git a/payment/src/test/java/com/ning/billing/payment/core/TestPaymentMethodProcessor.java b/payment/src/test/java/com/ning/billing/payment/core/TestPaymentMethodProcessor.java
index 2c36433..318c4e0 100644
--- a/payment/src/test/java/com/ning/billing/payment/core/TestPaymentMethodProcessor.java
+++ b/payment/src/test/java/com/ning/billing/payment/core/TestPaymentMethodProcessor.java
@@ -26,17 +26,17 @@ import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.Test;
 
 import com.ning.billing.account.api.Account;
-import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.config.PaymentConfig;
 import com.ning.billing.payment.PaymentTestSuite;
 import com.ning.billing.payment.api.PaymentMethod;
 import com.ning.billing.payment.dao.MockPaymentDao;
 import com.ning.billing.payment.provider.DefaultPaymentProviderPluginRegistry;
 import com.ning.billing.payment.provider.ExternalPaymentProviderPlugin;
-import com.ning.billing.util.api.TagUserApi;
 import com.ning.billing.util.bus.Bus;
 import com.ning.billing.util.clock.ClockMock;
 import com.ning.billing.util.globallocker.GlobalLocker;
+import com.ning.billing.util.svcapi.account.AccountInternalApi;
+import com.ning.billing.util.svcapi.tag.TagInternalApi;
 
 public class TestPaymentMethodProcessor extends PaymentTestSuite {
 
@@ -47,12 +47,12 @@ public class TestPaymentMethodProcessor extends PaymentTestSuite {
         final DefaultPaymentProviderPluginRegistry pluginRegistry = new DefaultPaymentProviderPluginRegistry(Mockito.mock(PaymentConfig.class));
         pluginRegistry.register(new ExternalPaymentProviderPlugin(new ClockMock()), ExternalPaymentProviderPlugin.PLUGIN_NAME);
 
-        final AccountUserApi accountUserApi = Mockito.mock(AccountUserApi.class);
+        final AccountInternalApi accountUserApi = Mockito.mock(AccountInternalApi.class);
         final Bus bus = Mockito.mock(Bus.class);
         final MockPaymentDao paymentDao = new MockPaymentDao();
         final GlobalLocker globalLocker = Mockito.mock(GlobalLocker.class);
         final ExecutorService executorService = Mockito.mock(ExecutorService.class);
-        final TagUserApi tagUserApi =  Mockito.mock(TagUserApi.class);
+        final TagInternalApi tagUserApi =  Mockito.mock(TagInternalApi.class);
         processor = new PaymentMethodProcessor(pluginRegistry, accountUserApi, bus, paymentDao, tagUserApi, globalLocker, executorService);
     }
 
diff --git a/usage/src/main/java/com/ning/billing/usage/api/user/DefaultUsageUserApi.java b/usage/src/main/java/com/ning/billing/usage/api/user/DefaultUsageUserApi.java
index 639bd9f..4df52f2 100644
--- a/usage/src/main/java/com/ning/billing/usage/api/user/DefaultUsageUserApi.java
+++ b/usage/src/main/java/com/ning/billing/usage/api/user/DefaultUsageUserApi.java
@@ -22,7 +22,6 @@ import javax.inject.Inject;
 
 import org.joda.time.DateTime;
 
-import com.ning.billing.entitlement.api.user.EntitlementUserApi;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.SubscriptionBundle;
 import com.ning.billing.usage.api.UsageUserApi;
@@ -32,6 +31,7 @@ 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.clock.Clock;
+import com.ning.billing.util.svcapi.entitlement.EntitlementInternalApi;
 
 import com.google.common.collect.ImmutableMap;
 
@@ -41,19 +41,19 @@ public class DefaultUsageUserApi implements UsageUserApi {
 
     private final RolledUpUsageDao rolledUpUsageDao;
     private final TimelineEventHandler timelineEventHandler;
-    private final EntitlementUserApi entitlementUserApi;
+    private final EntitlementInternalApi entitlementApi;
     private final Clock clock;
     private final InternalCallContextFactory internalCallContextFactory;
 
     @Inject
     public DefaultUsageUserApi(final RolledUpUsageDao rolledUpUsageDao,
                                final TimelineEventHandler timelineEventHandler,
-                               final EntitlementUserApi entitlementUserApi,
+                               final EntitlementInternalApi entitlementApi,
                                final Clock clock,
                                final InternalCallContextFactory internalCallContextFactory) {
         this.rolledUpUsageDao = rolledUpUsageDao;
         this.timelineEventHandler = timelineEventHandler;
-        this.entitlementUserApi = entitlementUserApi;
+        this.entitlementApi = entitlementApi;
         this.clock = clock;
         this.internalCallContextFactory = internalCallContextFactory;
     }
@@ -79,7 +79,8 @@ public class DefaultUsageUserApi implements UsageUserApi {
 
     private InternalCallContext createInternalCallContext(final UUID bundleId, final CallContext context) throws EntitlementUserApiException {
         // Retrieve the bundle to get the account id for the internal call context
-        final SubscriptionBundle bundle = entitlementUserApi.getBundleFromId(bundleId, context);
+        // API_FIX
+        final SubscriptionBundle bundle = null; // entitlementApi.getBundleFromId(bundleId, context);
         return internalCallContextFactory.createInternalCallContext(bundle.getAccountId(), context);
     }
 
diff --git a/util/src/main/java/com/ning/billing/util/svcapi/account/AccountInternalApi.java b/util/src/main/java/com/ning/billing/util/svcapi/account/AccountInternalApi.java
index 775956c..006278f 100644
--- a/util/src/main/java/com/ning/billing/util/svcapi/account/AccountInternalApi.java
+++ b/util/src/main/java/com/ning/billing/util/svcapi/account/AccountInternalApi.java
@@ -15,17 +15,27 @@
  */
 package com.ning.billing.util.svcapi.account;
 
+import java.util.List;
 import java.util.UUID;
 
 import com.ning.billing.account.api.Account;
 import com.ning.billing.account.api.AccountApiException;
 import com.ning.billing.account.api.AccountData;
+import com.ning.billing.account.api.AccountEmail;
 import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 
 public interface AccountInternalApi {
 
+    public Account getAccountByKey(String key, InternalTenantContext context) throws AccountApiException;
+
     public Account getAccountById(UUID accountId, InternalTenantContext context) throws AccountApiException;
 
     public void updateAccount(String key, AccountData accountData, InternalCallContext context) throws AccountApiException;
+
+    public List<AccountEmail> getEmails(UUID accountId, InternalTenantContext context);
+
+    public void removePaymentMethod(UUID accountId, InternalCallContext context) throws AccountApiException;
+
+    public void updatePaymentMethod(UUID accountId, UUID paymentMethodId, InternalCallContext context) throws AccountApiException;
 }
diff --git a/util/src/main/java/com/ning/billing/util/svcapi/tag/TagInternalApi.java b/util/src/main/java/com/ning/billing/util/svcapi/tag/TagInternalApi.java
index c5b9dbe..83160df 100644
--- a/util/src/main/java/com/ning/billing/util/svcapi/tag/TagInternalApi.java
+++ b/util/src/main/java/com/ning/billing/util/svcapi/tag/TagInternalApi.java
@@ -18,6 +18,8 @@ package com.ning.billing.util.svcapi.tag;
 import java.util.Map;
 import java.util.UUID;
 
+import com.ning.billing.util.api.TagApiException;
+import com.ning.billing.util.callcontext.InternalCallContext;
 import com.ning.billing.util.callcontext.InternalTenantContext;
 import com.ning.billing.util.dao.ObjectType;
 import com.ning.billing.util.tag.Tag;
@@ -25,4 +27,8 @@ import com.ning.billing.util.tag.Tag;
 public interface TagInternalApi {
 
     public Map<String, Tag> getTags(UUID objectId, ObjectType objectType, InternalTenantContext context);
+
+    public void addTag(UUID objectId, ObjectType objectType, UUID tagDefinitionId, InternalCallContext context) throws TagApiException;
+
+    public void removeTag(UUID objectId, ObjectType objectType, UUID tagDefinitionId, InternalCallContext context) throws TagApiException;
 }