You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by na...@apache.org on 2013/11/14 12:23:15 UTC

[12/13] JCLOUDS-291: Add pagination support to the cloudsigma2 provider.

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/0bebb584/cloudsigma2/src/test/java/org/jclouds/cloudsigma2/CloudSigma2ApiExpectTest.java
----------------------------------------------------------------------
diff --git a/cloudsigma2/src/test/java/org/jclouds/cloudsigma2/CloudSigma2ApiExpectTest.java b/cloudsigma2/src/test/java/org/jclouds/cloudsigma2/CloudSigma2ApiExpectTest.java
index 857ac73..3d3b12a 100644
--- a/cloudsigma2/src/test/java/org/jclouds/cloudsigma2/CloudSigma2ApiExpectTest.java
+++ b/cloudsigma2/src/test/java/org/jclouds/cloudsigma2/CloudSigma2ApiExpectTest.java
@@ -42,10 +42,12 @@ import org.jclouds.cloudsigma2.domain.Tag;
 import org.jclouds.cloudsigma2.domain.TagResource;
 import org.jclouds.cloudsigma2.domain.Transaction;
 import org.jclouds.cloudsigma2.domain.VLANInfo;
+import org.jclouds.cloudsigma2.options.PaginationOptions;
 import org.jclouds.date.internal.SimpleDateFormatDateService;
 import org.jclouds.http.HttpRequest;
 import org.jclouds.http.HttpResponse;
 import org.jclouds.rest.internal.BaseRestApiExpectTest;
+import org.testng.Assert;
 import org.testng.annotations.Test;
 
 import javax.ws.rs.core.MediaType;
@@ -105,30 +107,84 @@ public class CloudSigma2ApiExpectTest extends BaseRestApiExpectTest<CloudSigma2A
 
     @Test
     public void testListDrives() throws Exception {
+        CloudSigma2Api api = requestsSendResponses(
+                getBuilder()
+                        .endpoint(endpoint + "drives/")
+                        .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/drives.json", MediaType.APPLICATION_JSON))
+                .build()
+                , getBuilder()
+                .endpoint(endpoint + "drives/")
+                .addQueryParam("limit", "2")
+                .addQueryParam("offset", "2")
+                .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/drives-last-page.json", MediaType.APPLICATION_JSON))
+                .build());
+
+        List<Drive> drives = api.listDrives().concat().toList();
+
+        Assert.assertEquals(drives.size(), 3);
+        Assert.assertEquals(drives.get(0).getUuid(), "92ca1450-417e-4cc1-983b-1015777e2591");
+        Assert.assertEquals(drives.get(1).getUuid(), "414ad24b-ba41-47c0-9751-ef5060b6c391");
+        Assert.assertEquals(drives.get(2).getUuid(), "7bc04bc5-bd09-4269-b45d-16b58d6f71b4");
+    }
+
+    @Test
+    public void testListDrivesPaginatedCollection() throws Exception {
         CloudSigma2Api api = requestSendsResponse(
                 getBuilder()
-                        .endpoint(endpoint + "drives/?limit=0")
+                        .endpoint(endpoint + "drives/?limit=3&offset=3")
                         .build()
                 , responseBuilder()
                 .payload(payloadFromResourceWithContentType("/drives.json", MediaType.APPLICATION_JSON))
                 .build());
 
-        List<Drive> result = api.listDrives();
-        assertNotNull(result);
+        for(Drive drive : api.listDrives(new PaginationOptions.Builder().limit(3).offset(3).build())){
+            assertNotNull(drive);
+        }
     }
 
     @Test
     public void testListDrivesInfo() throws Exception {
+        CloudSigma2Api api = requestsSendResponses(
+                getBuilder()
+                        .endpoint(endpoint + "drives/detail/")
+                        .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/drives-detail-first-page.json", MediaType.APPLICATION_JSON))
+                .build()
+                , getBuilder()
+                .endpoint(endpoint + "drives/detail/")
+                .addQueryParam("limit", "2")
+                .addQueryParam("offset", "2")
+                .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/drives-detail-last-page.json", MediaType.APPLICATION_JSON))
+                .build());
+
+        List<DriveInfo> drives = api.listDrivesInfo().concat().toList();
+
+        Assert.assertEquals(drives.size(), 3);
+        Assert.assertEquals(drives.get(0).getUuid(), "92ca1450-417e-4cc1-983b-1015777e2591");
+        Assert.assertEquals(drives.get(1).getUuid(), "414ad24b-ba41-47c0-9751-ef5060b6c391");
+        Assert.assertEquals(drives.get(2).getUuid(), "7bc04bc5-bd09-4269-b45d-16b58d6f71b4");
+    }
+
+    @Test
+    public void testListDrivesInfoPaginatedCollection() throws Exception {
         CloudSigma2Api api = requestSendsResponse(
                 getBuilder()
-                        .endpoint(endpoint + "drives/detail/?limit=0")
+                        .endpoint(endpoint + "drives/detail/?limit=3&offset=3")
                         .build()
                 , responseBuilder()
                 .payload(payloadFromResourceWithContentType("/drives-detail.json", MediaType.APPLICATION_JSON))
                 .build());
 
-        List<DriveInfo> result = api.listDrivesInfo();
-        assertNotNull(result);
+        for(DriveInfo driveInfo : api.listDrivesInfo(new PaginationOptions.Builder().limit(3).offset(3).build())){
+            assertNotNull(driveInfo);
+        }
     }
 
     @Test
@@ -275,16 +331,46 @@ public class CloudSigma2ApiExpectTest extends BaseRestApiExpectTest<CloudSigma2A
 
     @Test
     public void testListLibraryDrives() throws Exception {
+        CloudSigma2Api api = requestsSendResponses(
+                getBuilder()
+                        .endpoint(endpoint + "libdrives/")
+                        .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/libdrives.json", MediaType.APPLICATION_JSON))
+                .build()
+                , getBuilder()
+                .endpoint(endpoint + "libdrives/")
+                .addQueryParam("limit", "2")
+                .addQueryParam("offset", "2")
+                .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/libdrives-last-page.json", MediaType.APPLICATION_JSON))
+                .build());
+
+        List<LibraryDrive> drives = api.listLibraryDrives().concat().toList();
+
+        Assert.assertEquals(drives.size(), 3);
+        Assert.assertEquals(drives.get(0).getUuid(), "8c45d8d9-4efd-44ec-9833-8d52004b4298");
+        Assert.assertEquals(drives.get(1).getUuid(), "d1ec9f26-ba44-4002-bbdf-82a31a84b611");
+        Assert.assertEquals(drives.get(2).getUuid(), "dd9da460-b1ab-419a-9fa1-804540eee4c3");
+    }
+
+    @Test
+    public void testListLibraryDrivesPaginatedCollection() throws Exception {
         CloudSigma2Api api = requestSendsResponse(
                 getBuilder()
-                        .endpoint(endpoint + "libdrives/?limit=0")
+                        .endpoint(endpoint + "libdrives/?limit=3&offset=3")
                         .build()
                 , responseBuilder()
                 .payload(payloadFromResourceWithContentType("/libdrives.json", MediaType.APPLICATION_JSON))
                 .build());
 
-        List<LibraryDrive> result = api.listLibraryDrives();
-        assertNotNull(result);
+        for (LibraryDrive libraryDrive : api.listLibraryDrives(new PaginationOptions.Builder()
+                .limit(3)
+                .offset(3)
+                .build())) {
+            assertNotNull(libraryDrive);
+        }
     }
 
     @Test
@@ -325,30 +411,84 @@ public class CloudSigma2ApiExpectTest extends BaseRestApiExpectTest<CloudSigma2A
 
     @Test
     public void testListServers() throws Exception {
+        CloudSigma2Api api = requestsSendResponses(
+                getBuilder()
+                        .endpoint(endpoint + "servers/")
+                        .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/servers.json", MediaType.APPLICATION_JSON))
+                .build()
+                , getBuilder()
+                .endpoint(endpoint + "servers/")
+                .addQueryParam("limit", "2")
+                .addQueryParam("offset", "2")
+                .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/servers-last-page.json", MediaType.APPLICATION_JSON))
+                .build());
+
+        List<Server> servers = api.listServers().concat().toList();
+
+        Assert.assertEquals(servers.size(), 3);
+        Assert.assertEquals(servers.get(0).getUuid(), "61d61337-884b-4c87-b4de-f7f48f9cfc84");
+        Assert.assertEquals(servers.get(1).getUuid(), "33e71c37-0d0a-4a3a-a1ea-dc7265c9a154");
+        Assert.assertEquals(servers.get(2).getUuid(), "05c16b9a-f2f5-4da6-a1cb-b90722c32212");
+    }
+
+    @Test
+    public void testListServersPaginatedCollection() throws Exception {
         CloudSigma2Api api = requestSendsResponse(
                 getBuilder()
-                        .endpoint(endpoint + "servers/?limit=0")
+                        .endpoint(endpoint + "servers/?limit=3&offset=3")
                         .build()
                 , responseBuilder()
                 .payload(payloadFromResourceWithContentType("/servers.json", MediaType.APPLICATION_JSON))
                 .build());
 
-        List<Server> result = api.listServers();
-        assertNotNull(result);
+        for (Server sever : api.listServers(new PaginationOptions.Builder().limit(3).offset(3).build())) {
+            assertNotNull(sever);
+        }
     }
 
     @Test
     public void testListServersInfo() throws Exception {
+        CloudSigma2Api api = requestsSendResponses(
+                getBuilder()
+                        .endpoint(endpoint + "servers/detail/")
+                        .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/server-detail-first-page.json", MediaType.APPLICATION_JSON))
+                .build()
+                , getBuilder()
+                .endpoint(endpoint + "servers/detail/")
+                .addQueryParam("limit", "2")
+                .addQueryParam("offset", "2")
+                .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/server-detail-last-page.json", MediaType.APPLICATION_JSON))
+                .build());
+
+        List<ServerInfo> serverInfos = api.listServersInfo().concat().toList();
+
+        Assert.assertEquals(serverInfos.size(), 3);
+        Assert.assertEquals(serverInfos.get(0).getUuid(), "a19a425f-9e92-42f6-89fb-6361203071bb");
+        Assert.assertEquals(serverInfos.get(1).getUuid(), "61d61337-884b-4c87-b4de-f7f48f9cfc84");
+        Assert.assertEquals(serverInfos.get(2).getUuid(), "33e71c37-0d0a-4a3a-a1ea-dc7265c9a154");
+    }
+
+    @Test
+    public void testListServersInfoPaginatedCollection() throws Exception {
         CloudSigma2Api api = requestSendsResponse(
                 getBuilder()
-                        .endpoint(endpoint + "servers/detail/?limit=0")
+                        .endpoint(endpoint + "servers/detail/?limit=3&offset=3")
                         .build()
                 , responseBuilder()
                 .payload(payloadFromResourceWithContentType("/server-detail.json", MediaType.APPLICATION_JSON))
                 .build());
 
-        List<ServerInfo> result = api.listServersInfo();
-        assertNotNull(result);
+        for(ServerInfo serverInfo : api.listServersInfo(new PaginationOptions.Builder().limit(3).offset(3).build())){
+            assertNotNull(serverInfo);
+        }
     }
 
     @Test
