killbill-memoizeit

Changes

profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoiceNotification.java 58(+0 -58)

Details

diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/ComboHostedPaymentPageJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/ComboHostedPaymentPageJson.java
index 0ae0281..490da97 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/ComboHostedPaymentPageJson.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/ComboHostedPaymentPageJson.java
@@ -23,11 +23,14 @@ import javax.annotation.Nullable;
 
 import com.fasterxml.jackson.annotation.JsonCreator;
 import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 
 @ApiModel(value="ComboHostedPaymentPage")
 public class ComboHostedPaymentPageJson extends ComboPaymentJson {
 
+    //@ApiModelProperty(name = required = true)
     private final HostedPaymentPageFieldsJson hostedPaymentPageFields;
 
     @JsonCreator
@@ -40,7 +43,7 @@ public class ComboHostedPaymentPageJson extends ComboPaymentJson {
         this.hostedPaymentPageFields = hostedPaymentPageFields;
     }
 
-    public HostedPaymentPageFieldsJson getHostedPaymentPageFieldsJson() {
+    public HostedPaymentPageFieldsJson getHostedPaymentPageFields() {
         return hostedPaymentPageFields;
     }
 
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/HostedPaymentPageFieldsJson.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/HostedPaymentPageFieldsJson.java
index 8c6ece4..fedba4c 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/HostedPaymentPageFieldsJson.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/json/HostedPaymentPageFieldsJson.java
@@ -23,17 +23,18 @@ import com.fasterxml.jackson.annotation.JsonProperty;
 import io.swagger.annotations.ApiModel;
 
 
-@ApiModel(value="HostedPaymentPageFields", parent = JsonBase.class)
-public class HostedPaymentPageFieldsJson extends JsonBase {
+@ApiModel(value="HostedPaymentPageFields")
+public class HostedPaymentPageFieldsJson  {
 
     private final List<PluginPropertyJson> formFields;
 
+
     @JsonCreator
     public HostedPaymentPageFieldsJson(@JsonProperty("formFields") final List<PluginPropertyJson> formFields) {
         this.formFields = formFields;
     }
 
-    public List<PluginPropertyJson> getCustomFields() {
+    public List<PluginPropertyJson> getFormFields() {
         return formFields;
     }
 
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
index 89e47f9..3d53ec0 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AccountResource.java
@@ -1232,7 +1232,7 @@ public class AccountResource extends JaxRsResourceBase {
     @ApiOperation(value = "Remove custom fields from account")
     @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid account id supplied")})
     public Response deleteCustomFields(@PathParam(ID_PARAM_NAME) final UUID accountId,
-                                       @QueryParam(QUERY_CUSTOM_FIELD) final List<String> customFieldList,
+                                       @QueryParam(QUERY_CUSTOM_FIELD) final List<UUID> customFieldList,
                                        @HeaderParam(HDR_CREATED_BY) final String createdBy,
                                        @HeaderParam(HDR_REASON) final String reason,
                                        @HeaderParam(HDR_COMMENT) final String comment,
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AdminResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AdminResource.java
index 6bcd713..b2cd8b4 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AdminResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/AdminResource.java
@@ -372,8 +372,7 @@ public class AdminResource extends JaxRsResourceBase {
     @Produces(APPLICATION_JSON)
     @ApiOperation(value = "Invalidates Caches per tenant level")
     @ApiResponses(value = {})
-    public Response invalidatesCacheByTenant(@QueryParam("tenantApiKey") final String tenantApiKey,
-                                             @javax.ws.rs.core.Context final HttpServletRequest request) throws TenantApiException {
+    public Response invalidatesCacheByTenant(@javax.ws.rs.core.Context final HttpServletRequest request) throws TenantApiException {
 
         // creating Tenant Context from Request
         final TenantContext tenantContext = context.createTenantContextNoAccountId(request);
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/BundleResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/BundleResource.java
index 09e6032..8b68755 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/BundleResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/BundleResource.java
@@ -350,7 +350,7 @@ public class BundleResource extends JaxRsResourceBase {
     @ApiOperation(value = "Remove custom fields from bundle")
     @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid bundle id supplied")})
     public Response deleteCustomFields(@PathParam(ID_PARAM_NAME) final UUID bundleId,
-                                       @QueryParam(QUERY_CUSTOM_FIELD) final List<String> customFieldList,
+                                       @QueryParam(QUERY_CUSTOM_FIELD) final List<UUID> customFieldList,
                                        @HeaderParam(HDR_CREATED_BY) final String createdBy,
                                        @HeaderParam(HDR_REASON) final String reason,
                                        @HeaderParam(HDR_COMMENT) final String comment,
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceItemResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceItemResource.java
index fcb1833..662b9fa 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceItemResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceItemResource.java
@@ -134,7 +134,7 @@ public class InvoiceItemResource extends JaxRsResourceBase {
     @ApiOperation(value = "Remove custom fields from invoice item")
     @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid invoice item id supplied")})
     public Response deleteCustomFields(@PathParam(ID_PARAM_NAME) final UUID id,
-                                       @QueryParam(QUERY_CUSTOM_FIELD) final List<String> customFieldList,
+                                       @QueryParam(QUERY_CUSTOM_FIELD) final List<UUID> customFieldList,
                                        @HeaderParam(HDR_CREATED_BY) final String createdBy,
                                        @HeaderParam(HDR_REASON) final String reason,
                                        @HeaderParam(HDR_COMMENT) final String comment,
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoicePaymentResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoicePaymentResource.java
index 8252eec..8705e13 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoicePaymentResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoicePaymentResource.java
@@ -368,7 +368,7 @@ public class InvoicePaymentResource extends JaxRsResourceBase {
     @ApiOperation(value = "Remove custom fields from payment")
     @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid payment id supplied")})
     public Response deleteCustomFields(@PathParam(ID_PARAM_NAME) final UUID id,
-                                       @QueryParam(QUERY_CUSTOM_FIELD) final List<String> customFieldList,
+                                       @QueryParam(QUERY_CUSTOM_FIELD) final List<UUID> customFieldList,
                                        @HeaderParam(HDR_CREATED_BY) final String createdBy,
                                        @HeaderParam(HDR_REASON) final String reason,
                                        @HeaderParam(HDR_COMMENT) final String comment,
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceResource.java
index cb4b4f5..becf8ad 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/InvoiceResource.java
@@ -924,7 +924,7 @@ public class InvoiceResource extends JaxRsResourceBase {
     @ApiOperation(value = "Remove custom fields from invoice")
     @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid invoice id supplied")})
     public Response deleteCustomFields(@PathParam(ID_PARAM_NAME) final UUID id,
-                                       @QueryParam(QUERY_CUSTOM_FIELD) final List<String> customFieldList,
+                                       @QueryParam(QUERY_CUSTOM_FIELD) final List<UUID> customFieldList,
                                        @HeaderParam(HDR_CREATED_BY) final String createdBy,
                                        @HeaderParam(HDR_REASON) final String reason,
                                        @HeaderParam(HDR_COMMENT) final String comment,
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxRsResourceBase.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxRsResourceBase.java
index 24802c3..e505c63 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxRsResourceBase.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/JaxRsResourceBase.java
@@ -286,7 +286,7 @@ public abstract class JaxRsResourceBase implements JaxrsResource {
      * @throws CustomFieldApiException
      */
     protected Response deleteCustomFields(final UUID id,
-                                          final List<String> customFieldList,
+                                          final List<UUID> customFieldList,
                                           final CallContext context) throws CustomFieldApiException {
 
         // Retrieve all the custom fields for the object
@@ -299,8 +299,7 @@ public abstract class JaxRsResourceBase implements JaxrsResource {
                 if (customFieldList.isEmpty()) {
                     return true;
                 }
-                for (final String cur : customFieldList) {
-                    final UUID curId = UUID.fromString(cur);
+                for (final UUID curId : customFieldList) {
                     if (input.getId().equals(curId)) {
                         return true;
                     }
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentGatewayResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentGatewayResource.java
index 9ffb317..fe4d23b 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentGatewayResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentGatewayResource.java
@@ -112,8 +112,8 @@ public class PaymentGatewayResource extends ComboPaymentResource {
         final Iterable<PluginProperty> paymentMethodPluginProperties = extractPluginProperties(json.getPaymentMethodPluginProperties());
         final UUID paymentMethodId = getOrCreatePaymentMethod(account, json.getPaymentMethod(), paymentMethodPluginProperties, callContext);
 
-        final HostedPaymentPageFieldsJson hostedPaymentPageFields = json.getHostedPaymentPageFieldsJson();
-        final Iterable<PluginProperty> customFields = extractPluginProperties(hostedPaymentPageFields != null ? hostedPaymentPageFields.getCustomFields() : null);
+        final HostedPaymentPageFieldsJson hostedPaymentPageFields = json.getHostedPaymentPageFields();
+        final Iterable<PluginProperty> customFields = extractPluginProperties(hostedPaymentPageFields != null ? hostedPaymentPageFields.getFormFields() : null);
 
         final HostedPaymentPageFormDescriptor descriptor = paymentGatewayApi.buildFormDescriptorWithPaymentControl(account, paymentMethodId, customFields, pluginProperties, paymentOptions, callContext);
         final HostedPaymentPageFormDescriptorJson result = new HostedPaymentPageFormDescriptorJson(descriptor);
@@ -147,7 +147,7 @@ public class PaymentGatewayResource extends ComboPaymentResource {
 
         validatePaymentMethodForAccount(accountId, paymentMethodId, callContext);
 
-        final Iterable<PluginProperty> customFields = extractPluginProperties(json.getCustomFields());
+        final Iterable<PluginProperty> customFields = extractPluginProperties(json.getFormFields());
 
         final HostedPaymentPageFormDescriptor descriptor = paymentGatewayApi.buildFormDescriptorWithPaymentControl(account, paymentMethodId, customFields, pluginProperties, paymentOptions, callContext);
         final HostedPaymentPageFormDescriptorJson result = new HostedPaymentPageFormDescriptorJson(descriptor);
@@ -160,7 +160,7 @@ public class PaymentGatewayResource extends ComboPaymentResource {
     @Path("/" + NOTIFICATION + "/{" + QUERY_PAYMENT_PLUGIN_NAME + ":" + ANYTHING_PATTERN + "}")
     @Consumes(WILDCARD)
     @Produces(APPLICATION_JSON)
-    @ApiOperation(value = "Process a gateway notification", notes = "The response is built by the appropriate plugin", response = GatewayNotificationJson.class)
+    @ApiOperation(value = "Process a gateway notification", notes = "The response is built by the appropriate plugin")
     @ApiResponses(value = {})
     public Response processNotification(final String body,
                                         @PathParam(PATH_PAYMENT_PLUGIN_NAME) final String pluginName,
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentMethodResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentMethodResource.java
index 027fb11..8f6f98c 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentMethodResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentMethodResource.java
@@ -338,7 +338,7 @@ public class PaymentMethodResource extends JaxRsResourceBase {
     @ApiOperation(value = "Remove custom fields from payment method")
     @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid payment method id supplied")})
     public Response deleteCustomFields(@PathParam("paymentMethodId") final UUID paymentMethodId,
-                                       @QueryParam(QUERY_CUSTOM_FIELD) final List<String> customFieldList,
+                                       @QueryParam(QUERY_CUSTOM_FIELD) final List<UUID> customFieldList,
                                        @HeaderParam(HDR_CREATED_BY) final String createdBy,
                                        @HeaderParam(HDR_REASON) final String reason,
                                        @HeaderParam(HDR_COMMENT) final String comment,
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentResource.java
index b448674..10fc50b 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/PaymentResource.java
@@ -837,7 +837,7 @@ public class PaymentResource extends ComboPaymentResource {
     @ApiOperation(value = "Remove custom fields from payment payment")
     @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid payment id supplied")})
     public Response deleteCustomFields(@PathParam(ID_PARAM_NAME) final UUID id,
-                                       @QueryParam(QUERY_CUSTOM_FIELD) final List<String> customFieldList,
+                                       @QueryParam(QUERY_CUSTOM_FIELD) final List<UUID> customFieldList,
                                        @HeaderParam(HDR_CREATED_BY) final String createdBy,
                                        @HeaderParam(HDR_REASON) final String reason,
                                        @HeaderParam(HDR_COMMENT) final String comment,
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/SubscriptionResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/SubscriptionResource.java
index 5885f9d..bd34e34 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/SubscriptionResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/SubscriptionResource.java
@@ -908,7 +908,7 @@ public class SubscriptionResource extends JaxRsResourceBase {
     @ApiOperation(value = "Remove custom fields from subscription")
     @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid subscription id supplied")})
     public Response deleteCustomFields(@PathParam(ID_PARAM_NAME) final UUID id,
-                                       @QueryParam(QUERY_CUSTOM_FIELD) final List<String> customFieldList,
+                                       @QueryParam(QUERY_CUSTOM_FIELD) final List<UUID> customFieldList,
                                        @HeaderParam(HDR_CREATED_BY) final String createdBy,
                                        @HeaderParam(HDR_REASON) final String reason,
                                        @HeaderParam(HDR_COMMENT) final String comment,
diff --git a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TransactionResource.java b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TransactionResource.java
index bba7dcb..a90182f 100644
--- a/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TransactionResource.java
+++ b/jaxrs/src/main/java/org/killbill/billing/jaxrs/resources/TransactionResource.java
@@ -202,7 +202,7 @@ public class TransactionResource extends JaxRsResourceBase {
     @ApiOperation(value = "Remove custom fields from payment transaction")
     @ApiResponses(value = {@ApiResponse(code = 400, message = "Invalid transaction id supplied")})
     public Response deleteCustomFields(@PathParam(ID_PARAM_NAME) final UUID id,
-                                       @QueryParam(QUERY_CUSTOM_FIELD) final List<String> customFieldList,
+                                       @QueryParam(QUERY_CUSTOM_FIELD) final List<UUID> customFieldList,
                                        @HeaderParam(HDR_CREATED_BY) final String createdBy,
                                        @HeaderParam(HDR_REASON) final String reason,
                                        @HeaderParam(HDR_COMMENT) final String comment,
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCache.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCache.java
index ee38da4..342ad53 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCache.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCache.java
@@ -17,6 +17,8 @@
 
 package org.killbill.billing.jaxrs;
 
+import java.io.File;
+import java.nio.charset.Charset;
 import java.util.UUID;
 
 import org.joda.time.LocalDate;
@@ -28,11 +30,11 @@ import org.killbill.billing.catalog.api.Catalog;
 import org.killbill.billing.catalog.api.PriceListSet;
 import org.killbill.billing.catalog.api.ProductCategory;
 import org.killbill.billing.client.RequestOptions;
-import org.killbill.billing.client.model.Account;
-import org.killbill.billing.client.model.PaymentMethod;
-import org.killbill.billing.client.model.PaymentMethodPluginDetail;
-import org.killbill.billing.client.model.Subscription;
-import org.killbill.billing.client.model.Tenant;
+import org.killbill.billing.client.model.gen.Account;
+import org.killbill.billing.client.model.gen.PaymentMethod;
+import org.killbill.billing.client.model.gen.PaymentMethodPluginDetail;
+import org.killbill.billing.client.model.gen.Subscription;
+import org.killbill.billing.client.model.gen.Tenant;
 import org.killbill.billing.overdue.api.OverdueConfig;
 import org.killbill.billing.util.cache.Cachable.CacheType;
 import org.killbill.billing.util.cache.CacheController;
@@ -40,6 +42,7 @@ import org.killbill.billing.util.config.tenant.PerTenantConfig;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
+import com.google.common.io.Files;
 import com.google.common.io.Resources;
 
 import static org.testng.Assert.assertFalse;
@@ -57,7 +60,7 @@ public class TestCache extends TestJaxrsBase {
         Assert.assertEquals(cache.size(), 1);
 
         // invalidate the specified cache
-        killBillClient.invalidateCacheByName(CacheType.RECORD_ID.getCacheName(), requestOptions);
+        adminApi.invalidatesCache(CacheType.RECORD_ID.getCacheName(), requestOptions);
 
         // verify that now the cache is empty and has no keys stored
         Assert.assertEquals(cache.size(), 0);
@@ -72,7 +75,7 @@ public class TestCache extends TestJaxrsBase {
         Assert.assertEquals(cache.size(), 1);
 
         // invalidate all caches
-        killBillClient.invalidateAllCaches(requestOptions);
+        adminApi.invalidatesCache(null, requestOptions);
 
         // verify that now the cache is empty and has no keys stored
         Assert.assertEquals(cache.size(), 0);
@@ -94,7 +97,7 @@ public class TestCache extends TestJaxrsBase {
         assertTrue(accountBcdCache.isKeyInCache(input.getAccountId()));
 
         // invalidate caches per account level by accountId
-        killBillClient.invalidateCacheByAccount(input.getAccountId().toString(), requestOptions);
+        adminApi.invalidatesCacheByAccount(input.getAccountId(), requestOptions);
 
         // verify that now the caches don't have the accountId key stored
         Assert.assertFalse(accountRecordIdCache.isKeyInCache(input.getAccountId().toString()));
@@ -103,7 +106,7 @@ public class TestCache extends TestJaxrsBase {
     }
 
     // Flaky, see https://github.com/killbill/killbill/issues/860
-    @Test(groups = "slow", description = "Can Invalidate (clear) all Tenant Caches for current Tenant", retryAnalyzer = FlakyRetryAnalyzer.class)
+    @Test(groups = "slow") //, description = "Can Invalidate (clear) all Tenant Caches for current Tenant", retryAnalyzer = FlakyRetryAnalyzer.class)
     public void testInvalidateCacheByTenant() throws Exception {
         // creating a new Tenant for this test
         final String testApiKey = "testApiKey";
@@ -112,7 +115,7 @@ public class TestCache extends TestJaxrsBase {
         tenant.setApiKey(testApiKey);
         tenant.setApiSecret(testApiSecret);
         loginTenant(testApiKey, testApiSecret);
-        Tenant currentTenant = killBillClient.createTenant(tenant, false, requestOptions);
+        Tenant currentTenant = tenantApi.createTenant(tenant, false, requestOptions);
 
         // using custom RequestOptions with the new Tenant created before
         RequestOptions inputOptions = RequestOptions.builder()
@@ -124,7 +127,10 @@ public class TestCache extends TestJaxrsBase {
                                                     .build();
 
         // Uploading the test catalog using the new Tenant created before
-        killBillClient.uploadXMLCatalog(Resources.getResource("SpyCarAdvanced.xml").getPath(), inputOptions);
+        final String catalogPath = Resources.getResource("SpyCarAdvanced.xml").getPath();
+        final File catalogFile = new File(catalogPath);
+        final String body = Files.toString(catalogFile, Charset.forName("UTF-8"));
+        catalogApi.uploadCatalogXml(body, inputOptions);
 
         // creating an Account with PaymentMethod and a Subscription
         createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoiceWithInputOptions(inputOptions);
@@ -142,7 +148,7 @@ public class TestCache extends TestJaxrsBase {
         assertTrue(tenantRecordIdCache.isKeyInCache(currentTenant.getTenantId().toString()));
         final Long tenantRecordId = tenantRecordIdCache.get(currentTenant.getTenantId().toString(), null);
 
-        assertTrue(hasKeysByTenantRecordId(tenantPaymentStateMachineConfigCache, tenantRecordId.toString()));
+        //assertTrue(hasKeysByTenantRecordId(tenantPaymentStateMachineConfigCache, tenantRecordId.toString()));
         assertTrue(tenantCache.isKeyInCache(testApiKey));
         assertTrue(hasKeysByTenantRecordId(tenantKvCache, tenantRecordId.toString()));
         assertTrue(tenantConfigCache.isKeyInCache(tenantRecordId));
@@ -150,11 +156,11 @@ public class TestCache extends TestJaxrsBase {
         assertTrue(tenantCatalogCache.isKeyInCache(tenantRecordId));
 
         // invalidate caches per tenant level
-        killBillClient.invalidateCacheByTenant(inputOptions);
+        adminApi.invalidatesCache(null, inputOptions);
 
         // verify that now the caches don't have the previous values
         assertFalse(tenantRecordIdCache.isKeyInCache(currentTenant.getTenantId().toString()));
-        assertFalse(hasKeysByTenantRecordId(tenantPaymentStateMachineConfigCache, tenantRecordId.toString()));
+        //assertFalse(hasKeysByTenantRecordId(tenantPaymentStateMachineConfigCache, tenantRecordId.toString()));
         assertFalse(tenantCache.isKeyInCache(testApiKey));
         assertFalse(hasKeysByTenantRecordId(tenantKvCache, tenantRecordId.toString()));
         assertFalse(tenantConfigCache.isKeyInCache(tenantRecordId));
@@ -172,12 +178,12 @@ public class TestCache extends TestJaxrsBase {
     }
 
     private void createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoiceWithInputOptions(final RequestOptions inputOptions) throws Exception {
-        Account account = killBillClient.createAccount(getAccount(), inputOptions);
+        Account account = accountApi.createAccount(getAccount(), inputOptions);
 
         final PaymentMethodPluginDetail info = new PaymentMethodPluginDetail();
         info.setProperties(null);
-        final PaymentMethod paymentMethodJson = new PaymentMethod(null, UUID.randomUUID().toString(), account.getAccountId(), true, PLUGIN_NAME, info);
-        killBillClient.createPaymentMethod(paymentMethodJson, inputOptions);
+        final PaymentMethod paymentMethodJson = new PaymentMethod(null, UUID.randomUUID().toString(), account.getAccountId(), true, PLUGIN_NAME, info, null);
+        accountApi.createPaymentMethod(paymentMethodJson, account.getAccountId(), NULL_PLUGIN_NAMES, NULL_PLUGIN_PROPERTIES, inputOptions);
 
         final Subscription subscription = new Subscription();
         subscription.setAccountId(account.getAccountId());
@@ -189,7 +195,7 @@ public class TestCache extends TestJaxrsBase {
 
         clock.resetDeltaFromReality();
         clock.setDay(new LocalDate(2013, 3, 1));
-        final Subscription subscriptionJson = killBillClient.createSubscription(subscription, clock.getUTCToday(), DEFAULT_WAIT_COMPLETION_TIMEOUT_SEC, inputOptions);
+        final Subscription subscriptionJson = subscriptionApi.createSubscription(subscription, null, null, null, NULL_PLUGIN_PROPERTIES, inputOptions);
 
         assertNotNull(subscriptionJson);
         clock.addDays(32);
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCatalog.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCatalog.java
index c5f263b..2df6781 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCatalog.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCatalog.java
@@ -18,7 +18,10 @@
 
 package org.killbill.billing.jaxrs;
 
+import java.io.File;
+import java.io.IOException;
 import java.math.BigDecimal;
+import java.nio.charset.Charset;
 import java.sql.Date;
 import java.util.HashSet;
 import java.util.List;
@@ -26,35 +29,34 @@ import java.util.Set;
 import java.util.UUID;
 
 import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
 import org.killbill.billing.catalog.api.BillingPeriod;
 import org.killbill.billing.catalog.api.Currency;
 import org.killbill.billing.catalog.api.ProductCategory;
 import org.killbill.billing.catalog.api.TimeUnit;
 import org.killbill.billing.client.KillBillClientException;
-import org.killbill.billing.client.KillBillHttpClient;
 import org.killbill.billing.client.RequestOptions;
-import org.killbill.billing.client.model.Catalog;
-import org.killbill.billing.client.model.Plan;
-import org.killbill.billing.client.model.PlanDetail;
-import org.killbill.billing.client.model.Product;
-import org.killbill.billing.client.model.SimplePlan;
-import org.killbill.billing.client.model.Tenant;
-import org.killbill.billing.client.model.Usage;
+import org.killbill.billing.client.model.Catalogs;
+import org.killbill.billing.client.model.gen.Catalog;
+import org.killbill.billing.client.model.gen.Plan;
+import org.killbill.billing.client.model.gen.PlanDetail;
+import org.killbill.billing.client.model.gen.Product;
+import org.killbill.billing.client.model.gen.SimplePlan;
+import org.killbill.billing.client.model.gen.Tenant;
+import org.killbill.billing.client.model.gen.Usage;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.google.common.collect.HashMultimap;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Multimap;
+import com.google.common.io.Files;
 import com.google.common.io.Resources;
 
 public class TestCatalog extends TestJaxrsBase {
 
+
     @Test(groups = "slow", description = "Upload and retrieve a per tenant catalog")
     public void testMultiTenantCatalog() throws Exception {
-        final String versionPath1 = Resources.getResource("SpyCarBasic.xml").getPath();
-        killBillClient.uploadXMLCatalog(versionPath1, requestOptions);
-        String catalog = killBillClient.getXMLCatalog(requestOptions);
+        String catalog = uploadTenantCatalog("SpyCarBasic.xml", true);
         Assert.assertNotNull(catalog);
         //
         // We can't deserialize the VersionedCatalog using our JAXB models because it contains several
@@ -64,21 +66,17 @@ public class TestCatalog extends TestJaxrsBase {
 
     @Test(groups = "slow")
     public void testUploadAndFetchUsageCatlog() throws Exception {
-        final String versionPath1 = Resources.getResource("UsageExperimental.xml").getPath();
-        killBillClient.uploadXMLCatalog(versionPath1, requestOptions);
-        String catalog = killBillClient.getXMLCatalog(requestOptions);
+        String catalog = uploadTenantCatalog("UsageExperimental.xml", true);
         Assert.assertNotNull(catalog);
     }
 
-
     @Test(groups = "slow")
     public void testUploadWithErrors() throws Exception {
-        final String versionPath1 = Resources.getResource("SpyCarBasic.xml").getPath();
-        killBillClient.uploadXMLCatalog(versionPath1, requestOptions);
+        uploadTenantCatalog("SpyCarBasic.xml", false);
 
         // Retry to upload same version
         try {
-            killBillClient.uploadXMLCatalog(versionPath1, requestOptions);
+            uploadTenantCatalog("SpyCarBasic.xml", false);
             Assert.fail("Uploading same version should fail");
         } catch (KillBillClientException e) {
             Assert.assertTrue(e.getMessage().startsWith("Invalid catalog for tenant : "));
@@ -86,14 +84,13 @@ public class TestCatalog extends TestJaxrsBase {
 
         // Try to upload another version with an invalid name (different than orignal name)
         try {
-            final String versionPath2 = Resources.getResource("SpyCarBasicInvalidName.xml").getPath();
-            killBillClient.uploadXMLCatalog(versionPath2, requestOptions);
+            uploadTenantCatalog("SpyCarBasicInvalidName.xml", false);
             Assert.fail("Uploading same version should fail");
         } catch (KillBillClientException e) {
             Assert.assertTrue(e.getMessage().startsWith("Invalid catalog for tenant : "));
         }
 
-        String catalog = killBillClient.getXMLCatalog(requestOptions);
+        String catalog = catalogApi.getCatalogXml(requestOptions);
         Assert.assertNotNull(catalog);
     }
 
@@ -101,10 +98,10 @@ public class TestCatalog extends TestJaxrsBase {
     public void testCatalog() throws Exception {
         final Set<String> allBasePlans = new HashSet<String>();
 
-        final List<Catalog> catalogsJson = killBillClient.getJSONCatalog(requestOptions);
+        final Catalogs catalogsJson = catalogApi.getCatalogJson(null, requestOptions);
 
         Assert.assertEquals(catalogsJson.get(0).getName(), "Firearms");
-        Assert.assertEquals(catalogsJson.get(0).getEffectiveDate(), Date.valueOf("2011-01-01"));
+        Assert.assertEquals(catalogsJson.get(0).getEffectiveDate().toLocalDate(), new LocalDate("2011-01-01"));
         Assert.assertEquals(catalogsJson.get(0).getCurrencies().size(), 3);
         Assert.assertEquals(catalogsJson.get(0).getProducts().size(), 12);
         Assert.assertEquals(catalogsJson.get(0).getPriceLists().size(), 7);
@@ -134,7 +131,7 @@ public class TestCatalog extends TestJaxrsBase {
             }
 
             // Retrieve available products (addons) for that base product
-            final List<PlanDetail> availableAddons = killBillClient.getAvailableAddons(productJson.getName(), requestOptions);
+            final List<PlanDetail> availableAddons = catalogApi.getAvailableAddons(productJson.getName(), null, requestOptions);
             final Set<String> availableAddonsNames = new HashSet<String>();
             for (final PlanDetail planDetailJson : availableAddons) {
                 availableAddonsNames.add(planDetailJson.getProduct());
@@ -143,7 +140,7 @@ public class TestCatalog extends TestJaxrsBase {
         }
 
         // Verify base plans endpoint
-        final List<PlanDetail> basePlans = killBillClient.getBasePlans(requestOptions);
+        final List<PlanDetail> basePlans = catalogApi.getAvailableBasePlans(requestOptions);
         final Set<String> foundBasePlans = new HashSet<String>();
         for (final PlanDetail planDetailJson : basePlans) {
             foundBasePlans.add(planDetailJson.getPlan());
@@ -153,7 +150,7 @@ public class TestCatalog extends TestJaxrsBase {
 
     @Test(groups = "slow", description = "Try to retrieve catalog with an effective date in the past")
     public void testCatalogWithEffectiveDateInThePast() throws Exception {
-        final List<Catalog> catalogsJson = killBillClient.getJSONCatalog(DateTime.parse("2008-01-01"), requestOptions);
+        final List<Catalog> catalogsJson = catalogApi.getCatalogJson(DateTime.parse("2008-01-01"), requestOptions);
         // We expect to see our catalogTest.xml (date in the past returns the first version. See #760
         Assert.assertEquals(catalogsJson.size(), 1);
     }
@@ -161,24 +158,23 @@ public class TestCatalog extends TestJaxrsBase {
     @Test(groups = "slow", description = "Can create a simple Plan into a per-tenant catalog")
     public void testAddSimplePlan() throws Exception {
 
-        killBillClient.addSimplePan(new SimplePlan("foo-monthly", "Foo", ProductCategory.BASE, Currency.USD, BigDecimal.TEN, BillingPeriod.MONTHLY, 0, TimeUnit.UNLIMITED, ImmutableList.<String>of()), requestOptions);
-        List<Catalog> catalogsJson = killBillClient.getJSONCatalog(requestOptions);
-        Assert.assertEquals(catalogsJson.size(),1);
-        Assert.assertEquals(catalogsJson.get(0).getProducts().size(),1);
-        Assert.assertEquals(catalogsJson.get(0).getProducts().get(0).getName(),"Foo");
-        Assert.assertEquals(catalogsJson.get(0).getPriceLists().size(),1);
+        catalogApi.addSimplePlan(new SimplePlan("foo-monthly", "Foo", ProductCategory.BASE, Currency.USD, BigDecimal.TEN, BillingPeriod.MONTHLY, 0, TimeUnit.UNLIMITED, ImmutableList.<String>of()), requestOptions);
+        List<Catalog> catalogsJson = catalogApi.getCatalogJson(null, requestOptions);
+        Assert.assertEquals(catalogsJson.size(), 1);
+        Assert.assertEquals(catalogsJson.get(0).getProducts().size(), 1);
+        Assert.assertEquals(catalogsJson.get(0).getProducts().get(0).getName(), "Foo");
+        Assert.assertEquals(catalogsJson.get(0).getPriceLists().size(), 1);
         Assert.assertEquals(catalogsJson.get(0).getPriceLists().get(0).getName(), "DEFAULT");
         Assert.assertEquals(catalogsJson.get(0).getPriceLists().get(0).getPlans().size(), 1);
         Assert.assertEquals(catalogsJson.get(0).getPriceLists().get(0).getPlans().get(0), "foo-monthly");
 
+        catalogApi.addSimplePlan(new SimplePlan("foo-annual", "Foo", ProductCategory.BASE, Currency.USD, new BigDecimal("100.00"), BillingPeriod.ANNUAL, 0, TimeUnit.UNLIMITED, ImmutableList.<String>of()), requestOptions);
 
-        killBillClient.addSimplePan(new SimplePlan("foo-annual", "Foo", ProductCategory.BASE, Currency.USD, new BigDecimal("100.00"), BillingPeriod.ANNUAL, 0, TimeUnit.UNLIMITED, ImmutableList.<String>of()), requestOptions);
-
-        catalogsJson = killBillClient.getJSONCatalog(requestOptions);
-        Assert.assertEquals(catalogsJson.size(),1);
-        Assert.assertEquals(catalogsJson.get(0).getProducts().size(),1);
-        Assert.assertEquals(catalogsJson.get(0).getProducts().get(0).getName(),"Foo");
-        Assert.assertEquals(catalogsJson.get(0).getPriceLists().size(),1);
+        catalogsJson = catalogApi.getCatalogJson(null, requestOptions);
+        Assert.assertEquals(catalogsJson.size(), 1);
+        Assert.assertEquals(catalogsJson.get(0).getProducts().size(), 1);
+        Assert.assertEquals(catalogsJson.get(0).getProducts().get(0).getName(), "Foo");
+        Assert.assertEquals(catalogsJson.get(0).getPriceLists().size(), 1);
         Assert.assertEquals(catalogsJson.get(0).getPriceLists().get(0).getName(), "DEFAULT");
         Assert.assertEquals(catalogsJson.get(0).getPriceLists().get(0).getPlans().size(), 2);
 
@@ -191,34 +187,33 @@ public class TestCatalog extends TestJaxrsBase {
         otherTenantNoKBDefault.setApiKey(UUID.randomUUID().toString());
         otherTenantNoKBDefault.setApiSecret(UUID.randomUUID().toString());
 
-        killBillClient.createTenant(otherTenantNoKBDefault, false, requestOptions);
+        tenantApi.createTenant(otherTenantNoKBDefault, false, requestOptions);
 
         final RequestOptions requestOptionsOtherTenant = requestOptions.extend()
                                                                        .withTenantApiKey(otherTenantNoKBDefault.getApiKey())
                                                                        .withTenantApiSecret(otherTenantNoKBDefault.getApiSecret())
                                                                        .build();
         // Verify the template catalog is not returned
-        List<Catalog> catalogsJson = killBillClient.getJSONCatalog(requestOptionsOtherTenant);
+        List<Catalog> catalogsJson = catalogApi.getCatalogJson(null, requestOptionsOtherTenant);
         Assert.assertEquals(catalogsJson.size(), 0);
 
-        killBillClient.addSimplePan(new SimplePlan("foo-monthly", "Foo", ProductCategory.BASE, Currency.USD, BigDecimal.TEN, BillingPeriod.MONTHLY, 0, TimeUnit.UNLIMITED, ImmutableList.<String>of()), requestOptionsOtherTenant);
-        catalogsJson = killBillClient.getJSONCatalog(requestOptionsOtherTenant);
-        Assert.assertEquals(catalogsJson.size(),1);
-        Assert.assertEquals(catalogsJson.get(0).getProducts().size(),1);
-        Assert.assertEquals(catalogsJson.get(0).getProducts().get(0).getName(),"Foo");
-        Assert.assertEquals(catalogsJson.get(0).getPriceLists().size(),1);
+        catalogApi.addSimplePlan(new SimplePlan("foo-monthly", "Foo", ProductCategory.BASE, Currency.USD, BigDecimal.TEN, BillingPeriod.MONTHLY, 0, TimeUnit.UNLIMITED, ImmutableList.<String>of()), requestOptionsOtherTenant);
+        catalogsJson = catalogApi.getCatalogJson(null, requestOptionsOtherTenant);
+        Assert.assertEquals(catalogsJson.size(), 1);
+        Assert.assertEquals(catalogsJson.get(0).getProducts().size(), 1);
+        Assert.assertEquals(catalogsJson.get(0).getProducts().get(0).getName(), "Foo");
+        Assert.assertEquals(catalogsJson.get(0).getPriceLists().size(), 1);
         Assert.assertEquals(catalogsJson.get(0).getPriceLists().get(0).getName(), "DEFAULT");
         Assert.assertEquals(catalogsJson.get(0).getPriceLists().get(0).getPlans().size(), 1);
         Assert.assertEquals(catalogsJson.get(0).getPriceLists().get(0).getPlans().get(0), "foo-monthly");
 
+        catalogApi.addSimplePlan(new SimplePlan("foo-annual", "Foo", ProductCategory.BASE, Currency.USD, new BigDecimal("100.00"), BillingPeriod.ANNUAL, 0, TimeUnit.UNLIMITED, ImmutableList.<String>of()), requestOptionsOtherTenant);
 
-        killBillClient.addSimplePan(new SimplePlan("foo-annual", "Foo", ProductCategory.BASE, Currency.USD, new BigDecimal("100.00"), BillingPeriod.ANNUAL, 0, TimeUnit.UNLIMITED, ImmutableList.<String>of()), requestOptionsOtherTenant);
-
-        catalogsJson = killBillClient.getJSONCatalog(requestOptionsOtherTenant);
-        Assert.assertEquals(catalogsJson.size(),1);
-        Assert.assertEquals(catalogsJson.get(0).getProducts().size(),1);
-        Assert.assertEquals(catalogsJson.get(0).getProducts().get(0).getName(),"Foo");
-        Assert.assertEquals(catalogsJson.get(0).getPriceLists().size(),1);
+        catalogsJson = catalogApi.getCatalogJson(null, requestOptionsOtherTenant);
+        Assert.assertEquals(catalogsJson.size(), 1);
+        Assert.assertEquals(catalogsJson.get(0).getProducts().size(), 1);
+        Assert.assertEquals(catalogsJson.get(0).getProducts().get(0).getName(), "Foo");
+        Assert.assertEquals(catalogsJson.get(0).getPriceLists().size(), 1);
         Assert.assertEquals(catalogsJson.get(0).getPriceLists().get(0).getName(), "DEFAULT");
         Assert.assertEquals(catalogsJson.get(0).getPriceLists().get(0).getPlans().size(), 2);
     }
@@ -226,14 +221,14 @@ public class TestCatalog extends TestJaxrsBase {
     @Test(groups = "slow")
     public void testCatalogDeletionInTestMode() throws Exception {
 
-        killBillClient.addSimplePan(new SimplePlan("something-monthly", "Something", ProductCategory.BASE, Currency.USD, BigDecimal.TEN, BillingPeriod.MONTHLY, 0, TimeUnit.UNLIMITED, ImmutableList.<String>of()), requestOptions);
-        List<Catalog> catalogsJson = killBillClient.getJSONCatalog(requestOptions);
+        catalogApi.addSimplePlan(new SimplePlan("something-monthly", "Something", ProductCategory.BASE, Currency.USD, BigDecimal.TEN, BillingPeriod.MONTHLY, 0, TimeUnit.UNLIMITED, ImmutableList.<String>of()), requestOptions);
+        List<Catalog> catalogsJson = catalogApi.getCatalogJson(null, requestOptions);
         Assert.assertEquals(catalogsJson.size(), 1);
 
-        killBillClient.deleteCatalog(requestOptions);
+        catalogApi.deleteCatalog(requestOptions);
 
         // Verify that we see no catalog -- and in particular not the KB default catalog
-        catalogsJson = killBillClient.getJSONCatalog(requestOptions);
+        catalogsJson = catalogApi.getCatalogJson(null, requestOptions);
         Assert.assertEquals(catalogsJson.size(), 0);
 
     }
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestChargeback.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestChargeback.java
index 405c415..7f72020 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestChargeback.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestChargeback.java
@@ -25,14 +25,14 @@ import java.util.UUID;
 import org.killbill.billing.catalog.api.BillingPeriod;
 import org.killbill.billing.catalog.api.ProductCategory;
 import org.killbill.billing.client.KillBillClientException;
-import org.killbill.billing.client.model.Account;
-import org.killbill.billing.client.model.Invoice;
-import org.killbill.billing.client.model.InvoicePayment;
-import org.killbill.billing.client.model.InvoicePaymentTransaction;
 import org.killbill.billing.client.model.InvoicePayments;
-import org.killbill.billing.client.model.Payment;
-import org.killbill.billing.client.model.PaymentTransaction;
-import org.killbill.billing.client.model.Subscription;
+import org.killbill.billing.client.model.gen.Account;
+import org.killbill.billing.client.model.gen.Invoice;
+import org.killbill.billing.client.model.gen.InvoicePayment;
+import org.killbill.billing.client.model.gen.InvoicePaymentTransaction;
+import org.killbill.billing.client.model.gen.PaymentTransaction;
+import org.killbill.billing.client.model.gen.Subscription;
+import org.killbill.billing.payment.api.TransactionStatus;
 import org.killbill.billing.payment.api.TransactionType;
 import org.testng.Assert;
 import org.testng.annotations.Test;
@@ -49,13 +49,13 @@ public class TestChargeback extends TestJaxrsBase {
 
     @Test(groups = "slow", description = "Can create a chargeback")
     public void testAddChargeback() throws Exception {
-        final Payment payment = createAccountWithInvoiceAndPayment();
+        final InvoicePayment payment = createAccountWithInvoiceAndPayment();
         createAndVerifyChargeback(payment);
     }
 
     @Test(groups = "slow", description = "Can create multiple chargebacks")
     public void testMultipleChargeback() throws Exception {
-        final Payment payment = createAccountWithInvoiceAndPayment();
+        final InvoicePayment payment = createAccountWithInvoiceAndPayment();
 
         // We get a 249.95 payment so we do 4 chargeback and then the fifth should fail
         final InvoicePaymentTransaction input = new InvoicePaymentTransaction();
@@ -63,22 +63,22 @@ public class TestChargeback extends TestJaxrsBase {
         input.setAmount(new BigDecimal("50.00"));
         int count = 4;
         while (count-- > 0) {
-            assertNotNull(killBillClient.createInvoicePaymentChargeback(input, createdBy, reason, comment));
+            assertNotNull(invoicePaymentApi.createChargeback(input, payment.getPaymentId(), requestOptions));
         }
 
         // Last attempt should fail because this is more than the Payment
-        final InvoicePayment foo = killBillClient.createInvoicePaymentChargeback(input, createdBy, reason, comment);
-        final List<InvoicePayment> payments = killBillClient.getInvoicePaymentsForAccount(payment.getAccountId());
-        final List<PaymentTransaction> transactions = getPaymentTransactions(payments, TransactionType.CHARGEBACK.toString());
+        final InvoicePayment foo = invoicePaymentApi.createChargeback(input, payment.getPaymentId(), requestOptions);
+        final InvoicePayments payments = accountApi.getInvoicePayments(payment.getAccountId(), NULL_PLUGIN_PROPERTIES, requestOptions);
+        final List<PaymentTransaction> transactions = getInvoicePaymentTransactions(payments, TransactionType.CHARGEBACK);
         Assert.assertEquals(transactions.size(), 5);
         int found = 0;
         for (final PaymentTransaction transaction : transactions) {
-            if (transaction.getStatus().equals("SUCCESS")) {
+            if (transaction.getStatus().equals(TransactionStatus.SUCCESS)) {
                 assertTrue(transaction.getAmount().compareTo(input.getAmount()) == 0);
                 assertEquals(transaction.getPaymentId(), input.getPaymentId());
                 found++;
             } else {
-                assertEquals(transaction.getStatus(), "PAYMENT_FAILURE");
+                assertEquals(transaction.getStatus(), TransactionStatus.PAYMENT_FAILURE);
                 found++;
             }
         }
@@ -87,17 +87,17 @@ public class TestChargeback extends TestJaxrsBase {
 
     @Test(groups = "slow", description = "Can add a chargeback for deleted payment methods")
     public void testAddChargebackForDeletedPaymentMethod() throws Exception {
-        final Payment payment = createAccountWithInvoiceAndPayment();
+        final InvoicePayment payment = createAccountWithInvoiceAndPayment();
 
         // Check the payment method exists
-        assertEquals(killBillClient.getAccount(payment.getAccountId()).getPaymentMethodId(), payment.getPaymentMethodId());
-        assertEquals(killBillClient.getPaymentMethod(payment.getPaymentMethodId()).getAccountId(), payment.getAccountId());
+        assertEquals(accountApi.getAccount(payment.getAccountId(), requestOptions).getPaymentMethodId(), payment.getPaymentMethodId());
+        assertEquals(paymentMethodApi.getPaymentMethod(payment.getPaymentMethodId(), NULL_PLUGIN_PROPERTIES, requestOptions).getAccountId(), payment.getAccountId());
 
         // Delete the payment method
-        killBillClient.deletePaymentMethod(payment.getPaymentMethodId(), true, false, createdBy, reason, comment);
+        paymentMethodApi.deletePaymentMethod(payment.getPaymentMethodId(), true, false, NULL_PLUGIN_PROPERTIES, requestOptions);
 
         // Check the payment method was deleted
-        assertNull(killBillClient.getAccount(payment.getAccountId()).getPaymentMethodId());
+        assertNull(accountApi.getAccount(payment.getAccountId(), requestOptions).getPaymentMethodId());
 
         createAndVerifyChargeback(payment);
     }
@@ -109,7 +109,7 @@ public class TestChargeback extends TestJaxrsBase {
         input.setPaymentId(input.getPaymentId());
         input.setAmount(BigDecimal.TEN);
         try {
-            killBillClient.createInvoicePaymentChargeback(input, createdBy, reason, comment);
+            invoicePaymentApi.createChargeback(input, input.getPaymentId(), requestOptions);
             fail();
         } catch (NullPointerException e) {
         } catch (KillBillClientException e) {
@@ -119,13 +119,13 @@ public class TestChargeback extends TestJaxrsBase {
 
     @Test(groups = "slow", description = "Cannot add a badly formatted chargeback")
     public void testBadRequest() throws Exception {
-        final Payment payment = createAccountWithInvoiceAndPayment();
+        final InvoicePayment payment = createAccountWithInvoiceAndPayment();
 
         final InvoicePaymentTransaction input = new InvoicePaymentTransaction();
         input.setPaymentId(payment.getPaymentId());
 
         try {
-            killBillClient.createInvoicePaymentChargeback(input, createdBy, reason, comment);
+            invoicePaymentApi.createChargeback(input, payment.getPaymentId(), requestOptions);
             fail();
         } catch (final KillBillClientException e) {
         }
@@ -133,33 +133,33 @@ public class TestChargeback extends TestJaxrsBase {
 
     @Test(groups = "slow", description = "Accounts can have zero chargeback")
     public void testNoChargebackForAccount() throws Exception {
-        final List<InvoicePayment> payments = killBillClient.getInvoicePaymentsForAccount(UUID.randomUUID());
-        final List<PaymentTransaction> transactions = getPaymentTransactions(payments, TransactionType.CHARGEBACK.toString());
+        final List<InvoicePayment> payments = accountApi.getInvoicePayments(UUID.randomUUID(), NULL_PLUGIN_PROPERTIES, requestOptions);
+        final List<PaymentTransaction> transactions = getInvoicePaymentTransactions(payments, TransactionType.CHARGEBACK);
         Assert.assertEquals(transactions.size(), 0);
     }
 
-    private void createAndVerifyChargeback(final Payment payment) throws KillBillClientException {
+    private void createAndVerifyChargeback(final InvoicePayment payment) throws KillBillClientException {
         // Create the chargeback
         final InvoicePaymentTransaction chargeback = new InvoicePaymentTransaction();
         chargeback.setPaymentId(payment.getPaymentId());
         chargeback.setAmount(BigDecimal.TEN);
 
-        final InvoicePayment chargebackJson = killBillClient.createInvoicePaymentChargeback(chargeback, createdBy, reason, comment);
-        final List<PaymentTransaction> chargebackTransactions = getPaymentTransactions(ImmutableList.of(chargebackJson), TransactionType.CHARGEBACK.toString());
+        final InvoicePayment chargebackJson = invoicePaymentApi.createChargeback(chargeback, payment.getPaymentId(), requestOptions);
+        final List<PaymentTransaction> chargebackTransactions = getInvoicePaymentTransactions(ImmutableList.of(chargebackJson), TransactionType.CHARGEBACK);
         assertEquals(chargebackTransactions.size(), 1);
 
         assertEquals(chargebackTransactions.get(0).getAmount().compareTo(chargeback.getAmount()), 0);
         assertEquals(chargebackTransactions.get(0).getPaymentId(), chargeback.getPaymentId());
 
         // Find the chargeback by account
-        final List<InvoicePayment> payments = killBillClient.getInvoicePaymentsForAccount(payment.getAccountId());
-        final List<PaymentTransaction> transactions = getPaymentTransactions(payments, TransactionType.CHARGEBACK.toString());
+        final List<InvoicePayment> payments = accountApi.getInvoicePayments(payment.getAccountId(), NULL_PLUGIN_PROPERTIES, requestOptions);
+        final List<PaymentTransaction> transactions = getInvoicePaymentTransactions(payments, TransactionType.CHARGEBACK);
         Assert.assertEquals(transactions.size(), 1);
         assertEquals(transactions.get(0).getAmount().compareTo(chargeback.getAmount()), 0);
         assertEquals(transactions.get(0).getPaymentId(), chargeback.getPaymentId());
     }
 
-    private Payment createAccountWithInvoiceAndPayment() throws Exception {
+    private InvoicePayment createAccountWithInvoiceAndPayment() throws Exception {
         final Invoice invoice = createAccountWithInvoice();
         return getPayment(invoice);
     }
@@ -169,8 +169,8 @@ public class TestChargeback extends TestJaxrsBase {
         final Account accountJson = createAccountWithDefaultPaymentMethod();
 
         // Create subscription
-        final Subscription subscriptionJson = createEntitlement(accountJson.getAccountId(), "6253283", "Shotgun",
-                                                                ProductCategory.BASE, BillingPeriod.MONTHLY, true);
+        final Subscription subscriptionJson = createSubscription(accountJson.getAccountId(), "6253283", "Shotgun",
+                                                                 ProductCategory.BASE, BillingPeriod.MONTHLY, true);
         assertNotNull(subscriptionJson);
 
         // Move after the trial period to trigger an invoice with a non-zero invoice item
@@ -178,7 +178,7 @@ public class TestChargeback extends TestJaxrsBase {
         crappyWaitForLackOfProperSynchonization();
 
         // Retrieve the invoice
-        final List<Invoice> invoices = killBillClient.getInvoicesForAccount(accountJson.getAccountId());
+        final List<Invoice> invoices = accountApi.getInvoices(accountJson.getAccountId(), requestOptions);
         // We should have two invoices, one for the trial (zero dollar amount) and one for the first month
         assertEquals(invoices.size(), 2);
         assertTrue(invoices.get(1).getAmount().doubleValue() > 0);
@@ -186,8 +186,8 @@ public class TestChargeback extends TestJaxrsBase {
         return invoices.get(1);
     }
 
-    private Payment getPayment(final Invoice invoice) throws KillBillClientException {
-        final InvoicePayments payments = killBillClient.getInvoicePayment(invoice.getInvoiceId());
+    private InvoicePayment getPayment(final Invoice invoice) throws KillBillClientException {
+        final InvoicePayments payments = invoiceApi.getPayments(invoice.getInvoiceId(), requestOptions);
         assertNotNull(payments);
         assertEquals(payments.size(), 1);
         return payments.get(0);
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCustomField.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCustomField.java
index c66ff3b..b7b6886 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCustomField.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestCustomField.java
@@ -24,9 +24,9 @@ import javax.annotation.Nullable;
 
 import org.killbill.billing.ObjectType;
 import org.killbill.billing.client.KillBillClientException;
-import org.killbill.billing.client.model.Account;
-import org.killbill.billing.client.model.CustomField;
 import org.killbill.billing.client.model.CustomFields;
+import org.killbill.billing.client.model.gen.Account;
+import org.killbill.billing.client.model.gen.CustomField;
 import org.killbill.billing.util.api.AuditLevel;
 import org.testng.Assert;
 import org.testng.annotations.Test;
@@ -35,16 +35,17 @@ import com.google.common.collect.ImmutableList;
 
 public class TestCustomField extends TestJaxrsBase {
 
-
     @Test(groups = "slow", description = "Can create/modify/delete custom fields")
     public void testBasicCustomFields() throws Exception {
         final Account account = createAccount();
         final CustomField customField = new CustomField();
         customField.setName("MyName");
         customField.setValue("InitialValue");
-        killBillClient.createAccountCustomField(account.getAccountId(), customField, requestOptions);
+        final CustomFields input = new CustomFields();
+        input.add(customField);
+        accountApi.createCustomFields(account.getAccountId(), input, requestOptions);
 
-        CustomFields allCustomFields = killBillClient.getCustomFields(requestOptions);
+        CustomFields allCustomFields = accountApi.getCustomFields(account.getAccountId(), requestOptions);
         Assert.assertEquals(allCustomFields.size(), 1);
         Assert.assertEquals(allCustomFields.get(0).getName(), "MyName");
         Assert.assertEquals(allCustomFields.get(0).getValue(), "InitialValue");
@@ -52,32 +53,38 @@ public class TestCustomField extends TestJaxrsBase {
         final CustomField customFieldModified = new CustomField();
         customFieldModified.setCustomFieldId(allCustomFields.get(0).getCustomFieldId());
         customFieldModified.setValue("NewValue");
-        killBillClient.modifyAccountCustomFields(account.getAccountId(), ImmutableList.of(customFieldModified), requestOptions);
+        input.clear();
+        input.add(customFieldModified);
+        accountApi.modifyCustomFields(account.getAccountId(), input, requestOptions);
 
-        allCustomFields = killBillClient.getCustomFields(requestOptions);
+        allCustomFields = accountApi.getCustomFields(account.getAccountId(), requestOptions);
         Assert.assertEquals(allCustomFields.size(), 1);
         Assert.assertEquals(allCustomFields.get(0).getName(), "MyName");
         Assert.assertEquals(allCustomFields.get(0).getValue(), "NewValue");
 
-        killBillClient.deleteAccountCustomField(account.getAccountId(), allCustomFields.get(0).getCustomFieldId(), requestOptions);
-        allCustomFields = killBillClient.getCustomFields(requestOptions);
+        accountApi.deleteCustomFields(account.getAccountId(), ImmutableList.<UUID>of(allCustomFields.get(0).getCustomFieldId()), requestOptions);
+        allCustomFields = accountApi.getCustomFields(account.getAccountId(), requestOptions);
         Assert.assertEquals(allCustomFields.size(), 0);
     }
 
-        @Test(groups = "slow", description = "Can paginate through all custom fields")
+    @Test(groups = "slow", description = "Can paginate through all custom fields")
     public void testCustomFieldsPagination() throws Exception {
         final Account account = createAccount();
+
+        final CustomFields input = new CustomFields();
+
         for (int i = 0; i < 5; i++) {
             final CustomField customField = new CustomField();
             customField.setName(UUID.randomUUID().toString().substring(0, 5));
             customField.setValue(UUID.randomUUID().toString().substring(0, 5));
-            killBillClient.createAccountCustomField(account.getAccountId(), customField, requestOptions);
+            input.add(customField);
         }
+        accountApi.createCustomFields(account.getAccountId(), input, requestOptions);
 
-        final CustomFields allCustomFields = killBillClient.getCustomFields(requestOptions);
+        final CustomFields allCustomFields = accountApi.getCustomFields(account.getAccountId(), requestOptions);
         Assert.assertEquals(allCustomFields.size(), 5);
 
-        CustomFields page = killBillClient.getCustomFields(0L, 1L, requestOptions);
+        CustomFields page = customFieldApi.getCustomFields(0L, 1L, AuditLevel.NONE, requestOptions);
         for (int i = 0; i < 5; i++) {
             Assert.assertNotNull(page);
             Assert.assertEquals(page.size(), 1);
@@ -92,21 +99,21 @@ public class TestCustomField extends TestJaxrsBase {
             doSearchCustomField(customField.getValue(), customField);
         }
 
-        final CustomFields customFields = killBillClient.searchCustomFields(ObjectType.ACCOUNT.toString(), requestOptions);
+        final CustomFields customFields = customFieldApi.searchCustomFields(ObjectType.ACCOUNT.toString(), requestOptions);
         Assert.assertEquals(customFields.size(), 5);
         Assert.assertEquals(customFields.getPaginationCurrentOffset(), 0);
         Assert.assertEquals(customFields.getPaginationTotalNbRecords(), 5);
         Assert.assertEquals(customFields.getPaginationMaxNbRecords(), 5);
 
-        final CustomFields allAccountCustomFields = killBillClient.getAllAccountCustomFields(account.getAccountId(), null, AuditLevel.FULL, requestOptions);
+        final CustomFields allAccountCustomFields = accountApi.getAllCustomFields(account.getAccountId(), null, AuditLevel.FULL, requestOptions);
         Assert.assertEquals(allAccountCustomFields.size(), 5);
 
-        final CustomFields allBundleCustomFieldsForAccount = killBillClient.getAllAccountCustomFields(account.getAccountId(), ObjectType.ACCOUNT.name(), AuditLevel.FULL, requestOptions);
+        final CustomFields allBundleCustomFieldsForAccount = accountApi.getAllCustomFields(account.getAccountId(), ObjectType.ACCOUNT, AuditLevel.FULL, requestOptions);
         Assert.assertEquals(allBundleCustomFieldsForAccount.size(), 5);
     }
 
     private void doSearchCustomField(final String searchKey, @Nullable final CustomField expectedCustomField) throws KillBillClientException {
-        final CustomFields customFields = killBillClient.searchCustomFields(searchKey, requestOptions);
+        final CustomFields customFields = customFieldApi.searchCustomFields(searchKey, requestOptions);
         if (expectedCustomField == null) {
             Assert.assertTrue(customFields.isEmpty());
             Assert.assertEquals(customFields.getPaginationCurrentOffset(), 0);
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestExceptions.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestExceptions.java
index fa7c31f..dab9724 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestExceptions.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestExceptions.java
@@ -23,9 +23,9 @@ import java.util.List;
 
 import org.killbill.billing.ErrorCode;
 import org.killbill.billing.client.KillBillClientException;
-import org.killbill.billing.client.model.Account;
-import org.killbill.billing.client.model.InvoicePayment;
-import org.killbill.billing.client.model.InvoicePaymentTransaction;
+import org.killbill.billing.client.model.gen.Account;
+import org.killbill.billing.client.model.gen.InvoicePayment;
+import org.killbill.billing.client.model.gen.InvoicePaymentTransaction;
 import org.killbill.billing.invoice.api.InvoiceApiException;
 import org.testng.Assert;
 import org.testng.annotations.Test;
@@ -34,16 +34,16 @@ import static org.testng.Assert.fail;
 
 public class TestExceptions extends TestJaxrsBase {
 
-    @Test(groups = "slow", enabled = false)
+    @Test(groups = "slow", enabled=false)
     public void testExceptionMapping() throws Exception {
         final Account account = createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice();
-        final List<InvoicePayment> payments = killBillClient.getInvoicePaymentsForAccount(account.getAccountId());
+        final List<InvoicePayment> payments = accountApi.getInvoicePayments(account.getAccountId(), NULL_PLUGIN_PROPERTIES, requestOptions);
 
         final InvoicePaymentTransaction input = new InvoicePaymentTransaction();
         input.setPaymentId(payments.get(0).getPaymentId());
         input.setAmount(BigDecimal.TEN.negate());
         try {
-            killBillClient.createInvoicePaymentChargeback(input, createdBy, reason, comment);
+            invoicePaymentApi.createChargeback(input, payments.get(0).getPaymentId(), requestOptions);
             fail();
         } catch (final KillBillClientException e) {
             Assert.assertEquals(e.getBillingException().getClassName(), InvoiceApiException.class.getName());
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestExternalRefund.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestExternalRefund.java
index 80575fd..6d3cf4d 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestExternalRefund.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestExternalRefund.java
@@ -23,19 +23,20 @@ import java.util.UUID;
 
 import org.joda.time.DateTime;
 import org.killbill.billing.client.KillBillClientException;
-import org.killbill.billing.client.model.Account;
-import org.killbill.billing.client.model.Invoice;
-import org.killbill.billing.client.model.InvoiceItem;
-import org.killbill.billing.client.model.InvoicePayment;
-import org.killbill.billing.client.model.InvoicePaymentTransaction;
 import org.killbill.billing.client.model.InvoicePayments;
 import org.killbill.billing.client.model.Invoices;
-import org.killbill.billing.client.model.Payment;
-import org.killbill.billing.client.model.PaymentMethod;
-import org.killbill.billing.client.model.PaymentMethodPluginDetail;
 import org.killbill.billing.client.model.Payments;
+import org.killbill.billing.client.model.gen.Account;
+import org.killbill.billing.client.model.gen.Invoice;
+import org.killbill.billing.client.model.gen.InvoiceItem;
+import org.killbill.billing.client.model.gen.InvoicePayment;
+import org.killbill.billing.client.model.gen.InvoicePaymentTransaction;
+import org.killbill.billing.client.model.gen.Payment;
+import org.killbill.billing.client.model.gen.PaymentMethod;
+import org.killbill.billing.client.model.gen.PaymentMethodPluginDetail;
 import org.killbill.billing.invoice.api.InvoiceItemType;
 import org.killbill.billing.payment.api.TransactionType;
+import org.killbill.billing.util.api.AuditLevel;
 import org.testng.annotations.Test;
 
 import static org.testng.Assert.assertEquals;
@@ -50,20 +51,19 @@ public class TestExternalRefund extends TestJaxrsBase {
         clock.setDeltaFromReality(initialDate.getMillis() - clock.getUTCNow().getMillis());
 
         final Account accountJson = createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice();
-        final Payments paymentsForAccount = killBillClient.getPaymentsForAccount(accountJson.getAccountId(), requestOptions);
+        final Payments paymentsForAccount = accountApi.getPayments(accountJson.getAccountId(), NULL_PLUGIN_PROPERTIES, requestOptions);
         final Payment payment = paymentsForAccount.get(paymentsForAccount.size() - 1);
 
-        Invoices invoices = killBillClient.getInvoicesForAccount(accountJson.getAccountId(), true, true, requestOptions);
-        final List<InvoiceItem> itemsToBeAdjusted = invoices.get(1).getItems();
+        Invoices invoices = accountApi.getInvoices(accountJson.getAccountId(), true, true, false, false, AuditLevel.NONE, requestOptions);
 
         // regular refund
         final InvoicePaymentTransaction invoicePaymentTransactionRequest = new InvoicePaymentTransaction();
         invoicePaymentTransactionRequest.setAmount(BigDecimal.valueOf(249.95));
-        invoicePaymentTransactionRequest.setCurrency(accountJson.getCurrency().toString());
+        invoicePaymentTransactionRequest.setCurrency(accountJson.getCurrency());
         invoicePaymentTransactionRequest.setPaymentId(payment.getPaymentId());
-        final InvoicePayment invoicePaymentRefund = killBillClient.createInvoicePaymentRefund(invoicePaymentTransactionRequest, requestOptions);
-        assertNotNull(invoicePaymentRefund);
+        invoicePaymentApi.createRefundWithAdjustments(invoicePaymentTransactionRequest, payment.getPaymentId(), payment.getPaymentMethodId(), NULL_PLUGIN_PROPERTIES, requestOptions);
 
+        final InvoicePayment invoicePaymentRefund = invoicePaymentApi.getInvoicePayment(payment.getPaymentId(), NULL_PLUGIN_PROPERTIES, requestOptions);
         assertSingleInvoicePaymentRefund(invoicePaymentRefund);
         assertRefundInvoiceNoAdjustments(accountJson.getAccountId());
         assertRefundAccountBalance(accountJson.getAccountId(), BigDecimal.valueOf(249.95), BigDecimal.ZERO);
@@ -75,20 +75,21 @@ public class TestExternalRefund extends TestJaxrsBase {
         clock.setDeltaFromReality(initialDate.getMillis() - clock.getUTCNow().getMillis());
 
         final Account accountJson = createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice();
-        final Payments paymentsForAccount = killBillClient.getPaymentsForAccount(accountJson.getAccountId(), requestOptions);
+        final Payments paymentsForAccount = accountApi.getPayments(accountJson.getAccountId(), NULL_PLUGIN_PROPERTIES, requestOptions);
         final Payment payment = paymentsForAccount.get(paymentsForAccount.size() - 1);
 
-        Invoices invoices = killBillClient.getInvoicesForAccount(accountJson.getAccountId(), true, true, requestOptions);
+        Invoices invoices = accountApi.getInvoices(accountJson.getAccountId(), true, true, false, false, AuditLevel.NONE, requestOptions);
         final List<InvoiceItem> itemsToBeAdjusted = invoices.get(1).getItems();
 
         // regular refund
         final InvoicePaymentTransaction invoicePaymentTransactionRequest = new InvoicePaymentTransaction();
         invoicePaymentTransactionRequest.setAmount(BigDecimal.valueOf(249.95));
-        invoicePaymentTransactionRequest.setCurrency(accountJson.getCurrency().toString());
+        invoicePaymentTransactionRequest.setCurrency(accountJson.getCurrency());
         invoicePaymentTransactionRequest.setPaymentId(payment.getPaymentId());
         invoicePaymentTransactionRequest.setIsAdjusted(true);
         invoicePaymentTransactionRequest.setAdjustments(itemsToBeAdjusted);
-        final InvoicePayment invoicePaymentRefund = killBillClient.createInvoicePaymentRefund(invoicePaymentTransactionRequest, requestOptions);
+        invoicePaymentApi.createRefundWithAdjustments(invoicePaymentTransactionRequest, payment.getPaymentId(), payment.getPaymentMethodId(), NULL_PLUGIN_PROPERTIES, requestOptions);
+        final InvoicePayment invoicePaymentRefund = invoicePaymentApi.getInvoicePayment(payment.getPaymentId(), NULL_PLUGIN_PROPERTIES, requestOptions);
         assertNotNull(invoicePaymentRefund);
 
         assertSingleInvoicePaymentRefund(invoicePaymentRefund);
@@ -103,26 +104,26 @@ public class TestExternalRefund extends TestJaxrsBase {
 
         final Account accountJson = createAccountWithExternalPMBundleAndSubscriptionAndManualPayTagAndWaitForFirstInvoice();
 
-        final Invoices invoicesForAccount = killBillClient.getInvoicesForAccount(accountJson.getAccountId(), requestOptions);
+        final Invoices invoicesForAccount = accountApi.getInvoices(accountJson.getAccountId(), requestOptions);
         final Invoice unpaidInvoice = invoicesForAccount.get(1);
         assertEquals(unpaidInvoice.getBalance().compareTo(BigDecimal.valueOf(249.95)), 0);
 
-        final Payments paymentsForAccount = killBillClient.getPaymentsForAccount(accountJson.getAccountId(), requestOptions);
+        final Payments paymentsForAccount = accountApi.getPayments(accountJson.getAccountId(), NULL_PLUGIN_PROPERTIES, requestOptions);
         assertEquals(paymentsForAccount.size(), 0);
 
         final InvoicePayment invoicePaymentRequest = new InvoicePayment();
         invoicePaymentRequest.setTargetInvoiceId(unpaidInvoice.getInvoiceId());
         invoicePaymentRequest.setAccountId(accountJson.getAccountId());
-        invoicePaymentRequest.setCurrency(unpaidInvoice.getCurrency().toString());
+        invoicePaymentRequest.setCurrency(unpaidInvoice.getCurrency());
         invoicePaymentRequest.setPurchasedAmount(unpaidInvoice.getAmount());
-        final InvoicePayment invoicePayment = killBillClient.createInvoicePayment(invoicePaymentRequest, true, requestOptions);
+        final InvoicePayment invoicePayment = invoiceApi.createInstantPayment(invoicePaymentRequest, unpaidInvoice.getInvoiceId(), true, NULL_PLUGIN_PROPERTIES, requestOptions);
         assertEquals(invoicePayment.getPurchasedAmount().compareTo(BigDecimal.valueOf(249.95)), 0);
         assertEquals(invoicePayment.getRefundedAmount().compareTo(BigDecimal.ZERO), 0);
 
         final InvoicePaymentTransaction invoicePaymentTransactionRequest = new InvoicePaymentTransaction();
         invoicePaymentTransactionRequest.setAmount(BigDecimal.valueOf(249.95));
         invoicePaymentTransactionRequest.setPaymentId(invoicePayment.getPaymentId());
-        final InvoicePayment invoicePaymentRefund = killBillClient.createInvoicePaymentRefund(invoicePaymentTransactionRequest, requestOptions);
+        final InvoicePayment invoicePaymentRefund = invoicePaymentApi.createRefundWithAdjustments(invoicePaymentTransactionRequest, invoicePayment.getPaymentId(), invoicePayment.getPaymentMethodId(), NULL_PLUGIN_PROPERTIES, requestOptions);
         assertNotNull(invoicePaymentRefund);
 
         assertSingleInvoicePaymentRefund(invoicePaymentRefund);
@@ -137,19 +138,19 @@ public class TestExternalRefund extends TestJaxrsBase {
 
         final Account accountJson = createAccountWithExternalPMBundleAndSubscriptionAndManualPayTagAndWaitForFirstInvoice();
 
-        final Invoices invoicesForAccount = killBillClient.getInvoicesForAccount(accountJson.getAccountId(), requestOptions);
+        final Invoices invoicesForAccount = accountApi.getInvoices(accountJson.getAccountId(), true, false, false, false, AuditLevel.NONE, requestOptions);
         final Invoice unpaidInvoice = invoicesForAccount.get(1);
         assertEquals(unpaidInvoice.getBalance().compareTo(BigDecimal.valueOf(249.95)), 0);
 
-        final Payments paymentsForAccount = killBillClient.getPaymentsForAccount(accountJson.getAccountId(), requestOptions);
+        final Payments paymentsForAccount = accountApi.getPayments(accountJson.getAccountId(), NULL_PLUGIN_PROPERTIES, requestOptions);
         assertEquals(paymentsForAccount.size(), 0);
 
         final InvoicePayment invoicePaymentRequest = new InvoicePayment();
         invoicePaymentRequest.setTargetInvoiceId(unpaidInvoice.getInvoiceId());
         invoicePaymentRequest.setAccountId(accountJson.getAccountId());
-        invoicePaymentRequest.setCurrency(unpaidInvoice.getCurrency().toString());
+        invoicePaymentRequest.setCurrency(unpaidInvoice.getCurrency());
         invoicePaymentRequest.setPurchasedAmount(unpaidInvoice.getAmount());
-        final InvoicePayment invoicePayment = killBillClient.createInvoicePayment(invoicePaymentRequest, true, requestOptions);
+        final InvoicePayment invoicePayment = invoiceApi.createInstantPayment(invoicePaymentRequest, unpaidInvoice.getInvoiceId(), true, NULL_PLUGIN_PROPERTIES, requestOptions);
         assertEquals(invoicePayment.getPurchasedAmount().compareTo(BigDecimal.valueOf(249.95)), 0);
         assertEquals(invoicePayment.getRefundedAmount().compareTo(BigDecimal.ZERO), 0);
 
@@ -158,7 +159,7 @@ public class TestExternalRefund extends TestJaxrsBase {
         invoicePaymentTransactionRequest.setPaymentId(invoicePayment.getPaymentId());
         invoicePaymentTransactionRequest.setIsAdjusted(true);
         invoicePaymentTransactionRequest.setAdjustments(unpaidInvoice.getItems());
-        final InvoicePayment invoicePaymentRefund = killBillClient.createInvoicePaymentRefund(invoicePaymentTransactionRequest, requestOptions);
+        final InvoicePayment invoicePaymentRefund = invoicePaymentApi.createRefundWithAdjustments(invoicePaymentTransactionRequest, invoicePayment.getPaymentId(), false, null, NULL_PLUGIN_PROPERTIES, requestOptions);
         assertNotNull(invoicePaymentRefund);
 
         assertSingleInvoicePaymentRefund(invoicePaymentRefund);
@@ -173,16 +174,16 @@ public class TestExternalRefund extends TestJaxrsBase {
 
         final Account accountJson = createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice();
         // delete PM
-        killBillClient.deletePaymentMethod(accountJson.getPaymentMethodId(), true, true, requestOptions);
-        final Payments paymentsForAccount = killBillClient.getPaymentsForAccount(accountJson.getAccountId(), requestOptions);
+        paymentMethodApi.deletePaymentMethod(accountJson.getPaymentMethodId(), true, true, NULL_PLUGIN_PROPERTIES, requestOptions);
+        final Payments paymentsForAccount = accountApi.getPayments(accountJson.getAccountId(), NULL_PLUGIN_PROPERTIES, requestOptions);
         final Payment payment = paymentsForAccount.get(paymentsForAccount.size() - 1);
 
         // external refund
         final InvoicePaymentTransaction invoicePaymentTransactionRequest = new InvoicePaymentTransaction();
         invoicePaymentTransactionRequest.setAmount(BigDecimal.valueOf(249.95));
-        invoicePaymentTransactionRequest.setCurrency(accountJson.getCurrency().toString());
+        invoicePaymentTransactionRequest.setCurrency(accountJson.getCurrency());
         invoicePaymentTransactionRequest.setPaymentId(payment.getPaymentId());
-        final InvoicePayment invoicePaymentExternalRefund = killBillClient.createInvoicePaymentRefund(invoicePaymentTransactionRequest, true, null, requestOptions);
+        final InvoicePayment invoicePaymentExternalRefund = invoicePaymentApi.createRefundWithAdjustments(invoicePaymentTransactionRequest, payment.getPaymentId(), true, null, NULL_PLUGIN_PROPERTIES, requestOptions);
         assertNotNull(invoicePaymentExternalRefund);
 
         assertInvoicePaymentsExternalRefund(accountJson.getAccountId(), invoicePaymentExternalRefund);
@@ -198,22 +199,22 @@ public class TestExternalRefund extends TestJaxrsBase {
 
         final Account accountJson = createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice();
         // delete PM
-        killBillClient.deletePaymentMethod(accountJson.getPaymentMethodId(), true, true, requestOptions);
+        paymentMethodApi.deletePaymentMethod(accountJson.getPaymentMethodId(), true, true, NULL_PLUGIN_PROPERTIES, requestOptions);
 
-        final Payments paymentsForAccount = killBillClient.getPaymentsForAccount(accountJson.getAccountId(), requestOptions);
+        final Payments paymentsForAccount = accountApi.getPayments(accountJson.getAccountId(), NULL_PLUGIN_PROPERTIES, requestOptions);
         final Payment payment = paymentsForAccount.get(paymentsForAccount.size() - 1);
 
-        final Invoices invoices = killBillClient.getInvoicesForAccount(accountJson.getAccountId(), true, true, requestOptions);
+        final Invoices invoices = accountApi.getInvoices(accountJson.getAccountId(), true, true, false, false, AuditLevel.NONE, requestOptions);
         final List<InvoiceItem> itemsToBeAdjusted = invoices.get(1).getItems();
 
         // external refund
         final InvoicePaymentTransaction invoicePaymentTransactionRequest = new InvoicePaymentTransaction();
         invoicePaymentTransactionRequest.setAmount(BigDecimal.valueOf(249.95));
-        invoicePaymentTransactionRequest.setCurrency(accountJson.getCurrency().toString());
+        invoicePaymentTransactionRequest.setCurrency(accountJson.getCurrency());
         invoicePaymentTransactionRequest.setPaymentId(payment.getPaymentId());
         invoicePaymentTransactionRequest.setIsAdjusted(true);
         invoicePaymentTransactionRequest.setAdjustments(itemsToBeAdjusted);
-        final InvoicePayment invoicePaymentExternalRefund = killBillClient.createInvoicePaymentRefund(invoicePaymentTransactionRequest, true, null, requestOptions);
+        final InvoicePayment invoicePaymentExternalRefund = invoicePaymentApi.createRefundWithAdjustments(invoicePaymentTransactionRequest, payment.getPaymentId(), true, null, NULL_PLUGIN_PROPERTIES, requestOptions);
         assertNotNull(invoicePaymentExternalRefund);
 
         assertInvoicePaymentsExternalRefund(accountJson.getAccountId(), invoicePaymentExternalRefund);
@@ -230,27 +231,27 @@ public class TestExternalRefund extends TestJaxrsBase {
         final Account accountJson = createAccountWithPMBundleAndSubscriptionAndWaitForFirstInvoice();
 
         // delete PM
-        killBillClient.deletePaymentMethod(accountJson.getPaymentMethodId(), true, true, requestOptions);
+        paymentMethodApi.deletePaymentMethod(accountJson.getPaymentMethodId(), true, true, NULL_PLUGIN_PROPERTIES, requestOptions);
 
         // create another PM
         final PaymentMethodPluginDetail info = new PaymentMethodPluginDetail();
-        final PaymentMethod paymentMethodJson = new PaymentMethod(null, UUID.randomUUID().toString(), accountJson.getAccountId(), false, PLUGIN_NAME, info);
-        final PaymentMethod otherPaymentMethod = killBillClient.createPaymentMethod(paymentMethodJson, requestOptions);
+        final PaymentMethod paymentMethodJson = new PaymentMethod(null, UUID.randomUUID().toString(), accountJson.getAccountId(), false, PLUGIN_NAME, info, null);
+        final PaymentMethod otherPaymentMethod = accountApi.createPaymentMethod(paymentMethodJson, accountJson.getAccountId(), NULL_PLUGIN_NAMES, NULL_PLUGIN_PROPERTIES, requestOptions);
 
-        final Payments paymentsForAccount = killBillClient.getPaymentsForAccount(accountJson.getAccountId(), requestOptions);
+        final Payments paymentsForAccount = accountApi.getPayments(accountJson.getAccountId(), NULL_PLUGIN_PROPERTIES, requestOptions);
         final Payment payment = paymentsForAccount.get(paymentsForAccount.size() - 1);
 
-        final Invoices invoices = killBillClient.getInvoicesForAccount(accountJson.getAccountId(), true, true, requestOptions);
+        final Invoices invoices = accountApi.getInvoices(accountJson.getAccountId(), true, true, false, false, AuditLevel.NONE, requestOptions);
         final List<InvoiceItem> itemsToBeAdjusted = invoices.get(1).getItems();
 
         // external refund
         final InvoicePaymentTransaction invoicePaymentTransactionRequest = new InvoicePaymentTransaction();
         invoicePaymentTransactionRequest.setAmount(BigDecimal.valueOf(249.95));
-        invoicePaymentTransactionRequest.setCurrency(accountJson.getCurrency().toString());
+        invoicePaymentTransactionRequest.setCurrency(accountJson.getCurrency());
         invoicePaymentTransactionRequest.setPaymentId(payment.getPaymentId());
         invoicePaymentTransactionRequest.setIsAdjusted(true);
         invoicePaymentTransactionRequest.setAdjustments(itemsToBeAdjusted);
-        final InvoicePayment invoicePaymentExternalRefund = killBillClient.createInvoicePaymentRefund(invoicePaymentTransactionRequest, true, otherPaymentMethod.getPaymentMethodId(), requestOptions);
+        final InvoicePayment invoicePaymentExternalRefund = invoicePaymentApi.createRefundWithAdjustments(invoicePaymentTransactionRequest, payment.getPaymentId(), true, otherPaymentMethod.getPaymentMethodId(), NULL_PLUGIN_PROPERTIES, requestOptions);
         assertNotNull(invoicePaymentExternalRefund);
         assertEquals(invoicePaymentExternalRefund.getPaymentMethodId(), otherPaymentMethod.getPaymentMethodId());
 
@@ -262,42 +263,42 @@ public class TestExternalRefund extends TestJaxrsBase {
 
     private void assertRefundInvoiceAdjustments(final UUID accountId) throws KillBillClientException {
         final Invoices invoices;
-        invoices = killBillClient.getInvoicesForAccount(accountId, true, true, requestOptions);
+        invoices = accountApi.getInvoices(accountId, true, true, false, false, AuditLevel.NONE, requestOptions);
         final Invoice invoiceWithRefund = invoices.get(1);
         assertEquals(invoiceWithRefund.getAmount().compareTo(BigDecimal.ZERO), 0);
         assertEquals(invoiceWithRefund.getRefundAdj().compareTo(BigDecimal.valueOf(249.95).negate()), 0);
         assertEquals(invoiceWithRefund.getItems().size(), 2);
-        assertEquals(invoiceWithRefund.getItems().get(0).getItemType(), InvoiceItemType.RECURRING.toString());
+        assertEquals(invoiceWithRefund.getItems().get(0).getItemType(), InvoiceItemType.RECURRING);
         assertEquals(invoiceWithRefund.getItems().get(0).getAmount().compareTo(BigDecimal.valueOf(249.95)), 0);
-        assertEquals(invoiceWithRefund.getItems().get(1).getItemType(), InvoiceItemType.ITEM_ADJ.toString());
+        assertEquals(invoiceWithRefund.getItems().get(1).getItemType(), InvoiceItemType.ITEM_ADJ);
         assertEquals(invoiceWithRefund.getItems().get(1).getAmount().compareTo(BigDecimal.valueOf(249.95).negate()), 0);
     }
 
     private void assertRefundInvoiceNoAdjustments(final UUID accountId) throws KillBillClientException {
-        final Invoices invoices = killBillClient.getInvoicesForAccount(accountId, true, true, requestOptions);
+        final Invoices invoices = accountApi.getInvoices(accountId, true, true, false, false, AuditLevel.NONE, requestOptions);
         final Invoice invoiceWithRefund = invoices.get(1);
         assertEquals(invoiceWithRefund.getAmount().compareTo(BigDecimal.valueOf(249.95)), 0);
         assertEquals(invoiceWithRefund.getRefundAdj().compareTo(BigDecimal.valueOf(249.95).negate()), 0);
         assertEquals(invoiceWithRefund.getItems().size(), 1);
-        assertEquals(invoiceWithRefund.getItems().get(0).getItemType(), InvoiceItemType.RECURRING.toString());
+        assertEquals(invoiceWithRefund.getItems().get(0).getItemType(), InvoiceItemType.RECURRING);
         assertEquals(invoiceWithRefund.getItems().get(0).getAmount().compareTo(BigDecimal.valueOf(249.95)), 0);
     }
 
     private void assertRefundAccountBalance(final UUID accountId, final BigDecimal balanceAmount, final BigDecimal cbaAmount) throws KillBillClientException {
-        final Account account = killBillClient.getAccount(accountId, true, true, requestOptions);
+        final Account account = accountApi.getAccount(accountId, true, true, AuditLevel.NONE, requestOptions);
         assertEquals(account.getAccountBalance().compareTo(balanceAmount), 0);
         assertEquals(account.getAccountCBA().compareTo(cbaAmount), 0);
     }
 
     private void assertInvoicePaymentsExternalRefund(final UUID accountId, final InvoicePayment invoicePaymentExternalRefund) throws KillBillClientException {
-        final InvoicePayments invoicePaymentsForAccount = killBillClient.getInvoicePaymentsForAccount(accountId, requestOptions);
+        final InvoicePayments invoicePaymentsForAccount = accountApi.getInvoicePayments(accountId, NULL_PLUGIN_PROPERTIES, requestOptions);
         assertEquals(invoicePaymentsForAccount.size(), 2);
 
         // INVOICE PAYMENT FOR ORIGINAL PURCHASE
         final InvoicePayment invoicePaymentPurchase = invoicePaymentsForAccount.get(0);
         assertEquals(invoicePaymentPurchase.getPurchasedAmount().compareTo(BigDecimal.valueOf(249.95)), 0);
         assertEquals(invoicePaymentPurchase.getCreditedAmount().compareTo(BigDecimal.ZERO), 0);
-        assertEquals(invoicePaymentPurchase.getTransactions().get(0).getTransactionType(), TransactionType.PURCHASE.toString());
+        assertEquals(invoicePaymentPurchase.getTransactions().get(0).getTransactionType(), TransactionType.PURCHASE);
         assertEquals(invoicePaymentPurchase.getTransactions().get(0).getAmount().compareTo(BigDecimal.valueOf(249.95)), 0);
 
         // INVOICE PAYMENT FOR EXTERNAL REFUND
@@ -307,7 +308,7 @@ public class TestExternalRefund extends TestJaxrsBase {
         assertEquals(creditInvoicePayment.getPurchasedAmount().compareTo(BigDecimal.ZERO), 0);
         assertEquals(creditInvoicePayment.getCreditedAmount().compareTo(BigDecimal.valueOf(249.95)), 0);
         assertEquals(creditInvoicePayment.getTransactions().size(), 1);
-        assertEquals(creditInvoicePayment.getTransactions().get(0).getTransactionType(), TransactionType.CREDIT.toString());
+        assertEquals(creditInvoicePayment.getTransactions().get(0).getTransactionType(), TransactionType.CREDIT);
         assertEquals(creditInvoicePayment.getTransactions().get(0).getAmount().compareTo(BigDecimal.valueOf(249.95)), 0);
     }
 
@@ -317,9 +318,9 @@ public class TestExternalRefund extends TestJaxrsBase {
         assertEquals(invoicePaymentRefund.getRefundedAmount().compareTo(BigDecimal.valueOf(249.95)), 0);
 
         assertEquals(invoicePaymentRefund.getTransactions().size(), 2);
-        assertEquals(invoicePaymentRefund.getTransactions().get(0).getTransactionType(), TransactionType.PURCHASE.toString());
+        assertEquals(invoicePaymentRefund.getTransactions().get(0).getTransactionType(), TransactionType.PURCHASE);
         assertEquals(invoicePaymentRefund.getTransactions().get(0).getAmount().compareTo(BigDecimal.valueOf(249.95)), 0);
-        assertEquals(invoicePaymentRefund.getTransactions().get(1).getTransactionType(), TransactionType.REFUND.toString());
+        assertEquals(invoicePaymentRefund.getTransactions().get(1).getTransactionType(), TransactionType.REFUND);
         assertEquals(invoicePaymentRefund.getTransactions().get(1).getAmount().compareTo(BigDecimal.valueOf(249.95)), 0);
     }
 
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoiceItem.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoiceItem.java
index a846d1b..628f429 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoiceItem.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoiceItem.java
@@ -17,20 +17,19 @@
 
 package org.killbill.billing.jaxrs;
 
-import java.util.Collection;
-import java.util.LinkedList;
 import java.util.List;
+import java.util.UUID;
 
-import org.killbill.billing.GuicyKillbillTestSuite;
 import org.killbill.billing.ObjectType;
 import org.killbill.billing.client.RequestOptions;
-import org.killbill.billing.client.model.Account;
-import org.killbill.billing.client.model.AuditLog;
-import org.killbill.billing.client.model.CustomField;
-import org.killbill.billing.client.model.InvoiceItem;
+import org.killbill.billing.client.model.CustomFields;
 import org.killbill.billing.client.model.Invoices;
-import org.killbill.billing.client.model.Tag;
-import org.killbill.billing.client.model.TagDefinition;
+import org.killbill.billing.client.model.gen.Account;
+import org.killbill.billing.client.model.gen.AuditLog;
+import org.killbill.billing.client.model.gen.CustomField;
+import org.killbill.billing.client.model.gen.InvoiceItem;
+import org.killbill.billing.client.model.gen.Tag;
+import org.killbill.billing.client.model.gen.TagDefinition;
 import org.killbill.billing.jaxrs.resources.JaxrsResource;
 import org.killbill.billing.util.api.AuditLevel;
 import org.testng.Assert;
@@ -45,7 +44,7 @@ public class TestInvoiceItem extends TestJaxrsBase {
     @Test(groups = "slow", description = "Add tags to invoice item")
     public void testTags() throws Exception {
         final Account accountJson = createAccountNoPMBundleAndSubscriptionAndWaitForFirstInvoice();
-        final Invoices invoicesJson = killBillClient.getInvoicesForAccount(accountJson.getAccountId(), requestOptions);
+        final Invoices invoicesJson = accountApi.getInvoices(accountJson.getAccountId(), true, false, false, false, AuditLevel.NONE, requestOptions);
 
         Assert.assertNotNull(invoicesJson);
         Assert.assertEquals(invoicesJson.size(), 2);
@@ -55,9 +54,9 @@ public class TestInvoiceItem extends TestJaxrsBase {
         Assert.assertNotNull(invoiceItems);
 
         // Create tag definition
-        final TagDefinition input = new TagDefinition(null, false, "tagtest", "invoice item tag test", ImmutableList.<ObjectType>of(ObjectType.INVOICE_ITEM));
+        final TagDefinition input = new TagDefinition(null, false, "tagtest", "invoice item tag test", ImmutableList.<ObjectType>of(ObjectType.INVOICE_ITEM), null);
 
-        final TagDefinition objFromJson = killBillClient.createTagDefinition(input, requestOptions);
+        final TagDefinition objFromJson = tagDefinitionApi.createTagDefinition(input, requestOptions);
         Assert.assertNotNull(objFromJson);
         Assert.assertEquals(objFromJson.getName(), input.getName());
         Assert.assertEquals(objFromJson.getDescription(), input.getDescription());
@@ -66,23 +65,18 @@ public class TestInvoiceItem extends TestJaxrsBase {
         final Multimap<String, String> followQueryParams = HashMultimap.create();
         followQueryParams.put(JaxrsResource.QUERY_ACCOUNT_ID, accountJson.getAccountId().toString());
         final RequestOptions followRequestOptions = requestOptions.extend().withQueryParamsForFollow(followQueryParams).build();
-        killBillClient.createInvoiceItemTag(invoiceItems.get(0).getInvoiceItemId(),objFromJson.getId(), followRequestOptions);
+        invoiceItemApi.createTags(invoiceItems.get(0).getInvoiceItemId(), ImmutableList.<String>of(objFromJson.getId().toString()), followRequestOptions);
 
-        // Add account id to request
-        final Multimap<String, String> queryParams = HashMultimap.create();
-        queryParams.put(JaxrsResource.QUERY_ACCOUNT_ID, accountJson.getAccountId().toString());
-        final RequestOptions addedRequestOptions = requestOptions.extend().withQueryParams(queryParams).build();
-        
         // Retrieves all tags
-        final List<Tag> tags1 = killBillClient.getInvoiceItemTags(invoiceItems.get(0).getInvoiceItemId(), AuditLevel.FULL, addedRequestOptions);
+        final List<Tag> tags1 = invoiceItemApi.getTags(invoiceItems.get(0).getInvoiceItemId(), accountJson.getAccountId(), null, AuditLevel.FULL, requestOptions);
         Assert.assertEquals(tags1.size(), 1);
         Assert.assertEquals(tags1.get(0).getTagDefinitionId(), objFromJson.getId());
 
         // Verify adding the same tag a second time doesn't do anything
-        killBillClient.createInvoiceItemTag(invoiceItems.get(0).getInvoiceItemId(), objFromJson.getId(), followRequestOptions);
+        invoiceItemApi.createTags(invoiceItems.get(0).getInvoiceItemId(), ImmutableList.<String>of(objFromJson.getId().toString()), followRequestOptions);
 
         // Retrieves all tags again
-        final List<Tag> tags2 = killBillClient.getInvoiceItemTags(invoiceItems.get(0).getInvoiceItemId(), AuditLevel.FULL, addedRequestOptions);
+        final List<Tag> tags2 = invoiceItemApi.getTags(invoiceItems.get(0).getInvoiceItemId(), accountJson.getAccountId(), null, AuditLevel.FULL, requestOptions);
         Assert.assertEquals(tags2, tags1);
 
         // Verify audit logs
@@ -96,15 +90,15 @@ public class TestInvoiceItem extends TestJaxrsBase {
         Assert.assertNotNull(auditLogJson.getUserToken());
 
         // remove it
-        killBillClient.deleteInvoiceItemTag(invoiceItems.get(0).getInvoiceItemId(), objFromJson.getId(), requestOptions);
-        final List<Tag> tags3 = killBillClient.getInvoiceItemTags(invoiceItems.get(0).getInvoiceItemId(), AuditLevel.FULL, addedRequestOptions);
+        invoiceItemApi.deleteTags(invoiceItems.get(0).getInvoiceItemId(), ImmutableList.<UUID>of(objFromJson.getId()), requestOptions);
+        final List<Tag> tags3 = invoiceItemApi.getTags(invoiceItems.get(0).getInvoiceItemId(), accountJson.getAccountId(), null, AuditLevel.FULL, requestOptions);
         Assert.assertEquals(tags3.size(), 0);
 
-        killBillClient.deleteTagDefinition(objFromJson.getId(),requestOptions);
-        List<TagDefinition> objsFromJson = killBillClient.getTagDefinitions(requestOptions);
+        tagDefinitionApi.deleteTagDefinition(objFromJson.getId(), requestOptions);
+        List<TagDefinition> objsFromJson = tagDefinitionApi.getTagDefinitions(requestOptions);
         Assert.assertNotNull(objsFromJson);
         Boolean isFound = false;
-        for (TagDefinition tagDefinition : objsFromJson){
+        for (TagDefinition tagDefinition : objsFromJson) {
             isFound |= tagDefinition.getId().equals(objFromJson.getId());
         }
         Assert.assertFalse(isFound);
@@ -113,7 +107,7 @@ public class TestInvoiceItem extends TestJaxrsBase {
     @Test(groups = "slow", description = "Add custom fields to invoice item")
     public void testCustomFields() throws Exception {
         final Account accountJson = createAccountNoPMBundleAndSubscriptionAndWaitForFirstInvoice();
-        final Invoices invoicesJson = killBillClient.getInvoicesForAccount(accountJson.getAccountId(), requestOptions);
+        final Invoices invoicesJson = accountApi.getInvoices(accountJson.getAccountId(), true, false, false, false, AuditLevel.NONE, requestOptions);
 
         Assert.assertNotNull(invoicesJson);
         Assert.assertEquals(invoicesJson.size(), 2);
@@ -122,20 +116,20 @@ public class TestInvoiceItem extends TestJaxrsBase {
 
         Assert.assertNotNull(invoiceItems);
 
-        final Collection<CustomField> customFields = new LinkedList<CustomField>();
+        final CustomFields customFields = new CustomFields();
         customFields.add(new CustomField(null, invoiceItems.get(0).getInvoiceItemId(), ObjectType.INVOICE_ITEM, "1", "value1", null));
         customFields.add(new CustomField(null, invoiceItems.get(0).getInvoiceItemId(), ObjectType.INVOICE_ITEM, "2", "value2", null));
         customFields.add(new CustomField(null, invoiceItems.get(0).getInvoiceItemId(), ObjectType.INVOICE_ITEM, "3", "value3", null));
 
-        killBillClient.createInvoiceItemCustomField(invoiceItems.get(0).getInvoiceItemId(), customFields, requestOptions);
+        invoiceItemApi.createCustomFields(invoiceItems.get(0).getInvoiceItemId(), customFields, requestOptions);
 
-        final List<CustomField> invoiceItemCustomFields = killBillClient.getInvoiceItemCustomFields(invoiceItems.get(0).getInvoiceItemId(), requestOptions);
+        final List<CustomField> invoiceItemCustomFields = invoiceItemApi.getCustomFields(invoiceItems.get(0).getInvoiceItemId(), requestOptions);
         Assert.assertEquals(invoiceItemCustomFields.size(), 3);
 
         // Delete all custom fields for account
-        killBillClient.deleteInvoiceItemCustomFields(invoiceItems.get(0).getInvoiceItemId(), requestOptions);
+        invoiceItemApi.deleteCustomFields(invoiceItems.get(0).getInvoiceItemId(), null, requestOptions);
 
-        final List<CustomField> remainingCustomFields = killBillClient.getInvoiceItemCustomFields(invoiceItems.get(0).getInvoiceItemId(), requestOptions);
+        final List<CustomField> remainingCustomFields = invoiceItemApi.getCustomFields(invoiceItems.get(0).getInvoiceItemId(), requestOptions);
         Assert.assertEquals(remainingCustomFields.size(), 0);
     }
 }
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoiceVoid.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoiceVoid.java
index ed56795..53c9373 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoiceVoid.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestInvoiceVoid.java
@@ -28,12 +28,12 @@ import org.killbill.billing.api.FlakyRetryAnalyzer;
 import org.killbill.billing.catalog.api.BillingPeriod;
 import org.killbill.billing.catalog.api.ProductCategory;
 import org.killbill.billing.client.KillBillClientException;
-import org.killbill.billing.client.model.Account;
-import org.killbill.billing.client.model.Invoice;
-import org.killbill.billing.client.model.InvoicePayment;
-import org.killbill.billing.client.model.InvoicePaymentTransaction;
 import org.killbill.billing.client.model.InvoicePayments;
-import org.killbill.billing.client.model.PaymentTransaction;
+import org.killbill.billing.client.model.gen.Account;
+import org.killbill.billing.client.model.gen.Invoice;
+import org.killbill.billing.client.model.gen.InvoicePayment;
+import org.killbill.billing.client.model.gen.InvoicePaymentTransaction;
+import org.killbill.billing.client.model.gen.PaymentTransaction;
 import org.killbill.billing.invoice.api.InvoiceStatus;
 import org.killbill.billing.payment.api.TransactionType;
 import org.killbill.billing.util.api.AuditLevel;
@@ -52,41 +52,41 @@ public class TestInvoiceVoid extends TestJaxrsBase {
         assertNotNull(accountJson);
 
         // Verify we didn't get any invoicePayment
-        final List<InvoicePayment> noPaymentsFromJson = killBillClient.getInvoicePaymentsForAccount(accountJson.getAccountId(), requestOptions);
+        final List<InvoicePayment> noPaymentsFromJson = accountApi.getInvoicePayments(accountJson.getAccountId(), NULL_PLUGIN_PROPERTIES, requestOptions);
         assertEquals(noPaymentsFromJson.size(), 0);
 
         // Get the invoices
-        List<Invoice> invoices = killBillClient.getInvoicesForAccount(accountJson.getAccountId(), requestOptions);
+        List<Invoice> invoices = accountApi.getInvoices(accountJson.getAccountId(), requestOptions);
         // 2 invoices but look for the non zero dollar one
         assertEquals(invoices.size(), 2);
         // verify account balance
-        Account account = killBillClient.getAccount(accountJson.getAccountId(), true, true, requestOptions);
+        Account account = accountApi.getAccount(accountJson.getAccountId(), true, true, AuditLevel.NONE, requestOptions);
         assertEquals(account.getAccountBalance().compareTo(invoices.get(1).getBalance()), 0);
 
         // void the invoice
-        killBillClient.voidInvoice(invoices.get(1).getInvoiceId(), requestOptions);
+        invoiceApi.voidInvoice(invoices.get(1).getInvoiceId(), requestOptions);
 
         // Get the invoices excluding voided
-        invoices = killBillClient.getInvoicesForAccount(accountJson.getAccountId(), requestOptions);
+        invoices = accountApi.getInvoices(accountJson.getAccountId(), requestOptions);
         // the voided invoice should not be returned
         assertEquals(invoices.size(), 1);
 
         // Get the invoices including voided
-        invoices = killBillClient.getInvoicesForAccount(accountJson.getAccountId(), true, false, true, true, AuditLevel.NONE, requestOptions);
+        invoices = accountApi.getInvoices(accountJson.getAccountId(), true, false, false, true, AuditLevel.NONE, requestOptions);
         assertEquals(invoices.size(), 2);
-        assertEquals(invoices.get(1).getStatus(), InvoiceStatus.VOID.toString());
+        assertEquals(invoices.get(1).getStatus(), InvoiceStatus.VOID);
         assertEquals(invoices.get(1).getBalance().compareTo(BigDecimal.ZERO), 0);
 
         // check that account balance is zero
-        account = killBillClient.getAccount(accountJson.getAccountId(), true, true, requestOptions);
+        account = accountApi.getAccount(accountJson.getAccountId(), true, true, AuditLevel.NONE, requestOptions);
         assertEquals(account.getAccountBalance().compareTo(BigDecimal.ZERO), 0);
 
         // After invoice was voided verify the subscription is re-invoiced on a new invoice
         // trigger an invoice generation
-        killBillClient.createInvoice(accountJson.getAccountId(), clock.getToday(DateTimeZone.forID(accountJson.getTimeZone())), requestOptions);
+        invoiceApi.createFutureInvoice(accountJson.getAccountId(), clock.getToday(DateTimeZone.forID(accountJson.getTimeZone())), requestOptions);
 
         // Get the invoices excluding voided
-        invoices = killBillClient.getInvoicesForAccount(accountJson.getAccountId(), requestOptions);
+        invoices = accountApi.getInvoices(accountJson.getAccountId(), requestOptions);
         // the voided invoice should not be returned
         assertEquals(invoices.size(), 2);
 
@@ -95,7 +95,7 @@ public class TestInvoiceVoid extends TestJaxrsBase {
 
         // try to void invoice
         try {
-            killBillClient.voidInvoice(invoices.get(1).getInvoiceId(), requestOptions);
+            invoiceApi.voidInvoice(invoices.get(1).getInvoiceId(), requestOptions);
             Assert.fail("VoidInvoice call should fail with 400");
         } catch (final KillBillClientException e) {
             assertTrue(true);
@@ -106,13 +106,13 @@ public class TestInvoiceVoid extends TestJaxrsBase {
 
         // try to void invoice
         try {
-            killBillClient.voidInvoice(invoices.get(1).getInvoiceId(), requestOptions);
+            invoiceApi.voidInvoice(invoices.get(1).getInvoiceId(), requestOptions);
         } catch (final KillBillClientException e) {
             assertTrue(false);
         }
 
         // check that account balance is zero
-        account = killBillClient.getAccount(accountJson.getAccountId(), true, true, requestOptions);
+        account = accountApi.getAccount(accountJson.getAccountId(), true, true, AuditLevel.NONE, requestOptions);
         assertEquals(account.getAccountBalance().compareTo(BigDecimal.ZERO), 0);
 
     }
@@ -123,15 +123,15 @@ public class TestInvoiceVoid extends TestJaxrsBase {
         assertNotNull(accountJson);
 
         // Verify we didn't get any invoicePayment
-        final List<InvoicePayment> noPaymentsFromJson = killBillClient.getInvoicePaymentsForAccount(accountJson.getAccountId(), requestOptions);
+        final List<InvoicePayment> noPaymentsFromJson = accountApi.getInvoicePayments(accountJson.getAccountId(), NULL_PLUGIN_PROPERTIES, requestOptions);
         assertEquals(noPaymentsFromJson.size(), 0);
 
         // Get the invoices
-        List<Invoice> invoices = killBillClient.getInvoicesForAccount(accountJson.getAccountId(), requestOptions);
+        List<Invoice> invoices = accountApi.getInvoices(accountJson.getAccountId(), requestOptions);
         // 2 invoices but look for the non zero dollar one
         assertEquals(invoices.size(), 2);
         // verify account balance
-        Account account = killBillClient.getAccount(accountJson.getAccountId(), true, true, requestOptions);
+        Account account = accountApi.getAccount(accountJson.getAccountId(), true, true, AuditLevel.NONE, requestOptions);
         assertEquals(account.getAccountBalance().compareTo(invoices.get(1).getBalance()), 0);
 
         // process payment
@@ -139,7 +139,7 @@ public class TestInvoiceVoid extends TestJaxrsBase {
 
         // try to void invoice
         try {
-            killBillClient.voidInvoice(invoices.get(1).getInvoiceId(), requestOptions);
+            invoiceApi.voidInvoice(invoices.get(1).getInvoiceId(), requestOptions);
             Assert.fail("VoidInvoice call should fail with 400");
         } catch (final KillBillClientException e) {
             assertTrue(true);
@@ -148,7 +148,7 @@ public class TestInvoiceVoid extends TestJaxrsBase {
     }
 
     // Flaky, see https://github.com/killbill/killbill/issues/860
-    @Test(groups = "slow", description = "Void a child invoice", retryAnalyzer = FlakyRetryAnalyzer.class)
+    @Test(groups = "slow", description = "Void a child invoice") // , retryAnalyzer = FlakyRetryAnalyzer.class)
     public void testChildVoidInvoice() throws Exception {
         final DateTime initialDate = new DateTime(2012, 4, 25, 0, 3, 42, 0);
         final LocalDate triggeredDate = new LocalDate(2012, 5, 26);
@@ -158,38 +158,38 @@ public class TestInvoiceVoid extends TestJaxrsBase {
         final Account childAccount1 = createAccount(parentAccount.getAccountId());
 
         // Add a bundle and subscription
-        createEntitlement(childAccount1.getAccountId(), UUID.randomUUID().toString(), "Shotgun",
+        createSubscription(childAccount1.getAccountId(), UUID.randomUUID().toString(), "Shotgun",
                           ProductCategory.BASE, BillingPeriod.MONTHLY, true);
 
         // trigger an invoice generation
-        killBillClient.createInvoice(childAccount1.getAccountId(), triggeredDate, requestOptions);
-        List<Invoice> child1Invoices = killBillClient.getInvoicesForAccount(childAccount1.getAccountId(), true, false, requestOptions);
+        invoiceApi.createFutureInvoice(childAccount1.getAccountId(), triggeredDate, requestOptions);
+        List<Invoice> child1Invoices = accountApi.getInvoices(childAccount1.getAccountId(), true, false, false, true, AuditLevel.NONE, requestOptions);
         assertEquals(child1Invoices.size(), 2);
 
         // move one day so that the parent invoice is committed
         clock.addDays(1);
         crappyWaitForLackOfProperSynchonization();
-        List<Invoice> parentInvoices = killBillClient.getInvoicesForAccount(parentAccount.getAccountId(), true, false, requestOptions);
+        List<Invoice> parentInvoices = accountApi.getInvoices(parentAccount.getAccountId(), true, false, false, false, AuditLevel.NONE, requestOptions);
         assertEquals(parentInvoices.size(), 1);
 
         // try to void child invoice
-        killBillClient.voidInvoice(child1Invoices.get(1).getInvoiceId(), requestOptions);
+        invoiceApi.voidInvoice(child1Invoices.get(1).getInvoiceId(), requestOptions);
 
         //  move the clock 1 month to check if invoices change
         clock.addDays(31);
         crappyWaitForLackOfProperSynchonization();
 
         // The parent added other invoice, now it has two (duplicate)
-        parentInvoices = killBillClient.getInvoicesForAccount(parentAccount.getAccountId(), true, false, requestOptions);
+        parentInvoices = accountApi.getInvoices(parentAccount.getAccountId(), true, false, false, false, AuditLevel.NONE, requestOptions);
         assertEquals(parentInvoices.size(), 2);
 
         // the child added one invoice as expected
-        child1Invoices = killBillClient.getInvoicesForAccount(childAccount1.getAccountId(), true, false, requestOptions);
+        child1Invoices = accountApi.getInvoices(childAccount1.getAccountId(), true, false, false, false, AuditLevel.NONE, requestOptions);
         assertEquals(child1Invoices.size(), 2);
     }
 
     // Flaky, see https://github.com/killbill/killbill/issues/860
-    @Test(groups = "slow", description = "Void a parent invoice", retryAnalyzer = FlakyRetryAnalyzer.class)
+    @Test(groups = "slow", description = "Void a parent invoice") //, retryAnalyzer = FlakyRetryAnalyzer.class)
     public void testParentVoidInvoice() throws Exception {
         final DateTime initialDate = new DateTime(2012, 4, 25, 0, 3, 42, 0);
         final LocalDate triggeredDate = new LocalDate(2012, 5, 26);
@@ -199,22 +199,22 @@ public class TestInvoiceVoid extends TestJaxrsBase {
         final Account childAccount1 = createAccount(parentAccount.getAccountId());
 
         // Add a bundle and subscription
-        createEntitlement(childAccount1.getAccountId(), UUID.randomUUID().toString(), "Shotgun",
+        createSubscription(childAccount1.getAccountId(), UUID.randomUUID().toString(), "Shotgun",
                           ProductCategory.BASE, BillingPeriod.MONTHLY, true);
 
         // trigger an invoice generation
-        killBillClient.createInvoice(childAccount1.getAccountId(), triggeredDate, requestOptions);
-        List<Invoice> child1Invoices = killBillClient.getInvoicesForAccount(childAccount1.getAccountId(), true, false, requestOptions);
+        invoiceApi.createFutureInvoice(childAccount1.getAccountId(), triggeredDate, requestOptions);
+        List<Invoice> child1Invoices = accountApi.getInvoices(childAccount1.getAccountId(), true, false, false, true, AuditLevel.NONE, requestOptions);
         assertEquals(child1Invoices.size(), 2);
 
         // move one day so that the parent invoice is committed
         clock.addDays(1);
         crappyWaitForLackOfProperSynchonization();
-        List<Invoice> parentInvoices = killBillClient.getInvoicesForAccount(parentAccount.getAccountId(), true, false, requestOptions);
+        List<Invoice> parentInvoices = accountApi.getInvoices(parentAccount.getAccountId(), true, false, false, false, AuditLevel.NONE, requestOptions);
         assertEquals(parentInvoices.size(), 1);
 
         // try to void parent invoice
-        killBillClient.voidInvoice(parentInvoices.get(0).getInvoiceId(), requestOptions);
+        invoiceApi.voidInvoice(parentInvoices.get(0).getInvoiceId(), requestOptions);
 
         //  move the clock 1 month to check if invoices change
         clock.addDays(31);
@@ -222,11 +222,11 @@ public class TestInvoiceVoid extends TestJaxrsBase {
 
         // since the child did not have any change, the parent does not have an invoice
         // after the void.
-        parentInvoices = killBillClient.getInvoicesForAccount(parentAccount.getAccountId(), true, false, requestOptions);
+        parentInvoices = accountApi.getInvoices(parentAccount.getAccountId(), true, false, false, false, AuditLevel.NONE, requestOptions);
         assertEquals(parentInvoices.size(), 0);
 
         // the child does not have any change
-        child1Invoices = killBillClient.getInvoicesForAccount(childAccount1.getAccountId(), true, false, requestOptions);
+        child1Invoices = accountApi.getInvoices(childAccount1.getAccountId(), true, false, false, true, AuditLevel.NONE, requestOptions);
         assertEquals(child1Invoices.size(), 2);
     }
 
@@ -238,7 +238,7 @@ public class TestInvoiceVoid extends TestJaxrsBase {
         invoicePayment.setAccountId(accountJson.getAccountId());
         invoicePayment.setTargetInvoiceId(invoice.getInvoiceId());
 
-        final InvoicePayment result = killBillClient.createInvoicePayment(invoicePayment, false, requestOptions);
+        final InvoicePayment result = invoiceApi.createInstantPayment(invoicePayment, invoice.getInvoiceId(), true, NULL_PLUGIN_PROPERTIES, requestOptions);
         assertEquals(result.getTransactions().size(), 1);
         assertTrue(result.getTransactions().get(0).getAmount().compareTo(payAmount) == 0);
 
@@ -250,12 +250,12 @@ public class TestInvoiceVoid extends TestJaxrsBase {
         final InvoicePaymentTransaction refund = new InvoicePaymentTransaction();
         refund.setPaymentId(payment.getPaymentId());
         refund.setAmount(payment.getPurchasedAmount());
-        killBillClient.createInvoicePaymentRefund(refund, requestOptions);
+        invoicePaymentApi.createRefundWithAdjustments(refund, payment.getPaymentId(), payment.getPaymentMethodId(), NULL_PLUGIN_PROPERTIES, requestOptions);
 
-        final InvoicePayments allPayments = killBillClient.getInvoicePaymentsForAccount(payment.getAccountId(), requestOptions);
+        final InvoicePayments allPayments = accountApi.getInvoicePayments(payment.getAccountId(), NULL_PLUGIN_PROPERTIES, requestOptions);
         assertEquals(allPayments.size(), 1);
 
-        final List<PaymentTransaction> objRefundFromJson = getPaymentTransactions(allPayments, TransactionType.REFUND.toString());
+        final List<PaymentTransaction> objRefundFromJson = getInvoicePaymentTransactions(allPayments, TransactionType.REFUND);
         assertEquals(objRefundFromJson.size(), 1);
     }
 }
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestJaxrsBase.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestJaxrsBase.java
index fd5f44d..af7edf7 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestJaxrsBase.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestJaxrsBase.java
@@ -18,9 +18,12 @@
 
 package org.killbill.billing.jaxrs;
 
+import java.io.File;
+import java.io.IOException;
 import java.lang.management.ManagementFactory;
 import java.lang.management.ThreadInfo;
 import java.lang.management.ThreadMXBean;
+import java.nio.charset.Charset;
 import java.util.EventListener;
 import java.util.Iterator;
 import java.util.List;
@@ -39,6 +42,7 @@ import org.eclipse.jetty.servlet.FilterHolder;
 import org.joda.time.LocalDate;
 import org.killbill.billing.GuicyKillbillTestWithEmbeddedDBModule;
 import org.killbill.billing.api.TestApiListener;
+import org.killbill.billing.client.KillBillClientException;
 import org.killbill.billing.client.KillBillHttpClient;
 import org.killbill.billing.client.api.gen.AccountApi;
 import org.killbill.billing.client.api.gen.AdminApi;
@@ -100,6 +104,8 @@ import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
+import com.google.common.io.Files;
+import com.google.common.io.Resources;
 import com.google.inject.Module;
 import com.google.inject.util.Modules;
 
@@ -372,6 +378,23 @@ public class TestJaxrsBase extends KillbillClient {
         }));
     }
 
+    protected String uploadTenantCatalog(final String catalog, final boolean fetch) throws IOException, KillBillClientException {
+        final String body = getResourceBodyString(catalog);
+        catalogApi.uploadCatalogXml(body, requestOptions);
+        return fetch ? catalogApi.getCatalogXml(requestOptions) : null;
+    }
+
+
+    protected void uploadTenantOverdueConfig(final String overdue) throws IOException, KillBillClientException {
+        final String body = getResourceBodyString(overdue);
+        overdueApi.uploadOverdueConfigXml(body, requestOptions);
+    }
+
+    protected String getResourceBodyString(final String resource) throws IOException {
+        final String catalogPath = Resources.getResource(resource).getPath();
+        final File catalogFile = new File(catalogPath);
+        return Files.toString(catalogFile, Charset.forName("UTF-8"));
+    }
 
     protected void printThreadDump() {
         final StringBuilder dump = new StringBuilder("Thread dump:\n");
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestOverdue.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestOverdue.java
index 6b13996..5f90e66 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestOverdue.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestOverdue.java
@@ -22,18 +22,17 @@ import java.math.BigDecimal;
 import java.util.Comparator;
 import java.util.List;
 
-import org.killbill.billing.client.KillBillClientException;
-import org.killbill.billing.client.model.Account;
-import org.killbill.billing.client.model.Invoice;
-import org.killbill.billing.client.model.InvoicePayment;
 import org.killbill.billing.client.model.Invoices;
 import org.killbill.billing.client.model.Tags;
+import org.killbill.billing.client.model.gen.Account;
+import org.killbill.billing.client.model.gen.Invoice;
+import org.killbill.billing.client.model.gen.InvoicePayment;
 import org.killbill.billing.util.tag.ControlTagType;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Ordering;
-import com.google.common.io.Resources;
 
 import static org.testng.Assert.assertEquals;
 
@@ -41,10 +40,9 @@ public class TestOverdue extends TestJaxrsBase {
 
     @Test(groups = "slow", description = "Upload and retrieve a per tenant overdue config")
     public void testMultiTenantOverdueConfig() throws Exception {
-        final String overdueConfigPath = Resources.getResource("overdue.xml").getPath();
-        killBillClient.uploadXMLOverdueConfig(overdueConfigPath, requestOptions);
+        uploadTenantOverdueConfig("overdue.xml");
 
-        final String overdueConfig = killBillClient.getXMLOverdueConfig(requestOptions);
+        final String overdueConfig = overdueApi.getOverdueConfigXml(requestOptions);
         Assert.assertNotNull(overdueConfig);
     }
 
@@ -54,29 +52,29 @@ public class TestOverdue extends TestJaxrsBase {
         final Account accountJson = createAccountNoPMBundleAndSubscriptionAndWaitForFirstInvoice();
 
         // Get the invoices
-        final List<Invoice> invoices = killBillClient.getInvoicesForAccount(accountJson.getAccountId(), requestOptions);
+        final List<Invoice> invoices = accountApi.getInvoices(accountJson.getAccountId(), requestOptions);
         // 2 invoices but look for the non zero dollar one
         assertEquals(invoices.size(), 2);
 
         // We're still clear - see the configuration
-        Assert.assertTrue(killBillClient.getOverdueStateForAccount(accountJson.getAccountId(), requestOptions).getIsClearState());
+        Assert.assertTrue(accountApi.getOverdueAccount(accountJson.getAccountId(), requestOptions).isIsClearState());
 
         clock.addDays(30);
         crappyWaitForLackOfProperSynchonization();
-        Assert.assertEquals(killBillClient.getOverdueStateForAccount(accountJson.getAccountId(), requestOptions).getName(), "OD1");
+        Assert.assertEquals(accountApi.getOverdueAccount(accountJson.getAccountId(), requestOptions).getName(), "OD1");
 
         clock.addDays(10);
         crappyWaitForLackOfProperSynchonization();
-        Assert.assertEquals(killBillClient.getOverdueStateForAccount(accountJson.getAccountId(), requestOptions).getName(), "OD2");
+        Assert.assertEquals(accountApi.getOverdueAccount(accountJson.getAccountId(), requestOptions).getName(), "OD2");
 
         clock.addDays(10);
         crappyWaitForLackOfProperSynchonization();
-        Assert.assertEquals(killBillClient.getOverdueStateForAccount(accountJson.getAccountId(), requestOptions).getName(), "OD3");
+        Assert.assertEquals(accountApi.getOverdueAccount(accountJson.getAccountId(), requestOptions).getName(), "OD3");
 
         // Post external payments, paying the most recent invoice first: this is to avoid a race condition where
         // a refresh overdue notification kicks in after the first payment, which makes the account goes CLEAR and
         // triggers an AUTO_INVOICE_OFF tag removal (hence adjustment of the other invoices balance).
-        final Invoices invoicesForAccount = killBillClient.getInvoicesForAccount(accountJson.getAccountId(), requestOptions);
+        final Invoices invoicesForAccount = accountApi.getInvoices(accountJson.getAccountId(), requestOptions);
         final List<Invoice> mostRecentInvoiceFirst = Ordering.<Invoice>from(new Comparator<Invoice>() {
             @Override
             public int compare(final Invoice invoice1, final Invoice invoice2) {
@@ -90,7 +88,7 @@ public class TestOverdue extends TestJaxrsBase {
                 invoicePayment.setPurchasedAmount(invoice.getAmount());
                 invoicePayment.setAccountId(accountJson.getAccountId());
                 invoicePayment.setTargetInvoiceId(invoice.getInvoiceId());
-                killBillClient.createInvoicePayment(invoicePayment, true, requestOptions);
+                invoiceApi.createInstantPayment(invoicePayment, invoice.getInvoiceId(), true, NULL_PLUGIN_PROPERTIES, requestOptions);
             }
         }
 
@@ -98,17 +96,16 @@ public class TestOverdue extends TestJaxrsBase {
         crappyWaitForLackOfProperSynchonization();
 
         // Verify we're in clear state
-        Assert.assertTrue(killBillClient.getOverdueStateForAccount(accountJson.getAccountId(), requestOptions).getIsClearState());
+        Assert.assertTrue(accountApi.getOverdueAccount(accountJson.getAccountId(), requestOptions).isIsClearState());
     }
 
     @Test(groups = "slow", description = "Allow overdue condition by control tag defined in overdue config xml file")
     public void testControlTagOverdueConfig() throws Exception {
-        final String overdueConfigPath = Resources.getResource("overdueWithControlTag.xml").getPath();
-        killBillClient.uploadXMLOverdueConfig(overdueConfigPath, requestOptions);
+        uploadTenantOverdueConfig("overdueWithControlTag.xml");
 
         // Create an account without a payment method and assign a TEST tag
         final Account accountJson = createAccountNoPMBundleAndSubscription();
-        final Tags accountTag = killBillClient.createAccountTag(accountJson.getAccountId(), ControlTagType.TEST.getId(), requestOptions);
+        final Tags accountTag = accountApi.createTags(accountJson.getAccountId(), ImmutableList.<String>of(ControlTagType.TEST.getId().toString()), requestOptions);
         assertEquals(accountTag.get(0).getTagDefinitionId(), ControlTagType.TEST.getId());
 
         // Create an account without a TEST tag
@@ -119,35 +116,35 @@ public class TestOverdue extends TestJaxrsBase {
         crappyWaitForLackOfProperSynchonization();
 
         // Get the invoices
-        final List<Invoice> invoices = killBillClient.getInvoicesForAccount(accountJson.getAccountId(), requestOptions);
+        final List<Invoice> invoices = accountApi.getInvoices(accountJson.getAccountId(), requestOptions);
         // 2 invoices but look for the non zero dollar one
         assertEquals(invoices.size(), 2);
 
-        final List<Invoice> invoicesNoTag = killBillClient.getInvoicesForAccount(accountJsonNoTag.getAccountId(), requestOptions);
+        final List<Invoice> invoicesNoTag = accountApi.getInvoices(accountJsonNoTag.getAccountId(), requestOptions);
         // 2 invoices but look for the non zero dollar one
         assertEquals(invoicesNoTag.size(), 2);
 
         // We're still clear - see the configuration
-        Assert.assertTrue(killBillClient.getOverdueStateForAccount(accountJson.getAccountId(), requestOptions).getIsClearState());
-        Assert.assertTrue(killBillClient.getOverdueStateForAccount(accountJsonNoTag.getAccountId(), requestOptions).getIsClearState());
+        Assert.assertTrue(accountApi.getOverdueAccount(accountJson.getAccountId(), requestOptions).isIsClearState());
+        Assert.assertTrue(accountApi.getOverdueAccount(accountJsonNoTag.getAccountId(), requestOptions).isIsClearState());
 
         clock.addDays(30);
         crappyWaitForLackOfProperSynchonization();
 
         // This account is expected to move to OD1 state because it matches with controlTag defined
-        Assert.assertEquals(killBillClient.getOverdueStateForAccount(accountJson.getAccountId(), requestOptions).getName(), "OD1");
+        Assert.assertEquals(accountApi.getOverdueAccount(accountJson.getAccountId(), requestOptions).getName(), "OD1");
         // This account is not expected to move to OD1 state because it does not match with controlTag defined
-        Assert.assertTrue(killBillClient.getOverdueStateForAccount(accountJsonNoTag.getAccountId(), requestOptions).getIsClearState());
+        Assert.assertTrue(accountApi.getOverdueAccount(accountJsonNoTag.getAccountId(), requestOptions).isIsClearState());
     }
 
     @Test(groups = "slow", description = "Allow overdue condition by exclusion control tag defined in overdue config xml file")
     public void testExclusionControlTagOverdueConfig() throws Exception {
-        final String overdueConfigPath = Resources.getResource("overdueWithExclusionControlTag.xml").getPath();
-        killBillClient.uploadXMLOverdueConfig(overdueConfigPath, requestOptions);
+
+        uploadTenantOverdueConfig("overdueWithExclusionControlTag.xml");
 
         // Create an account without a payment method and assign a TEST tag
         final Account accountJson = createAccountNoPMBundleAndSubscription();
-        final Tags accountTag = killBillClient.createAccountTag(accountJson.getAccountId(), ControlTagType.TEST.getId(), requestOptions);
+        final Tags accountTag = accountApi.createTags(accountJson.getAccountId(), ImmutableList.<String>of(ControlTagType.TEST.getId().toString()), requestOptions);
         assertEquals(accountTag.get(0).getTagDefinitionId(), ControlTagType.TEST.getId());
 
         // Create an account without a TEST tag
@@ -159,24 +156,24 @@ public class TestOverdue extends TestJaxrsBase {
         crappyWaitForLackOfProperSynchonization();
 
         // Get the invoices
-        final List<Invoice> invoices = killBillClient.getInvoicesForAccount(accountJson.getAccountId(), requestOptions);
+        final List<Invoice> invoices = accountApi.getInvoices(accountJson.getAccountId(), requestOptions);
         // 2 invoices but look for the non zero dollar one
         assertEquals(invoices.size(), 2);
 
-        final List<Invoice> invoicesNoTag = killBillClient.getInvoicesForAccount(accountJsonNoTag.getAccountId(), requestOptions);
+        final List<Invoice> invoicesNoTag = accountApi.getInvoices(accountJsonNoTag.getAccountId(), requestOptions);
         // 2 invoices but look for the non zero dollar one
         assertEquals(invoicesNoTag.size(), 2);
 
         // We're still clear - see the configuration
-        Assert.assertTrue(killBillClient.getOverdueStateForAccount(accountJson.getAccountId(), requestOptions).getIsClearState());
-        Assert.assertTrue(killBillClient.getOverdueStateForAccount(accountJsonNoTag.getAccountId(), requestOptions).getIsClearState());
+        Assert.assertTrue(accountApi.getOverdueAccount(accountJson.getAccountId(), requestOptions).isIsClearState());
+        Assert.assertTrue(accountApi.getOverdueAccount(accountJsonNoTag.getAccountId(), requestOptions).isIsClearState());
 
         clock.addDays(30);
         crappyWaitForLackOfProperSynchonization();
 
         // This account is not expected to move to OD1 state because it does not match with exclusion controlTag defined
-        Assert.assertTrue(killBillClient.getOverdueStateForAccount(accountJson.getAccountId(), requestOptions).getIsClearState());
+        Assert.assertTrue(accountApi.getOverdueAccount(accountJson.getAccountId(), requestOptions).isIsClearState());
         // This account is expected to move to OD1 state because it matches with exclusion controlTag defined
-        Assert.assertEquals(killBillClient.getOverdueStateForAccount(accountJsonNoTag.getAccountId(), requestOptions).getName(), "OD1");
+        Assert.assertEquals(accountApi.getOverdueAccount(accountJsonNoTag.getAccountId(), requestOptions).getName(), "OD1");
     }
 }
diff --git a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPaymentGateway.java b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPaymentGateway.java
index 5c87db5..3cfe097 100644
--- a/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPaymentGateway.java
+++ b/profiles/killbill/src/test/java/org/killbill/billing/jaxrs/TestPaymentGateway.java
@@ -19,20 +19,17 @@ package org.killbill.billing.jaxrs;
 
 import java.util.UUID;
 
-import org.killbill.billing.client.model.Account;
-import org.killbill.billing.client.model.ComboHostedPaymentPage;
-import org.killbill.billing.client.model.HostedPaymentPageFields;
-import org.killbill.billing.client.model.HostedPaymentPageFormDescriptor;
-import org.killbill.billing.client.model.PaymentMethod;
-import org.killbill.billing.client.model.PaymentMethodPluginDetail;
-import org.killbill.billing.client.model.PluginProperty;
+import org.killbill.billing.client.model.gen.Account;
+import org.killbill.billing.client.model.gen.ComboHostedPaymentPage;
+import org.killbill.billing.client.model.gen.HostedPaymentPageFields;
+import org.killbill.billing.client.model.gen.HostedPaymentPageFormDescriptor;
+import org.killbill.billing.client.model.gen.PaymentMethod;
+import org.killbill.billing.client.model.gen.PaymentMethodPluginDetail;
+import org.killbill.billing.client.model.gen.PluginProperty;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 
-import com.ning.http.client.Response;
-
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
 
 public class TestPaymentGateway extends TestJaxrsBase {
 
@@ -42,7 +39,7 @@ public class TestPaymentGateway extends TestJaxrsBase {
 
         final HostedPaymentPageFields hppFields = new HostedPaymentPageFields();
 
-        final HostedPaymentPageFormDescriptor hostedPaymentPageFormDescriptor = killBillClient.buildFormDescriptor(hppFields, account.getAccountId(), null, ImmutableMap.<String, String>of(), requestOptions);
+        final HostedPaymentPageFormDescriptor hostedPaymentPageFormDescriptor = paymentGatewayApi.buildFormDescriptor(hppFields, account.getAccountId(), null, NULL_PLUGIN_NAMES, NULL_PLUGIN_PROPERTIES, requestOptions);
         Assert.assertEquals(hostedPaymentPageFormDescriptor.getKbAccountId(), account.getAccountId());
     }
 
@@ -52,19 +49,18 @@ public class TestPaymentGateway extends TestJaxrsBase {
         account.setAccountId(null);
 
         final PaymentMethodPluginDetail info = new PaymentMethodPluginDetail();
-        final PaymentMethod paymentMethod = new PaymentMethod(null, UUID.randomUUID().toString(), null, true, PLUGIN_NAME, info);
+        final PaymentMethod paymentMethod = new PaymentMethod(null, UUID.randomUUID().toString(), null, true, PLUGIN_NAME, info, null);
 
         final HostedPaymentPageFields hppFields = new HostedPaymentPageFields();
 
-        final ComboHostedPaymentPage comboHostedPaymentPage = new ComboHostedPaymentPage(account, paymentMethod, ImmutableList.<PluginProperty>of(), hppFields);
+        final ComboHostedPaymentPage comboHostedPaymentPage = new ComboHostedPaymentPage(account, paymentMethod, hppFields, ImmutableList.<PluginProperty>of(), null);
 
-        final HostedPaymentPageFormDescriptor hostedPaymentPageFormDescriptor = killBillClient.buildFormDescriptor(comboHostedPaymentPage, ImmutableMap.<String, String>of(), requestOptions);
+        final HostedPaymentPageFormDescriptor hostedPaymentPageFormDescriptor = paymentGatewayApi.buildComboFormDescriptor(comboHostedPaymentPage, NULL_PLUGIN_NAMES, NULL_PLUGIN_PROPERTIES, requestOptions);
         Assert.assertNotNull(hostedPaymentPageFormDescriptor.getKbAccountId());
     }
 
     @Test(groups = "slow")
     public void testProcessNotification() throws Exception {
-        final Response response = killBillClient.processNotification("TOTO", PLUGIN_NAME, ImmutableMap.<String, String>of(), createdBy, reason, comment);
-        Assert.assertEquals(response.getStatusCode(), 200);
+        paymentGatewayApi.processNotification("TOTO", PLUGIN_NAME, NULL_PLUGIN_NAMES, NULL_PLUGIN_PROPERTIES, requestOptions);
     }
 }