killbill-memoizeit

Changes

account/src/main/java/com/ning/billing/account/dao/IAccountDao.java 82(+0 -82)

account/src/main/java/com/ning/billing/account/dao/IAccountDaoSql.java 98(+0 -98)

account/src/main/java/com/ning/billing/account/dao/IFieldStoreDao.java 26(+0 -26)

account/src/main/java/com/ning/billing/account/glue/InjectorMagic.java 66(+0 -66)

api/src/main/java/com/ning/billing/account/api/IPersistable.java 23(+0 -23)

invoice/src/main/java/com/ning/billing/invoice/dao/IInvoiceDao.java 110(+0 -110)

invoice/src/main/java/com/ning/billing/invoice/dao/IInvoiceItemDao.java 97(+0 -97)

Details

diff --git a/account/src/main/java/com/ning/billing/account/api/CustomizableEntityBase.java b/account/src/main/java/com/ning/billing/account/api/CustomizableEntityBase.java
index 40a78eb..1d81969 100644
--- a/account/src/main/java/com/ning/billing/account/api/CustomizableEntityBase.java
+++ b/account/src/main/java/com/ning/billing/account/api/CustomizableEntityBase.java
@@ -18,12 +18,12 @@ package com.ning.billing.account.api;
 
 import java.util.UUID;
 