@@ -547,56 +687,95 @@ public class CloudSigma2ApiExpectTest extends BaseRestApiExpectTest<CloudSigma2A
     public void testListServerAvailabilityGroup() throws Exception {
         CloudSigma2Api api = requestSendsResponse(
                 getBuilder()
-                        .endpoint(endpoint + "servers/availability_groups/?limit=0")
+                        .endpoint(endpoint + "servers/availability_groups/")
                         .build()
                 , responseBuilder()
                 .payload(payloadFromResourceWithContentType("/servers-availability-groups.json", MediaType.APPLICATION_JSON))
                 .build());
 
-        List<List<String>> result = api.listServerAvailabilityGroup();
-        assertNotNull(result);
+        for(List<String> availabilityGroup : api.listServerAvailabilityGroup()){
+            assertNotNull(availabilityGroup);
+        }
     }
 
     @Test
-    public void testGetServerAvailabilityGroup() throws Exception {
-        CloudSigma2Api api = requestSendsResponse(
+    public void testListFirewallPolicies() throws Exception {
+        CloudSigma2Api api = requestsSendResponses(
                 getBuilder()
-                        .endpoint(endpoint + "fwpolicies/?limit=0")
+                        .endpoint(endpoint + "fwpolicies/")
                         .build()
                 , responseBuilder()
-                .payload(payloadFromResourceWithContentType("/fwpolicies-detail.json", MediaType.APPLICATION_JSON))
+                .payload(payloadFromResourceWithContentType("/fwpolicies-detail-first-page.json", MediaType.APPLICATION_JSON))
+                .build()
+                , getBuilder()
+                .endpoint(endpoint + "fwpolicies/")
+                .addQueryParam("limit", "1")
+                .addQueryParam("offset", "1")
+                .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/fwpolicies-detail-last-page.json", MediaType.APPLICATION_JSON))
                 .build());
 
-        List<FirewallPolicy> result = api.listFirewallPolicies();
-        assertNotNull(result);
+        List<FirewallPolicy> firewallPolicies = api.listFirewallPolicies().concat().toList();
+
+        Assert.assertEquals(firewallPolicies.size(), 2);
+        Assert.assertEquals(firewallPolicies.get(0).getUuid(), "b68dd907-69fc-4b3c-b954-c39d0046525b");
+        Assert.assertEquals(firewallPolicies.get(1).getUuid(), "cf8479b4-c98b-46c8-ab9c-108bb00c8218");
     }
 
     @Test
-    public void testListFirewallPolicies() throws Exception {
+    public void testListFirewallPoliciesPaginatedCollection() throws Exception {
         CloudSigma2Api api = requestSendsResponse(
                 getBuilder()
-                        .endpoint(endpoint + "fwpolicies/?limit=0")
+                        .endpoint(endpoint + "fwpolicies/?limit=2&offset=2")
                         .build()
                 , responseBuilder()
                 .payload(payloadFromResourceWithContentType("/fwpolicies-detail.json", MediaType.APPLICATION_JSON))
                 .build());
 
-        List<FirewallPolicy> result = api.listFirewallPolicies();
-        assertNotNull(result);
+        for(FirewallPolicy firewallPolicy : api.listFirewallPolicies(new PaginationOptions.Builder().limit(2).offset(2).build())){
+            assertNotNull(firewallPolicy);
+        }
     }
 
     @Test
     public void testListFirewallPoliciesInfo() throws Exception {
+        CloudSigma2Api api = requestsSendResponses(
+                getBuilder()
+                        .endpoint(endpoint + "fwpolicies/detail/")
+                        .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/fwpolicies-detail-first-page.json", MediaType.APPLICATION_JSON))
+                .build()
+                , getBuilder()
+                .endpoint(endpoint + "fwpolicies/detail/")
+                .addQueryParam("limit", "1")
+                .addQueryParam("offset", "1")
+                .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/fwpolicies-detail-last-page.json", MediaType.APPLICATION_JSON))
+                .build());
+
+        List<FirewallPolicy> firewallPolicies = api.listFirewallPoliciesInfo().concat().toList();
+
+        Assert.assertEquals(firewallPolicies.size(), 2);
+        Assert.assertEquals(firewallPolicies.get(0).getUuid(), "b68dd907-69fc-4b3c-b954-c39d0046525b");
+        Assert.assertEquals(firewallPolicies.get(1).getUuid(), "cf8479b4-c98b-46c8-ab9c-108bb00c8218");
+    }
+
+    @Test
+    public void testListFirewallPoliciesInfoPaginatedCollection() throws Exception {
         CloudSigma2Api api = requestSendsResponse(
                 getBuilder()
-                        .endpoint(endpoint + "fwpolicies/detail/?limit=0")
+                        .endpoint(endpoint + "fwpolicies/detail/?limit=2&offset=2")
                         .build()
                 , responseBuilder()
                 .payload(payloadFromResourceWithContentType("/fwpolicies-detail.json", MediaType.APPLICATION_JSON))
                 .build());
 
-        List<FirewallPolicy> result = api.listFirewallPoliciesInfo();
-        assertNotNull(result);
+        for(FirewallPolicy firewallPolicy : api.listFirewallPoliciesInfo(new PaginationOptions.Builder().limit(2).offset(2).build())){
+            assertNotNull(firewallPolicy);
+        }
     }
 
     @Test
@@ -793,30 +972,82 @@ public class CloudSigma2ApiExpectTest extends BaseRestApiExpectTest<CloudSigma2A
 
     @Test
     public void testListVLANs() throws Exception {
+        CloudSigma2Api api = requestsSendResponses(
+                getBuilder()
+                        .endpoint(endpoint + "vlans/")
+                        .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/vlans.json", MediaType.APPLICATION_JSON))
+                .build()
+                , getBuilder()
+                .endpoint(endpoint + "vlans/")
+                .addQueryParam("limit", "1")
+                .addQueryParam("offset", "1")
+                .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/vlans-last-page.json", MediaType.APPLICATION_JSON))
+                .build());
+
+        List<VLANInfo> vlans = api.listVLANs().concat().toList();
+
+        Assert.assertEquals(vlans.size(), 2);
+        Assert.assertEquals(vlans.get(0).getUuid(), "96537817-f4b6-496b-a861-e74192d3ccb0");
+        Assert.assertEquals(vlans.get(1).getUuid(), "00b445a9-3936-47e5-ba8a-38adcf43db20");
+    }
+
+    @Test
+    public void testListVLANsPaginatedCollection() throws Exception {
         CloudSigma2Api api = requestSendsResponse(
                 getBuilder()
-                        .endpoint(endpoint + "vlans/?limit=0")
+                        .endpoint(endpoint + "vlans/?limit=2&offset=2")
                         .build()
                 , responseBuilder()
                 .payload(payloadFromResourceWithContentType("/vlans.json", MediaType.APPLICATION_JSON))
                 .build());
 
-        List<VLANInfo> result = api.listVLANs();
-        assertNotNull(result);
+        for(VLANInfo vlanInfo : api.listVLANs(new PaginationOptions.Builder().limit(2).offset(2).build())){
+            assertNotNull(vlanInfo);
+        }
     }
 
     @Test
     public void testListVLANInfo() throws Exception {
+        CloudSigma2Api api = requestsSendResponses(
+                getBuilder()
+                        .endpoint(endpoint + "vlans/detail/")
+                        .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/vlans.json", MediaType.APPLICATION_JSON))
+                .build()
+                , getBuilder()
+                .endpoint(endpoint + "vlans/detail/")
+                .addQueryParam("limit", "1")
+                .addQueryParam("offset", "1")
+                .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/vlans-last-page.json", MediaType.APPLICATION_JSON))
+                .build());
+
+        List<VLANInfo> vlanInfos = api.listVLANInfo().concat().toList();
+
+        Assert.assertEquals(vlanInfos.size(), 2);
+        Assert.assertEquals(vlanInfos.get(0).getUuid(), "96537817-f4b6-496b-a861-e74192d3ccb0");
+        Assert.assertEquals(vlanInfos.get(1).getUuid(), "00b445a9-3936-47e5-ba8a-38adcf43db20");
+    }
+
+    @Test
+    public void testListVLANInfoPaginatedCollection() throws Exception {
         CloudSigma2Api api = requestSendsResponse(
                 getBuilder()
-                        .endpoint(endpoint + "vlans/detail/?limit=0")
+                        .endpoint(endpoint + "vlans/detail/?limit=2&offset=2")
                         .build()
                 , responseBuilder()
                 .payload(payloadFromResourceWithContentType("/vlans.json", MediaType.APPLICATION_JSON))
                 .build());
 
-        List<VLANInfo> result = api.listVLANInfo();
-        assertNotNull(result);
+        for(VLANInfo vlanInfo : api.listVLANInfo(new PaginationOptions.Builder().limit(2).offset(2).build())){
+            assertNotNull(vlanInfo);
+        }
     }
 
     @Test
@@ -845,30 +1076,82 @@ public class CloudSigma2ApiExpectTest extends BaseRestApiExpectTest<CloudSigma2A
 
     @Test
     public void testListIPs() throws Exception {
+        CloudSigma2Api api = requestsSendResponses(
+                getBuilder()
+                        .endpoint(endpoint + "ips/")
+                        .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/ips.json", MediaType.APPLICATION_JSON))
+                .build()
+                , getBuilder()
+                .endpoint(endpoint + "ips/")
+                .addQueryParam("limit", "1")
+                .addQueryParam("offset", "1")
+                .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/ips-last-page.json", MediaType.APPLICATION_JSON))
+                .build());
+
+        List<IP> ips = api.listIPs().concat().toList();
+
+        Assert.assertEquals(ips.size(), 2);
+        Assert.assertEquals(ips.get(0).getUuid(), "185.12.6.183");
+        Assert.assertEquals(ips.get(1).getUuid(), "185.12.5.233");
+    }
+
+    @Test
+    public void testListIPsPaginatedCollection() throws Exception {
         CloudSigma2Api api = requestSendsResponse(
                 getBuilder()
-                        .endpoint(endpoint + "ips/?limit=0")
+                        .endpoint(endpoint + "ips/?limit=2&offset=2")
                         .build()
                 , responseBuilder()
                 .payload(payloadFromResourceWithContentType("/ips.json", MediaType.APPLICATION_JSON))
                 .build());
 
-        List<IP> result = api.listIPs();
-        assertNotNull(result);
+        for(IP ip : api.listIPs(new PaginationOptions.Builder().limit(2).offset(2).build())){
+            assertNotNull(ip);
+        }
     }
 
     @Test
     public void testListIPInfo() throws Exception {
+        CloudSigma2Api api = requestsSendResponses(
+                getBuilder()
+                        .endpoint(endpoint + "ips/detail/")
+                        .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/ips.json", MediaType.APPLICATION_JSON))
+                .build()
+                , getBuilder()
+                .endpoint(endpoint + "ips/detail/")
+                .addQueryParam("limit", "1")
+                .addQueryParam("offset", "1")
+                .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/ips-last-page.json", MediaType.APPLICATION_JSON))
+                .build());
+
+        List<IPInfo> ipInfos = api.listIPInfo().concat().toList();
+
+        Assert.assertEquals(ipInfos.size(), 2);
+        Assert.assertEquals(ipInfos.get(0).getUuid(), "185.12.6.183");
+        Assert.assertEquals(ipInfos.get(1).getUuid(), "185.12.5.233");
+    }
+
+    @Test
+    public void testListIPInfoPaginatedCollection() throws Exception {
         CloudSigma2Api api = requestSendsResponse(
                 getBuilder()
-                        .endpoint(endpoint + "ips/detail/?limit=0")
+                        .endpoint(endpoint + "ips/detail/?limit=2&offset=2")
                         .build()
                 , responseBuilder()
                 .payload(payloadFromResourceWithContentType("/ips.json", MediaType.APPLICATION_JSON))
                 .build());
 
-        List<IPInfo> result = api.listIPInfo();
-        assertNotNull(result);
+        for(IPInfo ipInfo : api.listIPInfo(new PaginationOptions.Builder().limit(2).offset(2).build())){
+            assertNotNull(ipInfo);
+        }
     }
 
     @Test
@@ -912,30 +1195,83 @@ public class CloudSigma2ApiExpectTest extends BaseRestApiExpectTest<CloudSigma2A
 
     @Test
     public void testListTags() throws Exception {
+        CloudSigma2Api api = requestsSendResponses(
+                getBuilder()
+                        .endpoint(endpoint + "tags/")
+                        .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/tags-detail-first-page.json", MediaType.APPLICATION_JSON))
+                .build()
+                , getBuilder()
+                .endpoint(endpoint + "tags/")
+                .addQueryParam("limit", "1")
+                .addQueryParam("offset", "1")
+                .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/tags-detail-last-page.json", MediaType.APPLICATION_JSON))
+                .build());
+
+        List<Tag> tags = api.listTags().concat().toList();
+
+        Assert.assertEquals(tags.size(), 2);
+        Assert.assertEquals(tags.get(0).getUuid(), "956e2ca0-dee3-4b3f-a1be-a6e86f90946f");
+        Assert.assertEquals(tags.get(1).getUuid(), "68bb0cfc-0c76-4f37-847d-7bb705c5ae46");
+    }
+
+    @Test
+    public void testListTagsPaginatedCollection() throws Exception {
         CloudSigma2Api api = requestSendsResponse(
                 getBuilder()
-                        .endpoint(endpoint + "tags/?limit=0")
+                        .endpoint(endpoint + "tags/?limit=2&offset=2")
                         .build()
                 , responseBuilder()
                 .payload(payloadFromResourceWithContentType("/tags-detail.json", MediaType.APPLICATION_JSON))
                 .build());
 
-        List<Tag> result = api.listTags();
-        assertNotNull(result);
+        for(Tag tag : api.listTags(new PaginationOptions.Builder().limit(2).offset(2).build())){
+            assertNotNull(tag);
+        }
     }
 
     @Test
     public void testListTagsInfo() throws Exception {
+        CloudSigma2Api api = requestsSendResponses(
+                getBuilder()
+                        .endpoint(endpoint + "tags/detail/")
+                        .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/tags-detail-first-page.json", MediaType.APPLICATION_JSON))
+                .build()
+                , getBuilder()
+                .endpoint(endpoint + "tags/detail/")
+                .addQueryParam("limit", "1")
+                .addQueryParam("offset", "1")
+                .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/tags-detail-last-page.json", MediaType.APPLICATION_JSON))
+                .build());
+
+        List<Tag> tags = api.listTagsInfo().concat().toList();
+
+        Assert.assertEquals(tags.size(), 2);
+        Assert.assertEquals(tags.get(0).getUuid(), "956e2ca0-dee3-4b3f-a1be-a6e86f90946f");
+        Assert.assertEquals(tags.get(1).getUuid(), "68bb0cfc-0c76-4f37-847d-7bb705c5ae46");
+    }
+
+
+    @Test
+    public void testListTagsInfoPaginatedCollection() throws Exception {
         CloudSigma2Api api = requestSendsResponse(
                 getBuilder()
-                        .endpoint(endpoint + "tags/detail/?limit=0")
+                        .endpoint(endpoint + "tags/detail/?limit=2&offset=2")
                         .build()
                 , responseBuilder()
                 .payload(payloadFromResourceWithContentType("/tags-detail.json", MediaType.APPLICATION_JSON))
                 .build());
 
-        List<Tag> result = api.listTagsInfo();
-        assertNotNull(result);
+        for(Tag tag : api.listTagsInfo(new PaginationOptions.Builder().limit(2).offset(2).build())){
+            assertNotNull(tag);
+        }
     }
 
     @Test
@@ -1140,30 +1476,84 @@ public class CloudSigma2ApiExpectTest extends BaseRestApiExpectTest<CloudSigma2A
 
     @Test
     public void testListSubscriptions() throws Exception {
+        CloudSigma2Api api = requestsSendResponses(
+                getBuilder()
+                        .endpoint(endpoint + "subscriptions/")
+                        .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/subscriptions-first-page.json", MediaType.APPLICATION_JSON))
+                .build()
+                , getBuilder()
+                .endpoint(endpoint + "subscriptions/")
+                .addQueryParam("limit", "2")
+                .addQueryParam("offset", "2")
+                .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/subscriptions-last-page.json", MediaType.APPLICATION_JSON))
+                .build());
+
+        List<Subscription> subscriptions = api.listSubscriptions().concat().toList();
+
+        Assert.assertEquals(subscriptions.size(), 3);
+        Assert.assertEquals(subscriptions.get(0).getUuid(), "509f8e27-1e64-49bb-aa5a-baec074b0210");
+        Assert.assertEquals(subscriptions.get(1).getUuid(), "c2423c1a-8768-462c-bdc3-4ca09c1e650b");
+        Assert.assertEquals(subscriptions.get(2).getUuid(), "9bb117d3-4bc5-4e2d-a907-b20abd48eaf9");
+    }
+
+    @Test
+    public void testListSubscriptionsPaginatedCollection() throws Exception {
         CloudSigma2Api api = requestSendsResponse(
                 getBuilder()
-                        .endpoint(endpoint + "subscriptions/?limit=0")
+                        .endpoint(endpoint + "subscriptions/?limit=3&offset=3")
                         .build()
                 , responseBuilder()
                 .payload(payloadFromResourceWithContentType("/subscriptions.json", MediaType.APPLICATION_JSON))
                 .build());
 
-        List<Subscription> result = api.listSubscriptions();
-        assertNotNull(result);
+        for(Subscription subscription : api.listSubscriptions(new PaginationOptions.Builder().limit(3).offset(3).build())){
+            assertNotNull(subscription);
+        }
     }
 
     @Test
     public void testListSubscriptionsCalculator() throws Exception {
+        CloudSigma2Api api = requestsSendResponses(
+                getBuilder()
+                        .endpoint(endpoint + "subscriptioncalculator/")
+                        .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/subscriptions-first-page.json", MediaType.APPLICATION_JSON))
+                .build()
+                , getBuilder()
+                .endpoint(endpoint + "subscriptioncalculator/")
+                .addQueryParam("limit", "2")
+                .addQueryParam("offset", "2")
+                .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/subscriptions-last-page.json", MediaType.APPLICATION_JSON))
+                .build());
+
+        List<Subscription> subscriptions = api.listSubscriptionsCalculator().concat().toList();
+
+        Assert.assertEquals(subscriptions.size(), 3);
+        Assert.assertEquals(subscriptions.get(0).getUuid(), "509f8e27-1e64-49bb-aa5a-baec074b0210");
+        Assert.assertEquals(subscriptions.get(1).getUuid(), "c2423c1a-8768-462c-bdc3-4ca09c1e650b");
+        Assert.assertEquals(subscriptions.get(2).getUuid(), "9bb117d3-4bc5-4e2d-a907-b20abd48eaf9");
+    }
+
+    @Test
+    public void testListSubscriptionsCalculatorPaginatedCollection() throws Exception {
         CloudSigma2Api api = requestSendsResponse(
                 getBuilder()
-                        .endpoint(endpoint + "subscriptioncalculator/?limit=0")
+                        .endpoint(endpoint + "subscriptioncalculator/?limit=2&offset=2")
                         .build()
                 , responseBuilder()
                 .payload(payloadFromResourceWithContentType("/subscriptions.json", MediaType.APPLICATION_JSON))
                 .build());
 
-        List<Subscription> result = api.listSubscriptionsCalculator();
-        assertNotNull(result);
+        for(Subscription subscription : api.listSubscriptionsCalculator(new PaginationOptions.Builder().limit(2).offset(2).build())){
+            assertNotNull(subscription);
+        }
     }
 
     @Test
@@ -1273,43 +1663,127 @@ public class CloudSigma2ApiExpectTest extends BaseRestApiExpectTest<CloudSigma2A
 
     @Test
     public void testListDiscounts() throws Exception {
+        CloudSigma2Api api = requestsSendResponses(
+                getBuilder()
+                        .endpoint(endpoint + "discount/")
+                        .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/discount.json", MediaType.APPLICATION_JSON))
+                .build()
+                , getBuilder()
+                .endpoint(endpoint + "discount/")
+                .addQueryParam("limit", "3")
+                .addQueryParam("offset", "3")
+                .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/discount-last-page.json", MediaType.APPLICATION_JSON))
+                .build());
+
+        List<Discount> discounts = api.listDiscounts().concat().toList();
+
+        Assert.assertEquals(discounts.size(), 5);
+        Assert.assertEquals(discounts.get(0).getValue(), 0.03);
+        Assert.assertEquals(discounts.get(1).getValue(), 0.1);
+        Assert.assertEquals(discounts.get(2).getValue(), 0.25);
+        Assert.assertEquals(discounts.get(3).getValue(), 0.35);
+        Assert.assertEquals(discounts.get(4).getValue(), 0.45);
+    }
+
+    @Test
+    public void testListDiscountsPaginatedCollection() throws Exception {
         CloudSigma2Api api = requestSendsResponse(
                 getBuilder()
-                        .endpoint(endpoint + "discount/?limit=0")
+                        .endpoint(endpoint + "discount/?limit=5&offset=5")
                         .build()
                 , responseBuilder()
                 .payload(payloadFromResourceWithContentType("/discount.json", MediaType.APPLICATION_JSON))
                 .build());
 
-        List<Discount> result = api.listDiscounts();
-        assertNotNull(result);
+        for(Discount discount : api.listDiscounts(new PaginationOptions.Builder().limit(5).offset(5).build())){
+            assertNotNull(discount);
+        }
     }
 
     @Test
     public void testListTransactions() throws Exception {
+        CloudSigma2Api api = requestsSendResponses(
+                getBuilder()
+                        .endpoint(endpoint + "ledger/")
+                        .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/ledger.json", MediaType.APPLICATION_JSON))
+                .build()
+                , getBuilder()
+                .endpoint(endpoint + "ledger/")
+                .addQueryParam("limit", "2")
+                .addQueryParam("offset", "2")
+                .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/ledger-last-page.json", MediaType.APPLICATION_JSON))
+                .build());
+
+        List<Transaction> transactions = api.listTransactions().concat().toList();
+
+        Assert.assertEquals(transactions.size(), 4);
+        Assert.assertEquals(transactions.get(0).getId(), "11042920");
+        Assert.assertEquals(transactions.get(1).getId(), "11042919");
+        Assert.assertEquals(transactions.get(2).getId(), "11042661");
+        Assert.assertEquals(transactions.get(3).getId(), "11042660");
+    }
+
+    @Test
+    public void testListTransactionsPaginatedCollection() throws Exception {
         CloudSigma2Api api = requestSendsResponse(
                 getBuilder()
-                        .endpoint(endpoint + "ledger/?limit=0")
+                        .endpoint(endpoint + "ledger/?limit=4&offset=4")
                         .build()
                 , responseBuilder()
                 .payload(payloadFromResourceWithContentType("/ledger.json", MediaType.APPLICATION_JSON))
                 .build());
 
-        List<Transaction> result = api.listTransactions();
-        assertNotNull(result);
+        for(Transaction transaction : api.listTransactions(new PaginationOptions.Builder().limit(4).offset(4).build())){
+            assertNotNull(transaction);
+        }
     }
 
     @Test
     public void testListLicenses() throws Exception {
+        CloudSigma2Api api = requestsSendResponses(
+                getBuilder()
+                        .endpoint(endpoint + "licenses/")
+                        .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/licences.json", MediaType.APPLICATION_JSON))
+                .build()
+                , getBuilder()
+                .endpoint(endpoint + "licenses/")
+                .addQueryParam("limit", "2")
+                .addQueryParam("offset", "2")
+                .build()
+                , responseBuilder()
+                .payload(payloadFromResourceWithContentType("/licences-last-page.json", MediaType.APPLICATION_JSON))
+                .build());
+
+        List<License> licenses = api.listLicenses().concat().toList();
+
+        Assert.assertEquals(licenses.size(), 3);
+        Assert.assertEquals(licenses.get(0).getName(), "msft_lwa_00135");
+        Assert.assertEquals(licenses.get(1).getName(), "msft_p73_04837");
+        Assert.assertEquals(licenses.get(2).getName(), "msft_tfa_00009");
+    }
+
+    @Test
+    public void testListLicensesPaginatedCollection() throws Exception {
         CloudSigma2Api api = requestSendsResponse(
                 getBuilder()
-                    .endpoint(endpoint + "licenses/?limit=0")
+                    .endpoint(endpoint + "licenses/?limit=3&offset=3")
                     .build()
                 , responseBuilder()
                     .payload(payloadFromResourceWithContentType("/licences.json", MediaType.APPLICATION_JSON))
                     .build());
 
-        List<License> result = api.listLicenses();
-        assertNotNull(result);
+        for(License license : api.listLicenses(new PaginationOptions.Builder().limit(3).offset(3).build())){
+            assertNotNull(license);
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/0bebb584/cloudsigma2/src/test/java/org/jclouds/cloudsigma2/CloudSigma2ApiLiveTest.java
----------------------------------------------------------------------
diff --git a/cloudsigma2/src/test/java/org/jclouds/cloudsigma2/CloudSigma2ApiLiveTest.java b/cloudsigma2/src/test/java/org/jclouds/cloudsigma2/CloudSigma2ApiLiveTest.java
index bef1bdd..1ba8fd6 100644
--- a/cloudsigma2/src/test/java/org/jclouds/cloudsigma2/CloudSigma2ApiLiveTest.java
+++ b/cloudsigma2/src/test/java/org/jclouds/cloudsigma2/CloudSigma2ApiLiveTest.java
@@ -19,6 +19,7 @@ package org.jclouds.cloudsigma2;
 import com.google.common.collect.ImmutableList;
 import org.jclouds.apis.BaseApiLiveTest;
 import org.jclouds.cloudsigma2.domain.DeviceEmulationType;
+import org.jclouds.cloudsigma2.domain.Discount;
 import org.jclouds.cloudsigma2.domain.Drive;
 import org.jclouds.cloudsigma2.domain.DriveInfo;
 import org.jclouds.cloudsigma2.domain.FirewallAction;
@@ -38,6 +39,7 @@ import org.jclouds.cloudsigma2.domain.ServerInfo;
 import org.jclouds.cloudsigma2.domain.Subscription;
 import org.jclouds.cloudsigma2.domain.Tag;
 import org.jclouds.cloudsigma2.domain.TagResource;
+import org.jclouds.cloudsigma2.domain.Transaction;
 import org.jclouds.cloudsigma2.domain.VLANInfo;
 import org.testng.Assert;
 import org.testng.annotations.Test;
@@ -77,7 +79,7 @@ public class CloudSigma2ApiLiveTest extends BaseApiLiveTest<CloudSigma2Api> {
 
     @Test
     public void testGetDriveInfo() throws Exception {
-        for(Drive driveInfo : api.listDrives()){
+        for(Drive driveInfo : api.listDrives().concat()){
             Assert.assertNotNull(api.getDriveInfo(driveInfo.getUuid()));
         }
     }
@@ -146,7 +148,7 @@ public class CloudSigma2ApiLiveTest extends BaseApiLiveTest<CloudSigma2Api> {
 
     @Test
     public void testGetLibraryDrive() throws Exception {
-        for(LibraryDrive libraryDrive : api.listLibraryDrives()){
+        for(LibraryDrive libraryDrive : api.listLibraryDrives().concat()){
             Assert.assertNotNull(libraryDrive.getUuid());
         }
     }
@@ -168,7 +170,7 @@ public class CloudSigma2ApiLiveTest extends BaseApiLiveTest<CloudSigma2Api> {
                 .memory(new BigInteger("5368709120"))
                 .cpu(3000)
                 .vncPassword("new_password")
-                .drives(ImmutableList.of(api.listDrives().get(0).toServerDrive(1, "0:1", DeviceEmulationType.IDE)))
+                .drives(ImmutableList.of(api.listDrives().concat().get(0).toServerDrive(1, "0:1", DeviceEmulationType.IDE)))
                 .build();
 
         createdServer = api.createServer(serverInfo);
@@ -213,7 +215,7 @@ public class CloudSigma2ApiLiveTest extends BaseApiLiveTest<CloudSigma2Api> {
 
     @Test
     public void testGetServerInfo() throws Exception {
-        for(Server server : api.listServers()){
+        for(Server server : api.listServers().concat()){
             Assert.assertNotNull(server.getUuid());
         }
     }
@@ -389,7 +391,7 @@ public class CloudSigma2ApiLiveTest extends BaseApiLiveTest<CloudSigma2Api> {
 
     @Test
     public void testGetVLANInfo() throws Exception {
-        for(VLANInfo vlanInfo : api.listVLANs()){
+        for(VLANInfo vlanInfo : api.listVLANs().concat()){
             Assert.assertNotNull(vlanInfo.getUuid());
         }
     }
@@ -404,7 +406,7 @@ public class CloudSigma2ApiLiveTest extends BaseApiLiveTest<CloudSigma2Api> {
                                         .build();
 
         if(api.listVLANs().size() > 0){
-            checkVlAN(vlanInfo, api.editVLAN(api.listVLANs().get(0).getUuid(), vlanInfo));
+            checkVlAN(vlanInfo, api.editVLAN(api.listVLANs().concat().get(0).getUuid(), vlanInfo));
         }
     }
 
@@ -420,7 +422,7 @@ public class CloudSigma2ApiLiveTest extends BaseApiLiveTest<CloudSigma2Api> {
 
     @Test
     public void testGetIPInfo() throws Exception {
-        for(IP ip : api.listIPs()){
+        for(IP ip : api.listIPs().concat()){
             Assert.assertNotNull(api.getIPInfo(ip.getUuid()));
         }
     }
@@ -435,7 +437,7 @@ public class CloudSigma2ApiLiveTest extends BaseApiLiveTest<CloudSigma2Api> {
                 .build();
 
         if(api.listIPs().size() > 0){
-            checkIP(ip, api.editIP(api.listIPs().get(0).getUuid(), ip));
+            checkIP(ip, api.editIP(api.listIPs().concat().get(0).getUuid(), ip));
         }
     }
 
@@ -451,7 +453,7 @@ public class CloudSigma2ApiLiveTest extends BaseApiLiveTest<CloudSigma2Api> {
 
     @Test
     public void testGetTagInfo() throws Exception {
-        for(Tag tag : api.listTags()){
+        for(Tag tag : api.listTags().concat()){
             Assert.assertNotNull(api.getTagInfo(tag.getUuid()));
         }
     }
@@ -564,19 +566,23 @@ public class CloudSigma2ApiLiveTest extends BaseApiLiveTest<CloudSigma2Api> {
 
     @Test
     public void testListSubscriptions() throws Exception {
-        Assert.assertNotNull(api.listSubscriptions());
+        for(Subscription subscription : api.listSubscriptions().concat()){
+            Assert.assertNotNull(subscription);
+        }
     }
 
     @Test
     public void testGetSubscription() throws Exception {
-        for(Subscription subscription : api.listSubscriptions()){
+        for(Subscription subscription : api.listSubscriptions().concat()){
             Assert.assertNotNull(api.getSubscription(subscription.getId()));
         }
     }
 
     @Test
     public void testListSubscriptionsCalculator() throws Exception {
-        Assert.assertNotNull(api.listSubscriptionsCalculator());
+        for(Subscription subscription : api.listSubscriptionsCalculator().concat()){
+            Assert.assertNotNull(subscription);
+        }
     }
 
     @Test
@@ -586,18 +592,23 @@ public class CloudSigma2ApiLiveTest extends BaseApiLiveTest<CloudSigma2Api> {
 
     @Test
     public void testListDiscounts() throws Exception {
-        Assert.assertNotNull(api.listDiscounts());
+        for(Discount discount : api.listDiscounts().concat()){
+            Assert.assertNotNull(discount);
+        }
     }
 
     @Test
     public void testListTransactions() throws Exception {
-        Assert.assertNotNull(api.listTransactions());
+        for(Transaction transaction : api.listTransactions().concat()){
+            Assert.assertNotNull(transaction);
+        }
     }
 
     @Test
     public void testListLicenses() throws Exception {
-        List<License> licenses = api.listLicenses();
-        Assert.assertNotNull(licenses);
+        for(License license : api.listLicenses().concat()){
+            Assert.assertNotNull(license);
+        }
     }
 
     private void checkDrive(DriveInfo newDrive, DriveInfo createdDrive){

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/0bebb584/cloudsigma2/src/test/resources/discount-last-page.json
----------------------------------------------------------------------
diff --git a/cloudsigma2/src/test/resources/discount-last-page.json b/cloudsigma2/src/test/resources/discount-last-page.json
new file mode 100644
index 0000000..fcbe550
--- /dev/null
+++ b/cloudsigma2/src/test/resources/discount-last-page.json
@@ -0,0 +1,17 @@
+{
+    "meta": {
+        "limit": 2,
+        "offset": 3,
+        "total_count": 5
+    },
+    "objects": [
+        {
+            "period": "2 years",
+            "value": "0.3500000000"
+        },
+        {
+            "period": "3 years",
+            "value": "0.4500000000"
+        }
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/0bebb584/cloudsigma2/src/test/resources/discount.json
----------------------------------------------------------------------
diff --git a/cloudsigma2/src/test/resources/discount.json b/cloudsigma2/src/test/resources/discount.json
index 4282cef..8539b82 100644
--- a/cloudsigma2/src/test/resources/discount.json
+++ b/cloudsigma2/src/test/resources/discount.json
@@ -1,6 +1,6 @@
 {
     "meta": {
-        "limit": 0,
+        "limit": 3,
         "offset": 0,
         "total_count": 5
     },
@@ -16,14 +16,6 @@
         {
             "period": "1 year",
             "value": "0.2500000000"
-        },
-        {
-            "period": "2 years",
-            "value": "0.3500000000"
-        },
-        {
-            "period": "3 years",
-            "value": "0.4500000000"
         }
     ]
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/0bebb584/cloudsigma2/src/test/resources/drives-detail-first-page.json
----------------------------------------------------------------------
diff --git a/cloudsigma2/src/test/resources/drives-detail-first-page.json b/cloudsigma2/src/test/resources/drives-detail-first-page.json
new file mode 100644
index 0000000..56b90d7
--- /dev/null
+++ b/cloudsigma2/src/test/resources/drives-detail-first-page.json
@@ -0,0 +1,88 @@
+{
+    "meta": {
+        "limit": 2,
+        "offset": 0,
+        "total_count": 3
+    },
+    "objects": [
+        {
+            "affinities": [
+                "ssd",
+                "sample"
+            ],
+            "allow_multimount": true,
+            "jobs": [],
+            "licenses": [
+                {
+                    "amount" : 1,
+                    "license" : {
+                        "burstable" : true,
+                        "long_name" : "sample_longname",
+                        "name" : "sample_name",
+                        "resource_uri" : "/api/2.0/samples/",
+                        "type" : "sample_type",
+                        "user_metric" : sample
+                    },
+                    "user" : {
+                        "resource_uri": "/api/2.0/user/5b4a69a3-8e78-4c45-a8ba-8b13f0895e23/",
+                        "uuid": "5b4a69a3-8e78-4c45-a8ba-8b13f0895e23"
+                    }
+                }
+            ],
+            "media": "disk",
+            "meta": {
+                "description": "",
+                "install_notes": ""
+            },
+            "mounted_on": [
+                {
+                    "uuid" : "81f911f9-5152-4328-8671-02543bafbd0e",
+                    "resource_uri" : "/api/2.0/servers/81f911f9-5152-4328-8671-02543bafbd0e/"
+                },
+                {
+                    "uuid" : "19163e1a-a6d6-4e73-8087-157dd302c373",
+                    "resource_uri" : "/api/2.0/servers/19163e1a-a6d6-4e73-8087-157dd302c373/"
+                }
+            ],
+            "name": "atom-sol3",
+            "owner": {
+                "resource_uri": "/api/2.0/user/5b4a69a3-8e78-4c45-a8ba-8b13f0895e23/",
+                "uuid": "5b4a69a3-8e78-4c45-a8ba-8b13f0895e23"
+            },
+            "resource_uri": "/api/2.0/drives/92ca1450-417e-4cc1-983b-1015777e2591/",
+            "size": 12348030976,
+            "status": "unmounted",
+            "tags": [
+                "tag_uuid_1",
+                "tag_uuid_2"
+            ],
+            "uuid": "92ca1450-417e-4cc1-983b-1015777e2591"
+        },
+        {
+            "affinities": [
+                "ssd"
+            ],
+            "allow_multimount": false,
+            "jobs": [],
+            "licenses": [],
+            "media": "disk",
+            "meta": {},
+            "mounted_on": [
+                {
+                "uuid" : "81f911f9-5152-4328-8671-02543bafbd0e",
+                "resource_uri" : "/api/2.0/servers/81f911f9-5152-4328-8671-02543bafbd0e/"
+                }
+            ],
+            "name": "test_drive_3",
+            "owner": {
+                "resource_uri": "/api/2.0/user/5b4a69a3-8e78-4c45-a8ba-8b13f0895e23/",
+                "uuid": "5b4a69a3-8e78-4c45-a8ba-8b13f0895e23"
+            },
+            "resource_uri": "/api/2.0/drives/414ad24b-ba41-47c0-9751-ef5060b6c391/",
+            "size": 1024000000,
+            "status": "unmounted",
+            "tags": [],
+            "uuid": "414ad24b-ba41-47c0-9751-ef5060b6c391"
+        }
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/0bebb584/cloudsigma2/src/test/resources/drives-detail-last-page.json
----------------------------------------------------------------------
diff --git a/cloudsigma2/src/test/resources/drives-detail-last-page.json b/cloudsigma2/src/test/resources/drives-detail-last-page.json
new file mode 100644
index 0000000..3068a71
--- /dev/null
+++ b/cloudsigma2/src/test/resources/drives-detail-last-page.json
@@ -0,0 +1,31 @@
+{
+    "meta": {
+        "limit": 1,
+        "offset": 2,
+        "total_count": 3
+    },
+    "objects": [
+        {
+            "affinities": [],
+            "allow_multimount": false,
+            "jobs": [],
+            "licenses": [],
+            "media": "disk",
+            "meta": {
+                "description": "",
+                "install_notes": ""
+            },
+            "mounted_on": [],
+            "name": "otom",
+            "owner": {
+                "resource_uri": "/api/2.0/user/5b4a69a3-8e78-4c45-a8ba-8b13f0895e23/",
+                "uuid": "5b4a69a3-8e78-4c45-a8ba-8b13f0895e23"
+            },
+            "resource_uri": "/api/2.0/drives/7bc04bc5-bd09-4269-b45d-16b58d6f71b4/",
+            "size": 11811160064,
+            "status": "unmounted",
+            "tags": [],
+            "uuid": "7bc04bc5-bd09-4269-b45d-16b58d6f71b4"
+        }
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/0bebb584/cloudsigma2/src/test/resources/drives-last-page.json
----------------------------------------------------------------------
diff --git a/cloudsigma2/src/test/resources/drives-last-page.json b/cloudsigma2/src/test/resources/drives-last-page.json
new file mode 100644
index 0000000..b7389f3
--- /dev/null
+++ b/cloudsigma2/src/test/resources/drives-last-page.json
@@ -0,0 +1,18 @@
+{
+    "meta": {
+        "limit": 1,
+        "offset": 2,
+        "total_count": 3
+    },
+    "objects": [
+        {
+            "owner": {
+                "resource_uri": "/api/2.0/user/5b4a69a3-8e78-4c45-a8ba-8b13f0895e23/",
+                "uuid": "5b4a69a3-8e78-4c45-a8ba-8b13f0895e23"
+            },
+            "resource_uri": "/api/2.0/drives/7bc04bc5-bd09-4269-b45d-16b58d6f71b4/",
+            "status": "mounted",
+            "uuid": "7bc04bc5-bd09-4269-b45d-16b58d6f71b4"
+        }
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/0bebb584/cloudsigma2/src/test/resources/drives.json
----------------------------------------------------------------------
diff --git a/cloudsigma2/src/test/resources/drives.json b/cloudsigma2/src/test/resources/drives.json
index a842121..8a24942 100644
--- a/cloudsigma2/src/test/resources/drives.json
+++ b/cloudsigma2/src/test/resources/drives.json
@@ -1,6 +1,6 @@
 {
     "meta": {
-        "limit": 0,
+        "limit": 2,
         "offset": 0,
         "total_count": 3
     },
@@ -22,15 +22,6 @@
             "resource_uri": "/api/2.0/drives/414ad24b-ba41-47c0-9751-ef5060b6c391/",
             "status": "unmounted",
             "uuid": "414ad24b-ba41-47c0-9751-ef5060b6c391"
-        },
-        {
-            "owner": {
-                "resource_uri": "/api/2.0/user/5b4a69a3-8e78-4c45-a8ba-8b13f0895e23/",
-                "uuid": "5b4a69a3-8e78-4c45-a8ba-8b13f0895e23"
-            },
-            "resource_uri": "/api/2.0/drives/7bc04bc5-bd09-4269-b45d-16b58d6f71b4/",
-            "status": "mounted",
-            "uuid": "7bc04bc5-bd09-4269-b45d-16b58d6f71b4"
         }
     ]
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/0bebb584/cloudsigma2/src/test/resources/fwpolicies-detail-first-page.json
----------------------------------------------------------------------
diff --git a/cloudsigma2/src/test/resources/fwpolicies-detail-first-page.json b/cloudsigma2/src/test/resources/fwpolicies-detail-first-page.json
new file mode 100644
index 0000000..b39a6a8
--- /dev/null
+++ b/cloudsigma2/src/test/resources/fwpolicies-detail-first-page.json
@@ -0,0 +1,32 @@
+{
+    "meta" : {
+        "limit": 1,
+        "offset": 0,
+        "total_count": 2
+    },
+    "objects": [
+        {
+            "meta": {},
+            "name": "New policy",
+            "owner": {
+                "resource_uri": "/api/2.0/user/5b4a69a3-8e78-4c45-a8ba-8b13f0895e23/",
+                "uuid": "5b4a69a3-8e78-4c45-a8ba-8b13f0895e23"
+            },
+            "resource_uri": "/api/2.0/fwpolicies/b68dd907-69fc-4b3c-b954-c39d0046525b/",
+            "rules": [
+                {
+                    "action": "accept",
+                    "comment": "Test comment",
+                    "direction": "in",
+                    "dst_ip": "192.168.1.132/32",
+                    "dst_port": "1233",
+                    "ip_proto": "tcp",
+                    "src_ip": "255.255.255.12/32",
+                    "src_port": "321"
+                }
+            ],
+            "servers": [],
+            "uuid": "b68dd907-69fc-4b3c-b954-c39d0046525b"
+        }
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/0bebb584/cloudsigma2/src/test/resources/fwpolicies-detail-last-page.json
----------------------------------------------------------------------
diff --git a/cloudsigma2/src/test/resources/fwpolicies-detail-last-page.json b/cloudsigma2/src/test/resources/fwpolicies-detail-last-page.json
new file mode 100644
index 0000000..ffc324a
--- /dev/null
+++ b/cloudsigma2/src/test/resources/fwpolicies-detail-last-page.json
@@ -0,0 +1,79 @@
+{
+    "meta" : {
+        "limit": 1,
+        "offset": 1,
+        "total_count": 2
+    },
+    "objects": [
+        {
+            "meta": {
+                "description" : "test firewall policy"
+            },
+            "name": "My awesome policy",
+            "owner": {
+                "resource_uri": "/api/2.0/user/5b4a69a3-8e78-4c45-a8ba-8b13f0895e23/",
+                "uuid": "5b4a69a3-8e78-4c45-a8ba-8b13f0895e23"
+            },
+            "resource_uri": "/api/2.0/fwpolicies/cf8479b4-c98b-46c8-ab9c-108bb00c8218/",
+            "rules": [
+                {
+                    "action": "drop",
+                    "comment": "Drop traffic from the VM to IP address 23.0.0.0/32",
+                    "direction": "out",
+                    "dst_ip": "23.0.0.0/32",
+                    "dst_port": null,
+                    "ip_proto": null,
+                    "src_ip": null,
+                    "src_port": null
+                },
+                {
+                    "action": "accept",
+                    "comment": "Allow SSH traffic to the VM from our office in Dubai",
+                    "direction": "in",
+                    "dst_ip": null,
+                    "dst_port": "22",
+                    "ip_proto": "tcp",
+                    "src_ip": "172.66.32.0/24",
+                    "src_port": null
+                },
+                {
+                    "action": "drop",
+                    "comment": "Drop all other SSH traffic to the VM",
+                    "direction": "in",
+                    "dst_ip": null,
+                    "dst_port": "22",
+                    "ip_proto": "tcp",
+                    "src_ip": null,
+                    "src_port": null
+                },
+                {
+                    "action": "drop",
+                    "comment": "Drop all UDP traffic to the VM, not originating from 172.66.32.55",
+                    "direction": "in",
+                    "dst_ip": null,
+                    "dst_port": null,
+                    "ip_proto": "udp",
+                    "src_ip": "!172.66.32.55/32",
+                    "src_port": null
+                },
+                {
+                    "action": "drop",
+                    "comment": "Drop any traffic, to the VM with destination port not between 1-1024",
+                    "direction": "in",
+                    "dst_ip": null,
+                    "dst_port": "!1:1024",
+                    "ip_proto": "tcp",
+                    "src_ip": null,
+                    "src_port": null
+                }
+            ],
+            "servers": [
+                {
+                   "uuid" : "81f911f9-5152-4328-8671-02543bafbd0e",
+                    "resource_uri" : "/api/2.0/servers/81f911f9-5152-4328-8671-02543bafbd0e/"
+                }
+            ],
+            "uuid": "cf8479b4-c98b-46c8-ab9c-108bb00c8218"
+        }
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/0bebb584/cloudsigma2/src/test/resources/ips-last-page.json
----------------------------------------------------------------------
diff --git a/cloudsigma2/src/test/resources/ips-last-page.json b/cloudsigma2/src/test/resources/ips-last-page.json
new file mode 100644
index 0000000..593fa47
--- /dev/null
+++ b/cloudsigma2/src/test/resources/ips-last-page.json
@@ -0,0 +1,28 @@
+{
+    "meta": {
+        "limit": 1,
+        "offset": 1,
+        "total_count": 2
+    },
+    "objects": [
+        {
+            "gateway": "185.12.5.1",
+            "meta": {},
+            "nameservers": [
+                "178.22.66.167",
+                "178.22.71.56",
+                "8.8.8.8"
+            ],
+            "netmask": 24,
+            "owner": {
+                "resource_uri": "/api/2.0/user/5b4a69a3-8e78-4c45-a8ba-8b13f0895e23/",
+                "uuid": "5b4a69a3-8e78-4c45-a8ba-8b13f0895e23"
+            },
+            "resource_uri": "/api/2.0/ips/185.12.5.233/",
+            "server": null,
+            "subscription": null,
+            "tags": [],
+            "uuid": "185.12.5.233"
+        }
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/0bebb584/cloudsigma2/src/test/resources/ips.json
----------------------------------------------------------------------
diff --git a/cloudsigma2/src/test/resources/ips.json b/cloudsigma2/src/test/resources/ips.json
index 44004a0..df1e6d9 100644
--- a/cloudsigma2/src/test/resources/ips.json
+++ b/cloudsigma2/src/test/resources/ips.json
@@ -1,6 +1,6 @@
 {
     "meta": {
-        "limit": 0,
+        "limit": 1,
         "offset": 0,
         "total_count": 2
     },
@@ -28,25 +28,6 @@
             },
             "tags": [],
             "uuid": "185.12.6.183"
-        },
-        {
-            "gateway": "185.12.5.1",
-            "meta": {},
-            "nameservers": [
-                "178.22.66.167",
-                "178.22.71.56",
-                "8.8.8.8"
-            ],
-            "netmask": 24,
-            "owner": {
-                "resource_uri": "/api/2.0/user/5b4a69a3-8e78-4c45-a8ba-8b13f0895e23/",
-                "uuid": "5b4a69a3-8e78-4c45-a8ba-8b13f0895e23"
-            },
-            "resource_uri": "/api/2.0/ips/185.12.5.233/",
-            "server": null,
-            "subscription": null,
-            "tags": [],
-            "uuid": "185.12.5.233"
         }
     ]
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/0bebb584/cloudsigma2/src/test/resources/ledger-last-page.json
----------------------------------------------------------------------
diff --git a/cloudsigma2/src/test/resources/ledger-last-page.json b/cloudsigma2/src/test/resources/ledger-last-page.json
new file mode 100644
index 0000000..208d592
--- /dev/null
+++ b/cloudsigma2/src/test/resources/ledger-last-page.json
@@ -0,0 +1,27 @@
+{
+    "meta": {
+        "limit": 2,
+        "offset": 2,
+        "total_count": 4
+    },
+    "objects": [
+        {
+            "amount": "0.00173818150273075810",
+            "billing_cycle": 68843,
+            "end": "128.20524192865676349824",
+            "id": "11042661",
+            "initial": "128.20698011015949425634",
+            "reason": "Burst: 57783091200 of dssd for 299 seconds at 2013-07-09 07:39:06+00:00",
+            "time": "2013-07-09T07:40:05+00:00"
+        },
+        {
+            "amount": "0.00174399481879340278",
+            "billing_cycle": 68843,
+            "end": "128.20698011015949425634",
+            "id": "11042660",
+            "initial": "128.20872410497828765912",
+            "reason": "Burst: 57783091200 of dssd for 300 seconds at 2013-07-09 07:34:06+00:00",
+            "time": "2013-07-09T07:40:04+00:00"
+        }
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/0bebb584/cloudsigma2/src/test/resources/ledger.json
----------------------------------------------------------------------
diff --git a/cloudsigma2/src/test/resources/ledger.json b/cloudsigma2/src/test/resources/ledger.json
index efe75eb..8eb236e 100644
--- a/cloudsigma2/src/test/resources/ledger.json
+++ b/cloudsigma2/src/test/resources/ledger.json
@@ -1,10 +1,8 @@
 {
     "meta": {
-        "limit": 20,
-        "next": "/api/2.0/ledger/?limit=20&offset=20",
+        "limit": 2,
         "offset": 0,
-        "previous": null,
-        "total_count": 9921
+        "total_count": 4
     },
     "objects": [
         {
@@ -24,24 +22,6 @@
             "initial": "128.20524192865676349824",
             "reason": "Burst: 57783091200 of dssd for 300 seconds at 2013-07-09 07:44:06+00:00",
             "time": "2013-07-09T07:49:54+00:00"
-        },
-        {
-            "amount": "0.00173818150273075810",
-            "billing_cycle": 68843,
-            "end": "128.20524192865676349824",
-            "id": "11042661",
-            "initial": "128.20698011015949425634",
-            "reason": "Burst: 57783091200 of dssd for 299 seconds at 2013-07-09 07:39:06+00:00",
-            "time": "2013-07-09T07:40:05+00:00"
-        },
-        {
-            "amount": "0.00174399481879340278",
-            "billing_cycle": 68843,
-            "end": "128.20698011015949425634",
-            "id": "11042660",
-            "initial": "128.20872410497828765912",
-            "reason": "Burst: 57783091200 of dssd for 300 seconds at 2013-07-09 07:34:06+00:00",
-            "time": "2013-07-09T07:40:04+00:00"
         }
     ]
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/0bebb584/cloudsigma2/src/test/resources/libdrives-last-page.json
----------------------------------------------------------------------
diff --git a/cloudsigma2/src/test/resources/libdrives-last-page.json b/cloudsigma2/src/test/resources/libdrives-last-page.json
new file mode 100644
index 0000000..11f1c04
--- /dev/null
+++ b/cloudsigma2/src/test/resources/libdrives-last-page.json
@@ -0,0 +1,36 @@
+{
+    "meta": {
+        "limit": 1,
+        "offset": 2,
+        "total_count": 3
+    },
+    "objects": [
+        {
+            "affinities": [],
+            "allow_multimount": false,
+            "arch": "64",
+            "category": [
+                "general"
+            ],
+            "description": "",
+            "favourite": true,
+            "image_type": "install",
+            "install_notes": "",
+            "jobs": [],
+            "licenses": [],
+            "media": "cdrom",
+            "meta": {},
+            "mounted_on": [],
+            "name": "Windows_Server_2003_r2_standard_x64_with_sp2_cd1.iso pub",
+            "os": "windows",
+            "owner": null,
+            "paid": false,
+            "resource_uri": "/api/2.0/libdrives/dd9da460-b1ab-419a-9fa1-804540eee4c3/",
+            "size": 1000000000,
+            "status": "unmounted",
+            "tags": [],
+            "url": "test_url",
+            "uuid": "dd9da460-b1ab-419a-9fa1-804540eee4c3"
+        }
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/0bebb584/cloudsigma2/src/test/resources/libdrives.json
----------------------------------------------------------------------
diff --git a/cloudsigma2/src/test/resources/libdrives.json b/cloudsigma2/src/test/resources/libdrives.json
index 78bcccf..79782ed 100644
--- a/cloudsigma2/src/test/resources/libdrives.json
+++ b/cloudsigma2/src/test/resources/libdrives.json
@@ -1,10 +1,8 @@
 {
     "meta": {
-        "limit": 3,
-        "next": "/api/2.0/libdrives/?limit=5&offset=5",
+        "limit": 2,
         "offset": 0,
-        "previous": null,
-        "total_count": 97
+        "total_count": 3
     },
     "objects": [
         {
@@ -63,33 +61,6 @@
             "tags": [],
             "url": "test_url",
             "uuid": "d1ec9f26-ba44-4002-bbdf-82a31a84b611"
-        },
-        {
-            "affinities": [],
-            "allow_multimount": false,
-            "arch": "64",
-            "category": [
-                "general"
-            ],
-            "description": "",
-            "favourite": true,
-            "image_type": "install",
-            "install_notes": "",
-            "jobs": [],
-            "licenses": [],
-            "media": "cdrom",
-            "meta": {},
-            "mounted_on": [],
-            "name": "Windows_Server_2003_r2_standard_x64_with_sp2_cd1.iso pub",
-            "os": "windows",
-            "owner": null,
-            "paid": false,
-            "resource_uri": "/api/2.0/libdrives/dd9da460-b1ab-419a-9fa1-804540eee4c3/",
-            "size": 1000000000,
-            "status": "unmounted",
-            "tags": [],
-            "url": "test_url",
-            "uuid": "dd9da460-b1ab-419a-9fa1-804540eee4c3"
         }
     ]
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/0bebb584/cloudsigma2/src/test/resources/licences-last-page.json
----------------------------------------------------------------------
diff --git a/cloudsigma2/src/test/resources/licences-last-page.json b/cloudsigma2/src/test/resources/licences-last-page.json
new file mode 100644
index 0000000..189ed41
--- /dev/null
+++ b/cloudsigma2/src/test/resources/licences-last-page.json
@@ -0,0 +1,17 @@
+{
+    "meta": {
+        "limit": 1,
+        "offset": 2,
+        "total_count": 3
+    },
+    "objects": [
+        {
+            "burstable": false,
+            "long_name": "SQL Server Standard 2008",
+            "name": "msft_tfa_00009",
+            "resource_uri": "/api/2.0/licenses/11/",
+            "type": "instance",
+            "user_metric": ""
+        }
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/0bebb584/cloudsigma2/src/test/resources/licences.json
----------------------------------------------------------------------
diff --git a/cloudsigma2/src/test/resources/licences.json b/cloudsigma2/src/test/resources/licences.json
index 2b210a7..b18af11 100644
--- a/cloudsigma2/src/test/resources/licences.json
+++ b/cloudsigma2/src/test/resources/licences.json
@@ -1,9 +1,7 @@
 {
     "meta": {
-        "limit": 20,
-        "next": null,
+        "limit": 2,
         "offset": 0,
-        "previous": null,
         "total_count": 3
     },
     "objects": [
@@ -22,14 +20,6 @@
             "resource_uri": "/api/2.0/licenses/10/",
             "type": "instance",
             "user_metric": ""
-        },
-        {
-            "burstable": false,
-            "long_name": "SQL Server Standard 2008",
-            "name": "msft_tfa_00009",
-            "resource_uri": "/api/2.0/licenses/11/",
-            "type": "instance",
-            "user_metric": ""
         }
     ]
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/0bebb584/cloudsigma2/src/test/resources/server-detail-first-page.json
----------------------------------------------------------------------
diff --git a/cloudsigma2/src/test/resources/server-detail-first-page.json b/cloudsigma2/src/test/resources/server-detail-first-page.json
new file mode 100644
index 0000000..275a9a2
--- /dev/null
+++ b/cloudsigma2/src/test/resources/server-detail-first-page.json
@@ -0,0 +1,96 @@
+{
+    "meta": {
+        "limit": 2,
+        "offset": 0,
+        "total_count": 3
+    },
+    "objects": [
+        {
+            "cpu": 1000,
+            "cpus_instead_of_cores": false,
+            "drives": [
+                {
+                    "boot_order": null,
+                    "dev_channel": "0:0",
+                    "device": "ide",
+                    "drive": {
+                        "resource_uri": "/api/2.0/drives/ae78e68c-9daa-4471-8878-0bb87fa80260/",
+                        "uuid": "ae78e68c-9daa-4471-8878-0bb87fa80260"
+                    }
+                },
+                {
+                    "boot_order": 1,
+                    "dev_channel": "0:0",
+                    "device": "virtio",
+                    "drive": {
+                        "resource_uri": "/api/2.0/drives/22826af4-d6c8-4d39-bd41-9cea86df2976/",
+                        "uuid": "22826af4-d6c8-4d39-bd41-9cea86df2976"
+                    }
+                }
+            ],
+            "enable_numa": false,
+            "hv_relaxed": false,
+            "hv_tsc": false,
+            "mem": 268435456,
+            "meta": {
+                "description": "A full server with description"
+            },
+            "name": "test_acc_full_server",
+            "nics": [
+                {
+                    "boot_order": null,
+                    "firewall_policy": null,
+                    "ip_v4_conf": {
+                        "conf": "dhcp",
+                        "ip": null
+                    },
+                    "ip_v6_conf": null,
+                    "mac": "22:a7:a0:0d:43:48",
+                    "model": "virtio",
+                    "runtime": null,
+                    "vlan": null
+                }
+            ],
+            "owner": {
+                "resource_uri": "/api/2.0/user/5b4a69a3-8e78-4c45-a8ba-8b13f0895e23/",
+                "uuid": "5b4a69a3-8e78-4c45-a8ba-8b13f0895e23"
+            },
+            "requirements": [],
+            "resource_uri": "/api/2.0/servers/a19a425f-9e92-42f6-89fb-6361203071bb/",
+            "runtime": null,
+            "smp": 1,
+            "status": "stopped",
+            "tags": [
+                "tag_uuid_1",
+                "tag_uuid_2"
+            ],
+            "uuid": "a19a425f-9e92-42f6-89fb-6361203071bb",
+            "vnc_password": "tester"
+        },
+        {
+            "cpu": 1000,
+            "cpus_instead_of_cores": false,
+            "drives": [],
+            "enable_numa": false,
+            "hv_relaxed": false,
+            "hv_tsc": false,
+            "mem": 536870912,
+            "meta": {},
+            "name": "test_server_3",
+            "nics": [],
+            "owner": {
+                "resource_uri": "/api/2.0/user/5b4a69a3-8e78-4c45-a8ba-8b13f0895e23/",
+                "uuid": "5b4a69a3-8e78-4c45-a8ba-8b13f0895e23"
+            },
+            "requirements": [],
+            "resource_uri": "/api/2.0/servers/61d61337-884b-4c87-b4de-f7f48f9cfc84/",
+            "runtime": null,
+            "smp": 1,
+            "status": "stopped",
+            "tags": [],
+            "uuid": "61d61337-884b-4c87-b4de-f7f48f9cfc84",
+            "vnc_password": "testserver"
+        }
+    ]
+}
+

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/0bebb584/cloudsigma2/src/test/resources/server-detail-last-page.json
----------------------------------------------------------------------
diff --git a/cloudsigma2/src/test/resources/server-detail-last-page.json b/cloudsigma2/src/test/resources/server-detail-last-page.json
new file mode 100644
index 0000000..9c450ff
--- /dev/null
+++ b/cloudsigma2/src/test/resources/server-detail-last-page.json
@@ -0,0 +1,34 @@
+{
+    "meta": {
+        "limit": 1,
+        "offset": 2,
+        "total_count": 3
+    },
+    "objects": [
+        {
+            "cpu": 1000,
+            "cpus_instead_of_cores": false,
+            "drives": [],
+            "enable_numa": false,
+            "hv_relaxed": false,
+            "hv_tsc": false,
+            "mem": 536870912,
+            "meta": {},
+            "name": "test_server_1",
+            "nics": [],
+            "owner": {
+                "resource_uri": "/api/2.0/user/5b4a69a3-8e78-4c45-a8ba-8b13f0895e23/",
+                "uuid": "5b4a69a3-8e78-4c45-a8ba-8b13f0895e23"
+            },
+            "requirements": [],
+            "resource_uri": "/api/2.0/servers/33e71c37-0d0a-4a3a-a1ea-dc7265c9a154/",
+            "runtime": null,
+            "smp": 1,
+            "status": "stopped",
+            "tags": [],
+            "uuid": "33e71c37-0d0a-4a3a-a1ea-dc7265c9a154",
+            "vnc_password": "testserver"
+        }
+    ]
+}
+

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/0bebb584/cloudsigma2/src/test/resources/servers-last-page.json
----------------------------------------------------------------------
diff --git a/cloudsigma2/src/test/resources/servers-last-page.json b/cloudsigma2/src/test/resources/servers-last-page.json
new file mode 100644
index 0000000..e3d25e7
--- /dev/null
+++ b/cloudsigma2/src/test/resources/servers-last-page.json
@@ -0,0 +1,20 @@
+{
+    "meta": {
+        "limit": 1,
+        "offset": 2,
+        "total_count": 3
+    },
+    "objects": [
+        {
+            "name": "test_server_2",
+            "owner": {
+                "resource_uri": "/api/2.0/user/5b4a69a3-8e78-4c45-a8ba-8b13f0895e23/",
+                "uuid": "5b4a69a3-8e78-4c45-a8ba-8b13f0895e23"
+            },
+            "resource_uri": "/api/2.0/servers/05c16b9a-f2f5-4da6-a1cb-b90722c32212/",
+            "runtime": null,
+            "status": "stopped",
+            "uuid": "05c16b9a-f2f5-4da6-a1cb-b90722c32212"
+        }
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/0bebb584/cloudsigma2/src/test/resources/servers.json
----------------------------------------------------------------------
diff --git a/cloudsigma2/src/test/resources/servers.json b/cloudsigma2/src/test/resources/servers.json
index 8b42aee..0595423 100644
--- a/cloudsigma2/src/test/resources/servers.json
+++ b/cloudsigma2/src/test/resources/servers.json
@@ -1,6 +1,6 @@
 {
     "meta": {
-        "limit": 0,
+        "limit": 2,
         "offset": 0,
         "total_count": 3
     },
@@ -26,17 +26,6 @@
             "runtime": null,
             "status": "stopped",
             "uuid": "33e71c37-0d0a-4a3a-a1ea-dc7265c9a154"
-        },
-        {
-            "name": "test_server_2",
-            "owner": {
-                "resource_uri": "/api/2.0/user/5b4a69a3-8e78-4c45-a8ba-8b13f0895e23/",
-                "uuid": "5b4a69a3-8e78-4c45-a8ba-8b13f0895e23"
-            },
-            "resource_uri": "/api/2.0/servers/05c16b9a-f2f5-4da6-a1cb-b90722c32212/",
-            "runtime": null,
-            "status": "stopped",
-            "uuid": "05c16b9a-f2f5-4da6-a1cb-b90722c32212"
         }
     ]
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/0bebb584/cloudsigma2/src/test/resources/subscriptions-first-page.json
----------------------------------------------------------------------
diff --git a/cloudsigma2/src/test/resources/subscriptions-first-page.json b/cloudsigma2/src/test/resources/subscriptions-first-page.json
new file mode 100644
index 0000000..46091fa
--- /dev/null
+++ b/cloudsigma2/src/test/resources/subscriptions-first-page.json
@@ -0,0 +1,47 @@
+{
+    "meta": {
+        "limit": 2,
+        "offset": 0,
+        "total_count": 3
+    },
+    "objects": [
+        {
+            "amount": "1",
+            "auto_renew": true,
+            "descendants": [],
+            "discount_amount": "10",
+            "discount_percent": "10",
+            "end_time": "2014-02-20T11:12:34+00:00",
+            "id": "7272",
+            "last_notification": null,
+            "period": "345 days, 0:00:00",
+            "price": "0E-20",
+            "remaining": "1",
+            "resource": "vlan",
+            "resource_uri": "/api/2.0/subscriptions/7272/",
+            "start_time": "2013-03-12T11:12:34+00:00",
+            "status": "active",
+            "subscribed_object": "96537817-f4b6-496b-a861-e74192d3ccb0",
+            "uuid": "509f8e27-1e64-49bb-aa5a-baec074b0210"
+        },
+        {
+            "amount": "1",
+            "auto_renew": true,
+            "descendants": [],
+            "discount_amount": null,
+            "discount_percent": null,
+            "end_time": "2014-02-20T11:12:41+00:00",
+            "id": "7273",
+            "last_notification": null,
+            "period": "345 days, 0:00:00",
+            "price": "0E-20",
+            "remaining": "1",
+            "resource": "ip",
+            "resource_uri": "/api/2.0/subscriptions/7273/",
+            "start_time": "2013-03-12T11:12:41+00:00",
+            "status": "active",
+            "subscribed_object": "185.12.6.183",
+            "uuid": "c2423c1a-8768-462c-bdc3-4ca09c1e650b"
+        }
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/0bebb584/cloudsigma2/src/test/resources/subscriptions-last-page.json
----------------------------------------------------------------------
diff --git a/cloudsigma2/src/test/resources/subscriptions-last-page.json b/cloudsigma2/src/test/resources/subscriptions-last-page.json
new file mode 100644
index 0000000..265051e
--- /dev/null
+++ b/cloudsigma2/src/test/resources/subscriptions-last-page.json
@@ -0,0 +1,28 @@
+{
+    "meta": {
+        "limit": 1,
+        "offset": 2,
+        "total_count": 3
+    },
+    "objects": [
+        {
+            "amount": "17179869184",
+            "auto_renew": true,
+            "descendants": [],
+            "discount_amount": null,
+            "discount_percent": null,
+            "end_time": "2014-02-20T14:04:14+00:00",
+            "id": "3985",
+            "last_notification": null,
+            "period": "365 days, 0:00:00",
+            "price": "0E-20",
+            "remaining": "17179869184",
+            "resource": "mem",
+            "resource_uri": "/api/2.0/subscriptions/3985/",
+            "start_time": "2013-02-20T14:04:14+00:00",
+            "status": "active",
+            "subscribed_object": null,
+            "uuid": "9bb117d3-4bc5-4e2d-a907-b20abd48eaf9"
+        }
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/0bebb584/cloudsigma2/src/test/resources/tags-detail-first-page.json
----------------------------------------------------------------------
diff --git a/cloudsigma2/src/test/resources/tags-detail-first-page.json b/cloudsigma2/src/test/resources/tags-detail-first-page.json
new file mode 100644
index 0000000..0411e7d
--- /dev/null
+++ b/cloudsigma2/src/test/resources/tags-detail-first-page.json
@@ -0,0 +1,20 @@
+{
+    "meta": {
+        "limit": 1,
+        "offset": 0,
+        "total_count": 2
+    },
+    "objects": [
+        {
+            "meta": {},
+            "name": "new tag",
+            "owner": {
+                "resource_uri": "/api/2.0/user/5b4a69a3-8e78-4c45-a8ba-8b13f0895e23/",
+                "uuid": "5b4a69a3-8e78-4c45-a8ba-8b13f0895e23"
+            },
+            "resource_uri": "/api/2.0/tags/956e2ca0-dee3-4b3f-a1be-a6e86f90946f/",
+            "resources": [],
+            "uuid": "956e2ca0-dee3-4b3f-a1be-a6e86f90946f"
+        },
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/0bebb584/cloudsigma2/src/test/resources/tags-detail-last-page.json
----------------------------------------------------------------------
diff --git a/cloudsigma2/src/test/resources/tags-detail-last-page.json b/cloudsigma2/src/test/resources/tags-detail-last-page.json
new file mode 100644
index 0000000..b1c53cb
--- /dev/null
+++ b/cloudsigma2/src/test/resources/tags-detail-last-page.json
@@ -0,0 +1,59 @@
+{
+    "meta": {
+        "limit": 1,
+        "offset": 1,
+        "total_count": 2
+    },
+    "objects": [
+        {
+            "meta": {
+                "description": "test tag"
+            },
+            "name": "TagCreatedWithResource",
+            "owner": {
+                "resource_uri": "/api/2.0/user/5b4a69a3-8e78-4c45-a8ba-8b13f0895e23/",
+                "uuid": "5b4a69a3-8e78-4c45-a8ba-8b13f0895e23"
+            },
+            "resource_uri": "/api/2.0/tags/68bb0cfc-0c76-4f37-847d-7bb705c5ae46/",
+            "resources": [
+                {
+                    "owner": {
+                        "resource_uri": "/api/2.0/user/5b4a69a3-8e78-4c45-a8ba-8b13f0895e23/",
+                        "uuid": "5b4a69a3-8e78-4c45-a8ba-8b13f0895e23"
+                    },
+                    "res_type": "vlans",
+                    "resource_uri": "/api/2.0/vlans/96537817-f4b6-496b-a861-e74192d3ccb0/",
+                    "uuid": "96537817-f4b6-496b-a861-e74192d3ccb0"
+                },
+                {
+                    "owner": {
+                        "resource_uri": "/api/2.0/user/5b4a69a3-8e78-4c45-a8ba-8b13f0895e23/",
+                        "uuid": "5b4a69a3-8e78-4c45-a8ba-8b13f0895e23"
+                    },
+                    "res_type": "servers",
+                    "resource_uri": "/api/2.0/servers/61bcc398-c034-42f1-81c9-f6d7f62c4ea0/",
+                    "uuid": "61bcc398-c034-42f1-81c9-f6d7f62c4ea0"
+                },
+                {
+                    "owner": {
+                        "resource_uri": "/api/2.0/user/5b4a69a3-8e78-4c45-a8ba-8b13f0895e23/",
+                        "uuid": "5b4a69a3-8e78-4c45-a8ba-8b13f0895e23"
+                    },
+                    "res_type": "drives",
+                    "resource_uri": "/api/2.0/drives/3610d935-514a-4552-acf3-a40dd0a5f961/",
+                    "uuid": "3610d935-514a-4552-acf3-a40dd0a5f961"
+                },
+                {
+                    "owner": {
+                        "resource_uri": "/api/2.0/user/5b4a69a3-8e78-4c45-a8ba-8b13f0895e23/",
+                        "uuid": "5b4a69a3-8e78-4c45-a8ba-8b13f0895e23"
+                    },
+                    "res_type": "ips",
+                    "resource_uri": "/api/2.0/ips/185.12.6.183/",
+                    "uuid": "185.12.6.183"
+                }
+            ],
+            "uuid": "68bb0cfc-0c76-4f37-847d-7bb705c5ae46"
+        }
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/0bebb584/cloudsigma2/src/test/resources/vlans-last-page.json
----------------------------------------------------------------------
diff --git a/cloudsigma2/src/test/resources/vlans-last-page.json b/cloudsigma2/src/test/resources/vlans-last-page.json
new file mode 100644
index 0000000..899290d
--- /dev/null
+++ b/cloudsigma2/src/test/resources/vlans-last-page.json
@@ -0,0 +1,21 @@
+{
+    "meta": {
+        "limit": 1,
+        "offset": 1,
+        "total_count": 2
+    },
+    "objects": [
+        {
+            "meta": {},
+            "owner": {
+                "resource_uri": "/api/2.0/user/5b4a69a3-8e78-4c45-a8ba-8b13f0895e23/",
+                "uuid": "5b4a69a3-8e78-4c45-a8ba-8b13f0895e23"
+            },
+            "resource_uri": "/api/2.0/vlans/00b445a9-3936-47e5-ba8a-38adcf43db20/",
+            "servers": [],
+            "subscription": null,
+            "tags": [],
+            "uuid": "00b445a9-3936-47e5-ba8a-38adcf43db20"
+        }
+    ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/0bebb584/cloudsigma2/src/test/resources/vlans.json
----------------------------------------------------------------------
diff --git a/cloudsigma2/src/test/resources/vlans.json b/cloudsigma2/src/test/resources/vlans.json
index 3b0feab..b067e10 100644
--- a/cloudsigma2/src/test/resources/vlans.json
+++ b/cloudsigma2/src/test/resources/vlans.json
@@ -1,6 +1,6 @@
 {
     "meta": {
-        "limit": 0,
+        "limit": 1,
         "offset": 0,
         "total_count": 2
     },
@@ -30,18 +30,6 @@
             },
             "tags": [],
             "uuid": "96537817-f4b6-496b-a861-e74192d3ccb0"
-        },
-        {
-            "meta": {},
-            "owner": {
-                "resource_uri": "/api/2.0/user/5b4a69a3-8e78-4c45-a8ba-8b13f0895e23/",
-                "uuid": "5b4a69a3-8e78-4c45-a8ba-8b13f0895e23"
-            },
-            "resource_uri": "/api/2.0/vlans/00b445a9-3936-47e5-ba8a-38adcf43db20/",
-            "servers": [],
-            "subscription": null,
-            "tags": [],
-            "uuid": "00b445a9-3936-47e5-ba8a-38adcf43db20"
         }
     ]
 }
\ No newline at end of file