Modernizing the Rackspace Cloud Load Balancers API. Following naming conventions and using PagedIterable.
diff --git a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/CloudLoadBalancersApi.java b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/CloudLoadBalancersApi.java
index d34a5d1..c0d2d5f 100644
--- a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/CloudLoadBalancersApi.java
+++ b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/CloudLoadBalancersApi.java
@@ -21,12 +21,15 @@
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+
 import org.jclouds.concurrent.Timeout;
 import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.location.Zone;
 import org.jclouds.location.functions.ZoneToEndpoint;
-import org.jclouds.rackspace.cloudloadbalancers.features.LoadBalancerClient;
-import org.jclouds.rackspace.cloudloadbalancers.features.NodeClient;
+import org.jclouds.rackspace.cloudloadbalancers.features.LoadBalancerApi;
+import org.jclouds.rackspace.cloudloadbalancers.features.NodeApi;
 import org.jclouds.rest.annotations.Delegate;
 import org.jclouds.rest.annotations.EndpointParam;
 
@@ -52,14 +55,15 @@
     * Provides synchronous access to LoadBalancer features.
     */
    @Delegate
-   LoadBalancerClient getLoadBalancerClient(
+   LoadBalancerApi getLoadBalancerApiForZone(
          @EndpointParam(parser = ZoneToEndpoint.class) @Nullable String zone);
    
    /**
     * Provides synchronous access to Node features.
     */
    @Delegate
-   NodeClient getNodeClient(
-         @EndpointParam(parser = ZoneToEndpoint.class) @Nullable String zone);
+   @Path("/loadbalancers/{lbId}")
+   NodeApi getNodeApiForZoneAndLoadBalancer(
+         @EndpointParam(parser = ZoneToEndpoint.class) @Nullable String zone, @PathParam("lbId") int lbId);
 
 }
diff --git a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/CloudLoadBalancersAsyncApi.java b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/CloudLoadBalancersAsyncApi.java
index 3dbf012..7a897da 100644
--- a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/CloudLoadBalancersAsyncApi.java
+++ b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/CloudLoadBalancersAsyncApi.java
@@ -20,11 +20,14 @@
 
 import java.util.Set;
 
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+
 import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.location.Zone;
 import org.jclouds.location.functions.ZoneToEndpoint;
-import org.jclouds.rackspace.cloudloadbalancers.features.LoadBalancerAsyncClient;
-import org.jclouds.rackspace.cloudloadbalancers.features.NodeAsyncClient;
+import org.jclouds.rackspace.cloudloadbalancers.features.LoadBalancerAsyncApi;
+import org.jclouds.rackspace.cloudloadbalancers.features.NodeAsyncApi;
 import org.jclouds.rest.annotations.Delegate;
 import org.jclouds.rest.annotations.EndpointParam;
 
@@ -49,14 +52,15 @@
     * Provides asynchronous access to LoadBalancer features.
     */
    @Delegate
-   LoadBalancerAsyncClient getLoadBalancerClient(
+   LoadBalancerAsyncApi getLoadBalancerApiForZone(
          @EndpointParam(parser = ZoneToEndpoint.class) @Nullable String zone);
    
    /**
     * Provides asynchronous access to Node features.
     */
    @Delegate
-   NodeAsyncClient getNodeClient(
-         @EndpointParam(parser = ZoneToEndpoint.class) @Nullable String zone);
+   @Path("/loadbalancers/{lbId}")
+   NodeAsyncApi getNodeApiForZoneAndLoadBalancer(
+         @EndpointParam(parser = ZoneToEndpoint.class) @Nullable String zone, @PathParam("lbId") int lbId);
 
 }
diff --git a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/config/CloudLoadBalancersRestClientModule.java b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/config/CloudLoadBalancersRestClientModule.java
index f8fd9e1..5bbc8f3 100644
--- a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/config/CloudLoadBalancersRestClientModule.java
+++ b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/config/CloudLoadBalancersRestClientModule.java
@@ -28,10 +28,10 @@
 import org.jclouds.json.config.GsonModule.Iso8601DateAdapter;
 import org.jclouds.rackspace.cloudloadbalancers.CloudLoadBalancersAsyncApi;
 import org.jclouds.rackspace.cloudloadbalancers.CloudLoadBalancersApi;
-import org.jclouds.rackspace.cloudloadbalancers.features.LoadBalancerAsyncClient;
-import org.jclouds.rackspace.cloudloadbalancers.features.LoadBalancerClient;
-import org.jclouds.rackspace.cloudloadbalancers.features.NodeAsyncClient;
-import org.jclouds.rackspace.cloudloadbalancers.features.NodeClient;
+import org.jclouds.rackspace.cloudloadbalancers.features.LoadBalancerAsyncApi;
+import org.jclouds.rackspace.cloudloadbalancers.features.LoadBalancerApi;
+import org.jclouds.rackspace.cloudloadbalancers.features.NodeAsyncApi;
+import org.jclouds.rackspace.cloudloadbalancers.features.NodeApi;
 import org.jclouds.rackspace.cloudloadbalancers.functions.ConvertLB;
 import org.jclouds.rackspace.cloudloadbalancers.handlers.ParseCloudLoadBalancersErrorFromHttpResponse;
 import org.jclouds.rest.ConfiguresRestClient;