-public abstract class CustomizableEntityBase extends EntityBase implements ICustomizableEntity {
-    protected final IFieldStore fields;
+public abstract class CustomizableEntityBase extends EntityBase implements CustomizableEntity {
+    protected final FieldStore fields;
 
     public CustomizableEntityBase(UUID id) {
         super(id);
-        fields = FieldStore.create(getId(), getObjectName());
+        fields = StringFieldStore.create(getId(), getObjectName());
     }
 
     @Override
@@ -37,7 +37,7 @@ public abstract class CustomizableEntityBase extends EntityBase implements ICust
     }
 
     @Override
-    public IFieldStore getFields() {
+    public FieldStore getFields() {
         return fields;
     }
 
diff --git a/account/src/main/java/com/ning/billing/account/api/EntityBase.java b/account/src/main/java/com/ning/billing/account/api/EntityBase.java
index 4fe8da2..375ff63 100644
--- a/account/src/main/java/com/ning/billing/account/api/EntityBase.java
+++ b/account/src/main/java/com/ning/billing/account/api/EntityBase.java
@@ -18,7 +18,7 @@ package com.ning.billing.account.api;
 
 import java.util.UUID;
 
-public abstract class EntityBase<T> implements IEntity {
+public abstract class EntityBase<T> implements Entity {
     protected final UUID id;
 
     public EntityBase(UUID id) {
diff --git a/account/src/main/java/com/ning/billing/account/api/EntityCollectionBase.java b/account/src/main/java/com/ning/billing/account/api/EntityCollectionBase.java
index 2ed4f86..b3e7552 100644
--- a/account/src/main/java/com/ning/billing/account/api/EntityCollectionBase.java
+++ b/account/src/main/java/com/ning/billing/account/api/EntityCollectionBase.java
@@ -20,7 +20,7 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.UUID;
 
-public abstract class EntityCollectionBase<T extends IEntity> implements IEntityCollection<T> {
+public abstract class EntityCollectionBase<T extends Entity> implements EntityCollection<T> {
     protected Map<String, T> entities = new HashMap<String, T>();
     protected final UUID objectId;
     protected final String objectType;
diff --git a/account/src/main/java/com/ning/billing/account/api/user/AccountBuilder.java b/account/src/main/java/com/ning/billing/account/api/user/AccountBuilder.java
index 75dea6d..5abe588 100644
--- a/account/src/main/java/com/ning/billing/account/api/user/AccountBuilder.java
+++ b/account/src/main/java/com/ning/billing/account/api/user/AccountBuilder.java
@@ -16,7 +16,7 @@
 
 package com.ning.billing.account.api.user;
 
-import com.ning.billing.account.api.Account;
+import com.ning.billing.account.api.AccountDefault;
 import com.ning.billing.catalog.api.Currency;
 
 import java.util.UUID;
@@ -74,7 +74,7 @@ public class AccountBuilder {
         return this;
     }
 
-    public Account build() {
-        return new Account(id, externalKey, email, firstName, lastName, phone, currency, billCycleDay);
+    public AccountDefault build() {
+        return new AccountDefault(id, externalKey, email, firstName, lastName, phone, currency, billCycleDay);
     }
 }
diff --git a/account/src/main/java/com/ning/billing/account/api/user/AccountUserApi.java b/account/src/main/java/com/ning/billing/account/api/user/AccountUserApi.java
index 5cc9f87..c065783 100644
--- a/account/src/main/java/com/ning/billing/account/api/user/AccountUserApi.java
+++ b/account/src/main/java/com/ning/billing/account/api/user/AccountUserApi.java
@@ -18,44 +18,43 @@ package com.ning.billing.account.api.user;
 
 import com.google.inject.Inject;
 import com.ning.billing.account.api.Account;
-import com.ning.billing.account.api.IAccount;
-import com.ning.billing.account.api.IAccountData;
-import com.ning.billing.account.api.IAccountUserApi;
-import com.ning.billing.account.dao.IAccountDao;
+import com.ning.billing.account.api.AccountData;
+import com.ning.billing.account.api.AccountDefault;
+import com.ning.billing.account.dao.AccountDao;
 
 import java.util.List;
 import java.util.UUID;
 
-public class AccountUserApi implements IAccountUserApi {
-    private final IAccountDao dao;
+public class AccountUserApi implements com.ning.billing.account.api.AccountUserApi {
+    private final AccountDao dao;
 
     @Inject
-    public AccountUserApi(IAccountDao dao) {
+    public AccountUserApi(AccountDao dao) {
         this.dao = dao;
     }
 
     @Override
-    public IAccount createAccount(IAccountData data) {
-        return new Account(data);
+    public Account createAccount(AccountData data) {
+        return new AccountDefault(data);
     }
 
     @Override
-    public IAccount getAccountByKey(String key) {
+    public Account getAccountByKey(String key) {
         return dao.getAccountByKey(key);
     }
 
     @Override
-    public IAccount getAccountById(UUID id) {
+    public Account getAccountById(UUID id) {
         return dao.getById(id.toString());
     }
 
     @Override
-    public List<IAccount> getAccounts() {
+    public List<Account> getAccounts() {
         return dao.get();
     }
 
     @Override
-    public void saveAccount(IAccount account) {
+    public void saveAccount(Account account) {
         dao.save(account);
     }
 }
diff --git a/account/src/main/java/com/ning/billing/account/core/Engine.java b/account/src/main/java/com/ning/billing/account/core/Engine.java
index 6497353..4a750c9 100644
--- a/account/src/main/java/com/ning/billing/account/core/Engine.java
+++ b/account/src/main/java/com/ning/billing/account/core/Engine.java
@@ -16,9 +16,8 @@
 
 package com.ning.billing.account.core;
 
-import com.ning.billing.account.api.IAccountChangeEvent;
-import com.ning.billing.account.api.IAccountService;
-import com.ning.billing.account.api.IAccountUserApi;
+import com.ning.billing.account.api.AccountService;
+import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.lifecycle.LyfecycleHandlerType;
 import com.ning.billing.util.eventbus.IEventBus;
 import org.slf4j.Logger;
@@ -26,15 +25,15 @@ import org.slf4j.LoggerFactory;
 
 import javax.inject.Inject;
 
-public class Engine implements IAccountService, IAccountChangeListener {
+public class Engine implements AccountService {
     private final static Logger log = LoggerFactory.getLogger(Engine.class);
 
     private static final String ACCOUNT_SERVICE_NAME = "account-service";
     private final IEventBus eventBus;
-    private final IAccountUserApi userApi;
+    private final AccountUserApi userApi;
 
     @Inject
-    public Engine(IEventBus eventBus, IAccountUserApi userApi) {
+    public Engine(IEventBus eventBus, AccountUserApi userApi) {
         this.eventBus = eventBus;
         this.userApi = userApi;
     }
@@ -52,7 +51,7 @@ public class Engine implements IAccountService, IAccountChangeListener {
     }
 
     @Override
-    public IAccountUserApi getAccountUserApi() {
+    public AccountUserApi getAccountUserApi() {
         return userApi;
     }
 
@@ -60,13 +59,4 @@ public class Engine implements IAccountService, IAccountChangeListener {
     public String getName() {
         return ACCOUNT_SERVICE_NAME;
     }
-
-    @Override
-    public void processAccountChange(IAccountChangeEvent changeEvent) {
-        try {
-            eventBus.post(changeEvent);
-        } catch (IEventBus.EventBusException e) {
-            log.warn("Failed to post account changeEvent event.");
-        }
-    }
 }
diff --git a/account/src/main/java/com/ning/billing/account/dao/AccountDao.java b/account/src/main/java/com/ning/billing/account/dao/AccountDao.java
index b4d8dc3..1dbc8d9 100644
--- a/account/src/main/java/com/ning/billing/account/dao/AccountDao.java
+++ b/account/src/main/java/com/ning/billing/account/dao/AccountDao.java
@@ -16,124 +16,67 @@
 
 package com.ning.billing.account.dao;
 
-import com.google.inject.Inject;
-import com.ning.billing.account.api.*;
-import com.ning.billing.account.api.user.AccountChangeEvent;
-import com.ning.billing.account.api.user.AccountCreationEvent;
-import com.ning.billing.util.eventbus.IEventBus;
-import org.skife.jdbi.v2.Handle;
-import org.skife.jdbi.v2.IDBI;
-import org.skife.jdbi.v2.TransactionCallback;
-import org.skife.jdbi.v2.TransactionStatus;
-
-import java.util.List;
-
-public class AccountDao implements IAccountDao {
-    private final IAccountDao accountDao;
-    private final IFieldStoreDao fieldStoreDao;
-    private final IDBI dbi; // needed for transaction support
-    private final IEventBus eventBus;
-
-    @Inject
-    public AccountDao(IDBI dbi, IEventBus eventBus) {
-        this.dbi = dbi;
-        this.eventBus = eventBus;
-        this.accountDao = dbi.onDemand(IAccountDao.class);
-        this.fieldStoreDao = dbi.onDemand(IFieldStoreDao.class);
-    }
+import com.ning.billing.account.api.Account;
+import com.ning.billing.account.api.AccountDefault;
+import com.ning.billing.account.api.user.AccountBuilder;
+import com.ning.billing.catalog.api.Currency;
+import org.skife.jdbi.v2.SQLStatement;
+import org.skife.jdbi.v2.StatementContext;
+import org.skife.jdbi.v2.sqlobject.*;
+import org.skife.jdbi.v2.sqlobject.customizers.RegisterMapper;
+import org.skife.jdbi.v2.sqlobject.stringtemplate.ExternalizedSqlViaStringTemplate3;
+import org.skife.jdbi.v2.tweak.ResultSetMapper;
+
+import java.lang.annotation.*;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.UUID;
+
+@ExternalizedSqlViaStringTemplate3
+@RegisterMapper(AccountDaoWrapper.AccountMapper.class)
+public interface AccountDao extends EntityDao<Account> {
+    @SqlQuery
+    public Account getAccountByKey(@Bind("externalKey") final String key);
 
     @Override
-    public IAccount getAccountByKey(String key) {
-        IAccount account = accountDao.getAccountByKey(key);
-        if (account != null) {
-            loadFields(account);
+    @SqlUpdate
+    public void save(@AccountBinder Account account);
+
+    public static class AccountMapper implements ResultSetMapper<Account> {
+        @Override
+        public Account map(int index, ResultSet result, StatementContext context) throws SQLException {
+            UUID id = UUID.fromString(result.getString("id"));
+            String externalKey = result.getString("external_key");
+            String email = result.getString("email");
+            String firstName = result.getString("first_name");
+            String lastName = result.getString("last_name");
+            String phone = result.getString("phone");
+            Currency currency = Currency.valueOf(result.getString("currency"));
+
+            return new AccountBuilder(id).externalKey(externalKey).email(email)
+                                         .firstName(firstName).lastName(lastName)
+                                         .phone(phone).currency(currency).build();
         }
-        return account;
-    }
-
-    @Override
-    public IAccount getById(String id) {
-        IAccount account = accountDao.getById(id);
-        if (account != null) {
-            loadFields(account);
-        }
-        return account;
-    }
-
-    private void loadFields(IAccount account) {
-        List<ICustomField> fields = fieldStoreDao.load(account.getId().toString(), Account.OBJECT_TYPE);
-        account.getFields().clear();
-        if (fields != null) {
-            for (ICustomField field : fields) {
-                account.getFields().setValue(field.getName(), field.getValue());
-            }
-        }
-    }
-
-    @Override
-    public List<IAccount> get() {
-        return accountDao.get();
     }
 
-    @Override
-    public void test() {
-        accountDao.test();
-    }
-
-    @Override
-    public void save(final IAccount account) {
-        final String accountId = account.getId().toString();
-        final String objectType = Account.OBJECT_TYPE;
-
-        dbi.inTransaction(new TransactionCallback<Void>() {
-            @Override
-            public Void inTransaction(Handle conn, TransactionStatus status) throws Exception {
-                try {
-                    conn.begin();
-
-                    IAccountDao accountDao = conn.attach(IAccountDao.class);
-                    IAccount currentAccount = accountDao.getById(accountId);
-                    accountDao.save(account);
-
-                    IFieldStore fieldStore = account.getFields();
-                    IFieldStoreDao fieldStoreDao = conn.attach(IFieldStoreDao.class);
-                    fieldStoreDao.save(accountId, objectType, fieldStore.getFieldList());
-
-                    if (currentAccount == null) {
-                        IAccountCreationEvent creationEvent = new AccountCreationEvent(account);
-                        eventBus.post(creationEvent);
-                    } else {
-                        IAccountChangeEvent changeEvent = new AccountChangeEvent(account.getId(), currentAccount, account);
-                        if (changeEvent.hasChanges()) {
-                            eventBus.post(changeEvent);
-                        }
+    @BindingAnnotation(AccountBinder.AccountBinderFactory.class)
+    @Retention(RetentionPolicy.RUNTIME)
+    @Target({ElementType.PARAMETER})
+    public @interface AccountBinder {
+        public static class AccountBinderFactory implements BinderFactory {
+            public Binder build(Annotation annotation) {
+                return new Binder<AccountBinder, AccountDefault>() {
+                    public void bind(SQLStatement q, AccountBinder bind, AccountDefault account) {
+                        q.bind("id", account.getId().toString());
+                        q.bind("externalKey", account.getExternalKey());
+                        q.bind("email", account.getEmail());
+                        q.bind("firstName", account.getFirstName());
+                        q.bind("lastName", account.getLastName());
+                        q.bind("phone", account.getPhone());
+                        q.bind("currency", account.getCurrency().toString());
                     }
-
-                    conn.commit();
-                } catch (Exception e) {
-                    conn.rollback();
-                    throw e;
-                }
-
-                return null;
+                };
             }
-        });
-//
-//
-//        //accountDao.begin();
-//        try {
-//            accountDao.save(account);
-//
-//            IFieldStore fieldStore = account.getFields();
-//            fieldStoreDao.save(objectId, objectType, fieldStore.getFieldList());
-//            fieldStore.processSaveEvent();
-//
-//            account.processSaveEvent();
-//            //accountDao.commit();
-//        }
-//        catch (RuntimeException ex) {
-//            //accountDao.rollback();
-//            throw ex;
-//        }
+        }
     }
 }
diff --git a/account/src/main/java/com/ning/billing/account/dao/AccountDaoWrapper.java b/account/src/main/java/com/ning/billing/account/dao/AccountDaoWrapper.java
new file mode 100644
index 0000000..ae7f059
--- /dev/null
+++ b/account/src/main/java/com/ning/billing/account/dao/AccountDaoWrapper.java
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2010-2011 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.account.dao;
+
+import com.google.inject.Inject;
+import com.ning.billing.account.api.*;
+import com.ning.billing.account.api.user.AccountChangeEventDefault;
+import com.ning.billing.account.api.user.AccountCreationEventDefault;
+import com.ning.billing.util.eventbus.IEventBus;
+import org.skife.jdbi.v2.Handle;
+import org.skife.jdbi.v2.IDBI;
+import org.skife.jdbi.v2.TransactionCallback;
+import org.skife.jdbi.v2.TransactionStatus;
+
+import java.util.List;
+
+public class AccountDaoWrapper implements AccountDao {
+    private final AccountDao accountDao;
+    private final FieldStoreDao fieldStoreDao;
+    private final IDBI dbi; // needed for transaction support
+    private final IEventBus eventBus;
+
+    @Inject
+    public AccountDaoWrapper(IDBI dbi, IEventBus eventBus) {
+        this.dbi = dbi;
+        this.eventBus = eventBus;
+        this.accountDao = dbi.onDemand(AccountDao.class);
+        this.fieldStoreDao = dbi.onDemand(FieldStoreDao.class);
+    }
+
+    @Override
+    public Account getAccountByKey(String key) {
+        Account account = accountDao.getAccountByKey(key);
+        if (account != null) {
+            loadFields(account);
+        }
+        return account;
+    }
+
+    @Override
+    public Account getById(String id) {
+        Account account = accountDao.getById(id);
+        if (account != null) {
+            loadFields(account);
+        }
+        return account;
+    }
+
+    private void loadFields(Account account) {
+        List<CustomField> fields = fieldStoreDao.load(account.getId().toString(), AccountDefault.OBJECT_TYPE);
+        account.getFields().clear();
+        if (fields != null) {
+            for (CustomField field : fields) {
+                account.getFields().setValue(field.getName(), field.getValue());
+            }
+        }
+    }
+
+    @Override
+    public List<Account> get() {
+        return accountDao.get();
+    }
+
+    @Override
+    public void test() {
+        accountDao.test();
+    }
+
+    @Override
+    public void save(final Account account) {
+        final String accountId = account.getId().toString();
+        final String objectType = AccountDefault.OBJECT_TYPE;
+
+        dbi.inTransaction(new TransactionCallback<Void>() {
+            @Override
+            public Void inTransaction(Handle conn, TransactionStatus status) throws Exception {
+                try {
+                    conn.begin();
+
+                    AccountDao accountDao = conn.attach(AccountDao.class);
+                    Account currentAccount = accountDao.getById(accountId);
+                    accountDao.save(account);
+
+                    FieldStore fieldStore = account.getFields();
+                    FieldStoreDao fieldStoreDao = conn.attach(FieldStoreDao.class);
+                    fieldStoreDao.save(accountId, objectType, fieldStore.getFieldList());
+
+                    if (currentAccount == null) {
+                        AccountCreationEvent creationEvent = new AccountCreationEventDefault(account);
+                        eventBus.post(creationEvent);
+                    } else {
+                        AccountChangeEvent changeEvent = new AccountChangeEventDefault(account.getId(), currentAccount, account);
+                        if (changeEvent.hasChanges()) {
+                            eventBus.post(changeEvent);
+                        }
+                    }
+
+                    conn.commit();
+                } catch (Exception e) {
+                    conn.rollback();
+                    throw e;
+                }
+
+                return null;
+            }
+        });
+    }
+}
diff --git a/account/src/main/java/com/ning/billing/account/dao/CustomFieldMapper.java b/account/src/main/java/com/ning/billing/account/dao/CustomFieldMapper.java
index 92f2c07..41bdc84 100644
--- a/account/src/main/java/com/ning/billing/account/dao/CustomFieldMapper.java
+++ b/account/src/main/java/com/ning/billing/account/dao/CustomFieldMapper.java
@@ -17,7 +17,7 @@
 package com.ning.billing.account.dao;
 
 import com.ning.billing.account.api.CustomField;
-import com.ning.billing.account.api.ICustomField;
+import com.ning.billing.account.api.StringCustomField;
 import org.skife.jdbi.v2.StatementContext;
 import org.skife.jdbi.v2.tweak.ResultSetMapper;
 
@@ -25,12 +25,12 @@ import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.UUID;
 
-public class CustomFieldMapper implements ResultSetMapper<ICustomField> {
+public class CustomFieldMapper implements ResultSetMapper<CustomField> {
         @Override
-        public ICustomField map(int index, ResultSet result, StatementContext context) throws SQLException {
+        public CustomField map(int index, ResultSet result, StatementContext context) throws SQLException {
             UUID id = UUID.fromString(result.getString("id"));
             String fieldName = result.getString("field_name");
             String fieldValue = result.getString("field_value");
-            return new CustomField(id, fieldName, fieldValue);
+            return new StringCustomField(id, fieldName, fieldValue);
         }
 }
diff --git a/account/src/main/java/com/ning/billing/account/dao/FieldStoreDao.java b/account/src/main/java/com/ning/billing/account/dao/FieldStoreDao.java
index d9f2cd2..079aeb7 100644
--- a/account/src/main/java/com/ning/billing/account/dao/FieldStoreDao.java
+++ b/account/src/main/java/com/ning/billing/account/dao/FieldStoreDao.java
@@ -16,32 +16,11 @@
 
 package com.ning.billing.account.dao;
 
-import com.google.inject.Inject;
-import com.ning.billing.account.api.ICustomField;
-import org.skife.jdbi.v2.IDBI;
+import com.ning.billing.account.api.CustomField;
+import org.skife.jdbi.v2.sqlobject.customizers.RegisterMapper;
+import org.skife.jdbi.v2.sqlobject.stringtemplate.ExternalizedSqlViaStringTemplate3;
 
-import java.util.List;
-
-public class FieldStoreDao implements IFieldStoreDao {
-    private final IFieldStoreDao dao;
-
-    @Inject
-    public FieldStoreDao(IDBI dbi) {
-        dao = dbi.onDemand(IFieldStoreDao.class);
-    }
-
-    @Override
-    public void save(String objectId, String objectType, List<ICustomField> entities) {
-        dao.save(objectId, objectType, entities);
-    }
-
-    @Override
-    public List<ICustomField> load(String objectId, String objectType) {
-        return dao.load(objectId, objectType);
-    }
-
-    @Override
-    public void test() {
-        dao.test();
-    }
+@ExternalizedSqlViaStringTemplate3
+@RegisterMapper(CustomFieldMapper.class)
+public interface FieldStoreDao extends EntityCollectionDao<CustomField> {
 }
diff --git a/account/src/main/java/com/ning/billing/account/glue/AccountModule.java b/account/src/main/java/com/ning/billing/account/glue/AccountModule.java
index 959ef2f..dc551c2 100644
--- a/account/src/main/java/com/ning/billing/account/glue/AccountModule.java
+++ b/account/src/main/java/com/ning/billing/account/glue/AccountModule.java
@@ -17,19 +17,18 @@
 package com.ning.billing.account.glue;
 
 import com.google.inject.AbstractModule;
-import com.ning.billing.account.api.IAccountUserApi;
-import com.ning.billing.account.api.user.AccountUserApi;
+import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.account.dao.AccountDao;
+import com.ning.billing.account.dao.AccountDaoWrapper;
 import com.ning.billing.account.dao.FieldStoreDao;
-import com.ning.billing.account.dao.IAccountDao;
-import com.ning.billing.account.dao.IFieldStoreDao;
+import com.ning.billing.account.dao.FieldStoreDaoWrapper;
 import org.skife.config.ConfigurationObjectFactory;
 
 public class AccountModule extends AbstractModule {
 
     private void installConfig() {
-        final IAccountConfig config = new ConfigurationObjectFactory(System.getProperties()).build(IAccountConfig.class);
-        bind(IAccountConfig.class).toInstance(config);
+        final AccountConfig config = new ConfigurationObjectFactory(System.getProperties()).build(AccountConfig.class);
+        bind(AccountConfig.class).toInstance(config);
     }
 
     private void installAccountCore() {
@@ -38,19 +37,15 @@ public class AccountModule extends AbstractModule {
     }
 
     private void installAccountDao() {
-        bind(IAccountDao.class).to(AccountDao.class).asEagerSingleton();
+        bind(AccountDao.class).to(AccountDaoWrapper.class).asEagerSingleton();
     }
 
     private void installAccountUserApi() {
-        bind(IAccountUserApi.class).to(AccountUserApi.class).asEagerSingleton();
+        bind(AccountUserApi.class).to(com.ning.billing.account.api.user.AccountUserApi.class).asEagerSingleton();
     }
 
     private void installFieldStore() {
-        bind(IFieldStoreDao.class).to(FieldStoreDao.class).asEagerSingleton();
-    }
-
-    protected void installInjectorMagic() {
-        bind(InjectorMagic.class).asEagerSingleton();
+        bind(FieldStoreDao.class).to(FieldStoreDaoWrapper.class).asEagerSingleton();
     }
 
     @Override
@@ -60,6 +55,5 @@ public class AccountModule extends AbstractModule {
         installAccountDao();
         installAccountUserApi();
         installFieldStore();
-        installInjectorMagic();
     }
 }
diff --git a/account/src/test/java/com/ning/billing/account/dao/AccountDaoTestBase.java b/account/src/test/java/com/ning/billing/account/dao/AccountDaoTestBase.java
index 4399ef5..3db0cac 100644
--- a/account/src/test/java/com/ning/billing/account/dao/AccountDaoTestBase.java
+++ b/account/src/test/java/com/ning/billing/account/dao/AccountDaoTestBase.java
@@ -30,23 +30,23 @@ import java.io.IOException;
 import static org.testng.Assert.fail;
 
 public abstract class AccountDaoTestBase {
-    protected IFieldStoreDao fieldStoreDao;
-    protected IAccountDao accountDao;
+    protected FieldStoreDao fieldStoreDao;
+    protected AccountDao accountDao;
 
     @BeforeClass(alwaysRun = true)
     protected void setup() throws IOException {
         // Healthcheck test to make sure MySQL is setup properly
         try {
             AccountModuleMock module = new AccountModuleMock();
-            final String ddl = IOUtils.toString(IAccountDaoSql.class.getResourceAsStream("/com/ning/billing/account/ddl.sql"));
+            final String ddl = IOUtils.toString(AccountDao.class.getResourceAsStream("/com/ning/billing/account/ddl.sql"));
             module.createDb(ddl);
 
             final Injector injector = Guice.createInjector(Stage.DEVELOPMENT, module);
 
-            fieldStoreDao = injector.getInstance(IFieldStoreDao.class);
+            fieldStoreDao = injector.getInstance(FieldStoreDao.class);
             fieldStoreDao.test();
 
-            accountDao = injector.getInstance(IAccountDao.class);
+            accountDao = injector.getInstance(AccountDao.class);
             accountDao.test();
 
             IEventBusService busService = injector.getInstance(IEventBusService.class);
diff --git a/account/src/test/java/com/ning/billing/account/dao/TestFieldStore.java b/account/src/test/java/com/ning/billing/account/dao/TestFieldStore.java
index c3ef66c..facfb69 100644
--- a/account/src/test/java/com/ning/billing/account/dao/TestFieldStore.java
+++ b/account/src/test/java/com/ning/billing/account/dao/TestFieldStore.java
@@ -17,7 +17,7 @@
 package com.ning.billing.account.dao;
 
 import com.ning.billing.account.api.FieldStore;
-import com.ning.billing.account.api.IFieldStore;
+import com.ning.billing.account.api.StringFieldStore;
 import org.testng.annotations.Test;
 
 import java.util.UUID;
@@ -31,7 +31,7 @@ public class TestFieldStore extends AccountDaoTestBase {
         UUID id = UUID.randomUUID();
         String objectType = "Test widget";
 
-        IFieldStore fieldStore = new FieldStore(id, objectType);
+        FieldStore fieldStore = new StringFieldStore(id, objectType);
 
         String fieldName = "TestField1";
         String fieldValue = "Kitty Hawk";
@@ -39,7 +39,7 @@ public class TestFieldStore extends AccountDaoTestBase {
 
         fieldStoreDao.save(id.toString(), objectType, fieldStore.getFieldList());
 
-        fieldStore = FieldStore.create(id, objectType);
+        fieldStore = StringFieldStore.create(id, objectType);
         fieldStore.add(fieldStoreDao.load(id.toString(), objectType));
 
         assertEquals(fieldStore.getValue(fieldName), fieldValue);
@@ -49,7 +49,7 @@ public class TestFieldStore extends AccountDaoTestBase {
         assertEquals(fieldStore.getValue(fieldName), fieldValue);
         fieldStoreDao.save(id.toString(), objectType, fieldStore.getFieldList());
 
-        fieldStore = FieldStore.create(id, objectType);
+        fieldStore = StringFieldStore.create(id, objectType);
         assertEquals(fieldStore.getValue(fieldName), null);
         fieldStore.add(fieldStoreDao.load(id.toString(), objectType));
 
diff --git a/account/src/test/java/com/ning/billing/account/dao/TestSimpleAccountDao.java b/account/src/test/java/com/ning/billing/account/dao/TestSimpleAccountDao.java
index 31f8a4f..ee4f813 100644
--- a/account/src/test/java/com/ning/billing/account/dao/TestSimpleAccountDao.java
+++ b/account/src/test/java/com/ning/billing/account/dao/TestSimpleAccountDao.java
@@ -17,7 +17,7 @@
 package com.ning.billing.account.dao;
 
 import com.ning.billing.account.api.Account;
-import com.ning.billing.account.api.IAccount;
+import com.ning.billing.account.api.AccountDefault;
 import com.ning.billing.account.api.user.AccountBuilder;
 import com.ning.billing.catalog.api.Currency;
 import org.testng.annotations.Test;
@@ -33,7 +33,7 @@ public class TestSimpleAccountDao extends AccountDaoTestBase {
     private final String firstName = "Wesley";
     private final String email = "me@me.com";
 
-    private Account createTestAccount() {
+    private AccountDefault createTestAccount() {
         String thisKey = key + UUID.randomUUID().toString();
         String lastName = UUID.randomUUID().toString();
         String thisEmail = email + " " + UUID.randomUUID();
@@ -43,11 +43,11 @@ public class TestSimpleAccountDao extends AccountDaoTestBase {
 
     public void testBasic() {
 
-        IAccount a = createTestAccount();
+        Account a = createTestAccount();
         accountDao.save(a);
         String key = a.getExternalKey();
 
-        IAccount r = accountDao.getAccountByKey(key);
+        Account r = accountDao.getAccountByKey(key);
         assertNotNull(r);
         assertEquals(r.getExternalKey(), a.getExternalKey());
 
@@ -55,14 +55,14 @@ public class TestSimpleAccountDao extends AccountDaoTestBase {
         assertNotNull(r);
         assertEquals(r.getExternalKey(), a.getExternalKey());
 
-        List<IAccount> all = accountDao.get();
+        List<Account> all = accountDao.get();
         assertNotNull(all);
         assertTrue(all.size() >= 1);
     }
 
     @Test
     public void testGetById() {
-        IAccount account = createTestAccount();
+        Account account = createTestAccount();
         UUID id = account.getId();
         String key = account.getExternalKey();
         String firstName = account.getFirstName();
@@ -81,14 +81,14 @@ public class TestSimpleAccountDao extends AccountDaoTestBase {
 
     @Test
     public void testCustomFields() {
-        IAccount account = createTestAccount();
+        Account account = createTestAccount();
         String fieldName = "testField1";
         String fieldValue = "testField1_value";
         account.setFieldValue(fieldName, fieldValue);
 
         accountDao.save(account);
 
-        IAccount thisAccount = accountDao.getAccountByKey(account.getExternalKey());
+        Account thisAccount = accountDao.getAccountByKey(account.getExternalKey());
         assertNotNull(thisAccount);
         assertEquals(thisAccount.getExternalKey(), account.getExternalKey());
         assertEquals(thisAccount.getFieldValue(fieldName), fieldValue);
diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessAccountRecorder.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessAccountRecorder.java
index 7c5a6da..185289a 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessAccountRecorder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessAccountRecorder.java
@@ -17,8 +17,8 @@
 package com.ning.billing.analytics;
 
 import com.google.inject.Inject;
-import com.ning.billing.account.api.IAccount;
-import com.ning.billing.account.api.IAccountUserApi;
+import com.ning.billing.account.api.Account;
+import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.analytics.dao.BusinessAccountDao;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -28,20 +28,20 @@ public class BusinessAccountRecorder
     private static final Logger log = LoggerFactory.getLogger(BusinessAccountRecorder.class);
 
     private final BusinessAccountDao dao;
-    private final IAccountUserApi accountApi;
+    private final AccountUserApi accountApi;
 
     @Inject
-    public BusinessAccountRecorder(final BusinessAccountDao dao, final IAccountUserApi accountApi)
+    public BusinessAccountRecorder(final BusinessAccountDao dao, final AccountUserApi accountApi)
     {
         this.dao = dao;
         this.accountApi = accountApi;
     }
 
-    public void subscriptionCreated(final IAccount created)
+    public void subscriptionCreated(final Account created)
     {
     }
 
-    public void subscriptionUpdated(final IAccount updated)
+    public void subscriptionUpdated(final Account updated)
     {
     }
 }
diff --git a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java
index 5828331..5125e7e 100644
--- a/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java
+++ b/analytics/src/main/java/com/ning/billing/analytics/BusinessSubscriptionTransitionRecorder.java
@@ -17,8 +17,8 @@
 package com.ning.billing.analytics;
 
 import com.google.inject.Inject;
-import com.ning.billing.account.api.IAccount;
-import com.ning.billing.account.api.IAccountUserApi;
+import com.ning.billing.account.api.Account;
+import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.analytics.dao.BusinessSubscriptionTransitionDao;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.entitlement.api.user.IEntitlementUserApi;
@@ -36,10 +36,10 @@ public class BusinessSubscriptionTransitionRecorder
 
     private final BusinessSubscriptionTransitionDao dao;
     private final IEntitlementUserApi entitlementApi;
-    private final IAccountUserApi accountApi;
+    private final AccountUserApi accountApi;
 
     @Inject
-    public BusinessSubscriptionTransitionRecorder(final BusinessSubscriptionTransitionDao dao, final IEntitlementUserApi entitlementApi, final IAccountUserApi accountApi)
+    public BusinessSubscriptionTransitionRecorder(final BusinessSubscriptionTransitionDao dao, final IEntitlementUserApi entitlementApi, final AccountUserApi accountApi)
     {
         this.dao = dao;
         this.entitlementApi = entitlementApi;
@@ -93,7 +93,7 @@ public class BusinessSubscriptionTransitionRecorder
         if (bundle != null) {
             transitionKey = bundle.getKey();
 
-            final IAccount account = accountApi.getAccountById(bundle.getAccountId());
+            final Account account = accountApi.getAccountById(bundle.getAccountId());
             if (account != null) {
                 accountKey = account.getExternalKey();
                 currency = account.getCurrency();
diff --git a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
index 1659284..7e81737 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/api/TestAnalyticsService.java
@@ -17,8 +17,8 @@
 package com.ning.billing.analytics.api;
 
 import com.google.inject.Inject;
-import com.ning.billing.account.api.IAccount;
-import com.ning.billing.account.api.IAccountUserApi;
+import com.ning.billing.account.api.Account;
+import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.analytics.*;
 import com.ning.billing.analytics.dao.BusinessSubscriptionTransitionDao;
 import com.ning.billing.catalog.api.*;
@@ -47,7 +47,7 @@ public class TestAnalyticsService
     private static final String ACCOUNT_KEY = "pierre-1234";
 
     @Inject
-    private IAccountUserApi accountApi;
+    private AccountUserApi accountApi;
 
     @Inject
     private IEntitlementUserApi entitlementApi;
@@ -82,7 +82,7 @@ public class TestAnalyticsService
 
         // We need a bundle to retrieve the event key
         final MockAccount account = new MockAccount(UUID.randomUUID(), ACCOUNT_KEY, Currency.USD);
-        final IAccount storedAccount = accountApi.createAccount(account);
+        final Account storedAccount = accountApi.createAccount(account);
         final ISubscriptionBundle bundle = entitlementApi.createBundleForAccount(storedAccount, KEY);
 
         // Verify we correctly initialized the account subsystem
diff --git a/analytics/src/test/java/com/ning/billing/analytics/MockAccount.java b/analytics/src/test/java/com/ning/billing/analytics/MockAccount.java
index 1a73298..689694a 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/MockAccount.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/MockAccount.java
@@ -17,14 +17,14 @@
 package com.ning.billing.analytics;
 
 import com.ning.billing.account.api.Account;
-import com.ning.billing.account.api.IAccount;
-import com.ning.billing.account.api.IFieldStore;
+import com.ning.billing.account.api.AccountDefault;
+import com.ning.billing.account.api.FieldStore;
 import com.ning.billing.catalog.api.Currency;
 import sun.reflect.generics.reflectiveObjects.NotImplementedException;
 
 import java.util.UUID;
 
-public class MockAccount implements IAccount
+public class MockAccount implements Account
 {
     private final UUID id;
     private final String accountKey;
@@ -40,25 +40,25 @@ public class MockAccount implements IAccount
     @Override
     public String getFirstName()
     {
-        throw new UnsupportedOperationException();
+        return "firstName";
     }
 
     @Override
     public String getLastName()
     {
-        throw new UnsupportedOperationException();
+        return "lastName";
     }
 
     @Override
     public String getEmail()
     {
-        throw new UnsupportedOperationException();
+        return "test@test.com";
     }
 
     @Override
     public String getPhone()
     {
-        throw new UnsupportedOperationException();
+        return "408-555-6665";
     }
 
     @Override
@@ -70,7 +70,7 @@ public class MockAccount implements IAccount
     @Override
     public int getBillCycleDay()
     {
-        throw new UnsupportedOperationException();
+        return 12;
     }
 
     @Override
@@ -101,12 +101,12 @@ public class MockAccount implements IAccount
     }
 
     @Override
-    public IFieldStore getFields() {
+    public FieldStore getFields() {
         throw new NotImplementedException();
     }
 
     @Override
     public String getObjectName() {
-        return Account.OBJECT_TYPE;
+        return AccountDefault.OBJECT_TYPE;
     }
 }
diff --git a/analytics/src/test/java/com/ning/billing/analytics/MockIAccountUserApi.java b/analytics/src/test/java/com/ning/billing/analytics/MockIAccountUserApi.java
index 336508b..d11f4e9 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/MockIAccountUserApi.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/MockIAccountUserApi.java
@@ -16,16 +16,16 @@
 
 package com.ning.billing.analytics;
 
-import com.ning.billing.account.api.IAccount;
-import com.ning.billing.account.api.IAccountData;
-import com.ning.billing.account.api.IAccountUserApi;
+import com.ning.billing.account.api.Account;
+import com.ning.billing.account.api.AccountData;
+import com.ning.billing.account.api.AccountUserApi;
 import com.ning.billing.catalog.api.Currency;
 import sun.reflect.generics.reflectiveObjects.NotImplementedException;
 
 import java.util.List;
 import java.util.UUID;
 
-public class MockIAccountUserApi implements IAccountUserApi
+public class MockIAccountUserApi implements AccountUserApi
 {
     private final MockAccount account;
 
@@ -35,30 +35,30 @@ public class MockIAccountUserApi implements IAccountUserApi
     }
 
     @Override
-    public IAccount createAccount(final IAccountData data)
+    public Account createAccount(final AccountData data)
     {
         throw new UnsupportedOperationException();
     }
 
     @Override
-    public void saveAccount(IAccount account) {
+    public void saveAccount(Account account) {
         throw new NotImplementedException();
     }
 
     @Override
-    public IAccount getAccountByKey(final String key)
+    public Account getAccountByKey(final String key)
     {
         throw new UnsupportedOperationException();
     }
 
     @Override
-    public IAccount getAccountById(final UUID uid)
+    public Account getAccountById(final UUID uid)
     {
         return account;
     }
 
     @Override
-    public List<IAccount> getAccounts()
+    public List<Account> getAccounts()
     {
         throw new UnsupportedOperationException();
     }
diff --git a/analytics/src/test/java/com/ning/billing/analytics/MockIEntitlementUserApi.java b/analytics/src/test/java/com/ning/billing/analytics/MockIEntitlementUserApi.java
index 1aabb67..3565296 100644
--- a/analytics/src/test/java/com/ning/billing/analytics/MockIEntitlementUserApi.java
+++ b/analytics/src/test/java/com/ning/billing/analytics/MockIEntitlementUserApi.java
@@ -16,7 +16,7 @@
 
 package com.ning.billing.analytics;
 
-import com.ning.billing.account.api.IAccount;
+import com.ning.billing.account.api.Account;
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.entitlement.api.user.EntitlementUserApiException;
 import com.ning.billing.entitlement.api.user.IEntitlementUserApi;
@@ -105,7 +105,7 @@ public class MockIEntitlementUserApi implements IEntitlementUserApi
     }
 
     @Override
-    public ISubscriptionBundle createBundleForAccount(final IAccount account, final String bundleKey) throws EntitlementUserApiException
+    public ISubscriptionBundle createBundleForAccount(final Account account, final String bundleKey) throws EntitlementUserApiException
     {
         throw new UnsupportedOperationException();
     }
diff --git a/api/src/main/java/com/ning/billing/entitlement/api/billing/IEntitlementBillingApi.java b/api/src/main/java/com/ning/billing/entitlement/api/billing/IEntitlementBillingApi.java
index 0a9848e..c364966 100644
--- a/api/src/main/java/com/ning/billing/entitlement/api/billing/IEntitlementBillingApi.java
+++ b/api/src/main/java/com/ning/billing/entitlement/api/billing/IEntitlementBillingApi.java
@@ -16,21 +16,20 @@
 
 package com.ning.billing.entitlement.api.billing;
 
+import com.ning.billing.account.api.Account;
+import org.joda.time.DateTime;
+
 import java.util.List;
 import java.util.SortedSet;
 import java.util.UUID;
 
-import org.joda.time.DateTime;
-
-import com.ning.billing.account.api.IAccount;
-
 public interface IEntitlementBillingApi {
 
     /**
      *
      * @return the list of accounts which have active subscriptions
      */
-    public List<IAccount> getActiveAccounts();
+    public List<Account> getActiveAccounts();
 
     /**
      *
diff --git a/api/src/main/java/com/ning/billing/entitlement/api/user/IEntitlementUserApi.java b/api/src/main/java/com/ning/billing/entitlement/api/user/IEntitlementUserApi.java
index f53e8bb..be570f7 100644
--- a/api/src/main/java/com/ning/billing/entitlement/api/user/IEntitlementUserApi.java
+++ b/api/src/main/java/com/ning/billing/entitlement/api/user/IEntitlementUserApi.java
@@ -16,7 +16,7 @@
 
 package com.ning.billing.entitlement.api.user;
 
-import com.ning.billing.account.api.IAccount;
+import com.ning.billing.account.api.Account;
 import com.ning.billing.catalog.api.BillingPeriod;
 import org.joda.time.DateTime;
 
@@ -36,7 +36,7 @@ public interface IEntitlementUserApi {
 
     public List<ISubscription> getSubscriptionsForKey(String bundleKey);
 
-    public ISubscriptionBundle createBundleForAccount(IAccount account, String bundleKey)
+    public ISubscriptionBundle createBundleForAccount(Account account, String bundleKey)
         throws EntitlementUserApiException;
 
     public ISubscription createSubscription(UUID bundleId, String productName, BillingPeriod term, String planSet, DateTime requestedDate)
diff --git a/api/src/main/java/com/ning/billing/invoice/api/IInvoicePaymentApi.java b/api/src/main/java/com/ning/billing/invoice/api/IInvoicePaymentApi.java
index 6528a79..eef5963 100644
--- a/api/src/main/java/com/ning/billing/invoice/api/IInvoicePaymentApi.java
+++ b/api/src/main/java/com/ning/billing/invoice/api/IInvoicePaymentApi.java
@@ -25,7 +25,7 @@ import java.util.UUID;
 public interface IInvoicePaymentApi {
     public void paymentSuccessful(UUID invoiceId, BigDecimal amount, Currency currency, UUID paymentId);
 
-    public List<IInvoice> getInvoicesByAccount(UUID accountId);
+    public List<Invoice> getInvoicesByAccount(UUID accountId);
 
-    public IInvoice getInvoice(UUID invoiceId);
+    public Invoice getInvoice(UUID invoiceId);
 }
diff --git a/api/src/main/java/com/ning/billing/invoice/api/IInvoiceUserApi.java b/api/src/main/java/com/ning/billing/invoice/api/IInvoiceUserApi.java
index 3f9b8f4..68e658b 100644
--- a/api/src/main/java/com/ning/billing/invoice/api/IInvoiceUserApi.java
+++ b/api/src/main/java/com/ning/billing/invoice/api/IInvoiceUserApi.java
@@ -25,9 +25,9 @@ import java.util.UUID;
 public interface IInvoiceUserApi {
     public List<UUID> getInvoicesForPayment(DateTime targetDate, int numberOfDays);
 
-    public List<IInvoice> getInvoicesByAccount();
+    public List<Invoice> getInvoicesByAccount();
 
-    public IInvoice getInvoice(UUID invoiceId);
+    public Invoice getInvoice(UUID invoiceId);
 
     public void paymentAttemptFailed(UUID invoiceId, DateTime paymentAttemptDate);
 
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/EntitlementBillingApi.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/EntitlementBillingApi.java
index 4fb32a4..8ee19ff 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/EntitlementBillingApi.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/billing/EntitlementBillingApi.java
@@ -17,7 +17,7 @@
 package com.ning.billing.entitlement.api.billing;
 
 import com.google.inject.Inject;
-import com.ning.billing.account.api.IAccount;
+import com.ning.billing.account.api.Account;
 import com.ning.billing.entitlement.api.user.Subscription;
 import com.ning.billing.entitlement.api.user.SubscriptionBuilder;
 import com.ning.billing.entitlement.engine.dao.IEntitlementDao;
@@ -41,7 +41,7 @@ public class EntitlementBillingApi implements IEntitlementBillingApi {
     }
 
     @Override
-    public List<IAccount> getActiveAccounts() {
+    public List<Account> getActiveAccounts() {
         return null;
     }
 
diff --git a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/EntitlementUserApi.java b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/EntitlementUserApi.java
index e867a82..7f6dcfc 100644
--- a/entitlement/src/main/java/com/ning/billing/entitlement/api/user/EntitlementUserApi.java
+++ b/entitlement/src/main/java/com/ning/billing/entitlement/api/user/EntitlementUserApi.java
@@ -18,7 +18,7 @@ package com.ning.billing.entitlement.api.user;
 
 import com.google.inject.Inject;
 import com.ning.billing.ErrorCode;
-import com.ning.billing.account.api.IAccount;
+import com.ning.billing.account.api.Account;
 import com.ning.billing.catalog.api.*;
 import com.ning.billing.entitlement.alignment.IPlanAligner;
 import com.ning.billing.entitlement.alignment.IPlanAligner.TimedPhase;
@@ -81,7 +81,7 @@ public class EntitlementUserApi implements IEntitlementUserApi {
     }
 
     @Override
-    public ISubscriptionBundle createBundleForAccount(IAccount account, String bundleName)
+    public ISubscriptionBundle createBundleForAccount(Account account, String bundleName)
         throws EntitlementUserApiException {
         SubscriptionBundle bundle = new SubscriptionBundle(bundleName, account.getId());
         return dao.createSubscriptionBundle(bundle);
diff --git a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiBase.java b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiBase.java
index 2104699..fa68bff 100644
--- a/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiBase.java
+++ b/entitlement/src/test/java/com/ning/billing/entitlement/api/user/TestUserApiBase.java
@@ -17,8 +17,8 @@
 package com.ning.billing.entitlement.api.user;
 
 import com.google.inject.Injector;
-import com.ning.billing.account.api.IAccount;
-import com.ning.billing.account.api.IFieldStore;
+import com.ning.billing.account.api.Account;
+import com.ning.billing.account.api.FieldStore;
 import com.ning.billing.catalog.CatalogService;
 import com.ning.billing.catalog.api.*;
 import com.ning.billing.config.IEntitlementConfig;
@@ -73,7 +73,7 @@ public abstract class TestUserApiBase {
     protected ClockMock clock;
     protected IEventBusService busService;
 
-    protected IAccount account;
+    protected Account account;
     protected ICatalog catalog;
     protected ApiTestListener testListener;
     protected ISubscriptionBundle bundle;
@@ -278,8 +278,8 @@ public abstract class TestUserApiBase {
         return result;
     }
 
-    protected IAccount getAccount() {
-        IAccount account = new IAccount() {
+    protected Account getAccount() {
+        Account account = new Account() {
             @Override
             public String getFirstName() {
                 return "accountFirstName";
@@ -329,7 +329,7 @@ public abstract class TestUserApiBase {
             }
 
             @Override
-            public IFieldStore getFields() {
+            public FieldStore getFields() {
                 throw new NotImplementedException();
             }
 
diff --git a/invoice/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java b/invoice/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java
index 8a4fc22..4d6e190 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/api/InvoiceUserApi.java
@@ -17,7 +17,7 @@
 package com.ning.billing.invoice.api;
 
 import com.google.inject.Inject;
-import com.ning.billing.invoice.dao.IInvoiceDao;
+import com.ning.billing.invoice.dao.InvoiceDao;
 import org.joda.time.DateTime;
 import org.skife.jdbi.v2.IDBI;
 
@@ -26,11 +26,11 @@ import java.util.List;
 import java.util.UUID;
 
 public class InvoiceUserApi implements IInvoiceUserApi {
-    private final IInvoiceDao dao;
+    private final InvoiceDao dao;
 
     @Inject
     public InvoiceUserApi(IDBI dbi) {
-        dao = dbi.onDemand(IInvoiceDao.class);
+        dao = dbi.onDemand(InvoiceDao.class);
     }
 
     @Override
@@ -39,12 +39,12 @@ public class InvoiceUserApi implements IInvoiceUserApi {
     }
 
     @Override
-    public List<IInvoice> getInvoicesByAccount() {
+    public List<Invoice> getInvoicesByAccount() {
         return null;  //To change body of implemented methods use File | Settings | File Templates.
     }
 
     @Override
-    public IInvoice getInvoice(UUID invoiceId) {
+    public Invoice getInvoice(UUID invoiceId) {
         return null;  //To change body of implemented methods use File | Settings | File Templates.
     }
 
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java
index 25ace96..efbb495 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDao.java
@@ -16,60 +16,95 @@
 
 package com.ning.billing.invoice.dao;
 
-import com.google.inject.Inject;
-import com.ning.billing.invoice.api.IInvoice;
-import org.skife.jdbi.v2.IDBI;
+import com.ning.billing.catalog.api.Currency;
+import com.ning.billing.invoice.api.IInvoiceItem;
+import com.ning.billing.invoice.api.Invoice;
+import com.ning.billing.invoice.model.InvoiceDefault;
+import org.joda.time.DateTime;
+import org.skife.jdbi.v2.SQLStatement;
+import org.skife.jdbi.v2.StatementContext;
+import org.skife.jdbi.v2.sqlobject.*;
+import org.skife.jdbi.v2.sqlobject.customizers.RegisterMapper;
+import org.skife.jdbi.v2.sqlobject.stringtemplate.ExternalizedSqlViaStringTemplate3;
+import org.skife.jdbi.v2.tweak.ResultSetMapper;
 
+import java.lang.annotation.*;
 import java.math.BigDecimal;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Timestamp;
+import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.UUID;
 
-public class InvoiceDao implements IInvoiceDao {
-    private final IInvoiceDao dao;
+@ExternalizedSqlViaStringTemplate3()
+@RegisterMapper({UuidMapper.class, InvoiceDao.InvoiceMapper.class})
+public interface InvoiceDao {
+    @SqlQuery
+    List<Invoice> getInvoicesByAccount(@Bind("accountId") final String accountId);
 
-    @Inject
-    public InvoiceDao(IDBI dbi) {
-        this.dao = dbi.onDemand(IInvoiceDao.class);
-    }
+    @SqlQuery
+    Invoice getInvoice(@Bind("id") final String invoiceId);
 
-    @Override
-    public List<IInvoice> getInvoicesByAccount(final String accountId) {
-        return dao.getInvoicesByAccount(accountId);
-    }
+    @SqlUpdate
+    void createInvoice(@InvoiceBinder final Invoice invoice);
 
-    @Override
-    public IInvoice getInvoice(final String invoiceId) {
-        return dao.getInvoice(invoiceId);
-    }
+    @SqlQuery
+    List<Invoice> getInvoicesBySubscription(@Bind("subscriptionId") final String subscriptionId);
 
-    @Override
-    public void createInvoice(final IInvoice invoice) {
-        dao.createInvoice(invoice);
-    }
+    @SqlQuery
+    List<UUID> getInvoicesForPayment(@Bind("targetDate") final Date targetDate,
+                                     @Bind("numberOfDays") final int numberOfDays);
 
-    @Override
-    public List<IInvoice> getInvoicesBySubscription(String subscriptionId) {
-        return dao.getInvoicesBySubscription(subscriptionId);
-    }
+    @SqlUpdate
+    void notifySuccessfulPayment(@Bind("id") final String invoiceId,
+                                 @Bind("paymentDate") final Date paymentDate,
+                                 @Bind("paymentAmount") final BigDecimal paymentAmount);
 
-    @Override
-    public List<UUID> getInvoicesForPayment(Date targetDate, int numberOfDays) {
-        return dao.getInvoicesForPayment(targetDate, numberOfDays);
-    }
+    @SqlUpdate
+    void notifyFailedPayment(@Bind("id") final String invoiceId,
+                             @Bind("paymentAttemptDate") final Date paymentAttemptDate);
 
-    @Override
-    public void notifySuccessfulPayment(String invoiceId, Date paymentDate, BigDecimal paymentAmount) {
-        dao.notifySuccessfulPayment(invoiceId, paymentDate, paymentAmount);
-    }
+    @SqlUpdate
+    void test();
 
-    @Override
-    public void notifyFailedPayment(String invoiceId, Date paymentAttemptDate) {
-        dao.notifyFailedPayment(invoiceId, paymentAttemptDate);
+    @BindingAnnotation(InvoiceBinder.InvoiceBinderFactory.class)
+    @Retention(RetentionPolicy.RUNTIME)
+    @Target({ElementType.PARAMETER})
+    public @interface InvoiceBinder {
+        public static class InvoiceBinderFactory implements BinderFactory {
+            public Binder build(Annotation annotation) {
+                return new Binder<InvoiceBinder, Invoice>() {
+                    public void bind(SQLStatement q, InvoiceBinder bind, Invoice invoice) {
+                        q.bind("id", invoice.getId().toString());
+                        q.bind("accountId", invoice.getAccountId().toString());
+                        q.bind("invoiceDate", invoice.getInvoiceDate().toDate());
+                        q.bind("targetDate", invoice.getTargetDate().toDate());
+                        q.bind("amountPaid", invoice.getAmountPaid());
+                        q.bind("amountOutstanding", invoice.getAmountOutstanding());
+                        DateTime invoiceDate = invoice.getLastPaymentAttempt();
+                        q.bind("lastPaymentAttempt", invoiceDate == null ? null : invoiceDate.toDate());
+                        q.bind("currency", invoice.getCurrency().toString());
+                    }
+                };
+            }
+        }
     }
 
-    @Override
-    public void test() {
-        dao.test();
+    public static class InvoiceMapper implements ResultSetMapper<Invoice> {
+        @Override
+        public Invoice map(int index, ResultSet result, StatementContext context) throws SQLException {
+            UUID id = UUID.fromString(result.getString("id"));
+            UUID accountId = UUID.fromString(result.getString("account_id"));
+            DateTime invoiceDate = new DateTime(result.getTimestamp("invoice_date"));
+            DateTime targetDate = new DateTime(result.getTimestamp("target_date"));
+            BigDecimal amountPaid = result.getBigDecimal("amount_paid");
+            Timestamp lastPaymentAttemptTimeStamp = result.getTimestamp("last_payment_attempt");
+            DateTime lastPaymentAttempt = lastPaymentAttemptTimeStamp == null ? null : new DateTime(lastPaymentAttemptTimeStamp);
+            Currency currency = Currency.valueOf(result.getString("currency"));
+
+            return new InvoiceDefault(id, accountId, invoiceDate, targetDate, currency, lastPaymentAttempt, amountPaid, new ArrayList<IInvoiceItem>());
+        }
     }
 }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDaoWrapper.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDaoWrapper.java
new file mode 100644
index 0000000..99a4a35
--- /dev/null
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceDaoWrapper.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2010-2011 Ning, Inc.
+ *
+ * Ning licenses this file to you under the Apache License, version 2.0
+ * (the "License"); you may not use this file except in compliance with the
+ * License.  You may obtain a copy of the License at:
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  See the
+ * License for the specific language governing permissions and limitations
+ * under the License.
+ */
+
+package com.ning.billing.invoice.dao;
+
+import com.google.inject.Inject;
+import com.ning.billing.invoice.api.Invoice;
+import org.skife.jdbi.v2.IDBI;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+
+public class InvoiceDaoWrapper implements InvoiceDao {
+    private final InvoiceDao dao;
+
+    @Inject
+    public InvoiceDaoWrapper(IDBI dbi) {
+        this.dao = dbi.onDemand(InvoiceDao.class);
+    }
+
+    @Override
+    public List<Invoice> getInvoicesByAccount(final String accountId) {
+        return dao.getInvoicesByAccount(accountId);
+    }
+
+    @Override
+    public Invoice getInvoice(final String invoiceId) {
+        return dao.getInvoice(invoiceId);
+    }
+
+    @Override
+    public void createInvoice(final Invoice invoice) {
+        dao.createInvoice(invoice);
+    }
+
+    @Override
+    public List<Invoice> getInvoicesBySubscription(String subscriptionId) {
+        return dao.getInvoicesBySubscription(subscriptionId);
+    }
+
+    @Override
+    public List<UUID> getInvoicesForPayment(Date targetDate, int numberOfDays) {
+        return dao.getInvoicesForPayment(targetDate, numberOfDays);
+    }
+
+    @Override
+    public void notifySuccessfulPayment(String invoiceId, Date paymentDate, BigDecimal paymentAmount) {
+        dao.notifySuccessfulPayment(invoiceId, paymentDate, paymentAmount);
+    }
+
+    @Override
+    public void notifyFailedPayment(String invoiceId, Date paymentAttemptDate) {
+        dao.notifyFailedPayment(invoiceId, paymentAttemptDate);
+    }
+
+    @Override
+    public void test() {
+        dao.test();
+    }
+}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceItemDao.java b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceItemDao.java
index d4dbc29..61e0865 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceItemDao.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/dao/InvoiceItemDao.java
@@ -16,47 +16,82 @@
 
 package com.ning.billing.invoice.dao;
 
-import com.google.inject.Inject;
+import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.api.IInvoiceItem;
-import org.skife.jdbi.v2.IDBI;
+import com.ning.billing.invoice.model.InvoiceItem;
+import org.joda.time.DateTime;
+import org.skife.jdbi.v2.SQLStatement;
+import org.skife.jdbi.v2.StatementContext;
+import org.skife.jdbi.v2.sqlobject.*;
+import org.skife.jdbi.v2.sqlobject.customizers.RegisterMapper;
+import org.skife.jdbi.v2.sqlobject.stringtemplate.ExternalizedSqlViaStringTemplate3;
+import org.skife.jdbi.v2.tweak.ResultSetMapper;
 
+import java.lang.annotation.*;
+import java.math.BigDecimal;
+import java.sql.ResultSet;
+import java.sql.SQLException;
 import java.util.List;
+import java.util.UUID;
 
-public class InvoiceItemDao implements IInvoiceItemDao {
-    private final IInvoiceItemDao dao;
+@ExternalizedSqlViaStringTemplate3()
+@RegisterMapper(InvoiceItemDao.InvoiceItemMapper.class)
+public interface InvoiceItemDao {
+    @SqlQuery
+    IInvoiceItem getInvoiceItem(@Bind("id") final String invoiceItemId);
 
-    @Inject
-    public InvoiceItemDao(IDBI dbi) {
-        dao = dbi.onDemand(IInvoiceItemDao.class);
-    }
+    @SqlQuery
+    List<IInvoiceItem> getInvoiceItemsByInvoice(@Bind("invoiceId") final String invoiceId);
 
-    @Override
-    public IInvoiceItem getInvoiceItem(String invoiceItemId) {
-        return dao.getInvoiceItem(invoiceItemId);
-    }
+    @SqlQuery
+    List<IInvoiceItem> getInvoiceItemsByAccount(@Bind("accountId") final String accountId);
 
-    @Override
-    public List<IInvoiceItem> getInvoiceItemsByInvoice(String invoiceId) {
-        return dao.getInvoiceItemsByInvoice(invoiceId);
-    }
+    @SqlQuery
+    List<IInvoiceItem> getInvoiceItemsBySubscription(@Bind("subscriptionId") final String subscriptionId);
 
-    @Override
-    public List<IInvoiceItem> getInvoiceItemsByAccount(String accountId) {
-        return dao.getInvoiceItemsByAccount(accountId);
-    }
+    @SqlUpdate
+    void createInvoiceItem(@InvoiceItemBinder final IInvoiceItem invoiceItem);
 
-    @Override
-    public List<IInvoiceItem> getInvoiceItemsBySubscription(String subscriptionId) {
-        return dao.getInvoiceItemsBySubscription(subscriptionId);
-    }
+    @SqlUpdate
+    void test();
 
-    @Override
-    public void createInvoiceItem(IInvoiceItem invoiceItem) {
-        dao.createInvoiceItem(invoiceItem);
+    @BindingAnnotation(InvoiceItemBinder.InvoiceItemBinderFactory.class)
+    @Retention(RetentionPolicy.RUNTIME)
+    @Target({ElementType.PARAMETER})
+    public @interface InvoiceItemBinder {
+        public static class InvoiceItemBinderFactory implements BinderFactory {
+            public Binder build(Annotation annotation) {
+                return new Binder<InvoiceItemBinder, IInvoiceItem>() {
+                    public void bind(SQLStatement q, InvoiceItemBinder bind, IInvoiceItem item) {
+                        q.bind("id", item.getId().toString());
+                        q.bind("invoiceId", item.getInvoiceId().toString());
+                        q.bind("subscriptionId", item.getSubscriptionId().toString());
+                        q.bind("startDate", item.getStartDate().toDate());
+                        q.bind("endDate", item.getEndDate().toDate());
+                        q.bind("description", item.getDescription());
+                        q.bind("amount", item.getAmount());
+                        q.bind("rate", item.getRate());
+                        q.bind("currency", item.getCurrency().toString());
+                    }
+                };
+            }
+        }
     }
 
-    @Override
-    public void test() {
-        dao.test();
+    public static class InvoiceItemMapper implements ResultSetMapper<IInvoiceItem> {
+        @Override
+        public IInvoiceItem map(int index, ResultSet result, StatementContext context) throws SQLException {
+            UUID id = UUID.fromString(result.getString("id"));
+            UUID invoiceId = UUID.fromString(result.getString("invoice_id"));
+            UUID subscriptionId = UUID.fromString(result.getString("subscription_id"));
+            DateTime startDate = new DateTime(result.getTimestamp("start_date"));
+            DateTime endDate = new DateTime(result.getTimestamp("end_date"));
+            String description = result.getString("description");
+            BigDecimal amount = result.getBigDecimal("amount");
+            BigDecimal rate = result.getBigDecimal("rate");
+            Currency currency = Currency.valueOf(result.getString("currency"));
+
+            return new InvoiceItem(id, invoiceId, subscriptionId, startDate, endDate, description, amount, rate , currency);
+        }
     }
 }
diff --git a/invoice/src/main/java/com/ning/billing/invoice/glue/InvoiceModule.java b/invoice/src/main/java/com/ning/billing/invoice/glue/InvoiceModule.java
index bd1932f..ee82e5c 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/glue/InvoiceModule.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/glue/InvoiceModule.java
@@ -19,18 +19,18 @@ package com.ning.billing.invoice.glue;
 import com.google.inject.AbstractModule;
 import com.ning.billing.invoice.api.IInvoiceUserApi;
 import com.ning.billing.invoice.api.InvoiceUserApi;
-import com.ning.billing.invoice.dao.IInvoiceDao;
-import com.ning.billing.invoice.dao.IInvoiceItemDao;
 import com.ning.billing.invoice.dao.InvoiceDao;
+import com.ning.billing.invoice.dao.InvoiceDaoWrapper;
 import com.ning.billing.invoice.dao.InvoiceItemDao;
+import com.ning.billing.invoice.dao.InvoiceItemDaoWrapper;
 
 public class InvoiceModule extends AbstractModule {
     private void installInvoiceDao() {
-        bind(IInvoiceDao.class).to(InvoiceDao.class).asEagerSingleton();
+        bind(InvoiceDao.class).to(InvoiceDaoWrapper.class).asEagerSingleton();
     }
 
     private void installInvoiceItemDao() {
-        bind(IInvoiceItemDao.class).to(InvoiceItemDao.class).asEagerSingleton();
+        bind(InvoiceItemDao.class).to(InvoiceItemDaoWrapper.class).asEagerSingleton();
     }
 
     protected void installInvoiceUserApi() {
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/BillingModeBase.java b/invoice/src/main/java/com/ning/billing/invoice/model/BillingModeBase.java
index d141f27..949f711 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/BillingModeBase.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/BillingModeBase.java
@@ -21,7 +21,7 @@ import org.joda.time.DateTime;
 
 import java.math.BigDecimal;
 
-public abstract class BillingModeBase implements IBillingMode {
+public abstract class BillingModeBase implements BillingMode {
     @Override
     public BigDecimal calculateNumberOfBillingCycles(final DateTime startDate, final DateTime endDate, final DateTime targetDate, final int billingCycleDay, final BillingPeriod billingPeriod) throws InvalidDateSequenceException {
         if (endDate.isBefore(startDate)) {throw new InvalidDateSequenceException();}
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceGenerator.java b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceGenerator.java
index 9526b62..360f85d 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceGenerator.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/DefaultInvoiceGenerator.java
@@ -18,11 +18,10 @@ package com.ning.billing.invoice.model;
 
 import com.ning.billing.catalog.api.BillingPeriod;
 import com.ning.billing.catalog.api.Currency;
-import com.ning.billing.entitlement.api.billing.BillingMode;
 import com.ning.billing.entitlement.api.billing.IBillingEvent;
 import com.ning.billing.invoice.api.BillingEventSet;
-import com.ning.billing.invoice.api.IInvoice;
 import com.ning.billing.invoice.api.IInvoiceItem;
+import com.ning.billing.invoice.api.Invoice;
 import org.joda.time.DateTime;
 
 import java.math.BigDecimal;
@@ -31,13 +30,13 @@ import java.util.Collections;
 import java.util.List;
 import java.util.UUID;
 
-public class DefaultInvoiceGenerator implements IInvoiceGenerator {
+public class DefaultInvoiceGenerator implements InvoiceGenerator {
     @Override
-    public IInvoice generateInvoice(final UUID accountId, final BillingEventSet events, final InvoiceItemList existingItems, final DateTime targetDate, final Currency targetCurrency) {
-        if (events == null) {return new Invoice(accountId, targetDate, targetCurrency);}
-        if (events.size() == 0) {return new Invoice(accountId, targetDate, targetCurrency);}
+    public Invoice generateInvoice(final UUID accountId, final BillingEventSet events, final InvoiceItemList existingItems, final DateTime targetDate, final Currency targetCurrency) {
+        if (events == null) {return new InvoiceDefault(accountId, targetDate, targetCurrency);}
+        if (events.size() == 0) {return new InvoiceDefault(accountId, targetDate, targetCurrency);}
 
-        Invoice invoice = new Invoice(accountId, targetDate, targetCurrency);
+        InvoiceDefault invoice = new InvoiceDefault(accountId, targetDate, targetCurrency);
         InvoiceItemList currentItems = generateInvoiceItems(events, invoice.getId(), targetDate, targetCurrency);
         InvoiceItemList itemsToPost = reconcileInvoiceItems(invoice.getId(), currentItems, existingItems);
         invoice.add(itemsToPost);
@@ -114,7 +113,7 @@ public class DefaultInvoiceGenerator implements IInvoiceGenerator {
     private void processEvent(UUID invoiceId, IBillingEvent event, List<IInvoiceItem> items, DateTime targetDate, Currency targetCurrency) {
         BigDecimal rate = event.getPrice(targetCurrency);
         BigDecimal invoiceItemAmount = calculateInvoiceItemAmount(event, targetDate, rate);
-        IBillingMode billingMode = getBillingMode(event.getBillingMode());
+        BillingMode billingMode = getBillingMode(event.getBillingMode());
         DateTime billThroughDate = billingMode.calculateEffectiveEndDate(event.getEffectiveDate(), targetDate, event.getBillCycleDay(), event.getBillingPeriod());
 
         addInvoiceItem(invoiceId, items, event, billThroughDate, invoiceItemAmount, rate, targetCurrency);
@@ -123,7 +122,7 @@ public class DefaultInvoiceGenerator implements IInvoiceGenerator {
     private void processEvents(UUID invoiceId, IBillingEvent firstEvent, IBillingEvent secondEvent, List<IInvoiceItem> items, DateTime targetDate, Currency targetCurrency) {
         BigDecimal rate = firstEvent.getPrice(targetCurrency);
         BigDecimal invoiceItemAmount = calculateInvoiceItemAmount(firstEvent, secondEvent, targetDate, rate);
-        IBillingMode billingMode = getBillingMode(firstEvent.getBillingMode());
+        BillingMode billingMode = getBillingMode(firstEvent.getBillingMode());
         DateTime billThroughDate = billingMode.calculateEffectiveEndDate(firstEvent.getEffectiveDate(), secondEvent.getEffectiveDate(), targetDate, firstEvent.getBillCycleDay(), firstEvent.getBillingPeriod());
 
         addInvoiceItem(invoiceId, items, firstEvent, billThroughDate, invoiceItemAmount, rate, targetCurrency);
@@ -137,7 +136,7 @@ public class DefaultInvoiceGenerator implements IInvoiceGenerator {
     }
 
     private BigDecimal calculateInvoiceItemAmount(IBillingEvent event, DateTime targetDate, BigDecimal rate){
-        IBillingMode billingMode = getBillingMode(event.getBillingMode());
+        BillingMode billingMode = getBillingMode(event.getBillingMode());
         DateTime startDate = event.getEffectiveDate();
         int billingCycleDay = event.getBillCycleDay();
         BillingPeriod billingPeriod = event.getBillingPeriod();
@@ -153,7 +152,7 @@ public class DefaultInvoiceGenerator implements IInvoiceGenerator {
     }
 
     private BigDecimal calculateInvoiceItemAmount(IBillingEvent firstEvent, IBillingEvent secondEvent, DateTime targetDate, BigDecimal rate) {
-        IBillingMode billingMode = getBillingMode(firstEvent.getBillingMode());
+        BillingMode billingMode = getBillingMode(firstEvent.getBillingMode());
         DateTime startDate = firstEvent.getEffectiveDate();
         int billingCycleDay = firstEvent.getBillCycleDay();
         BillingPeriod billingPeriod = firstEvent.getBillingPeriod();
@@ -170,7 +169,7 @@ public class DefaultInvoiceGenerator implements IInvoiceGenerator {
         }
     }
 
-    private IBillingMode getBillingMode(BillingMode billingMode) {
+    private BillingMode getBillingMode(com.ning.billing.entitlement.api.billing.BillingMode billingMode) {
         switch (billingMode) {
             case IN_ADVANCE:
                 return new InAdvanceBillingMode();
diff --git a/invoice/src/main/java/com/ning/billing/invoice/model/TestConsole.java b/invoice/src/main/java/com/ning/billing/invoice/model/TestConsole.java
index b637323..8c3baf1 100644
--- a/invoice/src/main/java/com/ning/billing/invoice/model/TestConsole.java
+++ b/invoice/src/main/java/com/ning/billing/invoice/model/TestConsole.java
@@ -82,7 +82,7 @@ public class TestConsole {
     }
 
     private static void testScenario(DateTime startDate, DateTime targetDate, int billingCycleDay, BillingPeriod billingPeriod, BigDecimal expectedValue) {
-        IBillingMode billingMode = new InAdvanceBillingMode();
+        BillingMode billingMode = new InAdvanceBillingMode();
 
         System.out.println("Start date: " + startDate.toLocalDate());
         System.out.println("Target date: " + targetDate.toLocalDate());
@@ -111,7 +111,7 @@ public class TestConsole {
     }
 
     private static void testScenario(DateTime startDate, DateTime endDate, DateTime targetDate, int billingCycleDay, BillingPeriod billingPeriod, BigDecimal expectedValue) {
-        IBillingMode billingMode = new InAdvanceBillingMode();
+        BillingMode billingMode = new InAdvanceBillingMode();
 
         System.out.println("Start date: " + startDate.toLocalDate());
         System.out.println("End date: " + endDate.toLocalDate());
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java
index 906300f..be96d86 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceDaoTests.java
@@ -21,10 +21,9 @@ import com.google.inject.Injector;
 import com.google.inject.Stage;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.dbi.MysqlTestingHelper;
-import com.ning.billing.invoice.api.IInvoice;
-import com.ning.billing.invoice.glue.InjectorMagic;
+import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.glue.InvoiceModuleMock;
-import com.ning.billing.invoice.model.Invoice;
+import com.ning.billing.invoice.model.InvoiceDefault;
 import com.ning.billing.invoice.model.InvoiceItem;
 import com.ning.billing.util.clock.Clock;
 import org.apache.commons.io.IOUtils;
@@ -44,24 +43,23 @@ public class InvoiceDaoTests {
     private final int NUMBER_OF_DAY_BETWEEN_RETRIES = 8;
 
     private final MysqlTestingHelper helper = new MysqlTestingHelper();
-    private IInvoiceDao dao;
-    private IInvoiceItemDao invoiceItemDao;
+    private InvoiceDao dao;
+    private InvoiceItemDao invoiceItemDao;
 
     @BeforeClass()
     private void setup() throws IOException {
         // Health check test to make sure MySQL is setup properly
         try {
             InvoiceModuleMock module = new InvoiceModuleMock();
-            final String ddl = IOUtils.toString(InvoiceDao.class.getResourceAsStream("/com/ning/billing/invoice/ddl.sql"));
+            final String ddl = IOUtils.toString(InvoiceDaoWrapper.class.getResourceAsStream("/com/ning/billing/invoice/ddl.sql"));
             module.createDb(ddl);
 
             final Injector injector = Guice.createInjector(Stage.DEVELOPMENT, module);
 
-            InjectorMagic injectorMagic = injector.getInstance(InjectorMagic.class);
-            dao = injector.getInstance(InvoiceDao.class);
+            dao = injector.getInstance(InvoiceDaoWrapper.class);
             dao.test();
 
-            invoiceItemDao = injector.getInstance(IInvoiceItemDao.class);
+            invoiceItemDao = injector.getInstance(InvoiceItemDao.class);
             invoiceItemDao.test();
         }
         catch (Throwable t) {
@@ -71,17 +69,16 @@ public class InvoiceDaoTests {
 
     @Test
     public void testCreationAndRetrievalByAccount() {
-        InvoiceDao dao = InjectorMagic.getInvoiceDao();
         UUID accountId = UUID.randomUUID();
-        IInvoice invoice = new Invoice(accountId, new Clock().getUTCNow(), Currency.USD);
+        Invoice invoice = new InvoiceDefault(accountId, new Clock().getUTCNow(), Currency.USD);
         DateTime invoiceDate = invoice.getInvoiceDate();
 
         dao.createInvoice(invoice);
 
-        List<IInvoice> invoices = dao.getInvoicesByAccount(accountId.toString());
+        List<Invoice> invoices = dao.getInvoicesByAccount(accountId.toString());
         assertNotNull(invoices);
         assertEquals(invoices.size(), 1);
-        IInvoice thisInvoice = invoices.get(0);
+        Invoice thisInvoice = invoices.get(0);
         assertEquals(invoice.getAccountId(), accountId);
         assertTrue(thisInvoice.getInvoiceDate().compareTo(invoiceDate) == 0);
         assertEquals(thisInvoice.getCurrency(), Currency.USD);
@@ -91,7 +88,7 @@ public class InvoiceDaoTests {
 
     @Test
     public void testRetrievalForNonExistentInvoiceId() {
-        IInvoice invoice = dao.getInvoice(UUID.randomUUID().toString());
+        Invoice invoice = dao.getInvoice(UUID.randomUUID().toString());
         assertNull(invoice);
     }
 
@@ -99,7 +96,7 @@ public class InvoiceDaoTests {
     public void testAddPayment() {
         UUID accountId = UUID.randomUUID();
         DateTime targetDate = new DateTime(2011, 10, 6, 0, 0, 0, 0);
-        IInvoice invoice = new Invoice(accountId, targetDate, Currency.USD);
+        Invoice invoice = new InvoiceDefault(accountId, targetDate, Currency.USD);
 
         DateTime paymentAttemptDate = new DateTime(2011, 6, 24, 12, 14, 36, 0);
         BigDecimal paymentAmount = new BigDecimal("14.0");
@@ -116,7 +113,7 @@ public class InvoiceDaoTests {
     public void testAddPaymentAttempt() {
         UUID accountId = UUID.randomUUID();
         DateTime targetDate = new DateTime(2011, 10, 6, 0, 0, 0, 0);
-        IInvoice invoice = new Invoice(accountId, targetDate, Currency.USD);
+        Invoice invoice = new InvoiceDefault(accountId, targetDate, Currency.USD);
 
         DateTime paymentAttemptDate = new DateTime(2011, 6, 24, 12, 14, 36, 0);
 
@@ -137,7 +134,7 @@ public class InvoiceDaoTests {
         int existingInvoiceCount = invoices.size();
         
         UUID accountId = UUID.randomUUID();
-        IInvoice invoice = new Invoice(accountId, targetDate, Currency.USD);
+        Invoice invoice = new InvoiceDefault(accountId, targetDate, Currency.USD);
 
         dao.createInvoice(invoice);
         invoices = dao.getInvoicesForPayment(notionalDate.toDate(), NUMBER_OF_DAY_BETWEEN_RETRIES);
@@ -157,7 +154,7 @@ public class InvoiceDaoTests {
         // create a new invoice with one item
         UUID accountId = UUID.randomUUID();
         DateTime targetDate = new DateTime(2011, 10, 6, 0, 0, 0, 0);
-        IInvoice invoice = new Invoice(accountId, targetDate, Currency.USD);
+        Invoice invoice = new InvoiceDefault(accountId, targetDate, Currency.USD);
         dao.createInvoice(invoice);
 
         UUID invoiceId = invoice.getId();
@@ -226,7 +223,7 @@ public class InvoiceDaoTests {
 
 
         // create invoice 1 (subscriptions 1-4)
-        IInvoice invoice1 = new Invoice(accountId, targetDate, Currency.USD);
+        Invoice invoice1 = new InvoiceDefault(accountId, targetDate, Currency.USD);
         dao.createInvoice(invoice1);
 
         UUID invoiceId1 = invoice1.getId();
@@ -247,7 +244,7 @@ public class InvoiceDaoTests {
         invoiceItemDao.createInvoiceItem(item4);
 
         // create invoice 2 (subscriptions 1-3)
-        Invoice invoice = new Invoice(accountId, targetDate, Currency.USD);
+        InvoiceDefault invoice = new InvoiceDefault(accountId, targetDate, Currency.USD);
         dao.createInvoice(invoice);
 
         UUID invoiceId2 = invoice.getId();
@@ -265,16 +262,16 @@ public class InvoiceDaoTests {
         invoiceItemDao.createInvoiceItem(item7);
 
         // check that each subscription returns the correct number of invoices
-        List<IInvoice> items1 = dao.getInvoicesBySubscription(subscriptionId1.toString());
+        List<Invoice> items1 = dao.getInvoicesBySubscription(subscriptionId1.toString());
         assertEquals(items1.size(), 2);
 
-        List<IInvoice> items2 = dao.getInvoicesBySubscription(subscriptionId2.toString());
+        List<Invoice> items2 = dao.getInvoicesBySubscription(subscriptionId2.toString());
         assertEquals(items2.size(), 2);
 
-        List<IInvoice> items3 = dao.getInvoicesBySubscription(subscriptionId3.toString());
+        List<Invoice> items3 = dao.getInvoicesBySubscription(subscriptionId3.toString());
         assertEquals(items3.size(), 2);
 
-        List<IInvoice> items4 = dao.getInvoicesBySubscription(subscriptionId4.toString());
+        List<Invoice> items4 = dao.getInvoicesBySubscription(subscriptionId4.toString());
         assertEquals(items4.size(), 1);
     }
     
diff --git a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceItemDaoTests.java b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceItemDaoTests.java
index bd91261..54fd71d 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceItemDaoTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/dao/InvoiceItemDaoTests.java
@@ -21,9 +21,8 @@ import com.google.inject.Injector;
 import com.google.inject.Stage;
 import com.ning.billing.catalog.api.Currency;
 import com.ning.billing.invoice.api.IInvoiceItem;
-import com.ning.billing.invoice.glue.InjectorMagic;
 import com.ning.billing.invoice.glue.InvoiceModuleMock;
-import com.ning.billing.invoice.model.Invoice;
+import com.ning.billing.invoice.model.InvoiceDefault;
 import com.ning.billing.invoice.model.InvoiceItem;
 import org.apache.commons.io.IOUtils;
 import org.joda.time.DateTime;
@@ -38,24 +37,23 @@ import java.util.UUID;
 import static org.testng.Assert.*;
 
 public class InvoiceItemDaoTests {
-    private InvoiceItemDao dao;
-    private IInvoiceDao invoiceDao;
+    private InvoiceItemDaoWrapper dao;
+    private InvoiceDao invoiceDao;
 
     @BeforeClass(alwaysRun = true)
     private void setup() throws IOException {
         InvoiceModuleMock module = new InvoiceModuleMock();
-        final String ddl = IOUtils.toString(InvoiceDao.class.getResourceAsStream("/com/ning/billing/invoice/ddl.sql"));
+        final String ddl = IOUtils.toString(InvoiceDaoWrapper.class.getResourceAsStream("/com/ning/billing/invoice/ddl.sql"));
         module.createDb(ddl);
 
         // Healthcheck test to make sure MySQL is setup properly
         try {
             final Injector injector = Guice.createInjector(Stage.DEVELOPMENT, module);
 
-            InjectorMagic injectorMagic = injector.getInstance(InjectorMagic.class);
-            dao = injector.getInstance(InvoiceItemDao.class);
+            dao = injector.getInstance(InvoiceItemDaoWrapper.class);
             dao.test();
 
-            invoiceDao = injector.getInstance(InvoiceDao.class);
+            invoiceDao = injector.getInstance(InvoiceDaoWrapper.class);
             invoiceDao.test();
         }
         catch (Throwable t) {
@@ -124,7 +122,7 @@ public class InvoiceItemDaoTests {
     public void testGetInvoiceItemsByAccountId() {
         UUID accountId = UUID.randomUUID();
         DateTime targetDate = new DateTime(2011, 5, 23, 0, 0, 0, 0);
-        Invoice invoice = new Invoice(accountId, targetDate, Currency.USD);
+        InvoiceDefault invoice = new InvoiceDefault(accountId, targetDate, Currency.USD);
 
         invoiceDao.createInvoice(invoice);
 
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java
index 6cf52e4..ee4d5fc 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/DefaultInvoiceGeneratorTests.java
@@ -22,10 +22,10 @@ import com.ning.billing.entitlement.api.billing.BillingMode;
 import com.ning.billing.entitlement.api.billing.IBillingEvent;
 import com.ning.billing.invoice.api.BillingEvent;
 import com.ning.billing.invoice.api.BillingEventSet;
-import com.ning.billing.invoice.api.IInvoice;
 import com.ning.billing.invoice.api.IInvoiceItem;
+import com.ning.billing.invoice.api.Invoice;
 import com.ning.billing.invoice.model.DefaultInvoiceGenerator;
-import com.ning.billing.invoice.model.IInvoiceGenerator;
+import com.ning.billing.invoice.model.InvoiceGenerator;
 import com.ning.billing.invoice.model.InvoiceItem;
 import com.ning.billing.invoice.model.InvoiceItemList;
 import org.joda.time.DateTime;
@@ -39,12 +39,12 @@ import static org.testng.Assert.assertNotNull;
 
 @Test(groups = {"invoicing", "invoiceGenerator"})
 public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
-    private final IInvoiceGenerator generator = new DefaultInvoiceGenerator();
+    private final InvoiceGenerator generator = new DefaultInvoiceGenerator();
 
     @Test
     public void testWithNullEventSetAndNullInvoiceSet() {
         UUID accountId = UUID.randomUUID();
-        IInvoice invoice = generator.generateInvoice(accountId, null, null, new DateTime(), Currency.USD);
+        Invoice invoice = generator.generateInvoice(accountId, null, null, new DateTime(), Currency.USD);
 
         assertNotNull(invoice);
         assertEquals(invoice.getNumberOfItems(), 0);
@@ -57,7 +57,7 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
 
         InvoiceItemList existingInvoiceItems = new InvoiceItemList();
         UUID accountId = UUID.randomUUID();
-        IInvoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, new DateTime(), Currency.USD);
+        Invoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, new DateTime(), Currency.USD);
 
         assertNotNull(invoice);
         assertEquals(invoice.getNumberOfItems(), 0);
@@ -82,7 +82,7 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
         
         DateTime targetDate = buildDateTime(2011, 10, 3);
         UUID accountId = UUID.randomUUID();
-        IInvoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, targetDate, Currency.USD);
+        Invoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, targetDate, Currency.USD);
 
         assertNotNull(invoice);
         assertEquals(invoice.getNumberOfItems(), 1);
@@ -108,7 +108,7 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
         
         DateTime targetDate = buildDateTime(2011, 10, 3);        
         UUID accountId = UUID.randomUUID();
-        IInvoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, targetDate, Currency.USD);
+        Invoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, targetDate, Currency.USD);
 
         assertNotNull(invoice);
         assertEquals(invoice.getNumberOfItems(), 1);
@@ -138,7 +138,7 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
         InvoiceItemList existingInvoiceItems = new InvoiceItemList();
         DateTime targetDate = buildDateTime(2011, 10, 3);
         UUID accountId = UUID.randomUUID();
-        IInvoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, targetDate, Currency.USD);
+        Invoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, targetDate, Currency.USD);
 
         assertNotNull(invoice);
         assertEquals(invoice.getNumberOfItems(), 2);
@@ -165,7 +165,7 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
         InvoiceItemList existingInvoiceItems = new InvoiceItemList();
         DateTime targetDate = buildDateTime(2011, 12, 3);
         UUID accountId = UUID.randomUUID();
-        IInvoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, targetDate, Currency.USD);
+        Invoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, targetDate, Currency.USD);
 
         assertNotNull(invoice);
         assertEquals(invoice.getNumberOfItems(), 2);
@@ -209,7 +209,7 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
         InvoiceItemList existingInvoiceItems = new InvoiceItemList();
         DateTime targetDate = buildDateTime(2011, 12, 3);
         UUID accountId = UUID.randomUUID();
-        IInvoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, targetDate, Currency.USD);
+        Invoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, targetDate, Currency.USD);
 
         assertNotNull(invoice);
         assertEquals(invoice.getNumberOfItems(), 3);
@@ -237,7 +237,7 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
 
         DateTime targetDate = buildDateTime(2011, 12, 3);
         UUID accountId = UUID.randomUUID();
-        IInvoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, targetDate, Currency.USD);
+        Invoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, targetDate, Currency.USD);
 
         assertNotNull(invoice);
         assertEquals(invoice.getNumberOfItems(), 0);
@@ -415,7 +415,7 @@ public class DefaultInvoiceGeneratorTests extends InvoicingTestBase {
     private void testInvoiceGeneration(BillingEventSet events, InvoiceItemList existingInvoiceItems, DateTime targetDate, int expectedNumberOfItems, BigDecimal expectedAmount) {
         Currency currency = Currency.USD;
         UUID accountId = UUID.randomUUID();
-        IInvoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, targetDate, currency);
+        Invoice invoice = generator.generateInvoice(accountId, events, existingInvoiceItems, targetDate, currency);
         existingInvoiceItems.addAll(invoice.getItems());
         assertNotNull(invoice);
         assertEquals(invoice.getNumberOfItems(), expectedNumberOfItems);
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/ProRationInAdvanceTestBase.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/ProRationInAdvanceTestBase.java
index 2948557..14392a8 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/ProRationInAdvanceTestBase.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/ProRationInAdvanceTestBase.java
@@ -16,7 +16,7 @@
 
 package com.ning.billing.invoice.tests.inAdvance;
 
-import com.ning.billing.invoice.model.IBillingMode;
+import com.ning.billing.invoice.model.BillingMode;
 import com.ning.billing.invoice.model.InAdvanceBillingMode;
 import com.ning.billing.invoice.tests.ProRationTestBase;
 import org.testng.annotations.Test;
@@ -24,7 +24,7 @@ import org.testng.annotations.Test;
 @Test(groups = {"invoicing", "proRation"})
 public abstract class ProRationInAdvanceTestBase extends ProRationTestBase {
     @Override
-    protected IBillingMode getBillingMode() {
+    protected BillingMode getBillingMode() {
         return new InAdvanceBillingMode();
     }
 }
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/ValidationProRationTests.java b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/ValidationProRationTests.java
index c57fe32..9de01bd 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/ValidationProRationTests.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/inAdvance/ValidationProRationTests.java
@@ -17,7 +17,7 @@
 package com.ning.billing.invoice.tests.inAdvance;
 
 import com.ning.billing.catalog.api.BillingPeriod;
-import com.ning.billing.invoice.model.IBillingMode;
+import com.ning.billing.invoice.model.BillingMode;
 import com.ning.billing.invoice.model.InAdvanceBillingMode;
 import com.ning.billing.invoice.model.InvalidDateSequenceException;
 import com.ning.billing.invoice.tests.ProRationTestBase;
@@ -35,7 +35,7 @@ public class ValidationProRationTests extends ProRationTestBase {
     }
 
     @Override
-    protected IBillingMode getBillingMode() {
+    protected BillingMode getBillingMode() {
         return new InAdvanceBillingMode();
     }
 
diff --git a/invoice/src/test/java/com/ning/billing/invoice/tests/ProRationTestBase.java b/invoice/src/test/java/com/ning/billing/invoice/tests/ProRationTestBase.java
index 835836e..174017b 100644
--- a/invoice/src/test/java/com/ning/billing/invoice/tests/ProRationTestBase.java
+++ b/invoice/src/test/java/com/ning/billing/invoice/tests/ProRationTestBase.java
@@ -17,7 +17,7 @@
 package com.ning.billing.invoice.tests;
 
 import com.ning.billing.catalog.api.BillingPeriod;
-import com.ning.billing.invoice.model.IBillingMode;
+import com.ning.billing.invoice.model.BillingMode;
 import com.ning.billing.invoice.model.InvalidDateSequenceException;
 import org.joda.time.DateTime;
 
@@ -27,7 +27,7 @@ import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.fail;
 
 public abstract class ProRationTestBase extends InvoicingTestBase{
-    protected abstract IBillingMode getBillingMode();
+    protected abstract BillingMode getBillingMode();
     protected abstract BillingPeriod getBillingPeriod();
 
     protected void testCalculateNumberOfBillingCycles(DateTime startDate, DateTime targetDate, int billingCycleDay, BigDecimal expectedValue) throws InvalidDateSequenceException {