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";
    }