@@ -50,8 +50,8 @@
          RestClientModule<CloudLoadBalancersApi, CloudLoadBalancersAsyncApi> {
 
    public static final Map<Class<?>, Class<?>> DELEGATE_MAP = ImmutableMap.<Class<?>, Class<?>> builder()
-            .put(LoadBalancerClient.class, LoadBalancerAsyncClient.class)
-            .put(NodeClient.class, NodeAsyncClient.class)
+            .put(LoadBalancerApi.class, LoadBalancerAsyncApi.class)
+            .put(NodeApi.class, NodeAsyncApi.class)
             .build();
 
    public CloudLoadBalancersRestClientModule() {
diff --git a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/domain/LoadBalancer.java b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/domain/LoadBalancer.java
index 00d9db3..cb84418 100644
--- a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/domain/LoadBalancer.java
+++ b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/domain/LoadBalancer.java
@@ -26,7 +26,7 @@
 
 import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.rackspace.cloudloadbalancers.domain.internal.BaseLoadBalancer;
-import org.jclouds.rackspace.cloudloadbalancers.features.LoadBalancerClient;
+import org.jclouds.rackspace.cloudloadbalancers.features.LoadBalancerApi;
 
 import com.google.common.base.Objects;
 import com.google.common.base.Objects.ToStringHelper;
@@ -344,8 +344,8 @@
 
    /**
     * Broken out as a separate field because when LoadBalancers are returned from 
-    * {@link LoadBalancerClient#listLoadBalancers()}, no Nodes are returned (so you can't rely on getNodes().size())
-    * but a nodeCount is returned. When {@link LoadBalancerClient#getLoadBalancer(int)} is called, nodes are
+    * {@link LoadBalancerApi#list()}, no Nodes are returned (so you can't rely on getNodes().size())
+    * but a nodeCount is returned. When {@link LoadBalancerApi#get(int)} is called, nodes are
     * returned by no nodeCount is returned.
     *  
     * @return The number of Nodes in this LoadBalancer 
diff --git a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/domain/internal/BaseLoadBalancer.java b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/domain/internal/BaseLoadBalancer.java
index dabcc52..b635e7b 100644
--- a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/domain/internal/BaseLoadBalancer.java
+++ b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/domain/internal/BaseLoadBalancer.java
@@ -24,7 +24,10 @@
 import java.util.SortedSet;
 
 import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.rackspace.cloudloadbalancers.domain.LoadBalancer;
 
+import com.google.common.base.Objects;
+import com.google.common.base.Objects.ToStringHelper;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.ImmutableSortedSet;
 import com.google.common.collect.Sets;
@@ -147,34 +150,28 @@
       return nodes;
    }
 
+   protected ToStringHelper string() {
+      return Objects.toStringHelper(this)
+            .add("name", name).add("protocol", protocol).add("port", port)
+            .add("algorithm", algorithm).add("nodes", nodes);
+   }
+   
+   @Override
+   public String toString() {
+      return string().toString();
+   }
+
    @Override
    public int hashCode() {
-      final Integer prime = 31;
-      Integer result = 1;
-      result = prime * result + ((name == null) ? 0 : name.hashCode());
-      return result;
+      return Objects.hashCode(name);
    }
 
    @Override
    public boolean equals(Object obj) {
-      if (this == obj)
-         return true;
-      if (obj == null)
-         return false;
-      if (getClass() != obj.getClass())
-         return false;
-      BaseLoadBalancer<?, ?> other = (BaseLoadBalancer<?, ?>) obj;
-      if (name == null) {
-         if (other.name != null)
-            return false;
-      } else if (!name.equals(other.name))
-         return false;
-      return true;
-   }
+      if (this == obj) return true;
+      if (obj == null || getClass() != obj.getClass()) return false;
 
-   @Override
-   public String toString() {
-      return String.format("[name=%s, port=%s, protocol=%s, algorithm=%s, nodes=%s]", name, port, protocol, algorithm,
-               nodes);
+      LoadBalancer that = LoadBalancer.class.cast(obj);
+      return Objects.equal(this.name, that.name);
    }
 }
diff --git a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/features/LoadBalancerClient.java b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/features/LoadBalancerApi.java
similarity index 83%
rename from apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/features/LoadBalancerClient.java
rename to apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/features/LoadBalancerApi.java
index b4f1cf3..340c218 100644
--- a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/features/LoadBalancerClient.java
+++ b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/features/LoadBalancerApi.java
@@ -18,10 +18,13 @@
  */
 package org.jclouds.rackspace.cloudloadbalancers.features;
 
-import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
+import org.jclouds.collect.IterableWithMarker;
+import org.jclouds.collect.PagedIterable;
 import org.jclouds.concurrent.Timeout;
+import org.jclouds.http.HttpResponseException;
+import org.jclouds.openstack.v2_0.options.PaginationOptions;
 import org.jclouds.rackspace.cloudloadbalancers.domain.LoadBalancer;
 import org.jclouds.rackspace.cloudloadbalancers.domain.LoadBalancerAttributes;
 import org.jclouds.rackspace.cloudloadbalancers.domain.LoadBalancerRequest;
@@ -30,14 +33,11 @@
  * Provides synchronous access to CloudLoadBalancers LoadBalancer features.
  * <p/>
  * 
- * @see LoadBalancerAsyncClient
- * @see <a
- *      href="http://docs.rackspacecloud.com/loadbalancers/api/v1.0/clb-devguide/content/ch04s01.html"
- *      />
- * @author Adrian Cole
+ * @see LoadBalancerAsyncApi
+ * @author Everett Toews
  */
 @Timeout(duration = 60, timeUnit = TimeUnit.SECONDS)
-public interface LoadBalancerClient {
+public interface LoadBalancerApi {
    /**
     * Create a new load balancer with the configuration defined by the request.
     * 
@@ -51,13 +51,13 @@
     *           configuration to create
     * @return The object will contain a unique identifier and status of the request. Using the
     *         identifier, the caller can check on the progress of the operation by performing a
-    *         {@link LoadBalancerClient#getLoadBalancer}.
+    *         {@link LoadBalancerApi#getLoadBalancer}.
     * @throws HttpResponseException
     *            If the corresponding request cannot be fulfilled due to insufficient or invalid
     *            data
     * 
     */
-   LoadBalancer createLoadBalancer(LoadBalancerRequest lb);
+   LoadBalancer create(LoadBalancerRequest lb);
 
    /**
     * 
@@ -75,16 +75,18 @@
     *           what to change
     * @return The object will contain a unique identifier and status of the request. Using the
     *         identifier, the caller can check on the progress of the operation by performing a
-    *         {@link LoadBalancerClient#getLoadBalancer}.
+    *         {@link LoadBalancerApi#getLoadBalancer}.
     * @see LoadBalancerAttributes#fromLoadBalancer
     */
-   void updateLoadBalancerAttributes(int id, LoadBalancerAttributes attrs);
+   void update(int id, LoadBalancerAttributes attrs);
 
    /**
     * 
     * @return all load balancers configured for the account, or empty set if none available
     */
-   Set<LoadBalancer> listLoadBalancers();
+   PagedIterable<LoadBalancer> list();
+   
+   IterableWithMarker<LoadBalancer> list(PaginationOptions options);
 
    /**
     * 
@@ -93,7 +95,7 @@
     *           id of the loadbalancer to retrieve
     * @return details of the specified load balancer, or null if not found
     */
-   LoadBalancer getLoadBalancer(int id);
+   LoadBalancer get(int id);
 
    /**
     * Remove a load balancer from the account.
@@ -105,5 +107,5 @@
     * @param id
     *           to remove
     */
-   void removeLoadBalancer(int id);
+   void remove(int id);
 }
diff --git a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/features/LoadBalancerAsyncApi.java b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/features/LoadBalancerAsyncApi.java
new file mode 100644
index 0000000..a38aaa5
--- /dev/null
+++ b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/features/LoadBalancerAsyncApi.java
@@ -0,0 +1,122 @@
+/**
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  jclouds licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.jclouds.rackspace.cloudloadbalancers.features;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.collect.IterableWithMarker;
+import org.jclouds.collect.PagedIterable;
+import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
+import org.jclouds.openstack.keystone.v2_0.functions.ReturnEmptyPaginatedCollectionOnNotFoundOr404;
+import org.jclouds.openstack.v2_0.options.PaginationOptions;
+import org.jclouds.rackspace.cloudloadbalancers.domain.LoadBalancer;
+import org.jclouds.rackspace.cloudloadbalancers.domain.LoadBalancerAttributes;
+import org.jclouds.rackspace.cloudloadbalancers.domain.LoadBalancerRequest;
+import org.jclouds.rackspace.cloudloadbalancers.functions.ParseLoadBalancer;
+import org.jclouds.rackspace.cloudloadbalancers.functions.ParseLoadBalancers;
+import org.jclouds.rest.annotations.ExceptionParser;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.ResponseParser;
+import org.jclouds.rest.annotations.SkipEncoding;
+import org.jclouds.rest.annotations.Transform;
+import org.jclouds.rest.annotations.WrapWith;
+import org.jclouds.rest.functions.ReturnEmptyPagedIterableOnNotFoundOr404;
+import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
+import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+/**
+ * Provides asynchronous access to Rackspace Cloud Load Balancers via their REST API.
+ * <p/>
+ * 
+ * @see LoadBalancerApi
+ * @author Everett Toews
+ */
+@SkipEncoding('/')
+@RequestFilters(AuthenticateRequest.class)
+public interface LoadBalancerAsyncApi {
+
+   /**
+    * @see LoadBalancerApi#create(LoadBalancerRequest)
+    */
+   @POST
+   @ResponseParser(ParseLoadBalancer.class)
+   @Consumes(MediaType.APPLICATION_JSON)
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   @Path("/loadbalancers")
+   ListenableFuture<LoadBalancer> create(@WrapWith("loadBalancer") LoadBalancerRequest lb);
+
+   /**
+    * @see LoadBalancerApi#update(int, LoadBalancerAttributes)
+    */
+   @PUT
+   @ResponseParser(ParseLoadBalancer.class)
+   @Consumes(MediaType.APPLICATION_JSON)
+   @Path("/loadbalancers/{id}")
+   ListenableFuture<Void> update(@PathParam("id") int id, @WrapWith("loadBalancer") LoadBalancerAttributes attrs);
+
+   /**
+    * @see LoadBalancerApi#list()
+    */
+   @GET
+   @ResponseParser(ParseLoadBalancers.class)
+   @Transform(ParseLoadBalancers.ToPagedIterable.class)
+   @Consumes(MediaType.APPLICATION_JSON)
+   @Path("/loadbalancers")
+   @ExceptionParser(ReturnEmptyPagedIterableOnNotFoundOr404.class)
+   ListenableFuture<PagedIterable<LoadBalancer>> list();
+
+   /** 
+    * @see LoadBalancerApi#list(PaginationOptions) 
+    */
+   @GET
+   @ResponseParser(ParseLoadBalancers.class)
+   @Consumes(MediaType.APPLICATION_JSON)
+   @ExceptionParser(ReturnEmptyPaginatedCollectionOnNotFoundOr404.class)
+   @Path("/loadbalancers")
+   ListenableFuture<IterableWithMarker<LoadBalancer>> list(PaginationOptions options);
+
+   /**
+    * @see LoadBalancerApi#get(int)
+    */
+   @GET
+   @ResponseParser(ParseLoadBalancer.class)
+   @Consumes(MediaType.APPLICATION_JSON)
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   @Path("/loadbalancers/{id}")
+   ListenableFuture<LoadBalancer> get(@PathParam("id") int id);
+
+   /**
+    * @see LoadBalancerApi#remove(int)
+    */
+   @DELETE
+   @ExceptionParser(ReturnVoidOnNotFoundOr404.class)
+   @Path("/loadbalancers/{id}")
+   @Consumes("*/*")
+   ListenableFuture<Void> remove(@PathParam("id") int id);
+
+}
diff --git a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/features/LoadBalancerAsyncClient.java b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/features/LoadBalancerAsyncClient.java
deleted file mode 100644
index ffad710..0000000
--- a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/features/LoadBalancerAsyncClient.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/**
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.jclouds.rackspace.cloudloadbalancers.features;
-
-import java.util.Set;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.core.MediaType;
-
-import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
-import org.jclouds.rackspace.cloudloadbalancers.domain.LoadBalancer;
-import org.jclouds.rackspace.cloudloadbalancers.domain.LoadBalancerAttributes;
-import org.jclouds.rackspace.cloudloadbalancers.domain.LoadBalancerRequest;
-import org.jclouds.rackspace.cloudloadbalancers.functions.UnwrapLoadBalancer;
-import org.jclouds.rackspace.cloudloadbalancers.functions.UnwrapLoadBalancers;
-import org.jclouds.rest.annotations.ExceptionParser;
-import org.jclouds.rest.annotations.RequestFilters;
-import org.jclouds.rest.annotations.ResponseParser;
-import org.jclouds.rest.annotations.SkipEncoding;
-import org.jclouds.rest.annotations.WrapWith;
-import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404;
-import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
-import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404;
-
-import com.google.common.util.concurrent.ListenableFuture;
-
-/**
- * Provides asynchronous access toRackspace Cloud Load Balancers via their REST API.
- * <p/>
- * 
- * @see LoadBalancerClient
- * @see <a
- *      href="http://docs.rackspacecloud.com/loadbalancers/api/v1.0/clb-devguide/content/ch04s01.html"
- *      />
- * @author Adrian Cole
- */
-@SkipEncoding('/')
-@RequestFilters(AuthenticateRequest.class)
-public interface LoadBalancerAsyncClient {
-
-   /**
-    * @see LoadBalancerClient#createLoadBalancer
-    */
-   @POST
-   @ResponseParser(UnwrapLoadBalancer.class)
-   @Consumes(MediaType.APPLICATION_JSON)
-   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   @Path("/loadbalancers")
-   ListenableFuture<LoadBalancer> createLoadBalancer(@WrapWith("loadBalancer") LoadBalancerRequest lb);
-
-   /**
-    * @see LoadBalancerClient#updateLoadBalancerAttributes
-    */
-   @PUT
-   @ResponseParser(UnwrapLoadBalancer.class)
-   @Consumes(MediaType.APPLICATION_JSON)
-   @Path("/loadbalancers/{id}")
-   ListenableFuture<Void> updateLoadBalancerAttributes(@PathParam("id") int id,
-            @WrapWith("loadBalancer") LoadBalancerAttributes attrs);
-
-   /**
-    * @see CloudServersClient#listLoadBalancers
-    */
-   @GET
-   @ResponseParser(UnwrapLoadBalancers.class)
-   @Consumes(MediaType.APPLICATION_JSON)
-   @Path("/loadbalancers")
-   @ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
-   ListenableFuture<Set<LoadBalancer>> listLoadBalancers();
-
-   /**
-    * @see LoadBalancerClient#getLoadBalancer
-    */
-   @GET
-   @ResponseParser(UnwrapLoadBalancer.class)
-   @Consumes(MediaType.APPLICATION_JSON)
-   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   @Path("/loadbalancers/{id}")
-   ListenableFuture<LoadBalancer> getLoadBalancer(@PathParam("id") int id);
-
-   /**
-    * @see LoadBalancerClient#removeLoadBalancer
-    */
-   @DELETE
-   @ExceptionParser(ReturnVoidOnNotFoundOr404.class)
-   @Path("/loadbalancers/{id}")
-   @Consumes("*/*")
-   ListenableFuture<Void> removeLoadBalancer(@PathParam("id") int id);
-
-}
diff --git a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/features/NodeClient.java b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/features/NodeApi.java
similarity index 75%
rename from apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/features/NodeClient.java
rename to apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/features/NodeApi.java
index 736194d..5dc1ffe 100644
--- a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/features/NodeClient.java
+++ b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/features/NodeApi.java
@@ -21,7 +21,12 @@
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
+import org.jclouds.collect.IterableWithMarker;
+import org.jclouds.collect.PagedIterable;
 import org.jclouds.concurrent.Timeout;
+import org.jclouds.http.HttpResponseException;
+import org.jclouds.openstack.v2_0.options.PaginationOptions;
+import org.jclouds.rackspace.cloudloadbalancers.domain.LoadBalancerAttributes;
 import org.jclouds.rackspace.cloudloadbalancers.domain.Node;
 import org.jclouds.rackspace.cloudloadbalancers.domain.NodeAttributes;
 import org.jclouds.rackspace.cloudloadbalancers.domain.NodeRequest;
@@ -30,14 +35,11 @@
  * Provides synchronous access to CloudLoadBalancers Node features.
  * <p/>
  * 
- * @see NodeAsyncClient
- * @see <a
- *      href="http://docs.rackspace.com/loadbalancers/api/v1.0/clb-devguide/content/Nodes-d1e2173.html"
- *      />
- * @author Dan Lo Bianco
+ * @see NodeAsyncApi
+ * @author Everett Toews
  */
 @Timeout(duration = 60, timeUnit = TimeUnit.SECONDS)
-public interface NodeClient {
+public interface NodeApi {
    /**
     * Create a new node with the configuration defined by the request.
     * 
@@ -49,15 +51,13 @@
     * 
     * @param nodes
     *           configurations to create
-    * @param lbid
-    *           loadbalancer on which to create the nodes
     * @return created nodes
     * @throws HttpResponseException
     *            If the corresponding request cannot be fulfilled due to insufficient or invalid
     *            data
     * 
     */
-	Set<Node> createNodesInLoadBalancer(Set<NodeRequest> nodes, int lbid);
+	Set<Node> add(Iterable<NodeRequest> nodes);
 
    /**
     * 
@@ -68,37 +68,28 @@
     * successful validation of the request, the service will return a 202 (Accepted) response code.
     * A caller can poll the load balancer with its ID to wait for the changes to be applied and the
     * load balancer to return to an ACTIVE status.
-    * 
+    * @param id
+    *           node to get
     * @param attrs
     *           what to change
-    * @param nid
-    *           node to get
-    * @param lbid
-    *           loadbalancer from which to get the node
-    *           
+    * 
     * @see LoadBalancerAttributes#fromLoadBalancer
     */
-   void updateAttributesForNodeInLoadBalancer(NodeAttributes attrs, int nid, int lbid);
+   void update(int id, NodeAttributes attrs);
 
    /**
-    * 
     * @return all nodes for a given loadbalancer, or empty set if none available
-    * 
-    * @param lbid
-    *           id of the loadbalancer to get the nodes for
     */
-   Set<Node> listNodes(int lbid);
+   PagedIterable<Node> list();
+
+   IterableWithMarker<Node> list(PaginationOptions options);
 
    /**
-    * 
-    * 
-    * @param nid
+    * @param id
     *           node to get
-    * @param lbid
-    *           loadbalancer from which to get the node
     * @return details of the specified node, or null if not found
     */
-   Node getNodeInLoadBalancer(int nid, int lbid);
+   Node get(int id);
 
    /**
     * Remove a node from the account.
@@ -107,12 +98,10 @@
     * configuration from the account. Any and all configuration data is immediately purged and is
     * not recoverable.
     * 
-    * @param nid
+    * @param id
     *           node to remove
-    * @param lbid
-    *           loadbalancer from which to remove the node
     */
-   void removeNodeFromLoadBalancer(int nid, int lbid);
+   void remove(int id);
    
    /**
     * Batch-remove nodes from the account.
@@ -122,10 +111,8 @@
     * cannot be removed due to its current status a 400:BadRequest is returned along with the ids 
     * of the ones the system identified as potential failures for this request
     * 
-    * @param nids
+    * @param ids
     *           nodes to remove
-    * @param lbid
-    *           loadbalancer from which to remove the node
     */
-   void removeNodesFromLoadBalancer(Set<Integer> nids, int lbid);
+   void remove(Iterable<Integer> ids);
 }
diff --git a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/features/NodeAsyncApi.java b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/features/NodeAsyncApi.java
new file mode 100644
index 0000000..054c16a
--- /dev/null
+++ b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/features/NodeAsyncApi.java
@@ -0,0 +1,137 @@
+/**
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  jclouds licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.jclouds.rackspace.cloudloadbalancers.features;
+
+import java.util.Set;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.collect.IterableWithMarker;
+import org.jclouds.collect.PagedIterable;
+import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
+import org.jclouds.openstack.keystone.v2_0.functions.ReturnEmptyPaginatedCollectionOnNotFoundOr404;
+import org.jclouds.openstack.v2_0.options.PaginationOptions;
+import org.jclouds.rackspace.cloudloadbalancers.domain.LoadBalancer;
+import org.jclouds.rackspace.cloudloadbalancers.domain.Node;
+import org.jclouds.rackspace.cloudloadbalancers.domain.NodeAttributes;
+import org.jclouds.rackspace.cloudloadbalancers.domain.NodeRequest;
+import org.jclouds.rackspace.cloudloadbalancers.functions.ParseLoadBalancers;
+import org.jclouds.rackspace.cloudloadbalancers.functions.ParseNodes;
+import org.jclouds.rest.annotations.ExceptionParser;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.ResponseParser;
+import org.jclouds.rest.annotations.SelectJson;
+import org.jclouds.rest.annotations.SkipEncoding;
+import org.jclouds.rest.annotations.Transform;
+import org.jclouds.rest.annotations.WrapWith;
+import org.jclouds.rest.functions.ReturnEmptyPagedIterableOnNotFoundOr404;
+import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404;
+import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
+import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+/**
+ * Provides asynchronous access to Cloud Load Balancers Node features.
+ * <p/>
+ * 
+ * @see NodeAsyncApi
+ * @author Everett Toews
+ */
+@SkipEncoding('/')
+@RequestFilters(AuthenticateRequest.class)
+public interface NodeAsyncApi {
+
+   /**
+    * @see NodeApi#add(Set)
+    */
+   @POST
+   @SelectJson("nodes")
+   @Consumes(MediaType.APPLICATION_JSON)
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   @Path("/nodes")
+   ListenableFuture<Set<Node>> add(@WrapWith("nodes") Iterable<NodeRequest> nodes);
+
+   /**
+    * @see NodeApi#update(int, NodeAttributes)
+    */
+   @PUT
+   @Consumes(MediaType.APPLICATION_JSON)
+   @Path("/nodes/{id}")
+   ListenableFuture<Void> update(@PathParam("id") int id, @WrapWith("node") NodeAttributes attrs);
+   
+   /**
+    * @see NodeApi#list()
+    */
+   @GET
+   @ResponseParser(ParseNodes.class)
+   @Transform(ParseNodes.ToPagedIterable.class)
+   @Consumes(MediaType.APPLICATION_JSON)
+   @Path("/nodes")
+   @ExceptionParser(ReturnEmptyPagedIterableOnNotFoundOr404.class)
+   ListenableFuture<PagedIterable<Node>> list();
+
+   /** 
+    * @see NodeApi#list(PaginationOptions) 
+    */
+   @GET
+   @ResponseParser(ParseNodes.class)
+   @Consumes(MediaType.APPLICATION_JSON)
+   @ExceptionParser(ReturnEmptyPaginatedCollectionOnNotFoundOr404.class)
+   @Path("/loadbalancers")
+   ListenableFuture<IterableWithMarker<LoadBalancer>> list(PaginationOptions options);
+   
+   /**
+    * @see NodeApi#get(int)
+    */
+   @GET
+   @SelectJson("node")
+   @Consumes(MediaType.APPLICATION_JSON)
+   @Path("/nodes/{id}")
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<Node> get(@PathParam("id") int id);
+   
+   /**
+    * @see NodeApi#remove(int)
+    */
+   @DELETE
+   @Path("/nodes/{id}")
+   @ExceptionParser(ReturnVoidOnNotFoundOr404.class)
+   @Consumes("*/*")
+   ListenableFuture<Void> remove(@PathParam("id") int id);
+   
+   /**
+    * @see NodeApi#remove(Set)
+    */
+   @DELETE
+   @Path("/nodes")
+   @ExceptionParser(ReturnVoidOnNotFoundOr404.class)
+   @Consumes("*/*")
+   ListenableFuture<Void> remove(@QueryParam("id") Iterable<Integer> ids);
+
+
+}
diff --git a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/features/NodeAsyncClient.java b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/features/NodeAsyncClient.java
deleted file mode 100644
index dcf5b05..0000000
--- a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/features/NodeAsyncClient.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/**
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.jclouds.rackspace.cloudloadbalancers.features;
-
-import java.util.Set;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-
-import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
-import org.jclouds.rackspace.cloudloadbalancers.domain.Node;
-import org.jclouds.rackspace.cloudloadbalancers.domain.NodeAttributes;
-import org.jclouds.rackspace.cloudloadbalancers.domain.NodeRequest;
-import org.jclouds.rest.annotations.ExceptionParser;
-import org.jclouds.rest.annotations.RequestFilters;
-import org.jclouds.rest.annotations.SelectJson;
-import org.jclouds.rest.annotations.SkipEncoding;
-import org.jclouds.rest.annotations.WrapWith;
-import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404;
-import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
-import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404;
-
-import com.google.common.util.concurrent.ListenableFuture;
-
-/**
- * Provides asynchronous access to CloudLoadBalancers Node features.
- * <p/>
- * 
- * @see NodeAsyncClient
- * @see <a
- *      href="http://docs.rackspace.com/loadbalancers/api/v1.0/clb-devguide/content/Nodes-d1e2173.html"
- *      />
- * @author Dan Lo Bianco
- */
-@SkipEncoding('/')
-@RequestFilters(AuthenticateRequest.class)
-public interface NodeAsyncClient {
-
-   /**
-    * @see NodeClient#createNodesInLoadBalancer
-    */
-   @POST
-   @SelectJson("nodes")
-   @Consumes(MediaType.APPLICATION_JSON)
-   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   @Path("/loadbalancers/{lbid}/nodes")
-   ListenableFuture<Set<Node>> createNodesInLoadBalancer(@WrapWith("nodes") Set<NodeRequest> nodes,
-		   @PathParam("lbid") int lbid);
-
-   /**
-    * @see NodeClient#updateAttributesForNodeInLoadBalancer
-    */
-   @PUT
-   @Consumes(MediaType.APPLICATION_JSON)
-   @Path("/loadbalancers/{lbid}/nodes/{nid}")
-   ListenableFuture<Void> updateAttributesForNodeInLoadBalancer(@WrapWith("node") NodeAttributes attrs,
-		   @PathParam("nid") int nid,
-		   @PathParam("lbid") int lbid);
-
-   /**
-    * @see NodeClient#listNodes
-    */
-   @GET
-   @SelectJson("nodes")
-   @Consumes(MediaType.APPLICATION_JSON)
-   @Path("/loadbalancers/{lbid}/nodes")
-   @ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
-   ListenableFuture<Set<Node>> listNodes(@PathParam("lbid") int lbid);
-   
-   /**
-    * @see NodeClient#getNodeInLoadBalancer
-    */
-   @GET
-   @SelectJson("node")
-   @Consumes(MediaType.APPLICATION_JSON)
-   @Path("/loadbalancers/{lbid}/nodes/{nid}")
-   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<Node> getNodeInLoadBalancer(@PathParam("nid") int nid,
-		   @PathParam("lbid") int lbid);
-   
-   /**
-    * @see NodeClient#removeNodeFromLoadBalancer
-    */
-   @DELETE
-   @Path("/loadbalancers/{lbid}/nodes/{nid}")
-   @ExceptionParser(ReturnVoidOnNotFoundOr404.class)
-   @Consumes("*/*")
-   ListenableFuture<Void> removeNodeFromLoadBalancer(@PathParam("nid") int nid,
-		   @PathParam("lbid") int lbid);
-   
-   /**
-    * @see NodeClient#removeNodesFromLoadBalancer
-    */
-   @DELETE
-   @Path("/loadbalancers/{lbid}/nodes")
-   @ExceptionParser(ReturnVoidOnNotFoundOr404.class)
-   @Consumes("*/*")
-   ListenableFuture<Void> removeNodesFromLoadBalancer(@QueryParam("id") Set<Integer> nids, 
-		   @PathParam("lbid") int lbid);
-
-
-}
diff --git a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/functions/UnwrapLoadBalancer.java b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/functions/ParseLoadBalancer.java
similarity index 87%
rename from apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/functions/UnwrapLoadBalancer.java
rename to apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/functions/ParseLoadBalancer.java
index 713d87a..cc64b5a 100644
--- a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/functions/UnwrapLoadBalancer.java
+++ b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/functions/ParseLoadBalancer.java
@@ -38,7 +38,7 @@
 /**
  * @author Adrian Cole
  */
-public class UnwrapLoadBalancer implements Function<HttpResponse, LoadBalancer>, InvocationContext<UnwrapLoadBalancer> {
+public class ParseLoadBalancer implements Function<HttpResponse, LoadBalancer>, InvocationContext<ParseLoadBalancer> {
 
    private final ParseJson<Map<String, LB>> json;
    private final Factory factory;
@@ -46,7 +46,7 @@
    private ConvertLB convertLB;
 
    @Inject
-   UnwrapLoadBalancer(ParseJson<Map<String, LB>> json, ConvertLB.Factory factory) {
+   ParseLoadBalancer(ParseJson<Map<String, LB>> json, ConvertLB.Factory factory) {
       this.json = checkNotNull(json, "json");
       this.factory = checkNotNull(factory, "factory");
    }
@@ -62,11 +62,11 @@
    }
 
    @Override
-   public UnwrapLoadBalancer setContext(HttpRequest request) {
+   public ParseLoadBalancer setContext(HttpRequest request) {
       return setRegion(request.getEndpoint().getHost().substring(0, request.getEndpoint().getHost().indexOf('.')));
    }
 
-   UnwrapLoadBalancer setRegion(String region) {
+   ParseLoadBalancer setRegion(String region) {
       this.convertLB = factory.createForRegion(region);
       return this;
    }
diff --git a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/functions/ParseLoadBalancers.java b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/functions/ParseLoadBalancers.java
new file mode 100644
index 0000000..cb46bf9
--- /dev/null
+++ b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/functions/ParseLoadBalancers.java
@@ -0,0 +1,124 @@
+/**
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  jclouds licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.jclouds.rackspace.cloudloadbalancers.functions;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.jclouds.openstack.v2_0.options.PaginationOptions.Builder.marker;
+
+import java.beans.ConstructorProperties;
+
+import javax.inject.Inject;
+
+import org.jclouds.collect.IterableWithMarker;
+import org.jclouds.collect.IterableWithMarkers;
+import org.jclouds.collect.internal.CallerArg0ToPagedIterable;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.http.functions.ParseJson;
+import org.jclouds.openstack.keystone.v2_0.domain.PaginatedCollection;
+import org.jclouds.openstack.v2_0.domain.Link;
+import org.jclouds.rackspace.cloudloadbalancers.CloudLoadBalancersApi;
+import org.jclouds.rackspace.cloudloadbalancers.domain.LoadBalancer;
+import org.jclouds.rackspace.cloudloadbalancers.features.LoadBalancerApi;
+import org.jclouds.rackspace.cloudloadbalancers.functions.ConvertLB.Factory;
+import org.jclouds.rest.InvocationContext;
+
+import com.google.common.base.Function;
+import com.google.common.collect.Iterables;
+
+/**
+ * @author Adrian Cole
+ */
+public class ParseLoadBalancers implements Function<HttpResponse, IterableWithMarker<LoadBalancer>>,
+         InvocationContext<ParseLoadBalancers> {
+
+   private final ParseJson<LoadBalancers> json;
+   private final Factory factory;
+
+   private ConvertLB convertLB;
+
+   @Inject
+   ParseLoadBalancers(ParseJson<LoadBalancers> json, ConvertLB.Factory factory) {
+      this.json = checkNotNull(json, "json");
+      this.factory = checkNotNull(factory, "factory");
+   }
+
+   @SuppressWarnings("unchecked")
+   @Override
+   public IterableWithMarker<LoadBalancer> apply(HttpResponse arg0) {
+      LoadBalancers lbs = json.apply(arg0);
+      
+      if (lbs.size() == 0)
+         return IterableWithMarkers.EMPTY;
+      
+      Iterable<LoadBalancer> transform = Iterables.transform(lbs, convertLB);      
+      IterableWithMarker<LoadBalancer> iterableWithMarker = IterableWithMarkers.from(transform);
+      
+      return iterableWithMarker;
+   }
+
+   @Override
+   public ParseLoadBalancers setContext(HttpRequest request) {
+      return setRegion(request.getEndpoint().getHost().substring(0, request.getEndpoint().getHost().indexOf('.')));
+   }
+
+   ParseLoadBalancers setRegion(String region) {
+      this.convertLB = factory.createForRegion(region);
+      return this;
+   }
+
+   static class LoadBalancers extends PaginatedCollection<LB> {
+
+      @ConstructorProperties({ "loadBalancers", "loadBalancers_links" })
+      protected LoadBalancers(Iterable<LB> loadBalancers, Iterable<Link> loadBalancers_links) {
+         super(loadBalancers, loadBalancers_links);
+      }
+
+   }
+
+   public static class ToPagedIterable extends CallerArg0ToPagedIterable<LoadBalancer, ToPagedIterable> {
+
+      private final CloudLoadBalancersApi api;
+
+      @Inject
+      protected ToPagedIterable(CloudLoadBalancersApi api) {
+         this.api = checkNotNull(api, "api");
+      }
+
+      @Override
+      protected Function<Object, IterableWithMarker<LoadBalancer>> markerToNextForCallingArg0(final String zone) {
+         final LoadBalancerApi loadBalancerApi = api.getLoadBalancerApiForZone(zone);
+         
+         return new Function<Object, IterableWithMarker<LoadBalancer>>() {
+
+            @Override
+            public IterableWithMarker<LoadBalancer> apply(Object input) {
+               IterableWithMarker<LoadBalancer> list = loadBalancerApi.list(marker(input.toString()));
+               return list;
+            }
+
+            @Override
+            public String toString() {
+               return "list()";
+            }
+         };
+      }
+
+   }
+}
diff --git a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/functions/ParseNodes.java b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/functions/ParseNodes.java
new file mode 100644
index 0000000..adf45ca
--- /dev/null
+++ b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/functions/ParseNodes.java
@@ -0,0 +1,107 @@
+/**
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  jclouds licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.jclouds.rackspace.cloudloadbalancers.functions;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.jclouds.openstack.v2_0.options.PaginationOptions.Builder.marker;
+
+import java.beans.ConstructorProperties;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.collect.IterableWithMarker;
+import org.jclouds.collect.internal.CallerArg0ToPagedIterable;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.functions.ParseJson;
+import org.jclouds.json.Json;
+import org.jclouds.openstack.keystone.v2_0.domain.PaginatedCollection;
+import org.jclouds.openstack.v2_0.domain.Link;
+import org.jclouds.rackspace.cloudloadbalancers.CloudLoadBalancersApi;
+import org.jclouds.rackspace.cloudloadbalancers.domain.Node;
+import org.jclouds.rackspace.cloudloadbalancers.features.NodeApi;
+import org.jclouds.rackspace.cloudloadbalancers.functions.ParseNodes.Nodes;
+
+import com.google.common.annotations.Beta;
+import com.google.common.base.Function;
+import com.google.inject.TypeLiteral;
+
+/**
+ * boiler plate until we determine a better way
+ * 
+ * @author Everett Toews
+ */
+@Beta
+@Singleton
+public class ParseNodes extends ParseJson<Nodes> {
+   static class Nodes extends PaginatedCollection<Node> {
+
+      @ConstructorProperties({ "nodes", "nodes_links" })
+      protected Nodes(Iterable<Node> nodes, Iterable<Link> nodes_links) {
+         super(nodes, nodes_links);
+      }
+
+   }
+
+   @Inject
+   public ParseNodes(Json json) {
+      super(json, new TypeLiteral<Nodes>() { });
+   }
+
+   public static class ToPagedIterable extends CallerArg0ToPagedIterable<Node, ToPagedIterable> {
+
+      private final CloudLoadBalancersApi api;
+      private int lbId;
+
+      @Inject
+      protected ToPagedIterable(CloudLoadBalancersApi api) {
+         this.api = checkNotNull(api, "api");
+      }
+
+      @Override
+      public ToPagedIterable setContext(HttpRequest request) {
+         String path = request.getEndpoint().getPath();
+         int lastSlash = path.lastIndexOf('/');
+         int secondLastSlash = path.lastIndexOf('/', lastSlash-1);
+         
+         lbId = Integer.valueOf(path.substring(secondLastSlash+1, lastSlash));
+         
+         return super.setContext(request);
+      }
+
+      @Override
+      protected Function<Object, IterableWithMarker<Node>> markerToNextForCallingArg0(final String zone) {
+         final NodeApi nodeApi = api.getNodeApiForZoneAndLoadBalancer(zone, lbId);
+         
+         return new Function<Object, IterableWithMarker<Node>>() {
+
+            @Override
+            public IterableWithMarker<Node> apply(Object input) {
+               IterableWithMarker<Node> list = nodeApi.list(marker(input.toString()));
+               return list;
+            }
+
+            @Override
+            public String toString() {
+               return "list()";
+            }
+         };
+      }
+   }
+}
diff --git a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/functions/UnwrapLoadBalancers.java b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/functions/UnwrapLoadBalancers.java
deleted file mode 100644
index 53ab736..0000000
--- a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/functions/UnwrapLoadBalancers.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/**
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.jclouds.rackspace.cloudloadbalancers.functions;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.Map;
-import java.util.Set;
-
-import javax.inject.Inject;
-
-import org.jclouds.http.HttpRequest;
-import org.jclouds.http.HttpResponse;
-import org.jclouds.http.functions.ParseJson;
-import org.jclouds.rackspace.cloudloadbalancers.domain.LoadBalancer;
-import org.jclouds.rackspace.cloudloadbalancers.functions.ConvertLB.Factory;
-import org.jclouds.rest.InvocationContext;
-
-import com.google.common.base.Function;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-
-/**
- * @author Adrian Cole
- */
-public class UnwrapLoadBalancers implements Function<HttpResponse, Set<LoadBalancer>>,
-         InvocationContext<UnwrapLoadBalancers> {
-
-   private final ParseJson<Map<String, Set<LB>>> json;
-   private final Factory factory;
-
-   private ConvertLB convertLB;
-
-   @Inject
-   UnwrapLoadBalancers(ParseJson<Map<String, Set<LB>>> json, ConvertLB.Factory factory) {
-      this.json = checkNotNull(json, "json");
-      this.factory = checkNotNull(factory, "factory");
-   }
-
-   @Override
-   public Set<LoadBalancer> apply(HttpResponse arg0) {
-      Map<String, Set<LB>> map = json.apply(arg0);
-      if (map.size() == 0)
-         return ImmutableSet.<LoadBalancer> of();
-      ;
-      return ImmutableSet.copyOf(Iterables.transform(Iterables.get(map.values(), 0), convertLB));
-   }
-
-   @Override
-   public UnwrapLoadBalancers setContext(HttpRequest request) {
-      return setRegion(request.getEndpoint().getHost().substring(0, request.getEndpoint().getHost().indexOf('.')));
-   }
-
-   UnwrapLoadBalancers setRegion(String region) {
-      this.convertLB = factory.createForRegion(region);
-      return this;
-   }
-
-}
diff --git a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/loadbalancer/strategy/CloudLoadBalancersDestroyLoadBalancerStrategy.java b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/loadbalancer/strategy/CloudLoadBalancersDestroyLoadBalancerStrategy.java
index 10d2253..bcb69c8 100644
--- a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/loadbalancer/strategy/CloudLoadBalancersDestroyLoadBalancerStrategy.java
+++ b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/loadbalancer/strategy/CloudLoadBalancersDestroyLoadBalancerStrategy.java
@@ -57,7 +57,7 @@
       String[] parts = checkNotNull(id, "id").split("/");
       String region = parts[0];
       int lbId = Integer.parseInt(parts[1]);
-      client.getLoadBalancerClient(region).removeLoadBalancer(lbId);
+      client.getLoadBalancerApiForZone(region).remove(lbId);
       return getLoadBalancer.getLoadBalancer(id);
    }
 }
diff --git a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/loadbalancer/strategy/CloudLoadBalancersGetLoadBalancerMetadataStrategy.java b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/loadbalancer/strategy/CloudLoadBalancersGetLoadBalancerMetadataStrategy.java
index a546d81..88d2f7e 100644
--- a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/loadbalancer/strategy/CloudLoadBalancersGetLoadBalancerMetadataStrategy.java
+++ b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/loadbalancer/strategy/CloudLoadBalancersGetLoadBalancerMetadataStrategy.java
@@ -52,7 +52,7 @@
       String[] parts = checkNotNull(id, "id").split("/");
       String region = parts[0];
       int lbId = Integer.parseInt(parts[1]);
-      return converter.apply(client.getLoadBalancerClient(region).getLoadBalancer(lbId));
+      return converter.apply(client.getLoadBalancerApiForZone(region).get(lbId));
    }
 
 }
diff --git a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/loadbalancer/strategy/CloudLoadBalancersListLoadBalancersStrategy.java b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/loadbalancer/strategy/CloudLoadBalancersListLoadBalancersStrategy.java
index d47fbf1..944d62b 100644
--- a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/loadbalancer/strategy/CloudLoadBalancersListLoadBalancersStrategy.java
+++ b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/loadbalancer/strategy/CloudLoadBalancersListLoadBalancersStrategy.java
@@ -19,13 +19,9 @@
 package org.jclouds.rackspace.cloudloadbalancers.loadbalancer.strategy;
 
 import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.collect.Iterables.concat;
-import static com.google.common.collect.Iterables.transform;
-import static org.jclouds.concurrent.FutureIterables.transformParallel;
 
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Future;
 
 import javax.annotation.Resource;
 import javax.inject.Inject;
@@ -38,12 +34,13 @@
 import org.jclouds.loadbalancer.strategy.ListLoadBalancersStrategy;
 import org.jclouds.location.Zone;
 import org.jclouds.logging.Logger;
-import org.jclouds.rackspace.cloudloadbalancers.CloudLoadBalancersAsyncApi;
+import org.jclouds.rackspace.cloudloadbalancers.CloudLoadBalancersApi;
 import org.jclouds.rackspace.cloudloadbalancers.domain.LoadBalancer;
 
 import com.google.common.base.Function;
 import com.google.common.base.Supplier;
-import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.collect.FluentIterable;
+import com.google.common.collect.Sets;
 
 /**
  * 
@@ -55,13 +52,13 @@
    @Named(LoadBalancerConstants.LOADBALANCER_LOGGER)
    protected Logger logger = Logger.NULL;
 
-   private final CloudLoadBalancersAsyncApi aclient;
+   private final CloudLoadBalancersApi aclient;
    private final Function<LoadBalancer, LoadBalancerMetadata> converter;
-   private final ExecutorService executor;
+   private final ExecutorService executor; // leaving this here for possible future parallelization
    private final Supplier<Set<String>> zones;
 
    @Inject
-   protected CloudLoadBalancersListLoadBalancersStrategy(CloudLoadBalancersAsyncApi aclient,
+   protected CloudLoadBalancersListLoadBalancersStrategy(CloudLoadBalancersApi aclient,
             Function<LoadBalancer, LoadBalancerMetadata> converter,
             @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor, @Zone Supplier<Set<String>> zones) {
       this.aclient = checkNotNull(aclient, "aclient");
@@ -72,13 +69,17 @@
 
    @Override
    public Iterable<? extends LoadBalancerMetadata> listLoadBalancers() {
-      return transform(concat(transformParallel(zones.get(), new Function<String, Future<? extends Set<LoadBalancer>>>() {
-
-         @Override
-         public ListenableFuture<Set<LoadBalancer>> apply(String from) {
-            return aclient.getLoadBalancerClient(from).listLoadBalancers();
+      Set<LoadBalancerMetadata> loadBalancerMetadatas = Sets.newHashSet();
+      
+      for (String zone: zones.get()) {
+         FluentIterable<LoadBalancerMetadata> lbm = 
+               aclient.getLoadBalancerApiForZone(zone).list().concat().transform(converter);
+         
+         for (LoadBalancerMetadata loadBalancerMetadata: lbm) {
+            loadBalancerMetadatas.add(loadBalancerMetadata);
          }
-
-      }, executor, null, logger, "loadbalancers")), converter);
+      }
+      
+      return loadBalancerMetadatas;
    }
 }
diff --git a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/loadbalancer/strategy/CloudLoadBalancersLoadBalanceNodesStrategy.java b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/loadbalancer/strategy/CloudLoadBalancersLoadBalanceNodesStrategy.java
index 9b35b0b..ac3eb5f 100644
--- a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/loadbalancer/strategy/CloudLoadBalancersLoadBalanceNodesStrategy.java
+++ b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/loadbalancer/strategy/CloudLoadBalancersLoadBalanceNodesStrategy.java
@@ -66,7 +66,7 @@
       String region = checkNotNull(location, "location").getId();
 
       // TODO need to query and update the LB per current design.
-      LoadBalancer lb = client.getLoadBalancerClient(region).createLoadBalancer(
+      LoadBalancer lb = client.getLoadBalancerApiForZone(region).create(
                LoadBalancerRequest.builder().name(name).protocol(protocol.toUpperCase()).port(loadBalancerPort)
                         .virtualIPType(Type.PUBLIC).nodes(
                                  Iterables.transform(nodes, new Function<NodeMetadata, NodeRequest>() {
diff --git a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/predicates/LoadBalancerActive.java b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/predicates/LoadBalancerActive.java
index 8381615..7222edf 100644
--- a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/predicates/LoadBalancerActive.java
+++ b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/predicates/LoadBalancerActive.java
@@ -63,6 +63,6 @@
    }
 
    private LoadBalancer refresh(LoadBalancer loadBalancer) {
-      return client.getLoadBalancerClient(loadBalancer.getRegion()).getLoadBalancer(loadBalancer.getId());
+      return client.getLoadBalancerApiForZone(loadBalancer.getRegion()).get(loadBalancer.getId());
    }
 }
diff --git a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/predicates/LoadBalancerDeleted.java b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/predicates/LoadBalancerDeleted.java
index 6ef84ce..f1da5c6 100644
--- a/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/predicates/LoadBalancerDeleted.java
+++ b/apis/rackspace-cloudloadbalancers/src/main/java/org/jclouds/rackspace/cloudloadbalancers/predicates/LoadBalancerDeleted.java
@@ -61,6 +61,6 @@
    }
 
    private LoadBalancer refresh(LoadBalancer loadBalancer) {
-      return client.getLoadBalancerClient(loadBalancer.getRegion()).getLoadBalancer(loadBalancer.getId());
+      return client.getLoadBalancerApiForZone(loadBalancer.getRegion()).get(loadBalancer.getId());
    }
 }
diff --git a/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/features/LoadBalancerExpectTest.java b/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/features/LoadBalancerApiExpectTest.java
similarity index 81%
rename from apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/features/LoadBalancerExpectTest.java
rename to apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/features/LoadBalancerApiExpectTest.java
index 2bfed4c..f8808f0 100644
--- a/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/features/LoadBalancerExpectTest.java
+++ b/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/features/LoadBalancerApiExpectTest.java
@@ -32,10 +32,9 @@
 import org.jclouds.rackspace.cloudloadbalancers.domain.LoadBalancerRequest;
 import org.jclouds.rackspace.cloudloadbalancers.domain.NodeRequest;
 import org.jclouds.rackspace.cloudloadbalancers.domain.VirtualIP;
-import org.jclouds.rackspace.cloudloadbalancers.features.LoadBalancerClient;
-import org.jclouds.rackspace.cloudloadbalancers.functions.UnwrapLoadBalancerTest;
-import org.jclouds.rackspace.cloudloadbalancers.functions.UnwrapLoadBalancersTest;
-import org.jclouds.rackspace.cloudloadbalancers.internal.BaseCloudLoadBalancerExpectTest;
+import org.jclouds.rackspace.cloudloadbalancers.functions.ParseLoadBalancerTest;
+import org.jclouds.rackspace.cloudloadbalancers.functions.ParseLoadBalancersTest;
+import org.jclouds.rackspace.cloudloadbalancers.internal.BaseCloudLoadBalancerApiExpectTest;
 import org.testng.annotations.Test;
 
 import com.google.common.collect.Sets;
@@ -44,37 +43,37 @@
  * @author Everett Toews
  */
 @Test(groups = "unit")
-public class LoadBalancerExpectTest extends BaseCloudLoadBalancerExpectTest<CloudLoadBalancersApi> {
+public class LoadBalancerApiExpectTest extends BaseCloudLoadBalancerApiExpectTest<CloudLoadBalancersApi> {
 
    public void testListLoadBalancers() {
       URI endpoint = URI.create("https://dfw.loadbalancers.api.rackspacecloud.com/v1.0/123123/loadbalancers");
-      LoadBalancerClient api = requestsSendResponses(
+      LoadBalancerApi api = requestsSendResponses(
             rackspaceAuthWithUsernameAndApiKey,
             responseWithAccess, 
             authenticatedGET().endpoint(endpoint).build(),
             HttpResponse.builder().statusCode(200).payload(payloadFromResource("/loadbalancers-list.json")).build()
-      ).getLoadBalancerClient("DFW");
+      ).getLoadBalancerApiForZone("DFW");
 
-      Set<LoadBalancer> loadBalancers = api.listLoadBalancers();
+      Set<LoadBalancer> loadBalancers = api.list().concat().toImmutableSet();
       assertEquals(loadBalancers, testLoadBalancers());
    }
 
    public void testGetLoadBalancer() {
       URI endpoint = URI.create("https://dfw.loadbalancers.api.rackspacecloud.com/v1.0/123123/loadbalancers/2000");
-      LoadBalancerClient api = requestsSendResponses(
+      LoadBalancerApi api = requestsSendResponses(
             rackspaceAuthWithUsernameAndApiKey,
             responseWithAccess, 
             authenticatedGET().endpoint(endpoint).build(),
             HttpResponse.builder().statusCode(200).payload(payloadFromResource("/loadbalancer-get.json")).build()
-      ).getLoadBalancerClient("DFW");
+      ).getLoadBalancerApiForZone("DFW");
 
-      LoadBalancer loadBalancer = api.getLoadBalancer(2000);
+      LoadBalancer loadBalancer = api.get(2000);
       assertEquals(loadBalancer, testLoadBalancer());
    }
 
    public void testCreateLoadBalancer() {
       URI endpoint = URI.create("https://dfw.loadbalancers.api.rackspacecloud.com/v1.0/123123/loadbalancers");
-      LoadBalancerClient api = requestsSendResponses(
+      LoadBalancerApi api = requestsSendResponses(
             rackspaceAuthWithUsernameAndApiKey,
             responseWithAccess, 
             authenticatedGET()
@@ -83,7 +82,7 @@
                   .endpoint(endpoint)
                   .build(),
             HttpResponse.builder().statusCode(200).payload(payloadFromResource("/loadbalancer-get.json")).build()
-      ).getLoadBalancerClient("DFW");
+      ).getLoadBalancerApiForZone("DFW");
 
       NodeRequest nodeRequest1 = NodeRequest.builder()
             .address("10.1.1.1")
@@ -108,19 +107,19 @@
             .nodes(nodeRequests)
             .build();
       
-      LoadBalancer loadBalancer = api.createLoadBalancer(lbRequest);
+      LoadBalancer loadBalancer = api.create(lbRequest);
       
       assertEquals(loadBalancer, testLoadBalancer());
    }
 
    public void testUpdateLoadBalancerAttributes() {
       URI endpoint = URI.create("https://dfw.loadbalancers.api.rackspacecloud.com/v1.0/123123/loadbalancers/2000");
-      LoadBalancerClient api = requestsSendResponses(
+      LoadBalancerApi api = requestsSendResponses(
             rackspaceAuthWithUsernameAndApiKey,
             responseWithAccess, 
             authenticatedGET().method("PUT").payload(payloadFromResource("/loadbalancer-update.json")).endpoint(endpoint).build(),
             HttpResponse.builder().statusCode(202).payload("").build()
-      ).getLoadBalancerClient("DFW");
+      ).getLoadBalancerApiForZone("DFW");
 
       LoadBalancerAttributes lbAttrs = LoadBalancerAttributes.Builder
             .name("foo")
@@ -128,12 +127,12 @@
             .port(443)
             .algorithm(LoadBalancer.Algorithm.RANDOM.name());
 
-      api.updateLoadBalancerAttributes(2000, lbAttrs);
+      api.update(2000, lbAttrs);
    }
 
    public void testRemoveLoadBalancer() {
       URI endpoint = URI.create("https://dfw.loadbalancers.api.rackspacecloud.com/v1.0/123123/loadbalancers/2000");
-      LoadBalancerClient api = requestsSendResponses(
+      LoadBalancerApi api = requestsSendResponses(
             rackspaceAuthWithUsernameAndApiKey,
             responseWithAccess, 
             authenticatedGET()
@@ -142,16 +141,16 @@
                   .endpoint(endpoint)
                   .build(),
             HttpResponse.builder().statusCode(202).payload("").build()
-      ).getLoadBalancerClient("DFW");
+      ).getLoadBalancerApiForZone("DFW");
       
-      api.removeLoadBalancer(2000);
+      api.remove(2000);
    }
 
    private Object testLoadBalancer() {
-      return new UnwrapLoadBalancerTest().expected();
+      return new ParseLoadBalancerTest().expected();
    }
 
    private Set<LoadBalancer> testLoadBalancers() {      
-      return new UnwrapLoadBalancersTest().expected();
+      return new ParseLoadBalancersTest().data();
    }   
 }
diff --git a/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/features/LoadBalancerClientLiveTest.java b/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/features/LoadBalancerApiLiveTest.java
similarity index 86%
rename from apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/features/LoadBalancerClientLiveTest.java
rename to apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/features/LoadBalancerApiLiveTest.java
index aafe00b..7b3a8a9 100644
--- a/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/features/LoadBalancerClientLiveTest.java
+++ b/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/features/LoadBalancerApiLiveTest.java
@@ -30,7 +30,7 @@
 import org.jclouds.rackspace.cloudloadbalancers.domain.LoadBalancerRequest;
 import org.jclouds.rackspace.cloudloadbalancers.domain.NodeRequest;
 import org.jclouds.rackspace.cloudloadbalancers.domain.VirtualIP.Type;
-import org.jclouds.rackspace.cloudloadbalancers.internal.BaseCloudLoadBalancersClientLiveTest;
+import org.jclouds.rackspace.cloudloadbalancers.internal.BaseCloudLoadBalancersApiLiveTest;
 import org.testng.annotations.AfterGroups;
 import org.testng.annotations.Test;
 
@@ -38,12 +38,10 @@
 import com.google.common.collect.Sets;
 
 /**
- * Tests behavior of {@code LoadBalancerClientLiveTest}
- * 
  * @author Adrian Cole
  */
-@Test(groups = "live", singleThreaded = true, testName = "LoadBalancerClientLiveTest")
-public class LoadBalancerClientLiveTest extends BaseCloudLoadBalancersClientLiveTest {
+@Test(groups = "live", singleThreaded = true, testName = "LoadBalancerApiLiveTest")
+public class LoadBalancerApiLiveTest extends BaseCloudLoadBalancersApiLiveTest {
    private Set<LoadBalancer> lbs = Sets.newLinkedHashSet();
 
    @Override
@@ -51,7 +49,7 @@
    protected void tearDownContext() {
       for (LoadBalancer lb: lbs) {
          assert loadBalancerActive.apply(lb) : lb;
-         client.getLoadBalancerClient(lb.getRegion()).removeLoadBalancer(lb.getId());
+         client.getLoadBalancerApiForZone(lb.getRegion()).remove(lb.getId());
          assert loadBalancerDeleted.apply(lb) : lb;
       }
       super.tearDownContext();
@@ -61,7 +59,7 @@
       for (String zone: client.getConfiguredZones()) {
          Logger.getAnonymousLogger().info("starting lb in region " + zone);
          
-         LoadBalancer lb = client.getLoadBalancerClient(zone).createLoadBalancer(
+         LoadBalancer lb = client.getLoadBalancerApiForZone(zone).create(
                LoadBalancerRequest.builder()
                      .name(prefix + "-" + zone)
                      .protocol("HTTP")
@@ -80,7 +78,7 @@
          
          assertTrue(loadBalancerActive.apply(lb));
 
-         LoadBalancer newLb = client.getLoadBalancerClient(zone).getLoadBalancer(lb.getId());
+         LoadBalancer newLb = client.getLoadBalancerApiForZone(zone).get(lb.getId());
          checkLBInRegion(zone, newLb, prefix + "-" + zone);
          
          assertEquals(newLb.getStatus(), LoadBalancer.Status.ACTIVE);
@@ -90,12 +88,12 @@
    @Test(dependsOnMethods = "testCreateLoadBalancer")
    public void testUpdateLoadBalancer() throws Exception {
       for (LoadBalancer lb: lbs) {
-         client.getLoadBalancerClient(lb.getRegion()).updateLoadBalancerAttributes(lb.getId(),
+         client.getLoadBalancerApiForZone(lb.getRegion()).update(lb.getId(),
                LoadBalancerAttributes.Builder.name("foo" + "-" + lb.getRegion()));
          
          assertTrue(loadBalancerActive.apply(lb));
 
-         LoadBalancer newLb = client.getLoadBalancerClient(lb.getRegion()).getLoadBalancer(lb.getId());
+         LoadBalancer newLb = client.getLoadBalancerApiForZone(lb.getRegion()).get(lb.getId());
          checkLBInRegion(newLb.getRegion(), newLb, "foo" + "-" + lb.getRegion());
          
          assertEquals(newLb.getStatus(), LoadBalancer.Status.ACTIVE);
@@ -105,7 +103,8 @@
    @Test(dependsOnMethods = "testUpdateLoadBalancer")
    public void testListLoadBalancers() throws Exception {
       for (String zone: client.getConfiguredZones()) {
-         Set<LoadBalancer> response = client.getLoadBalancerClient(zone).listLoadBalancers();
+         //TODO: FIXME
+         Set<LoadBalancer> response = client.getLoadBalancerApiForZone(zone).list().concat().toImmutableSet();
          
          assertNotNull(response);
          assertTrue(response.size() >= 0);
@@ -125,7 +124,7 @@
             // node info not available during list;
             assert lb.getNodes().size() == 0 : lb;
 
-            LoadBalancer getDetails = client.getLoadBalancerClient(zone).getLoadBalancer(lb.getId());
+            LoadBalancer getDetails = client.getLoadBalancerApiForZone(zone).get(lb.getId());
             
             try {
                assertEquals(getDetails.getRegion(), lb.getRegion());
diff --git a/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/features/NodeExpectTest.java b/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/features/NodeApiExpectTest.java
similarity index 86%
rename from apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/features/NodeExpectTest.java
rename to apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/features/NodeApiExpectTest.java
index e2947f8..bb96efe 100644
--- a/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/features/NodeExpectTest.java
+++ b/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/features/NodeApiExpectTest.java
@@ -30,8 +30,8 @@
 import org.jclouds.rackspace.cloudloadbalancers.domain.Node;
 import org.jclouds.rackspace.cloudloadbalancers.domain.NodeAttributes;
 import org.jclouds.rackspace.cloudloadbalancers.domain.NodeRequest;
-import org.jclouds.rackspace.cloudloadbalancers.features.NodeClient;
-import org.jclouds.rackspace.cloudloadbalancers.internal.BaseCloudLoadBalancerExpectTest;
+import org.jclouds.rackspace.cloudloadbalancers.features.NodeApi;
+import org.jclouds.rackspace.cloudloadbalancers.internal.BaseCloudLoadBalancerApiExpectTest;
 import org.testng.annotations.Test;
 
 import com.google.common.collect.ImmutableSet;
@@ -41,37 +41,36 @@
  * @author Everett Toews
  */
 @Test(groups = "unit")
-public class NodeExpectTest extends BaseCloudLoadBalancerExpectTest<CloudLoadBalancersApi> {
-
+public class NodeApiExpectTest extends BaseCloudLoadBalancerApiExpectTest<CloudLoadBalancersApi> {
    public void testListNodes() {
       URI endpoint = URI.create("https://dfw.loadbalancers.api.rackspacecloud.com/v1.0/123123/loadbalancers/2000/nodes");
-      NodeClient api = requestsSendResponses(
+      NodeApi api = requestsSendResponses(
             rackspaceAuthWithUsernameAndApiKey,
             responseWithAccess, 
             authenticatedGET().endpoint(endpoint).build(),
             HttpResponse.builder().statusCode(200).payload(payloadFromResource("/nodes-list.json")).build()
-      ).getNodeClient("DFW");
+      ).getNodeApiForZoneAndLoadBalancer("DFW", 2000);
 
-      Set<Node> nodes = api.listNodes(2000);
+      Set<Node> nodes = api.list().concat().toImmutableSet();
       assertEquals(nodes, testNodes());
    }
 
    public void testGetNodeInLoadBalancer() {
       URI endpoint = URI.create("https://dfw.loadbalancers.api.rackspacecloud.com/v1.0/123123/loadbalancers/2000/nodes/410");
-      NodeClient api = requestsSendResponses(
+      NodeApi api = requestsSendResponses(
             rackspaceAuthWithUsernameAndApiKey,
             responseWithAccess, 
             authenticatedGET().endpoint(endpoint).build(),
             HttpResponse.builder().statusCode(200).payload(payloadFromResource("/node-get.json")).build()
-      ).getNodeClient("DFW");
+      ).getNodeApiForZoneAndLoadBalancer("DFW", 2000);
 
-      Node node = api.getNodeInLoadBalancer(410, 2000);
+      Node node = api.get(410);
       assertEquals(node, testNode());
    }
 
    public void testAddNodesInLoadBalancer() {
       URI endpoint = URI.create("https://dfw.loadbalancers.api.rackspacecloud.com/v1.0/123123/loadbalancers/2000/nodes");
-      NodeClient api = requestsSendResponses(
+      NodeApi api = requestsSendResponses(
             rackspaceAuthWithUsernameAndApiKey,
             responseWithAccess, 
             authenticatedGET()
@@ -80,7 +79,7 @@
                   .endpoint(endpoint)
                   .build(),
             HttpResponse.builder().statusCode(200).payload(payloadFromResource("/nodes-list.json")).build()
-      ).getNodeClient("DFW");
+      ).getNodeApiForZoneAndLoadBalancer("DFW", 2000);
 
       NodeRequest nodeRequest1 = NodeRequest.builder()
             .address("10.1.1.1")
@@ -105,50 +104,50 @@
 
       Set<NodeRequest> nodeRequests = ImmutableSortedSet.<NodeRequest> of(nodeRequest1, nodeRequest2, nodeRequest3);
       
-      Set<Node> nodes = api.createNodesInLoadBalancer(nodeRequests, 2000);
+      Set<Node> nodes = api.add(nodeRequests);
       assertEquals(nodes, testNodes());
    }
 
    public void testUpdateAttributesForNodeInLoadBalancer() {
       URI endpoint = URI.create("https://dfw.loadbalancers.api.rackspacecloud.com/v1.0/123123/loadbalancers/2000/nodes/410");
-      NodeClient api = requestsSendResponses(
+      NodeApi api = requestsSendResponses(
             rackspaceAuthWithUsernameAndApiKey,
             responseWithAccess, 
             authenticatedGET().method("PUT").payload(payloadFromResource("/node-update.json")).endpoint(endpoint).build(),
             HttpResponse.builder().statusCode(200).build()
-      ).getNodeClient("DFW");
+      ).getNodeApiForZoneAndLoadBalancer("DFW", 2000);
 
       NodeAttributes nodeAttributes = NodeAttributes.Builder
             .condition(NodeRequest.Condition.DISABLED)
             .weight(20);
 
-      api.updateAttributesForNodeInLoadBalancer(nodeAttributes, 410, 2000);
+      api.update(410, nodeAttributes);
    }
 
    public void testRemoveNodeFromLoadBalancer() {
       URI endpoint = URI.create("https://dfw.loadbalancers.api.rackspacecloud.com/v1.0/123123/loadbalancers/2000/nodes/410");
-      NodeClient api = requestsSendResponses(
+      NodeApi api = requestsSendResponses(
             rackspaceAuthWithUsernameAndApiKey,
             responseWithAccess, 
             authenticatedGET().method("DELETE").replaceHeader("Accept", MediaType.WILDCARD).endpoint(endpoint).build(),
             HttpResponse.builder().statusCode(200).build()
-      ).getNodeClient("DFW");
+      ).getNodeApiForZoneAndLoadBalancer("DFW", 2000);
 
-      api.removeNodeFromLoadBalancer(410, 2000);
+      api.remove(410);
    }
 
    public void testRemoveNodesFromLoadBalancer() {
       URI endpoint = URI.create("https://dfw.loadbalancers.api.rackspacecloud.com/v1.0/123123/loadbalancers/2000/nodes?id=%5B410%2C%20411%5D");
-      NodeClient api = requestsSendResponses(
+      NodeApi api = requestsSendResponses(
             rackspaceAuthWithUsernameAndApiKey,
             responseWithAccess, 
             authenticatedGET().method("DELETE").replaceHeader("Accept", MediaType.WILDCARD).endpoint(endpoint).build(),
             HttpResponse.builder().statusCode(200).build()
-      ).getNodeClient("DFW");
+      ).getNodeApiForZoneAndLoadBalancer("DFW", 2000);
       
       Set<Integer> nodeIds = ImmutableSortedSet.<Integer> of(410, 411);
 
-      api.removeNodesFromLoadBalancer(nodeIds, 2000);
+      api.remove(nodeIds);
    }
 
    private Set<Node> testNodes() {
diff --git a/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/features/NodeClientLiveTest.java b/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/features/NodeApiLiveTest.java
similarity index 80%
rename from apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/features/NodeClientLiveTest.java
rename to apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/features/NodeApiLiveTest.java
index 1d86d65..76ab6c6 100644
--- a/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/features/NodeClientLiveTest.java
+++ b/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/features/NodeApiLiveTest.java
@@ -38,18 +38,16 @@
 import org.jclouds.rackspace.cloudloadbalancers.domain.NodeRequest;
 import org.jclouds.rackspace.cloudloadbalancers.domain.LoadBalancer.Status;
 import org.jclouds.rackspace.cloudloadbalancers.domain.VirtualIP.Type;
-import org.jclouds.rackspace.cloudloadbalancers.features.LoadBalancerClient;
-import org.jclouds.rackspace.cloudloadbalancers.internal.BaseCloudLoadBalancersClientLiveTest;
+import org.jclouds.rackspace.cloudloadbalancers.features.LoadBalancerApi;
+import org.jclouds.rackspace.cloudloadbalancers.internal.BaseCloudLoadBalancersApiLiveTest;
 import org.testng.annotations.AfterGroups;
 import org.testng.annotations.Test;
 
 /**
- * Tests behavior of {@code NodeClient}
- * 
  * @author Dan Lo Bianco
  */
 @Test(groups = "live", singleThreaded = true, testName = "NodeClientLiveTest")
-public class NodeClientLiveTest extends BaseCloudLoadBalancersClientLiveTest {
+public class NodeApiLiveTest extends BaseCloudLoadBalancersApiLiveTest {
    private Map<LoadBalancer, Set<Node>> nodes = Maps.newHashMap();
 
    public void testCreateLoadBalancers() {
@@ -57,7 +55,7 @@
       Logger.getAnonymousLogger().info("running against zones " + client.getConfiguredZones());
       for (String zone : client.getConfiguredZones()) {
          Logger.getAnonymousLogger().info("starting lb in zone " + zone);
-         LoadBalancer lb = client.getLoadBalancerClient(zone).createLoadBalancer(
+         LoadBalancer lb = client.getLoadBalancerApiForZone(zone).create(
                   LoadBalancerRequest.builder().name(prefix + "-" + zone).protocol("HTTP").port(80).virtualIPType(
                            Type.PUBLIC).node(NodeRequest.builder().address("192.168.1.1").port(8080).build()).build());
          nodes.put(lb, new HashSet<Node>());
@@ -71,14 +69,13 @@
       for (LoadBalancer lb : nodes.keySet()) {
          String region = lb.getRegion();
          Logger.getAnonymousLogger().info("starting node on loadbalancer " + lb.getId() + " in region " + region);
-         Set<Node> newNodes = client.getNodeClient(region).createNodesInLoadBalancer(
-                  ImmutableSet.<NodeRequest> of(NodeRequest.builder().address("192.168.1.2").port(8080).build()),
-                  lb.getId());
+         Set<Node> newNodes = client.getNodeApiForZoneAndLoadBalancer(region, lb.getId()).add(
+                  ImmutableSet.<NodeRequest> of(NodeRequest.builder().address("192.168.1.2").port(8080).build()));
 
          for (Node n : newNodes) {
             assertEquals(n.getStatus(), Node.Status.ONLINE);
             nodes.get(lb).add(n);
-            assertEquals(client.getNodeClient(region).getNodeInLoadBalancer(n.getId(), lb.getId()).getStatus(),
+            assertEquals(client.getNodeApiForZoneAndLoadBalancer(region, lb.getId()).get(n.getId()).getStatus(),
                      Node.Status.ONLINE);
          }
 
@@ -91,12 +88,12 @@
       for (Entry<LoadBalancer, Set<Node>> entry : nodes.entrySet()) {
          for (Node n : entry.getValue()) {
             String region = entry.getKey().getRegion();
-            client.getNodeClient(region).updateAttributesForNodeInLoadBalancer(NodeAttributes.Builder.weight(23),
-                     n.getId(), entry.getKey().getId());
-            assertEquals(client.getNodeClient(region).getNodeInLoadBalancer(n.getId(), entry.getKey().getId())
+            client.getNodeApiForZoneAndLoadBalancer(region, entry.getKey().getId()).update(n.getId(),
+                     NodeAttributes.Builder.weight(23));
+            assertEquals(client.getNodeApiForZoneAndLoadBalancer(region, entry.getKey().getId()).get(n.getId())
                      .getStatus(), Node.Status.ONLINE);
 
-            Node newNode = client.getNodeClient(region).getNodeInLoadBalancer(n.getId(), entry.getKey().getId());
+            Node newNode = client.getNodeApiForZoneAndLoadBalancer(region, entry.getKey().getId()).get(n.getId());
             assertEquals(newNode.getStatus(), Node.Status.ONLINE);
             assertEquals(newNode.getWeight(), (Integer) 23);
          }
@@ -106,7 +103,7 @@
    @Test(dependsOnMethods = "testModifyNode")
    public void testListNodes() throws Exception {
       for (LoadBalancer lb : nodes.keySet()) {
-         Set<Node> response = client.getNodeClient(lb.getRegion()).listNodes(lb.getId());
+         Set<Node> response = client.getNodeApiForZoneAndLoadBalancer(lb.getRegion(), lb.getId()).list().concat().toImmutableSet();
          assert null != response;
          assertTrue(response.size() >= 0);
          for (Node n : response) {
@@ -118,8 +115,8 @@
             assert !Arrays.asList(LoadBalancer.WEIGHTED_ALGORITHMS).contains(lb.getTypedAlgorithm())
                      || n.getWeight() != null : n;
 
-            Node getDetails = client.getNodeClient(lb.getRegion()).getNodeInLoadBalancer(n.getId(), lb.getId());
-            System.out.println(n.toString());
+            Node getDetails = client.getNodeApiForZoneAndLoadBalancer(lb.getRegion(), lb.getId()).get(n.getId());
+
             try {
                assertEquals(getDetails.getId(), n.getId());
                assertEquals(getDetails.getCondition(), n.getCondition());
@@ -141,11 +138,11 @@
    protected void tearDownContext() {
       for (Entry<LoadBalancer, Set<Node>> entry : nodes.entrySet()) {
          LoadBalancer lb = entry.getKey();
-         LoadBalancerClient lbClient = client.getLoadBalancerClient(lb.getRegion());
+         LoadBalancerApi lbClient = client.getLoadBalancerApiForZone(lb.getRegion());
 
-         if (lbClient.getLoadBalancer(lb.getId()).getStatus() != Status.DELETED) {
+         if (lbClient.get(lb.getId()).getStatus() != Status.DELETED) {
             assert loadBalancerActive.apply(lb) : lb;
-            lbClient.removeLoadBalancer(lb.getId());
+            lbClient.remove(lb.getId());
          }
          assert loadBalancerDeleted.apply(lb) : lb;
       }
diff --git a/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/functions/UnwrapLoadBalancerTest.java b/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/functions/ParseLoadBalancerTest.java
similarity index 93%
rename from apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/functions/UnwrapLoadBalancerTest.java
rename to apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/functions/ParseLoadBalancerTest.java
index 0b4a19a..81dc050 100644
--- a/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/functions/UnwrapLoadBalancerTest.java
+++ b/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/functions/ParseLoadBalancerTest.java
@@ -27,7 +27,7 @@
 import org.jclouds.rackspace.cloudloadbalancers.domain.LoadBalancer.Status;
 import org.jclouds.rackspace.cloudloadbalancers.domain.VirtualIP.IPVersion;
 import org.jclouds.rackspace.cloudloadbalancers.functions.ConvertLB;
-import org.jclouds.rackspace.cloudloadbalancers.functions.UnwrapLoadBalancer;
+import org.jclouds.rackspace.cloudloadbalancers.functions.ParseLoadBalancer;
 import org.testng.annotations.Test;
 
 import com.google.common.base.Function;
@@ -41,7 +41,7 @@
  * @author Adrian Cole
  */
 @Test(groups = "unit", testName = "UnwrapLoadBalancerTest")
-public class UnwrapLoadBalancerTest extends BaseItemParserTest<LoadBalancer> {
+public class ParseLoadBalancerTest extends BaseItemParserTest<LoadBalancer> {
 
    @Override
    public String resource() {
@@ -88,6 +88,6 @@
 
    @Override
    protected Function<HttpResponse, LoadBalancer> parser(Injector i) {
-      return i.getInstance(UnwrapLoadBalancer.class).setRegion("DFW");
+      return i.getInstance(ParseLoadBalancer.class).setRegion("DFW");
    }
 }
diff --git a/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/functions/UnwrapLoadBalancerWhenDeletedTest.java b/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/functions/ParseLoadBalancerWhenDeletedTest.java
similarity index 91%
rename from apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/functions/UnwrapLoadBalancerWhenDeletedTest.java
rename to apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/functions/ParseLoadBalancerWhenDeletedTest.java
index 5056667..c197f83 100644
--- a/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/functions/UnwrapLoadBalancerWhenDeletedTest.java
+++ b/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/functions/ParseLoadBalancerWhenDeletedTest.java
@@ -24,7 +24,7 @@
 import org.jclouds.rackspace.cloudloadbalancers.domain.LoadBalancer;
 import org.jclouds.rackspace.cloudloadbalancers.domain.LoadBalancer.Status;
 import org.jclouds.rackspace.cloudloadbalancers.functions.ConvertLB;
-import org.jclouds.rackspace.cloudloadbalancers.functions.UnwrapLoadBalancer;
+import org.jclouds.rackspace.cloudloadbalancers.functions.ParseLoadBalancer;
 import org.testng.annotations.Test;
 
 import com.google.common.base.Function;
@@ -37,7 +37,7 @@
  * @author Adrian Cole
  */
 @Test(groups = "unit", testName = "UnwrapLoadBalancerWhenDeletedTest")
-public class UnwrapLoadBalancerWhenDeletedTest extends BaseItemParserTest<LoadBalancer> {
+public class ParseLoadBalancerWhenDeletedTest extends BaseItemParserTest<LoadBalancer> {
 
    @Override
    public String resource() {
@@ -67,6 +67,6 @@
 
    @Override
    protected Function<HttpResponse, LoadBalancer> parser(Injector i) {
-      return i.getInstance(UnwrapLoadBalancer.class).setRegion("LON");
+      return i.getInstance(ParseLoadBalancer.class).setRegion("LON");
    }
 }
diff --git a/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/functions/UnwrapLoadBalancersTest.java b/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/functions/ParseLoadBalancersTest.java
similarity index 86%
rename from apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/functions/UnwrapLoadBalancersTest.java
rename to apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/functions/ParseLoadBalancersTest.java
index f238fb2..8f9de47 100644
--- a/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/functions/UnwrapLoadBalancersTest.java
+++ b/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/functions/ParseLoadBalancersTest.java
@@ -20,14 +20,14 @@
 
 import java.util.Set;
 
+import org.jclouds.collect.IterableWithMarker;
+import org.jclouds.collect.IterableWithMarkers;
 import org.jclouds.date.internal.SimpleDateFormatDateService;
 import org.jclouds.http.HttpResponse;
-import org.jclouds.json.BaseSetParserTest;
+import org.jclouds.json.BaseIterableWithMarkerParserTest;
 import org.jclouds.rackspace.cloudloadbalancers.domain.LoadBalancer;
-import org.jclouds.rackspace.cloudloadbalancers.domain.VirtualIP;
 import org.jclouds.rackspace.cloudloadbalancers.domain.LoadBalancer.Status;
-import org.jclouds.rackspace.cloudloadbalancers.functions.ConvertLB;
-import org.jclouds.rackspace.cloudloadbalancers.functions.UnwrapLoadBalancers;
+import org.jclouds.rackspace.cloudloadbalancers.domain.VirtualIP;
 import org.testng.annotations.Test;
 
 import com.google.common.base.Function;
@@ -41,18 +41,10 @@
  * @author Adrian Cole
  */
 @Test(groups = "unit")
-public class UnwrapLoadBalancersTest extends BaseSetParserTest<LoadBalancer> {
+public class ParseLoadBalancersTest extends BaseIterableWithMarkerParserTest<LoadBalancer> {
 
-   @Override
-   public String resource() {
-      return "/loadbalancers-list.json";
-   }
-
-   @Override
-   public Set<LoadBalancer> expected() {
-
+   public Set<LoadBalancer> data() {
       return ImmutableSet.of(
-
             LoadBalancer
                   .builder()
                   .region("DFW")
@@ -83,7 +75,16 @@
                               .type(VirtualIP.Type.PUBLIC).ipVersion(VirtualIP.IPVersion.IPV4).build()))
                   .created(new SimpleDateFormatDateService().iso8601SecondsDateParse("2010-11-30T03:23:42Z"))
                   .updated(new SimpleDateFormatDateService().iso8601SecondsDateParse("2010-11-30T03:23:44Z")).build());
+   }
+   
+   @Override
+   public String resource() {
+      return "/loadbalancers-list.json";
+   }
 
+   @Override
+   public IterableWithMarker<LoadBalancer> expected() {
+      return IterableWithMarkers.from(data());
    }
 
    // add factory binding as this is not default
@@ -101,7 +102,7 @@
    }
 
    @Override
-   protected Function<HttpResponse, Set<LoadBalancer>> parser(Injector i) {
-      return i.getInstance(UnwrapLoadBalancers.class).setRegion("DFW");
+   protected Function<HttpResponse, IterableWithMarker<LoadBalancer>> parser(Injector i) {
+      return i.getInstance(ParseLoadBalancers.class).setRegion("DFW");
    }
 }
diff --git a/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/internal/BaseCloudLoadBalancerExpectTest.java b/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/internal/BaseCloudLoadBalancerApiExpectTest.java
similarity index 93%
rename from apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/internal/BaseCloudLoadBalancerExpectTest.java
rename to apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/internal/BaseCloudLoadBalancerApiExpectTest.java
index a74e4b1..518b105 100644
--- a/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/internal/BaseCloudLoadBalancerExpectTest.java
+++ b/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/internal/BaseCloudLoadBalancerApiExpectTest.java
@@ -30,13 +30,13 @@
  * 
  * @author Everett Toews
  */
-public class BaseCloudLoadBalancerExpectTest<T> extends BaseRestApiExpectTest<T> {
+public class BaseCloudLoadBalancerApiExpectTest<T> extends BaseRestApiExpectTest<T> {
    protected HttpRequest rackspaceAuthWithUsernameAndApiKey;
 
    protected String authToken;
    protected HttpResponse responseWithAccess;
 
-   public BaseCloudLoadBalancerExpectTest() {
+   public BaseCloudLoadBalancerApiExpectTest() {
       provider = "cloudloadbalancers";
 
       rackspaceAuthWithUsernameAndApiKey = RackspaceFixture.INSTANCE
diff --git a/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/internal/BaseCloudLoadBalancersClientLiveTest.java b/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/internal/BaseCloudLoadBalancersApiLiveTest.java
similarity index 94%
rename from apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/internal/BaseCloudLoadBalancersClientLiveTest.java
rename to apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/internal/BaseCloudLoadBalancersApiLiveTest.java
index 449b3b8..f6edd93 100644
--- a/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/internal/BaseCloudLoadBalancersClientLiveTest.java
+++ b/apis/rackspace-cloudloadbalancers/src/test/java/org/jclouds/rackspace/cloudloadbalancers/internal/BaseCloudLoadBalancersApiLiveTest.java
@@ -45,9 +45,9 @@
  * 
  * @author Adrian Cole
  */
-public class BaseCloudLoadBalancersClientLiveTest extends BaseContextLiveTest<RestContext<CloudLoadBalancersApi, CloudLoadBalancersAsyncApi>> {
+public class BaseCloudLoadBalancersApiLiveTest extends BaseContextLiveTest<RestContext<CloudLoadBalancersApi, CloudLoadBalancersAsyncApi>> {
 
-   public BaseCloudLoadBalancersClientLiveTest() {
+   public BaseCloudLoadBalancersApiLiveTest() {
       provider = "cloudloadbalancers";
    }
 
diff --git a/core/src/test/java/org/jclouds/json/BaseIterableWithMarkerParserTest.java b/core/src/test/java/org/jclouds/json/BaseIterableWithMarkerParserTest.java
new file mode 100644
index 0000000..53841c1
--- /dev/null
+++ b/core/src/test/java/org/jclouds/json/BaseIterableWithMarkerParserTest.java
@@ -0,0 +1,37 @@
+/**
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  jclouds licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.jclouds.json;
+
+import static org.testng.Assert.assertEquals;
+
+import org.jclouds.collect.IterableWithMarker;
+
+import com.google.common.collect.ImmutableSortedSet;
+
+/**
+ * 
+ * @author Adrian Cole
+ */
+public abstract class BaseIterableWithMarkerParserTest<T> extends BaseParserTest<IterableWithMarker<T>, T> {
+
+   public void compare(IterableWithMarker<T> expects, IterableWithMarker<T> response) {
+      assertEquals(ImmutableSortedSet.copyOf(response).toString(), ImmutableSortedSet.copyOf(expects).toString());
+   }
+
+}
diff --git a/providers/rackspace-cloudloadbalancers-uk/src/test/java/org/jclouds/rackspace/cloudloadbalancers/uk/CloudLoadBalancersUKLoadBalancerClientLiveTest.java b/providers/rackspace-cloudloadbalancers-uk/src/test/java/org/jclouds/rackspace/cloudloadbalancers/uk/CloudLoadBalancersUKLoadBalancerClientLiveTest.java
index 3ada4ca..fd659e4 100644
--- a/providers/rackspace-cloudloadbalancers-uk/src/test/java/org/jclouds/rackspace/cloudloadbalancers/uk/CloudLoadBalancersUKLoadBalancerClientLiveTest.java
+++ b/providers/rackspace-cloudloadbalancers-uk/src/test/java/org/jclouds/rackspace/cloudloadbalancers/uk/CloudLoadBalancersUKLoadBalancerClientLiveTest.java
@@ -18,7 +18,7 @@
  */
 package org.jclouds.rackspace.cloudloadbalancers.uk;
 
-import org.jclouds.rackspace.cloudloadbalancers.features.LoadBalancerClientLiveTest;
+import org.jclouds.rackspace.cloudloadbalancers.features.LoadBalancerApiLiveTest;
 import org.testng.annotations.Test;
 
 /**
@@ -26,7 +26,7 @@
  * @author Dan Lo Bianco
  */
 @Test(groups = "live", singleThreaded = true, testName = "CloudLoadBalancersUKLoadBalancerClientLiveTest")
-public class CloudLoadBalancersUKLoadBalancerClientLiveTest extends LoadBalancerClientLiveTest {
+public class CloudLoadBalancersUKLoadBalancerClientLiveTest extends LoadBalancerApiLiveTest {
    public CloudLoadBalancersUKLoadBalancerClientLiveTest() {
       provider = "cloudloadbalancers-uk";
    }
diff --git a/providers/rackspace-cloudloadbalancers-uk/src/test/java/org/jclouds/rackspace/cloudloadbalancers/uk/CloudLoadBalancersUKNodeClientLiveTest.java b/providers/rackspace-cloudloadbalancers-uk/src/test/java/org/jclouds/rackspace/cloudloadbalancers/uk/CloudLoadBalancersUKNodeClientLiveTest.java
index d58f903..cd31ac2 100644
--- a/providers/rackspace-cloudloadbalancers-uk/src/test/java/org/jclouds/rackspace/cloudloadbalancers/uk/CloudLoadBalancersUKNodeClientLiveTest.java
+++ b/providers/rackspace-cloudloadbalancers-uk/src/test/java/org/jclouds/rackspace/cloudloadbalancers/uk/CloudLoadBalancersUKNodeClientLiveTest.java
@@ -18,7 +18,7 @@
  */
 package org.jclouds.rackspace.cloudloadbalancers.uk;
 
-import org.jclouds.rackspace.cloudloadbalancers.features.NodeClientLiveTest;
+import org.jclouds.rackspace.cloudloadbalancers.features.NodeApiLiveTest;
 import org.testng.annotations.Test;
 
 /**
@@ -26,7 +26,7 @@
  * @author Dan Lo Bianco
  */
 @Test(groups = "live", singleThreaded = true, testName = "CloudLoadBalancersUKNodeClientLiveTest")
-public class CloudLoadBalancersUKNodeClientLiveTest extends NodeClientLiveTest {
+public class CloudLoadBalancersUKNodeClientLiveTest extends NodeApiLiveTest {
    public CloudLoadBalancersUKNodeClientLiveTest() {
       provider = "cloudloadbalancers-uk";
    }
diff --git a/providers/rackspace-cloudloadbalancers-us/src/test/java/org/jclouds/rackspace/cloudloadbalancers/us/CloudLoadBalancersUSLoadBalancerClientLiveTest.java b/providers/rackspace-cloudloadbalancers-us/src/test/java/org/jclouds/rackspace/cloudloadbalancers/us/CloudLoadBalancersUSLoadBalancerClientLiveTest.java
index 5fd790f..2e23ff2 100644
--- a/providers/rackspace-cloudloadbalancers-us/src/test/java/org/jclouds/rackspace/cloudloadbalancers/us/CloudLoadBalancersUSLoadBalancerClientLiveTest.java
+++ b/providers/rackspace-cloudloadbalancers-us/src/test/java/org/jclouds/rackspace/cloudloadbalancers/us/CloudLoadBalancersUSLoadBalancerClientLiveTest.java
@@ -18,7 +18,7 @@
  */
 package org.jclouds.rackspace.cloudloadbalancers.us;
 
-import org.jclouds.rackspace.cloudloadbalancers.features.LoadBalancerClientLiveTest;
+import org.jclouds.rackspace.cloudloadbalancers.features.LoadBalancerApiLiveTest;
 import org.testng.annotations.Test;
 
 /**
@@ -26,7 +26,7 @@
  * @author Dan Lo Bianco
  */
 @Test(groups = "live", singleThreaded = true, testName = "CloudLoadBalancersUSLoadBalancerClientLiveTest")
-public class CloudLoadBalancersUSLoadBalancerClientLiveTest extends LoadBalancerClientLiveTest {
+public class CloudLoadBalancersUSLoadBalancerClientLiveTest extends LoadBalancerApiLiveTest {
    public CloudLoadBalancersUSLoadBalancerClientLiveTest() {
       provider = "cloudloadbalancers-us";
    }
diff --git a/providers/rackspace-cloudloadbalancers-us/src/test/java/org/jclouds/rackspace/cloudloadbalancers/us/CloudLoadBalancersUSNodeClientLiveTest.java b/providers/rackspace-cloudloadbalancers-us/src/test/java/org/jclouds/rackspace/cloudloadbalancers/us/CloudLoadBalancersUSNodeClientLiveTest.java
index 0eeefb2..56d8ffb 100644
--- a/providers/rackspace-cloudloadbalancers-us/src/test/java/org/jclouds/rackspace/cloudloadbalancers/us/CloudLoadBalancersUSNodeClientLiveTest.java
+++ b/providers/rackspace-cloudloadbalancers-us/src/test/java/org/jclouds/rackspace/cloudloadbalancers/us/CloudLoadBalancersUSNodeClientLiveTest.java
@@ -18,7 +18,7 @@
  */
 package org.jclouds.rackspace.cloudloadbalancers.us;
 
-import org.jclouds.rackspace.cloudloadbalancers.features.NodeClientLiveTest;
+import org.jclouds.rackspace.cloudloadbalancers.features.NodeApiLiveTest;
 import org.testng.annotations.Test;
 
 /**
@@ -26,7 +26,7 @@
  * @author Dan Lo Bianco
  */
 @Test(groups = "live", singleThreaded = true, testName = "CloudLoadBalancersUSNodeClientLiveTest")
-public class CloudLoadBalancersUSNodeClientLiveTest extends NodeClientLiveTest {
+public class CloudLoadBalancersUSNodeClientLiveTest extends NodeApiLiveTest {
    public CloudLoadBalancersUSNodeClientLiveTest() {
       provider = "cloudloadbalancers-us";
    }