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/08/23 10:37:40 UTC

[1/5] JCLOUDS-198: Implemented the PagedIterable in Abiquo

Updated Branches:
  refs/heads/master 0cec06649 -> 14fbe2d38


http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/enterprises-lastpage.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/enterprises-lastpage.xml b/abiquo/src/test/resources/payloads/enterprises-lastpage.xml
new file mode 100644
index 0000000..77654c9
--- /dev/null
+++ b/abiquo/src/test/resources/payloads/enterprises-lastpage.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<enterprises>
+    <link rel="first" href="http://localhost/api/admin/enterprises" />
+    <link rel="previous" href="http://localhost/api/admin/enterprises?startwith=0"/>
+    <link rel="last" href="http://localhost/api/admin/enterprises?startwith=1"/>
+    <totalSize>2</totalSize>
+    <enterprise>
+        <link rel="appslib/templateDefinitionLists" type="application/vnd.abiquo.templatedefinitionlists+xml" href="http://localhost/api/admin/enterprises/1/appslib/templateDefinitionLists"/>
+        <link rel="appslib/templateDefinitions" type="application/vnd.abiquo.templatedefinitions+xml" href="http://localhost/api/admin/enterprises/1/appslib/templateDefinitions"/>
+        <link rel="cloud/virtualdatacenters" type="application/vnd.abiquo.virtualdatacenters+xml" href="http://localhost/api/admin/enterprises/1/action/virtualdatacenters"/>
+        <link rel="datacenterrepositories" type="application/vnd.abiquo.datacenterrepositories+xml" href="http://localhost/api/admin/enterprises/1/datacenterrepositories"/>
+        <link rel="edit" type="application/vnd.abiquo.enterprise+xml" href="http://localhost/api/admin/enterprises/1"/>
+        <link rel="externalnetworks" type="application/vnd.abiquo.vlans+xml" href="http://localhost/api/admin/enterprises/1/action/externalnetworks"/>
+        <link rel="ips" href="http://localhost/api/admin/enterprises/1/action/ips"/>
+        <link rel="limits" type="application/vnd.abiquo.limits+xml" href="http://localhost/api/admin/enterprises/1/limits"/>
+        <link rel="properties" type="application/vnd.abiquo.enterpriseproperties+xml" href="http://localhost/api/admin/enterprises/1/properties"/>
+        <link rel="reservedmachines" type="application/vnd.abiquo.machines+xml" href="http://localhost/api/admin/enterprises/1/reservedmachines"/>
+        <link rel="users" type="application/vnd.abiquo.users+xml" href="http://localhost/api/admin/enterprises/1/users"/>
+        <link rel="virtualappliances" type="application/vnd.abiquo.virtualappliances+xml" href="http://localhost/api/admin/enterprises/1/action/virtualappliances"/>
+        <link rel="virtualmachines" type="application/vnd.abiquo.virtualmachines+xml" href="http://localhost/api/admin/enterprises/1/action/virtualmachines"/>
+        <link rel="volumes" type="application/vnd.abiquo.iscsivolumes+xml" href="http://localhost/api/admin/enterprises/1/action/volumes"/>
+        <cpuHard>0</cpuHard>
+        <cpuSoft>0</cpuSoft>
+        <hdHard>0</hdHard>
+        <hdSoft>0</hdSoft>
+        <publicIpsHard>0</publicIpsHard>
+        <publicIpsSoft>0</publicIpsSoft>
+        <ramHard>0</ramHard>
+        <ramSoft>0</ramSoft>
+        <storageHard>0</storageHard>
+        <storageSoft>0</storageSoft>
+        <vlansHard>0</vlansHard>
+        <vlansSoft>0</vlansSoft>
+        <id>2</id>
+        <isReservationRestricted>false</isReservationRestricted>
+        <name>Abiquo</name>
+        <repositoryHard>0</repositoryHard>
+        <repositorySoft>0</repositorySoft>
+    </enterprise>
+</enterprises>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/enterprises-page.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/enterprises-page.xml b/abiquo/src/test/resources/payloads/enterprises-page.xml
new file mode 100644
index 0000000..c7e9b07
--- /dev/null
+++ b/abiquo/src/test/resources/payloads/enterprises-page.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<enterprises>
+    <link rel="first" href="http://localhost/api/admin/enterprises" />
+    <link rel="next" href="http://localhost/api/admin/enterprises?startwith=1"/>
+    <link rel="last" href="http://localhost/api/admin/enterprises?startwith=1"/>
+    <totalSize>2</totalSize>
+    <enterprise>
+        <link rel="appslib/templateDefinitionLists" type="application/vnd.abiquo.templatedefinitionlists+xml" href="http://localhost/api/admin/enterprises/1/appslib/templateDefinitionLists"/>
+        <link rel="appslib/templateDefinitions" type="application/vnd.abiquo.templatedefinitions+xml" href="http://localhost/api/admin/enterprises/1/appslib/templateDefinitions"/>
+        <link rel="cloud/virtualdatacenters" type="application/vnd.abiquo.virtualdatacenters+xml" href="http://localhost/api/admin/enterprises/1/action/virtualdatacenters"/>
+        <link rel="datacenterrepositories" type="application/vnd.abiquo.datacenterrepositories+xml" href="http://localhost/api/admin/enterprises/1/datacenterrepositories"/>
+        <link rel="edit" type="application/vnd.abiquo.enterprise+xml" href="http://localhost/api/admin/enterprises/1"/>
+        <link rel="externalnetworks" type="application/vnd.abiquo.vlans+xml" href="http://localhost/api/admin/enterprises/1/action/externalnetworks"/>
+        <link rel="ips" href="http://localhost/api/admin/enterprises/1/action/ips"/>
+        <link rel="limits" type="application/vnd.abiquo.limits+xml" href="http://localhost/api/admin/enterprises/1/limits"/>
+        <link rel="properties" type="application/vnd.abiquo.enterpriseproperties+xml" href="http://localhost/api/admin/enterprises/1/properties"/>
+        <link rel="reservedmachines" type="application/vnd.abiquo.machines+xml" href="http://localhost/api/admin/enterprises/1/reservedmachines"/>
+        <link rel="users" type="application/vnd.abiquo.users+xml" href="http://localhost/api/admin/enterprises/1/users"/>
+        <link rel="virtualappliances" type="application/vnd.abiquo.virtualappliances+xml" href="http://localhost/api/admin/enterprises/1/action/virtualappliances"/>
+        <link rel="virtualmachines" type="application/vnd.abiquo.virtualmachines+xml" href="http://localhost/api/admin/enterprises/1/action/virtualmachines"/>
+        <link rel="volumes" type="application/vnd.abiquo.iscsivolumes+xml" href="http://localhost/api/admin/enterprises/1/action/volumes"/>
+        <cpuHard>0</cpuHard>
+        <cpuSoft>0</cpuSoft>
+        <hdHard>0</hdHard>
+        <hdSoft>0</hdSoft>
+        <publicIpsHard>0</publicIpsHard>
+        <publicIpsSoft>0</publicIpsSoft>
+        <ramHard>0</ramHard>
+        <ramSoft>0</ramSoft>
+        <storageHard>0</storageHard>
+        <storageSoft>0</storageSoft>
+        <vlansHard>0</vlansHard>
+        <vlansSoft>0</vlansSoft>
+        <id>1</id>
+        <isReservationRestricted>false</isReservationRestricted>
+        <name>Abiquo</name>
+        <repositoryHard>0</repositoryHard>
+        <repositorySoft>0</repositorySoft>
+    </enterprise>
+</enterprises>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/events-lastpage.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/events-lastpage.xml b/abiquo/src/test/resources/payloads/events-lastpage.xml
new file mode 100644
index 0000000..84e1a73
--- /dev/null
+++ b/abiquo/src/test/resources/payloads/events-lastpage.xml
@@ -0,0 +1,40 @@
+<events>
+    <link rel="first" href="http://localhost/api/events"/>
+    <link rel="previous" href="http://localhost/api/events?startwith=0"/>
+    <link rel="last" href="http://localhost/api/events?startwith=1"/>
+    <totalSize>4</totalSize>
+    <event>
+        <actionPerformed>VOLUME_DELETE</actionPerformed>
+        <component>VOLUME</component>
+        <enterprise>Abiquo</enterprise>
+        <id>110</id>
+        <idEnterprise>1</idEnterprise>
+        <idUser>1</idUser>
+        <idVirtualDatacenter>1</idVirtualDatacenter>
+        <idVolume>1786</idVolume>
+        <performedBy>admin</performedBy>
+        <severity>INFO</severity>
+        <stacktrace>Deleting volume &apos;JC-3972c0f8-28b&apos;</stacktrace>
+        <timestamp>2013-01-23T14:07:14Z</timestamp>
+        <user>admin</user>
+        <virtualDatacenter>JC-d0cf5cd6-67b</virtualDatacenter>
+        <volume>JC-3972c0f8-28b</volume>
+    </event>
+    <event>
+        <actionPerformed>VOLUME_MODIFY</actionPerformed>
+        <component>VOLUME</component>
+        <enterprise>Abiquo</enterprise>
+        <id>111</id>
+        <idEnterprise>1</idEnterprise>
+        <idUser>1</idUser>
+        <idVirtualDatacenter>1</idVirtualDatacenter>
+        <idVolume>1786</idVolume>
+        <performedBy>admin</performedBy>
+        <severity>INFO</severity>
+        <stacktrace>Updated size of volume &apos;JC-Event vol&apos; to &apos;32&apos; MB</stacktrace>
+        <timestamp>2013-01-23T14:07:12Z</timestamp>
+        <user>admin</user>
+        <virtualDatacenter>JC-d0cf5cd6-67b</virtualDatacenter>
+        <volume>JC-3972c0f8-28b</volume>
+    </event>
+</events>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/events-page.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/events-page.xml b/abiquo/src/test/resources/payloads/events-page.xml
new file mode 100644
index 0000000..4ac8d22
--- /dev/null
+++ b/abiquo/src/test/resources/payloads/events-page.xml
@@ -0,0 +1,40 @@
+<events>
+    <link rel="first" href="http://localhost/api/events"/>
+    <link rel="next" href="http://localhost/api/events?startwith=1"/>
+    <link rel="last" href="http://localhost/api/events?startwith=1"/>
+    <totalSize>4</totalSize>
+    <event>
+        <actionPerformed>VOLUME_DELETE</actionPerformed>
+        <component>VOLUME</component>
+        <enterprise>Abiquo</enterprise>
+        <id>109</id>
+        <idEnterprise>1</idEnterprise>
+        <idUser>1</idUser>
+        <idVirtualDatacenter>1</idVirtualDatacenter>
+        <idVolume>1786</idVolume>
+        <performedBy>admin</performedBy>
+        <severity>INFO</severity>
+        <stacktrace>Deleting volume &apos;JC-3972c0f8-28b&apos;</stacktrace>
+        <timestamp>2013-01-23T14:07:14Z</timestamp>
+        <user>admin</user>
+        <virtualDatacenter>JC-d0cf5cd6-67b</virtualDatacenter>
+        <volume>JC-3972c0f8-28b</volume>
+    </event>
+    <event>
+        <actionPerformed>VOLUME_MODIFY</actionPerformed>
+        <component>VOLUME</component>
+        <enterprise>Abiquo</enterprise>
+        <id>108</id>
+        <idEnterprise>1</idEnterprise>
+        <idUser>1</idUser>
+        <idVirtualDatacenter>1</idVirtualDatacenter>
+        <idVolume>1786</idVolume>
+        <performedBy>admin</performedBy>
+        <severity>INFO</severity>
+        <stacktrace>Updated size of volume &apos;JC-Event vol&apos; to &apos;32&apos; MB</stacktrace>
+        <timestamp>2013-01-23T14:07:12Z</timestamp>
+        <user>admin</user>
+        <virtualDatacenter>JC-d0cf5cd6-67b</virtualDatacenter>
+        <volume>JC-3972c0f8-28b</volume>
+    </event>
+</events>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/externalips-lastpage.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/externalips-lastpage.xml b/abiquo/src/test/resources/payloads/externalips-lastpage.xml
new file mode 100644
index 0000000..5e9311a
--- /dev/null
+++ b/abiquo/src/test/resources/payloads/externalips-lastpage.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<externalips>
+    <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips" rel="first" />
+    <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips?startwith=0" rel="previous" />
+    <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips?startwith=3" rel="last" />
+    <totalSize>4</totalSize>
+    <externalip>
+        <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2" rel="externalnetwork" title="ExternalNetwork" type="application/vnd.abiquo.vlan+xml" />
+        <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips" rel="ips" type="application/vnd.abiquo.externalips+xml" />
+        <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips/3" rel="self" title="externalip" type="application/vnd.abiquo.externalip+xml" />
+        <id>3</id>
+        <ip>10.0.0.1</ip>
+        <networkName>ExternalNetwork</networkName>
+        <available>true</available>
+        <quarantine>false</quarantine>
+    </externalip>
+    <externalip>
+        <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2" rel="externalnetwork" title="ExternalNetwork" type="application/vnd.abiquo.vlan+xml" />
+        <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips" rel="ips" type="application/vnd.abiquo.externalips+xml" />
+        <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips/4" rel="self" title="externalip" type="application/vnd.abiquo.externalip+xml" />
+        <id>4</id>
+        <ip>10.0.0.2</ip>
+        <networkName>ExternalNetwork</networkName>
+        <available>true</available>
+        <quarantine>false</quarantine>
+    </externalip>
+</externalips>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/externalips-page.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/externalips-page.xml b/abiquo/src/test/resources/payloads/externalips-page.xml
new file mode 100644
index 0000000..4abe4a8
--- /dev/null
+++ b/abiquo/src/test/resources/payloads/externalips-page.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<externalips>
+    <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips" rel="first" />
+    <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips?startwith=3" rel="next" />
+    <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips?startwith=3" rel="last" />
+    <totalSize>4</totalSize>
+    <externalip>
+        <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2" rel="externalnetwork" title="ExternalNetwork" type="application/vnd.abiquo.vlan+xml" />
+        <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips" rel="ips" type="application/vnd.abiquo.externalips+xml" />
+        <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips/1" rel="self" title="externalip" type="application/vnd.abiquo.externalip+xml" />
+        <id>1</id>
+        <ip>10.0.0.1</ip>
+        <networkName>ExternalNetwork</networkName>
+        <available>true</available>
+        <quarantine>false</quarantine>
+    </externalip>
+    <externalip>
+        <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2" rel="externalnetwork" title="ExternalNetwork" type="application/vnd.abiquo.vlan+xml" />
+        <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips" rel="ips" type="application/vnd.abiquo.externalips+xml" />
+        <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips/2" rel="self" title="externalip" type="application/vnd.abiquo.externalip+xml" />
+        <id>2</id>
+        <ip>10.0.0.2</ip>
+        <networkName>ExternalNetwork</networkName>
+        <available>true</available>
+        <quarantine>false</quarantine>
+    </externalip>
+</externalips>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/privateips-lastpage.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/privateips-lastpage.xml b/abiquo/src/test/resources/payloads/privateips-lastpage.xml
new file mode 100644
index 0000000..d289567
--- /dev/null
+++ b/abiquo/src/test/resources/payloads/privateips-lastpage.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<privateips>
+    <link href="http://localhost/api/cloud/virtualdatacenters/1/privatenetworks/1/ips" rel="first" />
+    <link href="http://localhost/api/cloud/virtualdatacenters/1/privatenetworks/1/ips?startwith=0" rel="previous" />
+    <link href="http://localhost/api/cloud/virtualdatacenters/1/privatenetworks/1/ips?startwith=1" rel="last" />
+    <totalSize>2</totalSize>
+    <privateip>
+        <link href="http://localhost/api/cloud/virtualdatacenters/1/privatenetworks/1" rel="privatenetwork" title="JC--privatenetwork-test" type="application/vnd.abiquo.vlan+xml" />
+        <link href="http://localhost/api/cloud/virtualdatacenters/1/privatenetworks/1/ips/3311" rel="self" title="privateip" type="application/vnd.abiquo.privateip+xml" />
+        <link href="http://localhost/api/cloud/virtualdatacenters/1" rel="virtualdatacenter" title="Aloha updated" type="application/vnd.abiquo.virtualdatacenter+xml" />
+        <id>2</id>
+        <ip>192.168.1.1</ip>
+        <mac>00:50:56:11:d4:a2</mac>
+        <name>00505611d4a2_host</name>
+        <networkName>JC--privatenetwork-test</networkName>
+    </privateip>
+</privateips>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/privateips-page.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/privateips-page.xml b/abiquo/src/test/resources/payloads/privateips-page.xml
new file mode 100644
index 0000000..4a6acb1
--- /dev/null
+++ b/abiquo/src/test/resources/payloads/privateips-page.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<privateips>
+    <link href="http://localhost/api/cloud/virtualdatacenters/1/privatenetworks/1/ips" rel="first" />
+    <link href="http://localhost/api/cloud/virtualdatacenters/1/privatenetworks/1/ips?startwith=1" rel="next" />
+    <link href="http://localhost/api/cloud/virtualdatacenters/1/privatenetworks/1/ips?startwith=1" rel="last" />
+    <totalSize>2</totalSize>
+    <privateip>
+        <link href="http://localhost/api/cloud/virtualdatacenters/1/privatenetworks/1" rel="privatenetwork" title="JC--privatenetwork-test" type="application/vnd.abiquo.vlan+xml" />
+        <link href="http://localhost/api/cloud/virtualdatacenters/1/privatenetworks/1/ips/3311" rel="self" title="privateip" type="application/vnd.abiquo.privateip+xml" />
+        <link href="http://localhost/api/cloud/virtualdatacenters/1" rel="virtualdatacenter" title="Aloha updated" type="application/vnd.abiquo.virtualdatacenter+xml" />
+        <id>1</id>
+        <ip>192.168.1.1</ip>
+        <mac>00:50:56:11:d4:a2</mac>
+        <name>00505611d4a2_host</name>
+        <networkName>JC--privatenetwork-test</networkName>
+    </privateip>
+</privateips>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/publicips-available-lastpage.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/publicips-available-lastpage.xml b/abiquo/src/test/resources/payloads/publicips-available-lastpage.xml
new file mode 100644
index 0000000..dec31ec
--- /dev/null
+++ b/abiquo/src/test/resources/payloads/publicips-available-lastpage.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<publicips>
+    <link rel="first" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/topurchase" />
+    <link rel="previous" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/topurchase?startwith=0" />
+    <link rel="last" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/topurchase?startwith=3" />
+    <totalSize>4</totalSize>
+    <publicip>
+        <link title="publicip" rel="edit" type="application/vnd.abiquo.publicips+xml" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/topurchase/3" />
+        <link title="publi" rel="publicnetwork" type="application/vnd.abiquo.vlan+xml" href="http://localhost/api/admin/datacenters/1/network/4" />
+        <link title="PUT" rel="purchase" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/purchased/3" />
+        <link rel="topurchase" type="application/vnd.abiquo.publicips+xml" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/topurchase" />
+        <id>3</id>
+        <ip>8.8.8.1</ip>
+        <networkName>publi</networkName>
+        <available>true</available>
+        <quarantine>false</quarantine>
+    </publicip>
+    <publicip>
+        <link title="publicip" rel="edit" type="application/vnd.abiquo.publicips+xml" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/topurchase/4" />
+        <link title="publi" rel="publicnetwork" type="application/vnd.abiquo.vlan+xml" href="http://localhost/api/admin/datacenters/1/network/4" />
+        <link title="PUT" rel="purchase" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/purchased/4" />
+        <link rel="topurchase" type="application/vnd.abiquo.publicips+xml" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/topurchase" />
+        <id>4</id>
+        <ip>8.8.8.3</ip>
+        <networkName>publi</networkName>
+        <available>true</available>
+        <quarantine>false</quarantine>
+    </publicip>
+</publicips>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/publicips-available-page.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/publicips-available-page.xml b/abiquo/src/test/resources/payloads/publicips-available-page.xml
new file mode 100644
index 0000000..f53c4ac
--- /dev/null
+++ b/abiquo/src/test/resources/payloads/publicips-available-page.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<publicips>
+    <link rel="first" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/topurchase" />
+    <link rel="next" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/topurchase?startwith=3" />
+    <link rel="last" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/topurchase?startwith=3" />
+    <totalSize>4</totalSize>
+    <publicip>
+        <link title="publicip" rel="edit" type="application/vnd.abiquo.publicips+xml" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/topurchase/1" />
+        <link title="publi" rel="publicnetwork" type="application/vnd.abiquo.vlan+xml" href="http://localhost/api/admin/datacenters/1/network/4" />
+        <link title="PUT" rel="purchase" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/purchased/1" />
+        <link rel="topurchase" type="application/vnd.abiquo.publicips+xml" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/topurchase" />
+        <id>1</id>
+        <ip>8.8.8.1</ip>
+        <networkName>publi</networkName>
+        <available>true</available>
+        <quarantine>false</quarantine>
+    </publicip>
+    <publicip>
+        <link title="publicip" rel="edit" type="application/vnd.abiquo.publicips+xml" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/topurchase/2" />
+        <link title="publi" rel="publicnetwork" type="application/vnd.abiquo.vlan+xml" href="http://localhost/api/admin/datacenters/1/network/4" />
+        <link title="PUT" rel="purchase" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/purchased/2" />
+        <link rel="topurchase" type="application/vnd.abiquo.publicips+xml" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/topurchase" />
+        <id>2</id>
+        <ip>8.8.8.3</ip>
+        <networkName>publi</networkName>
+        <available>true</available>
+        <quarantine>false</quarantine>
+    </publicip>
+</publicips>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/publicips-lastpage.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/publicips-lastpage.xml b/abiquo/src/test/resources/payloads/publicips-lastpage.xml
new file mode 100644
index 0000000..04741d3
--- /dev/null
+++ b/abiquo/src/test/resources/payloads/publicips-lastpage.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<publicips>
+    <link href="http://localhost/api/admin/datacenters/1/network/1/ips" rel="first" />
+    <link href="http://localhost/api/admin/datacenters/1/network/1/ips?startwith=0" rel="previous" />
+    <link href="http://localhost/api/admin/datacenters/1/network/1/ips?startwith=3" rel="last" />
+    <totalSize>4</totalSize>
+    <publicip>
+        <link href="http://localhost/api/admin/datacenters/1/network/1" rel="publicnetwork" title="JC--publicnetwork-test" type="application/vnd.abiquo.vlan+xml" />
+        <link href="http://localhost/api/admin/datacenters/1/network/1/ips/3" rel="self" title="publicip" type="application/vnd.abiquo.publicip+xml" />
+        <id>3</id>
+        <ip>80.80.80.1</ip>
+        <networkName>JC--publicnetwork-test</networkName>
+        <available>true</available>
+        <quarantine>false</quarantine>
+    </publicip>
+    <publicip>
+        <link href="http://localhost/api/admin/datacenters/1/network/1" rel="publicnetwork" title="JC--publicnetwork-test" type="application/vnd.abiquo.vlan+xml" />
+        <link href="http://localhost/api/admin/datacenters/1/network/1/ips/4" rel="self" title="publicip" type="application/vnd.abiquo.publicip+xml" />
+        <id>4</id>
+        <ip>80.80.80.2</ip>
+        <networkName>JC--publicnetwork-test</networkName>
+        <available>true</available>
+        <quarantine>false</quarantine>
+    </publicip>
+</publicips>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/publicips-page.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/publicips-page.xml b/abiquo/src/test/resources/payloads/publicips-page.xml
new file mode 100644
index 0000000..092b403
--- /dev/null
+++ b/abiquo/src/test/resources/payloads/publicips-page.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<publicips>
+    <link href="http://localhost/api/admin/datacenters/1/network/1/ips" rel="first" />
+    <link href="http://localhost/api/admin/datacenters/1/network/1/ips?startwith=3" rel="next" />
+    <link href="http://localhost/api/admin/datacenters/1/network/1/ips?startwith=3" rel="last" />
+    <totalSize>4</totalSize>
+    <publicip>
+        <link href="http://localhost/api/admin/datacenters/1/network/1" rel="publicnetwork" title="JC--publicnetwork-test" type="application/vnd.abiquo.vlan+xml" />
+        <link href="http://localhost/api/admin/datacenters/1/network/1/ips/1" rel="self" title="publicip" type="application/vnd.abiquo.publicip+xml" />
+        <id>1</id>
+        <ip>80.80.80.1</ip>
+        <networkName>JC--publicnetwork-test</networkName>
+        <available>true</available>
+        <quarantine>false</quarantine>
+    </publicip>
+    <publicip>
+        <link href="http://localhost/api/admin/datacenters/1/network/1" rel="publicnetwork" title="JC--publicnetwork-test" type="application/vnd.abiquo.vlan+xml" />
+        <link href="http://localhost/api/admin/datacenters/1/network/1/ips/2" rel="self" title="publicip" type="application/vnd.abiquo.publicip+xml" />
+        <id>2</id>
+        <ip>80.80.80.2</ip>
+        <networkName>JC--publicnetwork-test</networkName>
+        <available>true</available>
+        <quarantine>false</quarantine>
+    </publicip>
+</publicips>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/publicips-purchased-lastpage.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/publicips-purchased-lastpage.xml b/abiquo/src/test/resources/payloads/publicips-purchased-lastpage.xml
new file mode 100644
index 0000000..077b304
--- /dev/null
+++ b/abiquo/src/test/resources/payloads/publicips-purchased-lastpage.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<publicips>
+    <link rel="first" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/purchased" />
+    <link rel="previous" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/purchased?startwith=0" />
+    <link rel="last" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/purchased?startwith=3" />
+    <totalSize>4</totalSize>
+    <publicip>
+        <link title="publicip" rel="edit" type="application/vnd.abiquo.publicips+xml" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/purchased/3" />
+        <link title="publi" rel="publicnetwork" type="application/vnd.abiquo.vlan+xml" href="http://localhost/api/admin/datacenters/1/network/4" />
+        <link title="PUT" rel="purchase" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/purchased/3" />
+        <link rel="topurchase" type="application/vnd.abiquo.publicips+xml" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/topurchase" />
+        <id>3</id>
+        <ip>8.8.8.1</ip>
+        <networkName>publi</networkName>
+        <available>true</available>
+        <quarantine>false</quarantine>
+    </publicip>
+    <publicip>
+        <link title="publicip" rel="edit" type="application/vnd.abiquo.publicips+xml" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/purchased/4" />
+        <link title="publi" rel="publicnetwork" type="application/vnd.abiquo.vlan+xml" href="http://localhost/api/admin/datacenters/1/network/4" />
+        <link title="PUT" rel="purchase" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/purchased/4" />
+        <link rel="topurchase" type="application/vnd.abiquo.publicips+xml" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/topurchase" />
+        <id>4</id>
+        <ip>8.8.8.3</ip>
+        <networkName>publi</networkName>
+        <available>true</available>
+        <quarantine>false</quarantine>
+    </publicip>
+</publicips>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/publicips-purchased-page.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/publicips-purchased-page.xml b/abiquo/src/test/resources/payloads/publicips-purchased-page.xml
new file mode 100644
index 0000000..9456946
--- /dev/null
+++ b/abiquo/src/test/resources/payloads/publicips-purchased-page.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<publicips>
+    <link rel="first" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/purchased" />
+    <link rel="next" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/purchased?startwith=3" />
+    <link rel="last" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/purchased?startwith=3" />
+    <totalSize>4</totalSize>
+    <publicip>
+        <link title="publicip" rel="edit" type="application/vnd.abiquo.publicips+xml" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/purchased/1" />
+        <link title="publi" rel="publicnetwork" type="application/vnd.abiquo.vlan+xml" href="http://localhost/api/admin/datacenters/1/network/4" />
+        <link title="PUT" rel="purchase" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/purchased/1" />
+        <link rel="topurchase" type="application/vnd.abiquo.publicips+xml" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/topurchase" />
+        <id>1</id>
+        <ip>8.8.8.1</ip>
+        <networkName>publi</networkName>
+        <available>true</available>
+        <quarantine>false</quarantine>
+    </publicip>
+    <publicip>
+        <link title="publicip" rel="edit" type="application/vnd.abiquo.publicips+xml" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/purchased/2" />
+        <link title="publi" rel="publicnetwork" type="application/vnd.abiquo.vlan+xml" href="http://localhost/api/admin/datacenters/1/network/4" />
+        <link title="PUT" rel="purchase" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/purchased/2" />
+        <link rel="topurchase" type="application/vnd.abiquo.publicips+xml" href="http://localhost/api/cloud/virtualdatacenters/1/publicips/topurchase" />
+        <id>2</id>
+        <ip>8.8.8.3</ip>
+        <networkName>publi</networkName>
+        <available>true</available>
+        <quarantine>false</quarantine>
+    </publicip>
+</publicips>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/templates-lastpage.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/templates-lastpage.xml b/abiquo/src/test/resources/payloads/templates-lastpage.xml
new file mode 100644
index 0000000..63fa4cb
--- /dev/null
+++ b/abiquo/src/test/resources/payloads/templates-lastpage.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<virtualMachineTemplates>
+    <link rel="first" href="http://localhost/api/admin/enterprises/1/datacenterrepositories/1/virtualmachinetemplates"/>
+    <link rel="previous" href="http://localhost/api/admin/enterprises/1/datacenterrepositories/1/virtualmachinetemplates?startwith=0"/>
+    <link rel="last" href="http://localhost/api/admin/enterprises/1/datacenterrepositories/1/virtualmachinetemplates?startwith=1"/>
+    <totalSize>2</totalSize>
+    <virtualMachineTemplate>
+        <link title="Web Servers" rel="category" type="application/vnd.abiquo.category+xml" href="http://localhost/api/config/categories/14"/>
+        <link rel="conversions" type="application/vnd.abiquo.conversions+xml" href="http://localhost/api/admin/enterprises/152/datacenterrepositories/2/virtualmachinetemplates/151/conversions"/>
+        <link rel="datacenter" type="application/vnd.abiquo.datacenter+xml" href="http://localhost/api/admin/datacenters/2"/>
+        <link rel="datacenterrepository" type="application/vnd.abiquo.datacenterrepository+xml" href="http://localhost/api/admin/enterprises/152/datacenterrepositories/2"/>
+        <link rel="diskfile" href="http://localhost/am/erepos/152/templates/apache%252Fubuntu-910-server-x86_64-vmdk5.ovf?format=diskFile"/>
+        <link title="Apache Server" rel="edit" type="application/vnd.abiquo.virtualmachinetemplate+xml" href="http://localhost/api/admin/enterprises/152/datacenterrepositories/2/virtualmachinetemplates/151"/>
+        <link rel="enterprise" type="application/vnd.abiquo.enterprise+xml" href="http://localhost/api/admin/enterprises/152"/>
+        <link rel="ovfdocument" href="http://localhost/am/erepos/152/templates/apache%252Fubuntu-910-server-x86_64-vmdk5.ovf?format=envelope"/>
+        <link rel="template" href="http://localhost/am/erepos/152/templates/apache%252Fubuntu-910-server-x86_64-vmdk5.ovf"/>
+        <link rel="templatedefinition" href="http://apache/ubuntu-910-server-x86_64-vmdk5.ovf"/>
+        <link rel="templatestatus" href="http://localhost/am/erepos/152/templates/apache%252Fubuntu-910-server-x86_64-vmdk5.ovf?format=status"/>
+        <id>152</id>
+        <name>Apache Server</name>
+        <description>Apache Server</description>
+        <path>1/apache/ubuntu-910-server-x86_64-vmdk5.vmdk</path>
+        <diskFormatType>VMDK_STREAM_OPTIMIZED</diskFormatType>
+        <diskFileSize>206947328</diskFileSize>
+        <cpuRequired>1</cpuRequired>
+        <ramRequired>512</ramRequired>
+        <hdRequired>734003200</hdRequired>
+        <shared>true</shared>
+        <costCode>0</costCode>
+        <creationDate>2012-04-18T17:42:42+02:00</creationDate>
+        <creationUser>SYSTEM</creationUser>
+        <chefEnabled>false</chefEnabled>
+        <iconUrl>http://icons.abiquo.com/apache.jpg</iconUrl>
+    </virtualMachineTemplate>
+</virtualMachineTemplates>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/templates-page.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/templates-page.xml b/abiquo/src/test/resources/payloads/templates-page.xml
index 61c53f7..ec98f93 100644
--- a/abiquo/src/test/resources/payloads/templates-page.xml
+++ b/abiquo/src/test/resources/payloads/templates-page.xml
@@ -1,21 +1,21 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <virtualMachineTemplates>
-    <link rel="first" href="http://localhost:80/api/admin/enterprises/1/datacenterrepositories/1/virtualmachinetemplates"/>
-    <link rel="next" href="http://localhost:80/api/admin/enterprises/1/datacenterrepositories/1/virtualmachinetemplates?startwith=1"/>
-    <link rel="last" href="http://localhost:80/api/admin/enterprises/1/datacenterrepositories/1/virtualmachinetemplates?startwith=1"/>
+    <link rel="first" href="http://localhost/api/admin/enterprises/1/datacenterrepositories/1/virtualmachinetemplates"/>
+    <link rel="next" href="http://localhost/api/admin/enterprises/1/datacenterrepositories/1/virtualmachinetemplates?startwith=1"/>
+    <link rel="last" href="http://localhost/api/admin/enterprises/1/datacenterrepositories/1/virtualmachinetemplates?startwith=1"/>
     <totalSize>2</totalSize>
     <virtualMachineTemplate>
-        <link title="Web Servers" rel="category" type="application/vnd.abiquo.category+xml" href="http://localhost:80/api/config/categories/14"/>
-        <link rel="conversions" type="application/vnd.abiquo.conversions+xml" href="http://localhost:80/api/admin/enterprises/152/datacenterrepositories/2/virtualmachinetemplates/151/conversions"/>
-        <link rel="datacenter" type="application/vnd.abiquo.datacenter+xml" href="http://localhost:80/api/admin/datacenters/2"/>
-        <link rel="datacenterrepository" type="application/vnd.abiquo.datacenterrepository+xml" href="http://localhost:80/api/admin/enterprises/152/datacenterrepositories/2"/>
-        <link rel="diskfile" href="http://192.168.0.3:80/am/erepos/152/templates/apache%252Fubuntu-910-server-x86_64-vmdk5.ovf?format=diskFile"/>
-        <link title="Apache Server" rel="edit" type="application/vnd.abiquo.virtualmachinetemplate+xml" href="http://localhost:80/api/admin/enterprises/152/datacenterrepositories/2/virtualmachinetemplates/151"/>
-        <link rel="enterprise" type="application/vnd.abiquo.enterprise+xml" href="http://localhost:80/api/admin/enterprises/152"/>
-        <link rel="ovfdocument" href="http://192.168.0.3:80/am/erepos/152/templates/apache%252Fubuntu-910-server-x86_64-vmdk5.ovf?format=envelope"/>
-        <link rel="template" href="http://192.168.0.3:80/am/erepos/152/templates/apache%252Fubuntu-910-server-x86_64-vmdk5.ovf"/>
+        <link title="Web Servers" rel="category" type="application/vnd.abiquo.category+xml" href="http://localhost/api/config/categories/14"/>
+        <link rel="conversions" type="application/vnd.abiquo.conversions+xml" href="http://localhost/api/admin/enterprises/152/datacenterrepositories/2/virtualmachinetemplates/151/conversions"/>
+        <link rel="datacenter" type="application/vnd.abiquo.datacenter+xml" href="http://localhost/api/admin/datacenters/2"/>
+        <link rel="datacenterrepository" type="application/vnd.abiquo.datacenterrepository+xml" href="http://localhost/api/admin/enterprises/152/datacenterrepositories/2"/>
+        <link rel="diskfile" href="http://localhost/am/erepos/152/templates/apache%252Fubuntu-910-server-x86_64-vmdk5.ovf?format=diskFile"/>
+        <link title="Apache Server" rel="edit" type="application/vnd.abiquo.virtualmachinetemplate+xml" href="http://localhost/api/admin/enterprises/152/datacenterrepositories/2/virtualmachinetemplates/151"/>
+        <link rel="enterprise" type="application/vnd.abiquo.enterprise+xml" href="http://localhost/api/admin/enterprises/152"/>
+        <link rel="ovfdocument" href="http://localhost/am/erepos/152/templates/apache%252Fubuntu-910-server-x86_64-vmdk5.ovf?format=envelope"/>
+        <link rel="template" href="http://localhost/am/erepos/152/templates/apache%252Fubuntu-910-server-x86_64-vmdk5.ovf"/>
         <link rel="templatedefinition" href="http://apache/ubuntu-910-server-x86_64-vmdk5.ovf"/>
-        <link rel="templatestatus" href="http://192.168.0.3:80/am/erepos/152/templates/apache%252Fubuntu-910-server-x86_64-vmdk5.ovf?format=status"/>
+        <link rel="templatestatus" href="http://localhost/am/erepos/152/templates/apache%252Fubuntu-910-server-x86_64-vmdk5.ovf?format=status"/>
         <id>151</id>
         <name>Apache Server</name>
         <description>Apache Server</description>

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/unmanagedips-lastpage.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/unmanagedips-lastpage.xml b/abiquo/src/test/resources/payloads/unmanagedips-lastpage.xml
new file mode 100644
index 0000000..aade3a4
--- /dev/null
+++ b/abiquo/src/test/resources/payloads/unmanagedips-lastpage.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<unmanagedips>
+    <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips" rel="first" />
+    <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips?startwith=0" rel="previous" />
+    <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips?startwith=3" rel="last" />
+    <totalSize>4</totalSize>
+    <unmanagedip>
+        <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2" rel="externalnetwork" title="ExternalNetwork" type="application/vnd.abiquo.vlan+xml" />
+        <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips" rel="ips" type="application/vnd.abiquo.externalips+xml" />
+        <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips/3" rel="self" title="externalip" type="application/vnd.abiquo.externalip+xml" />
+        <id>3</id>
+        <ip>10.0.0.1</ip>
+        <networkName>UnmanagedNetwork</networkName>
+        <available>true</available>
+        <quarantine>false</quarantine>
+        <unmanaged>true</unmanaged>
+    </unmanagedip>
+    <unmanagedip>
+        <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2" rel="externalnetwork" title="ExternalNetwork" type="application/vnd.abiquo.vlan+xml" />
+        <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips" rel="ips" type="application/vnd.abiquo.externalips+xml" />
+        <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips/4" rel="self" title="externalip" type="application/vnd.abiquo.externalip+xml" />
+        <id>4</id>
+        <ip>10.0.0.2</ip>
+        <networkName>UnmanagedNetwork</networkName>
+        <available>true</available>
+        <quarantine>false</quarantine>
+        <unmanaged>true</unmanaged>
+    </unmanagedip>
+</unmanagedips>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/unmanagedips-page.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/unmanagedips-page.xml b/abiquo/src/test/resources/payloads/unmanagedips-page.xml
new file mode 100644
index 0000000..2302218
--- /dev/null
+++ b/abiquo/src/test/resources/payloads/unmanagedips-page.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<unmanagedips>
+    <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips" rel="first" />
+    <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips?startwith=3" rel="next" />
+    <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips?startwith=3" rel="last" />
+    <totalSize>4</totalSize>
+    <unmanagedip>
+        <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2" rel="externalnetwork" title="ExternalNetwork" type="application/vnd.abiquo.vlan+xml" />
+        <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips" rel="ips" type="application/vnd.abiquo.externalips+xml" />
+        <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips/1" rel="self" title="externalip" type="application/vnd.abiquo.externalip+xml" />
+        <id>1</id>
+        <ip>10.0.0.1</ip>
+        <networkName>UnmanagedNetwork</networkName>
+        <available>true</available>
+        <quarantine>false</quarantine>
+        <unmanaged>true</unmanaged>
+    </unmanagedip>
+    <unmanagedip>
+        <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2" rel="externalnetwork" title="ExternalNetwork" type="application/vnd.abiquo.vlan+xml" />
+        <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips" rel="ips" type="application/vnd.abiquo.externalips+xml" />
+        <link href="http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips/2" rel="self" title="externalip" type="application/vnd.abiquo.externalip+xml" />
+        <id>2</id>
+        <ip>10.0.0.2</ip>
+        <networkName>UnmanagedNetwork</networkName>
+        <available>true</available>
+        <quarantine>false</quarantine>
+        <unmanaged>true</unmanaged>
+    </unmanagedip>
+</unmanagedips>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/users-lastpage.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/users-lastpage.xml b/abiquo/src/test/resources/payloads/users-lastpage.xml
new file mode 100644
index 0000000..def0a5b
--- /dev/null
+++ b/abiquo/src/test/resources/payloads/users-lastpage.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<users>
+	<link rel="first" href="http://10.7.3.10:80/api/admin/enterprises/1/users?limit=2"/>
+	<link rel="previous" href="http://10.7.3.10:80/api/admin/enterprises/1/users?startwith=0&amp;limit=2"/>
+    <link rel="next" href="http://10.7.3.10:80/api/admin/enterprises/1/users?startwith=3&amp;limit=2"/>
+	<link rel="last" href="http://10.7.3.10:80/api/admin/enterprises/1/users?startwith=1&amp;limit=2"/>
+	<totalSize>3</totalSize>
+    <user>
+		<link rel="edit" type="application/vnd.abiquo.user+xml" href="http://localhost/api/admin/enterprises/1/users/3"/>
+		<link rel="enterprise" type="application/vnd.abiquo.enterprise+xml" href="http://localhost/api/admin/enterprises/1"/>
+		<link rel="role" type="application/vnd.abiquo.role+xml" href="http://localhost/api/admin/roles/7"/>
+		<link rel="virtualmachines" type="application/vnd.abiquo.virtualmachines+xml" href="http://localhost/api/admin/enterprises/1/users/3/action/virtualmachines"/>
+		<id>3</id>
+		<nick>ron</nick>
+		<password>0371e4dce3c8804f1543c3f0f309cc10</password>
+		<name>Ron</name>
+		<surname>Weasley</surname>
+		<description/>
+		<email>ron.weasley@hogwarts.edu</email>
+		<locale>en_EN</locale>
+		<authType>ABIQUO</authType>
+		<active>true</active>
+    </user>
+</users>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/users-page.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/users-page.xml b/abiquo/src/test/resources/payloads/users-page.xml
new file mode 100644
index 0000000..5427878
--- /dev/null
+++ b/abiquo/src/test/resources/payloads/users-page.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<users>
+	<link rel="first" href="http://localhost/api/admin/enterprises/1/users?limit=2"/>
+    <link rel="next" href="http://localhost/api/admin/enterprises/1/users?startwith=2&amp;limit=2"/>
+	<link rel="last" href="http://localhost/api/admin/enterprises/1/users?startwith=2&amp;limit=2"/>
+	<totalSize>3</totalSize>
+    <user>
+		<link rel="edit" type="application/vnd.abiquo.user+xml" href="http://localhost/api/admin/enterprises/1/users/1"/>
+		<link rel="enterprise" type="application/vnd.abiquo.enterprise+xml" href="http://localhost/api/admin/enterprises/1"/>
+		<link rel="role" type="application/vnd.abiquo.role+xml" href="http://localhost/api/admin/roles/7"/>
+		<link rel="virtualmachines" type="application/vnd.abiquo.virtualmachines+xml" href="http://localhost/api/admin/enterprises/1/users/1/action/virtualmachines"/>
+		<id>1</id>
+		<nick>potter</nick>
+		<password>0371e4dce3c8804f1543c3f0f309cc10</password>
+		<name>Harry</name>
+		<surname>Potter</surname>
+		<description/>
+		<email>harry.potter@hogwarts.edu</email>
+		<locale>en_EN</locale>
+		<authType>ABIQUO</authType>
+		<active>true</active>
+    </user>
+    <user>
+		<link rel="edit" type="application/vnd.abiquo.user+xml" href="http://localhost/api/admin/enterprises/1/users/2"/>
+		<link rel="enterprise" type="application/vnd.abiquo.enterprise+xml" href="http://localhost/api/admin/enterprises/1"/>
+		<link rel="role" type="application/vnd.abiquo.role+xml" href="http://localhost/api/admin/roles/7"/>
+		<link rel="virtualmachines" type="application/vnd.abiquo.virtualmachines+xml" href="http://localhost/api/admin/enterprises/1/users/2/action/virtualmachines"/>
+		<id>2</id>
+		<nick>granger</nick>
+		<password>0371e4dce3c8804f1543c3f0f309cc10</password>
+		<name>Hermione</name>
+		<surname>Granger</surname>
+		<description/>
+		<email>hermione.granger@hogwarts.edu</email>
+		<locale>en_EN</locale>
+		<authType>ABIQUO</authType>
+		<active>true</active>
+    </user>
+</users>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/usr-list-page-2.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/usr-list-page-2.xml b/abiquo/src/test/resources/payloads/usr-list-page-2.xml
deleted file mode 100644
index 9f3012e..0000000
--- a/abiquo/src/test/resources/payloads/usr-list-page-2.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<users>
-	<link rel="first" href="http://10.7.3.10:80/api/admin/enterprises/1/users?limit=1"/>
-	<link rel="previous" href="http://10.7.3.10:80/api/admin/enterprises/1/users?startwith=0&amp;limit=1"/>
-	<link rel="last" href="http://10.7.3.10:80/api/admin/enterprises/1/users?startwith=2&amp;limit=1"/>
-	<totalSize>3</totalSize>
-    <user>
-		<link rel="edit" type="application/vnd.abiquo.user+xml" href="http://localhost/api/admin/enterprises/1/users/3"/>
-		<link rel="enterprise" type="application/vnd.abiquo.enterprise+xml" href="http://localhost/api/admin/enterprises/1"/>
-		<link rel="role" type="application/vnd.abiquo.role+xml" href="http://localhost/api/admin/roles/7"/>
-		<link rel="virtualmachines" type="application/vnd.abiquo.virtualmachines+xml" href="http://localhost/api/admin/enterprises/1/users/3/action/virtualmachines"/>
-		<id>3</id>
-		<nick>ron</nick>
-		<password>0371e4dce3c8804f1543c3f0f309cc10</password>
-		<name>Ron</name>
-		<surname>Weasley</surname>
-		<description/>
-		<email>ron.weasley@hogwarts.edu</email>
-		<locale>en_EN</locale>
-		<authType>ABIQUO</authType>
-		<active>true</active>
-    </user>
-</users>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/usr-list.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/usr-list.xml b/abiquo/src/test/resources/payloads/usr-list.xml
deleted file mode 100644
index 0468815..0000000
--- a/abiquo/src/test/resources/payloads/usr-list.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<users>
-	<link rel="first" href="http://localhost/api/admin/enterprises/1/users?limit=2"/>
-	<link rel="last" href="http://localhost/api/admin/enterprises/1/users?startwith=0&amp;limit=2"/>
-	<totalSize>3</totalSize>
-    <user>
-		<link rel="edit" type="application/vnd.abiquo.user+xml" href="http://localhost/api/admin/enterprises/1/users/1"/>
-		<link rel="enterprise" type="application/vnd.abiquo.enterprise+xml" href="http://localhost/api/admin/enterprises/1"/>
-		<link rel="role" type="application/vnd.abiquo.role+xml" href="http://localhost/api/admin/roles/7"/>
-		<link rel="virtualmachines" type="application/vnd.abiquo.virtualmachines+xml" href="http://localhost/api/admin/enterprises/1/users/1/action/virtualmachines"/>
-		<id>1</id>
-		<nick>potter</nick>
-		<password>0371e4dce3c8804f1543c3f0f309cc10</password>
-		<name>Harry</name>
-		<surname>Potter</surname>
-		<description/>
-		<email>harry.potter@hogwarts.edu</email>
-		<locale>en_EN</locale>
-		<authType>ABIQUO</authType>
-		<active>true</active>
-    </user>
-    <user>
-		<link rel="edit" type="application/vnd.abiquo.user+xml" href="http://localhost/api/admin/enterprises/1/users/2"/>
-		<link rel="enterprise" type="application/vnd.abiquo.enterprise+xml" href="http://localhost/api/admin/enterprises/1"/>
-		<link rel="role" type="application/vnd.abiquo.role+xml" href="http://localhost/api/admin/roles/7"/>
-		<link rel="virtualmachines" type="application/vnd.abiquo.virtualmachines+xml" href="http://localhost/api/admin/enterprises/1/users/2/action/virtualmachines"/>
-		<id>2</id>
-		<nick>granger</nick>
-		<password>0371e4dce3c8804f1543c3f0f309cc10</password>
-		<name>Hermione</name>
-		<surname>Granger</surname>
-		<description/>
-		<email>hermione.granger@hogwarts.edu</email>
-		<locale>en_EN</locale>
-		<authType>ABIQUO</authType>
-		<active>true</active>
-    </user>
-    <user>
-		<link rel="edit" type="application/vnd.abiquo.user+xml" href="http://localhost/api/admin/enterprises/1/users/3"/>
-		<link rel="enterprise" type="application/vnd.abiquo.enterprise+xml" href="http://localhost/api/admin/enterprises/1"/>
-		<link rel="role" type="application/vnd.abiquo.role+xml" href="http://localhost/api/admin/roles/7"/>
-		<link rel="virtualmachines" type="application/vnd.abiquo.virtualmachines+xml" href="http://localhost/api/admin/enterprises/1/users/3/action/virtualmachines"/>
-		<id>3</id>
-		<nick>ron</nick>
-		<password>0371e4dce3c8804f1543c3f0f309cc10</password>
-		<name>Ron</name>
-		<surname>Weasley</surname>
-		<description/>
-		<email>ron.weasley@hogwarts.edu</email>
-		<locale>en_EN</locale>
-		<authType>ABIQUO</authType>
-		<active>true</active>
-    </user>
-</users>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/vms-lastpage.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/vms-lastpage.xml b/abiquo/src/test/resources/payloads/vms-lastpage.xml
new file mode 100644
index 0000000..889874f
--- /dev/null
+++ b/abiquo/src/test/resources/payloads/vms-lastpage.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<virtualmachineswithnodeextended>
+    <link href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines" rel="first" />
+    <link href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines?startwith=0" rel="previous" />
+    <link href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines?startwith=2" rel="last" />
+    <totalSize>2</totalSize>
+    <virtualmachinewithnodeextended>
+        <link rel="deploy" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/action/deploy" />
+        <link rel="disks" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/storage/disks" />
+        <link rel="edit" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1" />
+        <link rel="state" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/state" />
+        <link rel="reset" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/action/reset" />
+        <link rel="tasks" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/tasks" />
+        <link rel="undeploy" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/action/undeploy" />
+        <link rel="persistent" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/action/persistent" />
+        <link rel="virtualappliance" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1" />
+        <link rel="virtualmachinetemplate" href="/admin/enterprises/1/datacenterrepositories/1/virtualmachinetemplates/1" />
+        <link rel="nics" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/network/nics" />
+        <link rel="volumes" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/storage/volumes" />
+        <link rel="configurations" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/network/configurations" />
+        <cpu>0</cpu>
+        <hdInBytes>0</hdInBytes>
+        <highDisponibility>0</highDisponibility>
+        <id>2</id>
+        <idState>0</idState>
+        <idType>0</idType>
+        <name>VM</name>
+        <ram>0</ram>
+        <vdrpPort>0</vdrpPort>
+    </virtualmachinewithnodeextended>
+</virtualmachineswithnodeextended>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/vms-page.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/vms-page.xml b/abiquo/src/test/resources/payloads/vms-page.xml
new file mode 100644
index 0000000..4535697
--- /dev/null
+++ b/abiquo/src/test/resources/payloads/vms-page.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<virtualmachineswithnodeextended>
+    <link href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines" rel="first" />
+    <link href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines?startwith=2" rel="next" />
+    <link href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines?startwith=2" rel="last" />
+    <totalSize>2</totalSize>
+    <virtualmachinewithnodeextended>
+        <link rel="deploy" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/action/deploy" />
+        <link rel="disks" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/storage/disks" />
+        <link rel="edit" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1" />
+        <link rel="state" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/state" />
+        <link rel="reset" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/action/reset" />
+        <link rel="tasks" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/tasks" />
+        <link rel="undeploy" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/action/undeploy" />
+        <link rel="persistent" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/action/persistent" />
+        <link rel="virtualappliance" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1" />
+        <link rel="virtualmachinetemplate" href="/admin/enterprises/1/datacenterrepositories/1/virtualmachinetemplates/1" />
+        <link rel="nics" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/network/nics" />
+        <link rel="volumes" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/storage/volumes" />
+        <link rel="configurations" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/network/configurations" />
+        <cpu>0</cpu>
+        <hdInBytes>0</hdInBytes>
+        <highDisponibility>0</highDisponibility>
+        <id>1</id>
+        <idState>0</idState>
+        <idType>0</idType>
+        <name>VM</name>
+        <ram>0</ram>
+        <vdrpPort>0</vdrpPort>
+    </virtualmachinewithnodeextended>
+</virtualmachineswithnodeextended>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/volumes-lastpage.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/volumes-lastpage.xml b/abiquo/src/test/resources/payloads/volumes-lastpage.xml
new file mode 100644
index 0000000..3df58b0
--- /dev/null
+++ b/abiquo/src/test/resources/payloads/volumes-lastpage.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<volumes>
+    <link href="http://example.com/api/cloud/virtualdatacenters/1/volumes" rel="first" />
+    <link href="http://example.com/api/cloud/virtualdatacenters/1/volumes?startwith=0" rel="previous" />
+    <link href="http://example.com/api/cloud/virtualdatacenters/1/volumes?startwith=1" rel="last" />
+    <totalSize>2</totalSize>
+    <volume>
+        <link href="http://example.com/api/cloud/virtualdatacenters/1/volumes/1531" rel="edit" type="application/vnd.abiquo.volume+xml" />
+        <link href="http://example.com/api/cloud/virtualdatacenters/1/volumes/1531/action/initiatormappings" rel="initiator mappings" type="application/vnd.abiquo.initiatormappings+xml" />
+        <link href="http://example.com/api/cloud/virtualdatacenters/1/tiers/1" rel="tier" title="Default Tier 1" type="application/vnd.abiquo.tier+xml" />
+        <link href="http://example.com/api/cloud/virtualdatacenters/1" rel="virtualdatacenter" title="Aloha updated" type="application/vnd.abiquo.virtualdatacenter+xml" />
+        <id>1531</id>
+        <name>Hawaian volume updated</name>
+        <state>DETACHED</state>
+        <sizeInMB>32</sizeInMB>
+        <sequence>0</sequence>
+    </volume>
+</volumes>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/volumes-page.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/volumes-page.xml b/abiquo/src/test/resources/payloads/volumes-page.xml
new file mode 100644
index 0000000..d069445
--- /dev/null
+++ b/abiquo/src/test/resources/payloads/volumes-page.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<volumes>
+    <link href="http://example.com/api/cloud/virtualdatacenters/1/volumes" rel="first" />
+    <link href="http://example.com/api/cloud/virtualdatacenters/1/volumes?startwith=1" rel="next" />
+    <link href="http://example.com/api/cloud/virtualdatacenters/1/volumes?startwith=1" rel="last" />
+    <totalSize>2</totalSize>
+    <volume>
+        <link href="http://example.com/api/cloud/virtualdatacenters/1/volumes/1530" rel="edit" type="application/vnd.abiquo.volume+xml" />
+        <link href="http://example.com/api/cloud/virtualdatacenters/1/volumes/1530/action/initiatormappings" rel="initiator mappings" type="application/vnd.abiquo.initiatormappings+xml" />
+        <link href="http://example.com/api/cloud/virtualdatacenters/1/tiers/1" rel="tier" title="Default Tier 1" type="application/vnd.abiquo.tier+xml" />
+        <link href="http://example.com/api/cloud/virtualdatacenters/1" rel="virtualdatacenter" title="Aloha updated" type="application/vnd.abiquo.virtualdatacenter+xml" />
+        <id>1530</id>
+        <name>Hawaian volume updated</name>
+        <state>DETACHED</state>
+        <sizeInMB>32</sizeInMB>
+        <sequence>0</sequence>
+    </volume>
+</volumes>
\ No newline at end of file


[4/5] JCLOUDS-198: Implemented the PagedIterable in Abiquo

Posted by na...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/domain/network/PublicNetwork.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/domain/network/PublicNetwork.java b/abiquo/src/main/java/org/jclouds/abiquo/domain/network/PublicNetwork.java
index e1c1dce..aa3f562 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/domain/network/PublicNetwork.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/domain/network/PublicNetwork.java
@@ -18,13 +18,13 @@ package org.jclouds.abiquo.domain.network;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import java.util.List;
-
 import org.jclouds.abiquo.AbiquoApi;
+import org.jclouds.abiquo.domain.PaginatedCollection;
 import org.jclouds.abiquo.domain.infrastructure.Datacenter;
 import org.jclouds.abiquo.domain.network.options.IpOptions;
 import org.jclouds.abiquo.reference.ValidationErrors;
 import org.jclouds.abiquo.reference.rest.ParentLinkName;
+import org.jclouds.collect.PagedIterable;
 import org.jclouds.http.HttpResponse;
 import org.jclouds.http.functions.ParseXMLWithJAXB;
 import org.jclouds.rest.ApiContext;
@@ -92,16 +92,17 @@ public class PublicNetwork extends Network<PublicIp> {
       target = context.getApi().getInfrastructureApi().updateNetwork(target);
    }
 
-   /**
-    * @see API: <a href=
-    *      "http://community.abiquo.com/display/ABI20/Public+IPs+Resource#PublicIPsResource-ReturnthelistofIPsforaPublicNetwork"
-    *      > http://community.abiquo.com/display/ABI20/Public+IPs+Resource#
-    *      PublicIPsResource- ReturnthelistofIPsforaPublicNetwork</a>
-    */
    @Override
-   public List<PublicIp> listIps(final IpOptions options) {
-      PublicIpsDto ips = context.getApi().getInfrastructureApi().listPublicIps(target, options);
-      return wrap(context, PublicIp.class, ips.getCollection());
+   public Iterable<PublicIp> listIps() {
+      PagedIterable<PublicIpDto> ips = context.getApi().getInfrastructureApi().listPublicIps(target);
+      return wrap(context, PublicIp.class, ips.concat());
+   }
+
+   @Override
+   public Iterable<PublicIp> listIps(final IpOptions options) {
+      PaginatedCollection<PublicIpDto, PublicIpsDto> ips = context.getApi().getInfrastructureApi()
+            .listPublicIps(target, options);
+      return wrap(context, PublicIp.class, ips.toPagedIterable().concat());
    }
 
    @Override

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/domain/network/UnmanagedNetwork.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/domain/network/UnmanagedNetwork.java b/abiquo/src/main/java/org/jclouds/abiquo/domain/network/UnmanagedNetwork.java
index 15f6bb3..6de0a29 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/domain/network/UnmanagedNetwork.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/domain/network/UnmanagedNetwork.java
@@ -18,14 +18,14 @@ package org.jclouds.abiquo.domain.network;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import java.util.List;
-
 import org.jclouds.abiquo.AbiquoApi;
+import org.jclouds.abiquo.domain.PaginatedCollection;
 import org.jclouds.abiquo.domain.enterprise.Enterprise;
 import org.jclouds.abiquo.domain.infrastructure.Datacenter;
 import org.jclouds.abiquo.domain.network.options.IpOptions;
 import org.jclouds.abiquo.reference.ValidationErrors;
 import org.jclouds.abiquo.reference.rest.ParentLinkName;
+import org.jclouds.collect.PagedIterable;
 import org.jclouds.http.HttpResponse;
 import org.jclouds.http.functions.ParseXMLWithJAXB;
 import org.jclouds.rest.ApiContext;
@@ -98,16 +98,17 @@ public class UnmanagedNetwork extends Network<UnmanagedIp> {
       target = context.getApi().getInfrastructureApi().updateNetwork(target);
    }
 
-   /**
-    * @see API: <a href=
-    *      "http://community.abiquo.com/display/ABI20/Public+IPs+Resource#PublicIPsResource-ReturnthelistofIPsforaPublicNetwork"
-    *      > http://community.abiquo.com/display/ABI20/Public+IPs+Resource#
-    *      PublicIPsResource- ReturnthelistofIPsforaPublicNetwork</a>
-    */
    @Override
-   public List<UnmanagedIp> listIps(final IpOptions options) {
-      UnmanagedIpsDto ips = context.getApi().getInfrastructureApi().listUnmanagedIps(target, options);
-      return wrap(context, UnmanagedIp.class, ips.getCollection());
+   public Iterable<UnmanagedIp> listIps() {
+      PagedIterable<UnmanagedIpDto> ips = context.getApi().getInfrastructureApi().listUnmanagedIps(target);
+      return wrap(context, UnmanagedIp.class, ips.concat());
+   }
+
+   @Override
+   public Iterable<UnmanagedIp> listIps(final IpOptions options) {
+      PaginatedCollection<UnmanagedIpDto, UnmanagedIpsDto> ips = context.getApi().getInfrastructureApi()
+            .listUnmanagedIps(target, options);
+      return wrap(context, UnmanagedIp.class, ips.toPagedIterable().concat());
    }
 
    @Override

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/domain/options/FilterOptions.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/domain/options/FilterOptions.java b/abiquo/src/main/java/org/jclouds/abiquo/domain/options/FilterOptions.java
index 2bcf022..c8cfc45 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/domain/options/FilterOptions.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/domain/options/FilterOptions.java
@@ -76,21 +76,11 @@ public class FilterOptions extends BaseHttpRequestOptions {
          return (T) this;
       }
 
-      public T ascendant(final boolean asc) {
+      public T asc(final boolean asc) {
          this.asc = asc;
          return (T) this;
       }
 
-      public T descendant(final boolean desc) {
-         this.asc = !desc;
-         return (T) this;
-      }
-
-      public T disablePagination() {
-         this.limit = 0;
-         return (T) this;
-      }
-
       protected <O extends BaseHttpRequestOptions> O addFilterOptions(final O options) {
          Multimap<String, String> queryParameters = options.buildQueryParameters();
 

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/domain/task/AsyncTask.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/domain/task/AsyncTask.java b/abiquo/src/main/java/org/jclouds/abiquo/domain/task/AsyncTask.java
index fca2827..1594184 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/domain/task/AsyncTask.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/domain/task/AsyncTask.java
@@ -18,8 +18,6 @@ package org.jclouds.abiquo.domain.task;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import java.util.List;
-
 import org.jclouds.abiquo.AbiquoApi;
 import org.jclouds.abiquo.domain.DomainWrapper;
 import org.jclouds.abiquo.reference.ValidationErrors;
@@ -93,7 +91,7 @@ public abstract class AsyncTask<T extends DomainWrapper<D>, D extends SingleReso
    /**
     * Get the individual jobs that compose the current task.
     */
-   public List<AsyncJob> getJobs() {
+   public Iterable<AsyncJob> getJobs() {
       return wrap(context, AsyncJob.class, target.getJobs().getCollection());
    }
 

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/features/CloudApi.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/features/CloudApi.java b/abiquo/src/main/java/org/jclouds/abiquo/features/CloudApi.java
index 3906e63..fa34f17 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/features/CloudApi.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/features/CloudApi.java
@@ -40,6 +40,7 @@ import org.jclouds.abiquo.binders.cloud.BindNetworkConfigurationRefToPayload;
 import org.jclouds.abiquo.binders.cloud.BindNetworkRefToPayload;
 import org.jclouds.abiquo.binders.cloud.BindVirtualDatacenterRefToPayload;
 import org.jclouds.abiquo.binders.cloud.BindVolumeRefsToPayload;
+import org.jclouds.abiquo.domain.PaginatedCollection;
 import org.jclouds.abiquo.domain.cloud.options.VirtualApplianceOptions;
 import org.jclouds.abiquo.domain.cloud.options.VirtualDatacenterOptions;
 import org.jclouds.abiquo.domain.cloud.options.VirtualMachineOptions;
@@ -50,9 +51,15 @@ import org.jclouds.abiquo.fallbacks.MovedVolume;
 import org.jclouds.abiquo.functions.ReturnTaskReferenceOrNull;
 import org.jclouds.abiquo.functions.enterprise.ParseEnterpriseId;
 import org.jclouds.abiquo.functions.infrastructure.ParseDatacenterId;
+import org.jclouds.abiquo.functions.pagination.ParsePrivateIps;
+import org.jclouds.abiquo.functions.pagination.ParsePublicIps;
+import org.jclouds.abiquo.functions.pagination.ParseVirtualMachineTemplates;
+import org.jclouds.abiquo.functions.pagination.ParseVirtualMachines;
+import org.jclouds.abiquo.functions.pagination.ParseVolumes;
 import org.jclouds.abiquo.http.filters.AbiquoAuthentication;
 import org.jclouds.abiquo.http.filters.AppendApiVersionToMediaType;
 import org.jclouds.abiquo.rest.annotations.EndpointLink;
+import org.jclouds.collect.PagedIterable;
 import org.jclouds.http.functions.ReturnStringIf2xx;
 import org.jclouds.rest.annotations.BinderParam;
 import org.jclouds.rest.annotations.Fallback;
@@ -61,6 +68,7 @@ import org.jclouds.rest.annotations.ParamParser;
 import org.jclouds.rest.annotations.RequestFilters;
 import org.jclouds.rest.annotations.ResponseParser;
 import org.jclouds.rest.annotations.SinceApiVersion;
+import org.jclouds.rest.annotations.Transform;
 import org.jclouds.rest.binders.BindToXMLPayload;
 
 import com.abiquo.model.transport.AcceptedRequestDto;
@@ -195,8 +203,9 @@ public interface CloudApi extends Closeable {
    @Named("vdc:listtemplates")
    @GET
    @Consumes(VirtualMachineTemplatesDto.BASE_MEDIA_TYPE)
-   @JAXBResponseParser
-   VirtualMachineTemplatesDto listAvailableTemplates(
+   @ResponseParser(ParseVirtualMachineTemplates.class)
+   @Transform(ParseVirtualMachineTemplates.ToPagedIterable.class)
+   PagedIterable<VirtualMachineTemplateDto> listAvailableTemplates(
          @EndpointLink("templates") @BinderParam(BindToPath.class) VirtualDatacenterDto virtualDatacenter);
 
    /**
@@ -211,8 +220,8 @@ public interface CloudApi extends Closeable {
    @Named("vdc:listtemplates")
    @GET
    @Consumes(VirtualMachineTemplatesDto.BASE_MEDIA_TYPE)
-   @JAXBResponseParser
-   VirtualMachineTemplatesDto listAvailableTemplates(
+   @ResponseParser(ParseVirtualMachineTemplates.class)
+   PaginatedCollection<VirtualMachineTemplateDto, VirtualMachineTemplatesDto> listAvailableTemplates(
          @EndpointLink("templates") @BinderParam(BindToPath.class) VirtualDatacenterDto virtualDatacenter,
          VirtualMachineTemplateOptions options);
 
@@ -229,8 +238,26 @@ public interface CloudApi extends Closeable {
    @Named("vdc:listavailablepublicips")
    @GET
    @Consumes(PublicIpsDto.BASE_MEDIA_TYPE)
-   @JAXBResponseParser
-   PublicIpsDto listAvailablePublicIps(
+   @ResponseParser(ParsePublicIps.class)
+   @Transform(ParsePublicIps.ToPagedIterable.class)
+   PagedIterable<PublicIpDto> listAvailablePublicIps(
+         @EndpointLink("topurchase") @BinderParam(BindToPath.class) VirtualDatacenterDto virtualDatacenter);
+
+   /**
+    * List all available ips to purchase in the datacenter by the virtual
+    * datacenter.
+    * 
+    * @param virtualDatacenter
+    *           The virtual datacenter.
+    * @param options
+    *           Filtering options.
+    * @return The list of available ips.
+    */
+   @Named("vdc:listavailablepublicips")
+   @GET
+   @Consumes(PublicIpsDto.BASE_MEDIA_TYPE)
+   @ResponseParser(ParsePublicIps.class)
+   PaginatedCollection<PublicIpDto, PublicIpsDto> listAvailablePublicIps(
          @EndpointLink("topurchase") @BinderParam(BindToPath.class) VirtualDatacenterDto virtualDatacenter,
          IpOptions options);
 
@@ -246,8 +273,25 @@ public interface CloudApi extends Closeable {
    @Named("vdc:listpurchasedpublicips")
    @GET
    @Consumes(PublicIpsDto.BASE_MEDIA_TYPE)
-   @JAXBResponseParser
-   PublicIpsDto listPurchasedPublicIps(
+   @ResponseParser(ParsePublicIps.class)
+   @Transform(ParsePublicIps.ToPagedIterable.class)
+   PagedIterable<PublicIpDto> listPurchasedPublicIps(
+         @EndpointLink("purchased") @BinderParam(BindToPath.class) VirtualDatacenterDto virtualDatacenter);
+
+   /**
+    * List all purchased public ip addresses in the virtual datacenter.
+    * 
+    * @param virtualDatacenter
+    *           The virtual datacenter.
+    * @param options
+    *           Filtering options.
+    * @return The list of purchased ips.
+    */
+   @Named("vdc:listpurchasedpublicips")
+   @GET
+   @Consumes(PublicIpsDto.BASE_MEDIA_TYPE)
+   @ResponseParser(ParsePublicIps.class)
+   PaginatedCollection<PublicIpDto, PublicIpsDto> listPurchasedPublicIps(
          @EndpointLink("purchased") @BinderParam(BindToPath.class) VirtualDatacenterDto virtualDatacenter,
          IpOptions options);
 
@@ -426,8 +470,10 @@ public interface CloudApi extends Closeable {
    @Named("privatenetwork:listips")
    @GET
    @Consumes(PrivateIpsDto.BASE_MEDIA_TYPE)
-   @JAXBResponseParser
-   PrivateIpsDto listPrivateNetworkIps(@EndpointLink("ips") @BinderParam(BindToPath.class) VLANNetworkDto network);
+   @ResponseParser(ParsePrivateIps.class)
+   @Transform(ParsePrivateIps.ToPagedIterable.class)
+   PagedIterable<PrivateIpDto> listPrivateNetworkIps(
+         @EndpointLink("ips") @BinderParam(BindToPath.class) VLANNetworkDto network);
 
    /**
     * List all ips for a private network with options.
@@ -441,9 +487,9 @@ public interface CloudApi extends Closeable {
    @Named("privatenetwork:listips")
    @GET
    @Consumes(PrivateIpsDto.BASE_MEDIA_TYPE)
-   @JAXBResponseParser
-   PrivateIpsDto listPrivateNetworkIps(@EndpointLink("ips") @BinderParam(BindToPath.class) VLANNetworkDto network,
-         IpOptions options);
+   @ResponseParser(ParsePrivateIps.class)
+   PaginatedCollection<PrivateIpDto, PrivateIpsDto> listPrivateNetworkIps(
+         @EndpointLink("ips") @BinderParam(BindToPath.class) VLANNetworkDto network, IpOptions options);
 
    /**
     * Get the requested ip from the given private network.
@@ -630,8 +676,25 @@ public interface CloudApi extends Closeable {
    @GET
    @Path("/virtualmachines")
    @Consumes(VirtualMachinesWithNodeExtendedDto.BASE_MEDIA_TYPE)
-   @JAXBResponseParser
-   VirtualMachinesWithNodeExtendedDto listAllVirtualMachines();
+   @ResponseParser(ParseVirtualMachines.class)
+   @Transform(ParseVirtualMachines.ToPagedIterable.class)
+   PagedIterable<VirtualMachineWithNodeExtendedDto> listAllVirtualMachines();
+
+   /**
+    * List all virtual machines available to the current user.
+    * 
+    * @param options
+    *           The filter options.
+    * @return The list of all virtual machines available to the current user.
+    */
+   @SinceApiVersion("2.4")
+   @Named("vm:listall")
+   @GET
+   @Path("/virtualmachines")
+   @Consumes(VirtualMachinesWithNodeExtendedDto.BASE_MEDIA_TYPE)
+   @ResponseParser(ParseVirtualMachines.class)
+   PaginatedCollection<VirtualMachineWithNodeExtendedDto, VirtualMachinesWithNodeExtendedDto> listAllVirtualMachines(
+         VirtualMachineOptions options);
 
    /**
     * List all virtual machines for a virtual appliance.
@@ -643,8 +706,9 @@ public interface CloudApi extends Closeable {
    @Named("vm:list")
    @GET
    @Consumes(VirtualMachinesWithNodeExtendedDto.BASE_MEDIA_TYPE)
-   @JAXBResponseParser
-   VirtualMachinesWithNodeExtendedDto listVirtualMachines(
+   @ResponseParser(ParseVirtualMachines.class)
+   @Transform(ParseVirtualMachines.ToPagedIterable.class)
+   PagedIterable<VirtualMachineWithNodeExtendedDto> listVirtualMachines(
          @EndpointLink("virtualmachines") @BinderParam(BindToPath.class) VirtualApplianceDto virtualAppliance);
 
    /**
@@ -659,8 +723,8 @@ public interface CloudApi extends Closeable {
    @Named("vm:list")
    @GET
    @Consumes(VirtualMachinesWithNodeExtendedDto.BASE_MEDIA_TYPE)
-   @JAXBResponseParser
-   VirtualMachinesWithNodeExtendedDto listVirtualMachines(
+   @ResponseParser(ParseVirtualMachines.class)
+   PaginatedCollection<VirtualMachineWithNodeExtendedDto, VirtualMachinesWithNodeExtendedDto> listVirtualMachines(
          @EndpointLink("virtualmachines") @BinderParam(BindToPath.class) VirtualApplianceDto virtualAppliance,
          VirtualMachineOptions options);
 
@@ -1079,8 +1143,9 @@ public interface CloudApi extends Closeable {
    @Named("volume:list")
    @GET
    @Consumes(VolumesManagementDto.BASE_MEDIA_TYPE)
-   @JAXBResponseParser
-   VolumesManagementDto listVolumes(
+   @ResponseParser(ParseVolumes.class)
+   @Transform(ParseVolumes.ToPagedIterable.class)
+   PagedIterable<VolumeManagementDto> listVolumes(
          @EndpointLink("volumes") @BinderParam(BindToPath.class) VirtualDatacenterDto virtualDatacenter);
 
    /**
@@ -1095,8 +1160,8 @@ public interface CloudApi extends Closeable {
    @Named("volume:list")
    @GET
    @Consumes(VolumesManagementDto.BASE_MEDIA_TYPE)
-   @JAXBResponseParser
-   VolumesManagementDto listVolumes(
+   @ResponseParser(ParseVolumes.class)
+   PaginatedCollection<VolumeManagementDto, VolumesManagementDto> listVolumes(
          @EndpointLink("volumes") @BinderParam(BindToPath.class) VirtualDatacenterDto virtualDatacenter,
          VolumeOptions options);
 

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/features/EnterpriseApi.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/features/EnterpriseApi.java b/abiquo/src/main/java/org/jclouds/abiquo/features/EnterpriseApi.java
index 668e288..a7d1b04 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/features/EnterpriseApi.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/features/EnterpriseApi.java
@@ -33,17 +33,23 @@ import org.jclouds.Fallbacks.NullOnNotFoundOr404;
 import org.jclouds.abiquo.binders.AppendToPath;
 import org.jclouds.abiquo.binders.BindToPath;
 import org.jclouds.abiquo.binders.BindToXMLPayloadAndPath;
+import org.jclouds.abiquo.domain.PaginatedCollection;
 import org.jclouds.abiquo.domain.enterprise.options.EnterpriseOptions;
 import org.jclouds.abiquo.domain.enterprise.options.UserOptions;
 import org.jclouds.abiquo.functions.infrastructure.ParseDatacenterId;
+import org.jclouds.abiquo.functions.pagination.ParseEnterprises;
+import org.jclouds.abiquo.functions.pagination.ParseUsers;
 import org.jclouds.abiquo.http.filters.AbiquoAuthentication;
 import org.jclouds.abiquo.http.filters.AppendApiVersionToMediaType;
 import org.jclouds.abiquo.rest.annotations.EndpointLink;
+import org.jclouds.collect.PagedIterable;
 import org.jclouds.rest.annotations.BinderParam;
 import org.jclouds.rest.annotations.Fallback;
 import org.jclouds.rest.annotations.JAXBResponseParser;
 import org.jclouds.rest.annotations.ParamParser;
 import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.ResponseParser;
+import org.jclouds.rest.annotations.Transform;
 import org.jclouds.rest.binders.BindToXMLPayload;
 
 import com.abiquo.am.model.TemplatesStateDto;
@@ -88,8 +94,9 @@ public interface EnterpriseApi extends Closeable {
    @GET
    @Path("/enterprises")
    @Consumes(EnterprisesDto.BASE_MEDIA_TYPE)
-   @JAXBResponseParser
-   EnterprisesDto listEnterprises();
+   @ResponseParser(ParseEnterprises.class)
+   @Transform(ParseEnterprises.ToPagedIterable.class)
+   PagedIterable<EnterpriseDto> listEnterprises();
 
    /**
     * List enterprises with options.
@@ -102,8 +109,8 @@ public interface EnterpriseApi extends Closeable {
    @GET
    @Path("/enterprises")
    @Consumes(EnterprisesDto.BASE_MEDIA_TYPE)
-   @JAXBResponseParser
-   EnterprisesDto listEnterprises(EnterpriseOptions options);
+   @ResponseParser(ParseEnterprises.class)
+   PaginatedCollection<EnterpriseDto, EnterprisesDto> listEnterprises(EnterpriseOptions options);
 
    /**
     * List filtered enterprises by datacenter.
@@ -117,9 +124,9 @@ public interface EnterpriseApi extends Closeable {
    @Named("enterprise:list")
    @GET
    @Consumes(EnterprisesDto.BASE_MEDIA_TYPE)
-   @JAXBResponseParser
-   EnterprisesDto listEnterprises(@EndpointLink("enterprises") @BinderParam(BindToPath.class) DatacenterDto datacenter,
-         EnterpriseOptions options);
+   @ResponseParser(ParseEnterprises.class)
+   PaginatedCollection<EnterpriseDto, EnterprisesDto> listEnterprises(
+         @EndpointLink("enterprises") @BinderParam(BindToPath.class) DatacenterDto datacenter, EnterpriseOptions options);
 
    /**
     * Create a new enterprise.
@@ -327,9 +334,10 @@ public interface EnterpriseApi extends Closeable {
    @Named("user:list")
    @GET
    @Consumes(UsersDto.BASE_MEDIA_TYPE)
-   @JAXBResponseParser
-   UsersDto listUsers(@EndpointLink("users") @BinderParam(BindToPath.class) EnterpriseDto enterprise);
-   
+   @ResponseParser(ParseUsers.class)
+   @Transform(ParseUsers.ToPagedIterable.class)
+   PagedIterable<UserDto> listUsers(@EndpointLink("users") @BinderParam(BindToPath.class) EnterpriseDto enterprise);
+
    /**
     * List filtered users by enterprise.
     * 
@@ -342,9 +350,9 @@ public interface EnterpriseApi extends Closeable {
    @Named("user:list")
    @GET
    @Consumes(UsersDto.BASE_MEDIA_TYPE)
-   @JAXBResponseParser
-   UsersDto listUsers(@EndpointLink("users") @BinderParam(BindToPath.class) EnterpriseDto enterprise,
-         UserOptions options);
+   @ResponseParser(ParseUsers.class)
+   PaginatedCollection<UserDto, UsersDto> listUsers(
+         @EndpointLink("users") @BinderParam(BindToPath.class) EnterpriseDto enterprise, UserOptions options);
 
    /**
     * Create a new user in the given enterprise.

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/features/EventApi.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/features/EventApi.java b/abiquo/src/main/java/org/jclouds/abiquo/features/EventApi.java
index 3e3ef1b..e9040fd 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/features/EventApi.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/features/EventApi.java
@@ -23,12 +23,17 @@ import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
 
+import org.jclouds.abiquo.domain.PaginatedCollection;
 import org.jclouds.abiquo.domain.event.options.EventOptions;
+import org.jclouds.abiquo.functions.pagination.ParseEvents;
 import org.jclouds.abiquo.http.filters.AbiquoAuthentication;
 import org.jclouds.abiquo.http.filters.AppendApiVersionToMediaType;
-import org.jclouds.rest.annotations.JAXBResponseParser;
+import org.jclouds.collect.PagedIterable;
 import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.ResponseParser;
+import org.jclouds.rest.annotations.Transform;
 
+import com.abiquo.server.core.event.EventDto;
 import com.abiquo.server.core.event.EventsDto;
 
 /**
@@ -50,8 +55,9 @@ public interface EventApi extends Closeable {
    @Named("event:list")
    @GET
    @Consumes(EventsDto.BASE_MEDIA_TYPE)
-   @JAXBResponseParser
-   EventsDto listEvents();
+   @ResponseParser(ParseEvents.class)
+   @Transform(ParseEvents.ToPagedIterable.class)
+   PagedIterable<EventDto> listEvents();
 
    /**
     * List events using filters.
@@ -61,6 +67,6 @@ public interface EventApi extends Closeable {
    @Named("event:list")
    @GET
    @Consumes(EventsDto.BASE_MEDIA_TYPE)
-   @JAXBResponseParser
-   EventsDto listEvents(EventOptions options);
+   @ResponseParser(ParseEvents.class)
+   PaginatedCollection<EventDto, EventsDto> listEvents(EventOptions options);
 }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/features/InfrastructureApi.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/features/InfrastructureApi.java b/abiquo/src/main/java/org/jclouds/abiquo/features/InfrastructureApi.java
index 391d48d..85b799f 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/features/InfrastructureApi.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/features/InfrastructureApi.java
@@ -39,6 +39,7 @@ import org.jclouds.abiquo.binders.BindToXMLPayloadAndPath;
 import org.jclouds.abiquo.binders.infrastructure.AppendMachineIdToPath;
 import org.jclouds.abiquo.binders.infrastructure.AppendRemoteServiceTypeToPath;
 import org.jclouds.abiquo.binders.infrastructure.BindSupportedDevicesLinkToPath;
+import org.jclouds.abiquo.domain.PaginatedCollection;
 import org.jclouds.abiquo.domain.infrastructure.options.DatacenterOptions;
 import org.jclouds.abiquo.domain.infrastructure.options.IpmiOptions;
 import org.jclouds.abiquo.domain.infrastructure.options.MachineOptions;
@@ -46,9 +47,13 @@ import org.jclouds.abiquo.domain.infrastructure.options.StoragePoolOptions;
 import org.jclouds.abiquo.domain.network.options.IpOptions;
 import org.jclouds.abiquo.domain.network.options.NetworkOptions;
 import org.jclouds.abiquo.functions.infrastructure.ParseDatacenterId;
+import org.jclouds.abiquo.functions.pagination.ParseExternalIps;
+import org.jclouds.abiquo.functions.pagination.ParsePublicIps;
+import org.jclouds.abiquo.functions.pagination.ParseUnmanagedIps;
 import org.jclouds.abiquo.http.filters.AbiquoAuthentication;
 import org.jclouds.abiquo.http.filters.AppendApiVersionToMediaType;
 import org.jclouds.abiquo.rest.annotations.EndpointLink;
+import org.jclouds.collect.PagedIterable;
 import org.jclouds.http.functions.ReturnStringIf2xx;
 import org.jclouds.rest.annotations.BinderParam;
 import org.jclouds.rest.annotations.Fallback;
@@ -56,6 +61,8 @@ import org.jclouds.rest.annotations.JAXBResponseParser;
 import org.jclouds.rest.annotations.ParamParser;
 import org.jclouds.rest.annotations.RequestFilters;
 import org.jclouds.rest.annotations.ResponseParser;
+import org.jclouds.rest.annotations.SinceApiVersion;
+import org.jclouds.rest.annotations.Transform;
 import org.jclouds.rest.binders.BindToXMLPayload;
 
 import com.abiquo.model.enumerator.HypervisorType;
@@ -1141,13 +1148,14 @@ public interface InfrastructureApi extends Closeable {
     * @param network
     *           The public network.
     * @return The IPs in the given public network.
-    * @since 2.3
     */
+   @SinceApiVersion("2.3")
    @Named("publicnetwork:listips")
    @GET
    @Consumes(PublicIpsDto.BASE_MEDIA_TYPE)
-   @JAXBResponseParser
-   PublicIpsDto listPublicIps(@EndpointLink("ips") @BinderParam(BindToPath.class) VLANNetworkDto network);
+   @ResponseParser(ParsePublicIps.class)
+   @Transform(ParsePublicIps.ToPagedIterable.class)
+   PagedIterable<PublicIpDto> listPublicIps(@EndpointLink("ips") @BinderParam(BindToPath.class) VLANNetworkDto network);
 
    /**
     * List all the IPs in the given public network.
@@ -1157,14 +1165,14 @@ public interface InfrastructureApi extends Closeable {
     * @param options
     *           The filtering options.
     * @return The IPs in the given public network.
-    * @since 2.3
     */
+   @SinceApiVersion("2.3")
    @Named("publicnetwork:listips")
    @GET
    @Consumes(PublicIpsDto.BASE_MEDIA_TYPE)
-   @JAXBResponseParser
-   PublicIpsDto listPublicIps(@EndpointLink("ips") @BinderParam(BindToPath.class) VLANNetworkDto network,
-         IpOptions options);
+   @ResponseParser(ParsePublicIps.class)
+   PaginatedCollection<PublicIpDto, PublicIpsDto> listPublicIps(
+         @EndpointLink("ips") @BinderParam(BindToPath.class) VLANNetworkDto network, IpOptions options);
 
    /**
     * Get the given public ip.
@@ -1174,8 +1182,8 @@ public interface InfrastructureApi extends Closeable {
     * @param ipId
     *           The id of the ip to get.
     * @return The requested ip.
-    * @since 2.3
     */
+   @SinceApiVersion("2.3")
    @Named("publicnetwork:getip")
    @GET
    @Consumes(PublicIpDto.BASE_MEDIA_TYPE)
@@ -1189,13 +1197,15 @@ public interface InfrastructureApi extends Closeable {
     * @param network
     *           The external network.
     * @return The IPs in the given external network.
-    * @since 2.3
     */
+   @SinceApiVersion("2.3")
    @Named("externalnetwork:listips")
    @GET
    @Consumes(ExternalIpsDto.BASE_MEDIA_TYPE)
-   @JAXBResponseParser
-   ExternalIpsDto listExternalIps(@EndpointLink("ips") @BinderParam(BindToPath.class) VLANNetworkDto network);
+   @ResponseParser(ParseExternalIps.class)
+   @Transform(ParseExternalIps.ToPagedIterable.class)
+   PagedIterable<ExternalIpDto> listExternalIps(
+         @EndpointLink("ips") @BinderParam(BindToPath.class) VLANNetworkDto network);
 
    /**
     * List all the IPs in the given external network.
@@ -1205,14 +1215,14 @@ public interface InfrastructureApi extends Closeable {
     * @param options
     *           The filtering options.
     * @return The IPs in the given external network.
-    * @since 2.3
     */
+   @SinceApiVersion("2.3")
    @Named("externalnetwork:listips")
    @GET
    @Consumes(ExternalIpsDto.BASE_MEDIA_TYPE)
-   @JAXBResponseParser
-   ExternalIpsDto listExternalIps(@EndpointLink("ips") @BinderParam(BindToPath.class) VLANNetworkDto network,
-         IpOptions options);
+   @ResponseParser(ParseExternalIps.class)
+   PaginatedCollection<ExternalIpDto, ExternalIpsDto> listExternalIps(
+         @EndpointLink("ips") @BinderParam(BindToPath.class) VLANNetworkDto network, IpOptions options);
 
    /**
     * Get the given external ip.
@@ -1222,8 +1232,8 @@ public interface InfrastructureApi extends Closeable {
     * @param ipId
     *           The id of the ip to get.
     * @return The requested ip.
-    * @since 2.3
     */
+   @SinceApiVersion("2.3")
    @Named("externalnetwork:getip")
    @GET
    @Consumes(ExternalIpDto.BASE_MEDIA_TYPE)
@@ -1237,13 +1247,15 @@ public interface InfrastructureApi extends Closeable {
     * @param network
     *           The unmanaged network.
     * @return The IPs in the given unmanaged network.
-    * @since 2.3
     */
+   @SinceApiVersion("2.3")
    @Named("unmanagednetwork:listips")
    @GET
    @Consumes(UnmanagedIpsDto.BASE_MEDIA_TYPE)
-   @JAXBResponseParser
-   UnmanagedIpsDto listUnmanagedIps(@EndpointLink("ips") @BinderParam(BindToPath.class) VLANNetworkDto network);
+   @ResponseParser(ParseUnmanagedIps.class)
+   @Transform(ParseUnmanagedIps.ToPagedIterable.class)
+   PagedIterable<UnmanagedIpDto> listUnmanagedIps(
+         @EndpointLink("ips") @BinderParam(BindToPath.class) VLANNetworkDto network);
 
    /**
     * List all the IPs in the given unmanaged network.
@@ -1253,14 +1265,14 @@ public interface InfrastructureApi extends Closeable {
     * @param options
     *           The filtering options.
     * @return The IPs in the given unmanaged network.
-    * @since 2.3
     */
+   @SinceApiVersion("2.3")
    @Named("unmanagednetwork:listips")
    @GET
    @Consumes(UnmanagedIpsDto.BASE_MEDIA_TYPE)
-   @JAXBResponseParser
-   UnmanagedIpsDto listUnmanagedIps(@EndpointLink("ips") @BinderParam(BindToPath.class) VLANNetworkDto network,
-         IpOptions options);
+   @ResponseParser(ParseUnmanagedIps.class)
+   PaginatedCollection<UnmanagedIpDto, UnmanagedIpsDto> listUnmanagedIps(
+         @EndpointLink("ips") @BinderParam(BindToPath.class) VLANNetworkDto network, IpOptions options);
 
    /**
     * Get the given unmanaged ip.
@@ -1270,8 +1282,8 @@ public interface InfrastructureApi extends Closeable {
     * @param ipId
     *           The id of the ip to get.
     * @return The requested ip.
-    * @since 2.3
     */
+   @SinceApiVersion("2.3")
    @Named("unmanagednetwork:getip")
    @GET
    @Consumes(UnmanagedIpDto.BASE_MEDIA_TYPE)

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/features/VirtualMachineTemplateApi.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/features/VirtualMachineTemplateApi.java b/abiquo/src/main/java/org/jclouds/abiquo/features/VirtualMachineTemplateApi.java
index 6fa4f58..30e8680 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/features/VirtualMachineTemplateApi.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/features/VirtualMachineTemplateApi.java
@@ -32,17 +32,21 @@ import org.jclouds.Fallbacks.NullOnNotFoundOr404;
 import org.jclouds.abiquo.binders.AppendToPath;
 import org.jclouds.abiquo.binders.BindToPath;
 import org.jclouds.abiquo.binders.BindToXMLPayloadAndPath;
+import org.jclouds.abiquo.domain.PaginatedCollection;
 import org.jclouds.abiquo.domain.cloud.options.ConversionOptions;
 import org.jclouds.abiquo.domain.cloud.options.VirtualMachineTemplateOptions;
 import org.jclouds.abiquo.functions.ReturnTaskReferenceOrNull;
+import org.jclouds.abiquo.functions.pagination.ParseVirtualMachineTemplates;
 import org.jclouds.abiquo.http.filters.AbiquoAuthentication;
 import org.jclouds.abiquo.http.filters.AppendApiVersionToMediaType;
 import org.jclouds.abiquo.rest.annotations.EndpointLink;
+import org.jclouds.collect.PagedIterable;
 import org.jclouds.rest.annotations.BinderParam;
 import org.jclouds.rest.annotations.Fallback;
 import org.jclouds.rest.annotations.JAXBResponseParser;
 import org.jclouds.rest.annotations.RequestFilters;
 import org.jclouds.rest.annotations.ResponseParser;
+import org.jclouds.rest.annotations.Transform;
 import org.jclouds.rest.binders.BindToXMLPayload;
 
 import com.abiquo.model.enumerator.DiskFormatType;
@@ -81,8 +85,9 @@ public interface VirtualMachineTemplateApi extends Closeable {
    @GET
    @Path("/{enterprise}/datacenterrepositories/{datacenterrepository}/virtualmachinetemplates")
    @Consumes(VirtualMachineTemplatesDto.BASE_MEDIA_TYPE)
-   @JAXBResponseParser
-   VirtualMachineTemplatesDto listVirtualMachineTemplates(@PathParam("enterprise") Integer enterpriseId,
+   @ResponseParser(ParseVirtualMachineTemplates.class)
+   @Transform(ParseVirtualMachineTemplates.ToPagedIterable.class)
+   PagedIterable<VirtualMachineTemplateDto> listVirtualMachineTemplates(@PathParam("enterprise") Integer enterpriseId,
          @PathParam("datacenterrepository") Integer datacenterRepositoryId);
 
    /**
@@ -102,8 +107,9 @@ public interface VirtualMachineTemplateApi extends Closeable {
    @GET
    @Path("/{enterprise}/datacenterrepositories/{datacenterrepository}/virtualmachinetemplates")
    @Consumes(VirtualMachineTemplatesDto.BASE_MEDIA_TYPE)
-   @JAXBResponseParser
-   VirtualMachineTemplatesDto listVirtualMachineTemplates(@PathParam("enterprise") Integer enterpriseId,
+   @ResponseParser(ParseVirtualMachineTemplates.class)
+   PaginatedCollection<VirtualMachineTemplateDto, VirtualMachineTemplatesDto> listVirtualMachineTemplates(
+         @PathParam("enterprise") Integer enterpriseId,
          @PathParam("datacenterrepository") Integer datacenterRepositoryId, VirtualMachineTemplateOptions options);
 
    /**

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/features/services/AdministrationService.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/features/services/AdministrationService.java b/abiquo/src/main/java/org/jclouds/abiquo/features/services/AdministrationService.java
index 2278708..929ae4c 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/features/services/AdministrationService.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/features/services/AdministrationService.java
@@ -24,6 +24,7 @@ import org.jclouds.abiquo.domain.enterprise.Enterprise;
 import org.jclouds.abiquo.domain.enterprise.EnterpriseProperties;
 import org.jclouds.abiquo.domain.enterprise.Role;
 import org.jclouds.abiquo.domain.enterprise.User;
+import org.jclouds.abiquo.domain.enterprise.options.EnterpriseOptions;
 import org.jclouds.abiquo.domain.infrastructure.Datacenter;
 import org.jclouds.abiquo.domain.infrastructure.Machine;
 import org.jclouds.abiquo.internal.BaseAdministrationService;
@@ -65,6 +66,11 @@ public interface AdministrationService {
    Iterable<Enterprise> listEnterprises();
 
    /**
+    * Get the list of all enterprises, filtered with the given options.
+    */
+   Iterable<Enterprise> listEnterprises(EnterpriseOptions options);
+
+   /**
     * Get the enterprise with the given id.
     */
    Enterprise getEnterprise(final Integer enterpriseId);

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/features/services/CloudService.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/features/services/CloudService.java b/abiquo/src/main/java/org/jclouds/abiquo/features/services/CloudService.java
index fc1aeed..080fc8f 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/features/services/CloudService.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/features/services/CloudService.java
@@ -21,6 +21,7 @@ import java.util.List;
 import org.jclouds.abiquo.domain.cloud.VirtualAppliance;
 import org.jclouds.abiquo.domain.cloud.VirtualDatacenter;
 import org.jclouds.abiquo.domain.cloud.VirtualMachine;
+import org.jclouds.abiquo.domain.cloud.options.VirtualMachineOptions;
 import org.jclouds.abiquo.domain.enterprise.Enterprise;
 import org.jclouds.abiquo.internal.BaseCloudService;
 
@@ -75,4 +76,9 @@ public interface CloudService {
     */
    Iterable<VirtualMachine> listVirtualMachines();
 
+   /**
+    * Get the list of all virtual machines filtered with the given options.
+    */
+   Iterable<VirtualMachine> listVirtualMachines(VirtualMachineOptions options);
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/BasePaginationParser.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/BasePaginationParser.java b/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/BasePaginationParser.java
new file mode 100644
index 0000000..0fcf254
--- /dev/null
+++ b/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/BasePaginationParser.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.abiquo.functions.pagination;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import org.jclouds.abiquo.AbiquoApi;
+import org.jclouds.abiquo.domain.PaginatedCollection;
+import org.jclouds.collect.PagedIterable;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.http.functions.ParseXMLWithJAXB;
+
+import com.abiquo.model.transport.WrapperDto;
+import com.google.common.base.Function;
+
+/**
+ * Base class for all pagination response parsers.
+ * <p>
+ * Parses the response with the given parser, and wraps the results in a
+ * {@link PaginatedCollection} so it can be properly iterated.
+ * 
+ * @author Ignasi Barrera
+ * 
+ * @see PaginatedCollection
+ * @see PagedIterable
+ */
+public abstract class BasePaginationParser<T, W extends WrapperDto<T>> implements
+      Function<HttpResponse, PaginatedCollection<T, W>> {
+   protected final AbiquoApi api;
+   protected final ParseXMLWithJAXB<W> parser;
+
+   public BasePaginationParser(AbiquoApi api, ParseXMLWithJAXB<W> parser) {
+      this.api = checkNotNull(api, "api must not be null");
+      this.parser = checkNotNull(parser, "parser must not be null");
+   }
+
+   @Override
+   public PaginatedCollection<T, W> apply(HttpResponse input) {
+      return new PaginatedCollection<T, W>(api, parser.apply(input), parser);
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseEnterprises.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseEnterprises.java b/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseEnterprises.java
new file mode 100644
index 0000000..99fcc1d
--- /dev/null
+++ b/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseEnterprises.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.abiquo.functions.pagination;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.abiquo.AbiquoApi;
+import org.jclouds.abiquo.domain.PaginatedCollection;
+import org.jclouds.http.functions.ParseXMLWithJAXB;
+
+import com.abiquo.server.core.enterprise.EnterpriseDto;
+import com.abiquo.server.core.enterprise.EnterprisesDto;
+
+/**
+ * Parses a paginated enterprise list.
+ * 
+ * @author Ignasi Barrera
+ */
+@Singleton
+public class ParseEnterprises extends BasePaginationParser<EnterpriseDto, EnterprisesDto> {
+   @Inject
+   public ParseEnterprises(AbiquoApi api, ParseXMLWithJAXB<EnterprisesDto> parser) {
+      super(api, parser);
+   }
+
+   @Singleton
+   public static class ToPagedIterable extends PaginatedCollection.ToPagedIterable<EnterpriseDto, EnterprisesDto> {
+      @Inject
+      public ToPagedIterable(AbiquoApi api, ParseXMLWithJAXB<EnterprisesDto> parser) {
+         super(api, parser);
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseEvents.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseEvents.java b/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseEvents.java
new file mode 100644
index 0000000..2cbcd0d
--- /dev/null
+++ b/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseEvents.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.abiquo.functions.pagination;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.abiquo.AbiquoApi;
+import org.jclouds.abiquo.domain.PaginatedCollection;
+import org.jclouds.http.functions.ParseXMLWithJAXB;
+
+import com.abiquo.server.core.event.EventDto;
+import com.abiquo.server.core.event.EventsDto;
+
+/**
+ * Parses a paginated event list.
+ * 
+ * @author Ignasi Barrera
+ */
+@Singleton
+public class ParseEvents extends BasePaginationParser<EventDto, EventsDto> {
+   @Inject
+   public ParseEvents(AbiquoApi api, ParseXMLWithJAXB<EventsDto> parser) {
+      super(api, parser);
+   }
+
+   @Singleton
+   public static class ToPagedIterable extends PaginatedCollection.ToPagedIterable<EventDto, EventsDto> {
+      @Inject
+      public ToPagedIterable(AbiquoApi api, ParseXMLWithJAXB<EventsDto> parser) {
+         super(api, parser);
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseExternalIps.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseExternalIps.java b/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseExternalIps.java
new file mode 100644
index 0000000..86a67e0
--- /dev/null
+++ b/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseExternalIps.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.abiquo.functions.pagination;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.abiquo.AbiquoApi;
+import org.jclouds.abiquo.domain.PaginatedCollection;
+import org.jclouds.http.functions.ParseXMLWithJAXB;
+
+import com.abiquo.server.core.infrastructure.network.ExternalIpDto;
+import com.abiquo.server.core.infrastructure.network.ExternalIpsDto;
+
+/**
+ * Parses a paginated external ip list.
+ * 
+ * @author Ignasi Barrera
+ */
+@Singleton
+public class ParseExternalIps extends BasePaginationParser<ExternalIpDto, ExternalIpsDto> {
+   @Inject
+   public ParseExternalIps(AbiquoApi api, ParseXMLWithJAXB<ExternalIpsDto> parser) {
+      super(api, parser);
+   }
+
+   @Singleton
+   public static class ToPagedIterable extends PaginatedCollection.ToPagedIterable<ExternalIpDto, ExternalIpsDto> {
+      @Inject
+      public ToPagedIterable(AbiquoApi api, ParseXMLWithJAXB<ExternalIpsDto> parser) {
+         super(api, parser);
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParsePrivateIps.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParsePrivateIps.java b/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParsePrivateIps.java
new file mode 100644
index 0000000..a56688a
--- /dev/null
+++ b/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParsePrivateIps.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.abiquo.functions.pagination;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.abiquo.AbiquoApi;
+import org.jclouds.abiquo.domain.PaginatedCollection;
+import org.jclouds.http.functions.ParseXMLWithJAXB;
+
+import com.abiquo.server.core.infrastructure.network.PrivateIpDto;
+import com.abiquo.server.core.infrastructure.network.PrivateIpsDto;
+
+/**
+ * Parses a paginated private ip list.
+ * 
+ * @author Ignasi Barrera
+ */
+@Singleton
+public class ParsePrivateIps extends BasePaginationParser<PrivateIpDto, PrivateIpsDto> {
+   @Inject
+   public ParsePrivateIps(AbiquoApi api, ParseXMLWithJAXB<PrivateIpsDto> parser) {
+      super(api, parser);
+   }
+
+   @Singleton
+   public static class ToPagedIterable extends PaginatedCollection.ToPagedIterable<PrivateIpDto, PrivateIpsDto> {
+      @Inject
+      public ToPagedIterable(AbiquoApi api, ParseXMLWithJAXB<PrivateIpsDto> parser) {
+         super(api, parser);
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParsePublicIps.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParsePublicIps.java b/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParsePublicIps.java
new file mode 100644
index 0000000..7671024
--- /dev/null
+++ b/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParsePublicIps.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.abiquo.functions.pagination;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.abiquo.AbiquoApi;
+import org.jclouds.abiquo.domain.PaginatedCollection;
+import org.jclouds.http.functions.ParseXMLWithJAXB;
+
+import com.abiquo.server.core.infrastructure.network.PublicIpDto;
+import com.abiquo.server.core.infrastructure.network.PublicIpsDto;
+
+/**
+ * Parses a paginated public ip list.
+ * 
+ * @author Ignasi Barrera
+ */
+@Singleton
+public class ParsePublicIps extends BasePaginationParser<PublicIpDto, PublicIpsDto> {
+   @Inject
+   public ParsePublicIps(AbiquoApi api, ParseXMLWithJAXB<PublicIpsDto> parser) {
+      super(api, parser);
+   }
+
+   @Singleton
+   public static class ToPagedIterable extends PaginatedCollection.ToPagedIterable<PublicIpDto, PublicIpsDto> {
+      @Inject
+      public ToPagedIterable(AbiquoApi api, ParseXMLWithJAXB<PublicIpsDto> parser) {
+         super(api, parser);
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseUnmanagedIps.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseUnmanagedIps.java b/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseUnmanagedIps.java
new file mode 100644
index 0000000..33ee503
--- /dev/null
+++ b/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseUnmanagedIps.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.abiquo.functions.pagination;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.abiquo.AbiquoApi;
+import org.jclouds.abiquo.domain.PaginatedCollection;
+import org.jclouds.http.functions.ParseXMLWithJAXB;
+
+import com.abiquo.server.core.infrastructure.network.UnmanagedIpDto;
+import com.abiquo.server.core.infrastructure.network.UnmanagedIpsDto;
+
+/**
+ * Parses a paginated unmnaged ip list.
+ * 
+ * @author Ignasi Barrera
+ */
+@Singleton
+public class ParseUnmanagedIps extends BasePaginationParser<UnmanagedIpDto, UnmanagedIpsDto> {
+   @Inject
+   public ParseUnmanagedIps(AbiquoApi api, ParseXMLWithJAXB<UnmanagedIpsDto> parser) {
+      super(api, parser);
+   }
+
+   @Singleton
+   public static class ToPagedIterable extends PaginatedCollection.ToPagedIterable<UnmanagedIpDto, UnmanagedIpsDto> {
+      @Inject
+      public ToPagedIterable(AbiquoApi api, ParseXMLWithJAXB<UnmanagedIpsDto> parser) {
+         super(api, parser);
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseUsers.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseUsers.java b/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseUsers.java
new file mode 100644
index 0000000..f782ccb
--- /dev/null
+++ b/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseUsers.java
@@ -0,0 +1,157 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.abiquo.functions.pagination;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.collect.Iterables.getFirst;
+import static org.jclouds.http.utils.Queries.encodeQueryLine;
+import static org.jclouds.http.utils.Queries.queryParser;
+
+import java.net.URI;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.abiquo.AbiquoApi;
+import org.jclouds.abiquo.domain.PaginatedCollection;
+import org.jclouds.collect.IterableWithMarker;
+import org.jclouds.collect.PagedIterable;
+import org.jclouds.http.HttpResponse;
+import org.jclouds.http.functions.ParseXMLWithJAXB;
+
+import com.abiquo.model.rest.RESTLink;
+import com.abiquo.server.core.enterprise.UserDto;
+import com.abiquo.server.core.enterprise.UsersDto;
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+import com.google.common.collect.Multimap;
+
+/**
+ * Parses a paginated user list.
+ * 
+ * @author Ignasi Barrera
+ */
+@Singleton
+public class ParseUsers extends BasePaginationParser<UserDto, UsersDto> {
+   @Inject
+   public ParseUsers(AbiquoApi api, ParseXMLWithJAXB<UsersDto> parser) {
+      super(api, parser);
+   }
+
+   // Return a custom class to bypass
+   // http://jira.abiquo.com/browse/ABICLOUDPREMIUM-5927
+   // Remove once the fix has been deployed to production
+   @Override
+   public PaginatedCollection<UserDto, UsersDto> apply(HttpResponse input) {
+      return new UserPaginatedCollection(api, parser.apply(input), parser);
+   }
+
+   @Singleton
+   public static class ToPagedIterable extends PaginatedCollection.ToPagedIterable<UserDto, UsersDto> {
+      @Inject
+      public ToPagedIterable(AbiquoApi api, ParseXMLWithJAXB<UsersDto> parser) {
+         super(api, parser);
+      }
+
+      // Overwrite to return a custom class and bypass
+      // http://jira.abiquo.com/browse/ABICLOUDPREMIUM-5927
+      // Remove once the fix has been deployed to production
+      @Override
+      protected Function<Object, IterableWithMarker<UserDto>> nextPage(PaginatedCollection<UserDto, UsersDto> input) {
+         return new Function<Object, IterableWithMarker<UserDto>>() {
+            @Override
+            public IterableWithMarker<UserDto> apply(Object marker) {
+               checkArgument(marker instanceof RESTLink, "Marker must be a RESTLink");
+               RESTLink next = RESTLink.class.cast(marker);
+
+               // The Abiquo API does not provide the media types in the
+               // pagination links, but it will be the same type than the
+               // current page, so just set it.
+               next.setType(UsersDto.BASE_MEDIA_TYPE);
+
+               UsersDto nextPage = parser.apply(api.get(next));
+               return new UserPaginatedCollection(api, nextPage, parser);
+            }
+         };
+      }
+   }
+
+   /**
+    * This class is used to bypass
+    * http://jira.abiquo.com/browse/ABICLOUDPREMIUM-5927
+    * <p>
+    * The issue has already been fixed but still not been deployed in
+    * production. Once that is done, this class should be removed.
+    * 
+    * @author Ignasi Barrera
+    */
+   private static class UserPaginatedCollection extends PaginatedCollection<UserDto, UsersDto> {
+      public UserPaginatedCollection(AbiquoApi api, UsersDto delegate, ParseXMLWithJAXB<UsersDto> parser) {
+         super(api, delegate, parser);
+      }
+
+      @Override
+      public Optional<Object> nextMarker() {
+         Optional<Object> next = super.nextMarker();
+         // Pagination links are not consistent and a "next" link can be
+         // returned even if there are no more pages. Overwrite the
+         // default behavior to handle this, and to adapt the query
+         // parameters returned in the pagination links to what the api
+         // expects in the GET requests
+         if (next.isPresent()) {
+            checkArgument(next.get() instanceof RESTLink, "Marker must be a RESTLink");
+            RESTLink link = RESTLink.class.cast(next.get());
+
+            // Get the conflicting query parameters and remove them from the
+            // query parameter map
+            Multimap<String, String> params = queryParser().apply(URI.create(link.getHref()).getRawQuery());
+            String limit = getFirst(params.removeAll("limit"), null);
+            String startwith = getFirst(params.removeAll("startwith"), null);
+
+            // Next page links always have both query parameters. Otherwise
+            // assume there is no next page
+            if (limit != null && startwith != null) {
+               int resultsPerPage = Integer.parseInt(limit);
+               int totalResults = delegate.getTotalSize();
+               int pageNumber = Integer.parseInt(startwith) - resultsPerPage;
+
+               // Check if there is really a next page, and then return the
+               // marker with the appropriate values
+               if (totalResults / (double) resultsPerPage > pageNumber + 1) {
+                  params.put("numResults", limit);
+                  params.put("page", String.valueOf(pageNumber + 1));
+
+                  // Build the new URI stripping the existing query
+                  // parameters and using the new ones
+                  String uri = link.getHref().substring(0, link.getHref().indexOf('?') + 1);
+                  uri += encodeQueryLine(params);
+
+                  return Optional.<Object> of(new RESTLink(link.getRel(), uri));
+               }
+            }
+         }
+
+         return Optional.absent();
+      }
+
+      @Override
+      public PagedIterable<UserDto> toPagedIterable() {
+         return new ParseUsers.ToPagedIterable(api, parser).apply(this);
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseVirtualMachineTemplates.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseVirtualMachineTemplates.java b/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseVirtualMachineTemplates.java
new file mode 100644
index 0000000..a26766c
--- /dev/null
+++ b/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseVirtualMachineTemplates.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.abiquo.functions.pagination;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.abiquo.AbiquoApi;
+import org.jclouds.abiquo.domain.PaginatedCollection;
+import org.jclouds.http.functions.ParseXMLWithJAXB;
+
+import com.abiquo.server.core.appslibrary.VirtualMachineTemplateDto;
+import com.abiquo.server.core.appslibrary.VirtualMachineTemplatesDto;
+
+/**
+ * Parses a paginated virtual machine template list.
+ * 
+ * @author Ignasi Barrera
+ */
+@Singleton
+public class ParseVirtualMachineTemplates extends
+      BasePaginationParser<VirtualMachineTemplateDto, VirtualMachineTemplatesDto> {
+   @Inject
+   public ParseVirtualMachineTemplates(AbiquoApi api, ParseXMLWithJAXB<VirtualMachineTemplatesDto> parser) {
+      super(api, parser);
+   }
+
+   @Singleton
+   public static class ToPagedIterable extends
+         PaginatedCollection.ToPagedIterable<VirtualMachineTemplateDto, VirtualMachineTemplatesDto> {
+      @Inject
+      public ToPagedIterable(AbiquoApi api, ParseXMLWithJAXB<VirtualMachineTemplatesDto> parser) {
+         super(api, parser);
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseVirtualMachines.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseVirtualMachines.java b/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseVirtualMachines.java
new file mode 100644
index 0000000..2103a77
--- /dev/null
+++ b/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseVirtualMachines.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.abiquo.functions.pagination;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.abiquo.AbiquoApi;
+import org.jclouds.abiquo.domain.PaginatedCollection;
+import org.jclouds.http.functions.ParseXMLWithJAXB;
+
+import com.abiquo.server.core.cloud.VirtualMachineWithNodeExtendedDto;
+import com.abiquo.server.core.cloud.VirtualMachinesWithNodeExtendedDto;
+
+/**
+ * Parses a paginated virtual machine list.
+ * 
+ * @author Ignasi Barrera
+ */
+@Singleton
+public class ParseVirtualMachines extends
+      BasePaginationParser<VirtualMachineWithNodeExtendedDto, VirtualMachinesWithNodeExtendedDto> {
+   @Inject
+   public ParseVirtualMachines(AbiquoApi api, ParseXMLWithJAXB<VirtualMachinesWithNodeExtendedDto> parser) {
+      super(api, parser);
+   }
+
+   @Singleton
+   public static class ToPagedIterable extends
+         PaginatedCollection.ToPagedIterable<VirtualMachineWithNodeExtendedDto, VirtualMachinesWithNodeExtendedDto> {
+      @Inject
+      public ToPagedIterable(AbiquoApi api, ParseXMLWithJAXB<VirtualMachinesWithNodeExtendedDto> parser) {
+         super(api, parser);
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseVolumes.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseVolumes.java b/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseVolumes.java
new file mode 100644
index 0000000..d9f9ab2
--- /dev/null
+++ b/abiquo/src/main/java/org/jclouds/abiquo/functions/pagination/ParseVolumes.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.abiquo.functions.pagination;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.abiquo.AbiquoApi;
+import org.jclouds.abiquo.domain.PaginatedCollection;
+import org.jclouds.http.functions.ParseXMLWithJAXB;
+
+import com.abiquo.server.core.infrastructure.storage.VolumeManagementDto;
+import com.abiquo.server.core.infrastructure.storage.VolumesManagementDto;
+
+/**
+ * Parses a paginated volume list.
+ * 
+ * @author Ignasi Barrera
+ */
+@Singleton
+public class ParseVolumes extends BasePaginationParser<VolumeManagementDto, VolumesManagementDto> {
+   @Inject
+   public ParseVolumes(AbiquoApi api, ParseXMLWithJAXB<VolumesManagementDto> parser) {
+      super(api, parser);
+   }
+
+   @Singleton
+   public static class ToPagedIterable extends
+         PaginatedCollection.ToPagedIterable<VolumeManagementDto, VolumesManagementDto> {
+      @Inject
+      public ToPagedIterable(AbiquoApi api, ParseXMLWithJAXB<VolumesManagementDto> parser) {
+         super(api, parser);
+      }
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/internal/BaseAdministrationService.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/internal/BaseAdministrationService.java b/abiquo/src/main/java/org/jclouds/abiquo/internal/BaseAdministrationService.java
index ceffaa4..290f0fd 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/internal/BaseAdministrationService.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/internal/BaseAdministrationService.java
@@ -24,6 +24,7 @@ import javax.inject.Inject;
 import javax.inject.Singleton;
 
 import org.jclouds.abiquo.AbiquoApi;
+import org.jclouds.abiquo.domain.PaginatedCollection;
 import org.jclouds.abiquo.domain.config.Category;
 import org.jclouds.abiquo.domain.config.License;
 import org.jclouds.abiquo.domain.config.Privilege;
@@ -34,12 +35,14 @@ import org.jclouds.abiquo.domain.enterprise.Enterprise;
 import org.jclouds.abiquo.domain.enterprise.EnterpriseProperties;
 import org.jclouds.abiquo.domain.enterprise.Role;
 import org.jclouds.abiquo.domain.enterprise.User;
+import org.jclouds.abiquo.domain.enterprise.options.EnterpriseOptions;
 import org.jclouds.abiquo.domain.infrastructure.Datacenter;
 import org.jclouds.abiquo.domain.infrastructure.Machine;
 import org.jclouds.abiquo.features.services.AdministrationService;
 import org.jclouds.abiquo.reference.ValidationErrors;
 import org.jclouds.abiquo.strategy.infrastructure.ListMachines;
 import org.jclouds.collect.Memoized;
+import org.jclouds.collect.PagedIterable;
 import org.jclouds.rest.ApiContext;
 
 import com.abiquo.server.core.appslibrary.CategoriesDto;
@@ -112,8 +115,15 @@ public class BaseAdministrationService implements AdministrationService {
 
    @Override
    public Iterable<Enterprise> listEnterprises() {
-      EnterprisesDto result = context.getApi().getEnterpriseApi().listEnterprises();
-      return wrap(context, Enterprise.class, result.getCollection());
+      PagedIterable<EnterpriseDto> result = context.getApi().getEnterpriseApi().listEnterprises();
+      return wrap(context, Enterprise.class, result.concat());
+   }
+
+   @Override
+   public Iterable<Enterprise> listEnterprises(EnterpriseOptions options) {
+      PaginatedCollection<EnterpriseDto, EnterprisesDto> result = context.getApi().getEnterpriseApi()
+            .listEnterprises(options);
+      return wrap(context, Enterprise.class, result.toPagedIterable().concat());
    }
 
    @Override

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/internal/BaseCloudService.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/internal/BaseCloudService.java b/abiquo/src/main/java/org/jclouds/abiquo/internal/BaseCloudService.java
index 1ef28af..a8df42d 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/internal/BaseCloudService.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/internal/BaseCloudService.java
@@ -25,18 +25,22 @@ import javax.inject.Inject;
 import javax.inject.Singleton;
 
 import org.jclouds.abiquo.AbiquoApi;
+import org.jclouds.abiquo.domain.PaginatedCollection;
 import org.jclouds.abiquo.domain.cloud.VirtualAppliance;
 import org.jclouds.abiquo.domain.cloud.VirtualDatacenter;
 import org.jclouds.abiquo.domain.cloud.VirtualMachine;
 import org.jclouds.abiquo.domain.cloud.options.VirtualDatacenterOptions;
+import org.jclouds.abiquo.domain.cloud.options.VirtualMachineOptions;
 import org.jclouds.abiquo.domain.enterprise.Enterprise;
 import org.jclouds.abiquo.features.services.CloudService;
 import org.jclouds.abiquo.reference.ValidationErrors;
 import org.jclouds.abiquo.strategy.cloud.ListVirtualAppliances;
 import org.jclouds.abiquo.strategy.cloud.ListVirtualDatacenters;
+import org.jclouds.collect.PagedIterable;
 import org.jclouds.rest.ApiContext;
 
 import com.abiquo.server.core.cloud.VirtualDatacenterDto;
+import com.abiquo.server.core.cloud.VirtualMachineWithNodeExtendedDto;
 import com.abiquo.server.core.cloud.VirtualMachinesWithNodeExtendedDto;
 import com.google.common.annotations.VisibleForTesting;
 
@@ -104,7 +108,14 @@ public class BaseCloudService implements CloudService {
 
    @Override
    public Iterable<VirtualMachine> listVirtualMachines() {
-      VirtualMachinesWithNodeExtendedDto vms = context.getApi().getCloudApi().listAllVirtualMachines();
-      return wrap(context, VirtualMachine.class, vms.getCollection());
+      PagedIterable<VirtualMachineWithNodeExtendedDto> vms = context.getApi().getCloudApi().listAllVirtualMachines();
+      return wrap(context, VirtualMachine.class, vms.concat());
+   }
+
+   @Override
+   public Iterable<VirtualMachine> listVirtualMachines(VirtualMachineOptions options) {
+      PaginatedCollection<VirtualMachineWithNodeExtendedDto, VirtualMachinesWithNodeExtendedDto> vms = context.getApi()
+            .getCloudApi().listAllVirtualMachines(options);
+      return wrap(context, VirtualMachine.class, vms.toPagedIterable().concat());
    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/internal/BaseEventService.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/internal/BaseEventService.java b/abiquo/src/main/java/org/jclouds/abiquo/internal/BaseEventService.java
index 38f5e43..669ed4d 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/internal/BaseEventService.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/internal/BaseEventService.java
@@ -23,11 +23,14 @@ import javax.inject.Inject;
 import javax.inject.Singleton;
 
 import org.jclouds.abiquo.AbiquoApi;
+import org.jclouds.abiquo.domain.PaginatedCollection;
 import org.jclouds.abiquo.domain.event.Event;
 import org.jclouds.abiquo.domain.event.options.EventOptions;
 import org.jclouds.abiquo.features.services.EventService;
+import org.jclouds.collect.PagedIterable;
 import org.jclouds.rest.ApiContext;
 
+import com.abiquo.server.core.event.EventDto;
 import com.abiquo.server.core.event.EventsDto;
 import com.google.common.annotations.VisibleForTesting;
 
@@ -49,13 +52,13 @@ public class BaseEventService implements EventService {
 
    @Override
    public Iterable<Event> listEvents() {
-      EventsDto result = context.getApi().getEventApi().listEvents();
-      return wrap(context, Event.class, result.getCollection());
+      PagedIterable<EventDto> result = context.getApi().getEventApi().listEvents();
+      return wrap(context, Event.class, result.concat());
    }
 
    @Override
    public Iterable<Event> listEvents(final EventOptions options) {
-      EventsDto result = context.getApi().getEventApi().listEvents(options);
-      return wrap(context, Event.class, result.getCollection());
+      PaginatedCollection<EventDto, EventsDto> result = context.getApi().getEventApi().listEvents(options);
+      return wrap(context, Event.class, result.toPagedIterable().concat());
    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/predicates/VirtualDatacenterPredicates.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/predicates/VirtualDatacenterPredicates.java b/abiquo/src/main/java/org/jclouds/abiquo/predicates/VirtualDatacenterPredicates.java
index ac71720..97e4695 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/predicates/VirtualDatacenterPredicates.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/predicates/VirtualDatacenterPredicates.java
@@ -17,8 +17,7 @@
 package org.jclouds.abiquo.predicates;
 
 import static com.google.common.base.Preconditions.checkNotNull;
-
-import java.util.List;
+import static com.google.common.collect.Iterables.isEmpty;
 
 import org.jclouds.abiquo.domain.cloud.Conversion;
 import org.jclouds.abiquo.domain.cloud.VirtualDatacenter;
@@ -71,8 +70,8 @@ public class VirtualDatacenterPredicates {
             HypervisorType type = vdc.getHypervisorType();
             boolean compatible = type.isCompatible(template.getDiskFormatType());
             if (!compatible) {
-               List<Conversion> compatibleConversions = template.listConversions(type, ConversionState.FINISHED);
-               compatible = compatibleConversions != null && !compatibleConversions.isEmpty();
+               Iterable<Conversion> compatibleConversions = template.listConversions(type, ConversionState.FINISHED);
+               compatible = compatibleConversions != null && !isEmpty(compatibleConversions);
             }
             return compatible;
          }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/strategy/enterprise/ListVirtualMachineTemplates.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/strategy/enterprise/ListVirtualMachineTemplates.java b/abiquo/src/main/java/org/jclouds/abiquo/strategy/enterprise/ListVirtualMachineTemplates.java
index d82d3ad..989e42e 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/strategy/enterprise/ListVirtualMachineTemplates.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/strategy/enterprise/ListVirtualMachineTemplates.java
@@ -17,6 +17,7 @@
 package org.jclouds.abiquo.strategy.enterprise;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.Iterables.concat;
 import static com.google.common.collect.Iterables.filter;
 import static com.google.common.collect.Iterables.transform;
 import static com.google.common.util.concurrent.Futures.allAsList;
@@ -31,16 +32,15 @@ import javax.inject.Named;
 
 import org.jclouds.Constants;
 import org.jclouds.abiquo.AbiquoApi;
-import org.jclouds.abiquo.domain.DomainWrapper;
 import org.jclouds.abiquo.domain.cloud.VirtualMachineTemplate;
 import org.jclouds.abiquo.domain.enterprise.Enterprise;
 import org.jclouds.abiquo.domain.infrastructure.Datacenter;
 import org.jclouds.abiquo.strategy.ListEntities;
+import org.jclouds.collect.PagedIterable;
 import org.jclouds.logging.Logger;
 import org.jclouds.rest.ApiContext;
 
 import com.abiquo.server.core.appslibrary.VirtualMachineTemplateDto;
-import com.abiquo.server.core.appslibrary.VirtualMachineTemplatesDto;
 import com.google.common.base.Function;
 import com.google.common.base.Predicate;
 import com.google.common.util.concurrent.ListenableFuture;
@@ -90,21 +90,23 @@ public class ListVirtualMachineTemplates implements ListEntities<VirtualMachineT
 
    private Iterable<VirtualMachineTemplateDto> listConcurrentTemplates(final ListeningExecutorService executor,
          final Enterprise parent, final Iterable<Datacenter> dcs) {
-      ListenableFuture<List<VirtualMachineTemplatesDto>> futures = allAsList(transform(dcs,
-            new Function<Datacenter, ListenableFuture<VirtualMachineTemplatesDto>>() {
+      ListenableFuture<List<Iterable<VirtualMachineTemplateDto>>> futures = allAsList(transform(dcs,
+            new Function<Datacenter, ListenableFuture<Iterable<VirtualMachineTemplateDto>>>() {
                @Override
-               public ListenableFuture<VirtualMachineTemplatesDto> apply(final Datacenter input) {
-                  return executor.submit(new Callable<VirtualMachineTemplatesDto>() {
+               public ListenableFuture<Iterable<VirtualMachineTemplateDto>> apply(final Datacenter input) {
+                  return executor.submit(new Callable<Iterable<VirtualMachineTemplateDto>>() {
                      @Override
-                     public VirtualMachineTemplatesDto call() throws Exception {
-                        return context.getApi().getVirtualMachineTemplateApi()
+                     public Iterable<VirtualMachineTemplateDto> call() throws Exception {
+                        PagedIterable<VirtualMachineTemplateDto> templates = context.getApi()
+                              .getVirtualMachineTemplateApi()
                               .listVirtualMachineTemplates(parent.getId(), input.getId());
+                        return templates.concat();
                      }
                   });
                }
             }));
 
       logger.trace("getting virtual machine templates");
-      return DomainWrapper.join(getUnchecked(futures));
+      return concat(getUnchecked(futures));
    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/AccountLiveTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/AccountLiveTest.java b/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/AccountLiveTest.java
index 144280d..a2599cd 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/AccountLiveTest.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/AccountLiveTest.java
@@ -16,6 +16,7 @@
  */
 package org.jclouds.abiquo.domain.cloud;
 
+import static com.google.common.collect.Iterables.size;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertTrue;
 
@@ -46,11 +47,11 @@ public class AccountLiveTest extends BaseAbiquoLiveApiTest {
    }
 
    public void testAllowedDatacenters() {
-      assertTrue(enterprise.listAllowedDatacenters().size() > 0);
+      assertTrue(size(enterprise.listAllowedDatacenters()) > 0);
    }
 
    public void testAvailableTemplates() {
-      assertTrue(enterprise.listTemplates().size() > 0);
+      assertTrue(size(enterprise.listTemplates()) > 0);
    }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VirtualDatacenterLiveApiTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VirtualDatacenterLiveApiTest.java b/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VirtualDatacenterLiveApiTest.java
index c6c6fdd..5f8ac67 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VirtualDatacenterLiveApiTest.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VirtualDatacenterLiveApiTest.java
@@ -17,7 +17,9 @@
 package org.jclouds.abiquo.domain.cloud;
 
 import static com.google.common.collect.Iterables.find;
+import static com.google.common.collect.Iterables.get;
 import static com.google.common.collect.Iterables.size;
+import static com.google.common.collect.Lists.newArrayList;
 import static org.jclouds.abiquo.reference.AbiquoTestConstants.PREFIX;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
@@ -79,13 +81,13 @@ public class VirtualDatacenterLiveApiTest extends BaseAbiquoApiLiveApiTest {
       Enterprise enterprise = env.enterpriseAdminContext.getAdministrationService().getCurrentUser().getEnterprise();
       assertNotNull(enterprise);
 
-      List<Datacenter> datacenters = enterprise.listAllowedDatacenters();
+      List<Datacenter> datacenters = newArrayList(enterprise.listAllowedDatacenters());
       assertNotNull(datacenters);
       assertTrue(size(datacenters) > 0);
 
       Datacenter datacenter = datacenters.get(0);
 
-      List<HypervisorType> hypervisors = datacenter.listAvailableHypervisors();
+      List<HypervisorType> hypervisors = newArrayList(datacenter.listAvailableHypervisors());
       assertNotNull(datacenters);
       assertTrue(size(datacenters) > 0);
 
@@ -130,7 +132,7 @@ public class VirtualDatacenterLiveApiTest extends BaseAbiquoApiLiveApiTest {
    }
 
    public void testPurchaseIp() {
-      final PublicIp publicIp = env.virtualDatacenter.listAvailablePublicIps().get(0);
+      final PublicIp publicIp = get(env.virtualDatacenter.listAvailablePublicIps(), 0);
       assertNotNull(publicIp);
       env.virtualDatacenter.purchasePublicIp(publicIp);
 
@@ -160,7 +162,7 @@ public class VirtualDatacenterLiveApiTest extends BaseAbiquoApiLiveApiTest {
    }
 
    public void testGetAvailableTemplates() {
-      List<VirtualMachineTemplate> templates = env.virtualDatacenter.listAvailableTemplates();
+      List<VirtualMachineTemplate> templates = newArrayList(env.virtualDatacenter.listAvailableTemplates());
       assertNotNull(templates);
       assertFalse(templates.isEmpty());
 

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VirtualMachineLiveApiTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VirtualMachineLiveApiTest.java b/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VirtualMachineLiveApiTest.java
index d838438..fab4988 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VirtualMachineLiveApiTest.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VirtualMachineLiveApiTest.java
@@ -27,8 +27,6 @@ import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 
-import java.util.List;
-
 import javax.ws.rs.core.Response.Status;
 
 import org.jclouds.abiquo.domain.exception.AbiquoException;
@@ -77,7 +75,7 @@ public class VirtualMachineLiveApiTest extends BaseAbiquoApiLiveApiTest {
    }
 
    public void testGetTasks() {
-      List<AsyncTask<?, ?>> tasks = env.virtualMachine.listTasks();
+      Iterable<AsyncTask<?, ?>> tasks = env.virtualMachine.listTasks();
       assertNotNull(tasks);
    }
 

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VirtualMachineLiveTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VirtualMachineLiveTest.java b/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VirtualMachineLiveTest.java
index 3a2eb1a..c5e67a4 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VirtualMachineLiveTest.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VirtualMachineLiveTest.java
@@ -18,6 +18,7 @@ package org.jclouds.abiquo.domain.cloud;
 
 import static com.google.common.collect.Iterables.find;
 import static com.google.common.collect.Iterables.getLast;
+import static org.jclouds.abiquo.environment.CloudTestEnvironment.templateBySize;
 import static org.jclouds.abiquo.reference.AbiquoTestConstants.PREFIX;
 import static org.jclouds.abiquo.util.Assert.assertHasError;
 import static org.testng.Assert.assertEquals;
@@ -42,8 +43,6 @@ import org.testng.annotations.Test;
 import com.abiquo.server.core.cloud.VirtualMachineState;
 import com.google.common.base.Predicate;
 import com.google.common.collect.Lists;
-import com.google.common.collect.Ordering;
-import com.google.common.primitives.Longs;
 
 /**
  * Live integration tests for the {@link VirtualMachine} domain class.
@@ -179,13 +178,4 @@ public class VirtualMachineLiveTest extends BaseAbiquoLiveApiTest {
       assertNull(vapp.getVirtualMachine(vmId));
    }
 
-   private static Ordering<VirtualMachineTemplate> templateBySize() {
-      return new Ordering<VirtualMachineTemplate>() {
-         @Override
-         public int compare(final VirtualMachineTemplate left, final VirtualMachineTemplate right) {
-            return Longs.compare(left.getDiskFileSize(), right.getDiskFileSize());
-         }
-      };
-   }
-
 }


[2/5] JCLOUDS-198: Implemented the PagedIterable in Abiquo

Posted by na...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/features/CloudApiTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/features/CloudApiTest.java b/abiquo/src/test/java/org/jclouds/abiquo/features/CloudApiTest.java
index 249b62f..baa36d5 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/features/CloudApiTest.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/features/CloudApiTest.java
@@ -30,9 +30,6 @@ import org.jclouds.abiquo.domain.InfrastructureResources;
 import org.jclouds.abiquo.domain.NetworkResources;
 import org.jclouds.abiquo.domain.cloud.options.VirtualDatacenterOptions;
 import org.jclouds.abiquo.domain.cloud.options.VirtualMachineOptions;
-import org.jclouds.abiquo.domain.cloud.options.VirtualMachineTemplateOptions;
-import org.jclouds.abiquo.domain.cloud.options.VolumeOptions;
-import org.jclouds.abiquo.domain.network.options.IpOptions;
 import org.jclouds.abiquo.fallbacks.MovedVolume;
 import org.jclouds.abiquo.functions.ReturnTaskReferenceOrNull;
 import org.jclouds.http.functions.ParseXMLWithJAXB;
@@ -42,12 +39,10 @@ import org.jclouds.reflect.Invocation;
 import org.jclouds.rest.internal.GeneratedHttpRequest;
 import org.testng.annotations.Test;
 
-import com.abiquo.model.enumerator.HypervisorType;
 import com.abiquo.model.rest.RESTLink;
 import com.abiquo.model.transport.AcceptedRequestDto;
 import com.abiquo.model.transport.LinksDto;
 import com.abiquo.server.core.appslibrary.VirtualMachineTemplateDto;
-import com.abiquo.server.core.appslibrary.VirtualMachineTemplatesDto;
 import com.abiquo.server.core.cloud.VirtualApplianceDto;
 import com.abiquo.server.core.cloud.VirtualApplianceStateDto;
 import com.abiquo.server.core.cloud.VirtualAppliancesDto;
@@ -57,13 +52,10 @@ import com.abiquo.server.core.cloud.VirtualMachineDto;
 import com.abiquo.server.core.cloud.VirtualMachineStateDto;
 import com.abiquo.server.core.cloud.VirtualMachineTaskDto;
 import com.abiquo.server.core.cloud.VirtualMachineWithNodeExtendedDto;
-import com.abiquo.server.core.cloud.VirtualMachinesWithNodeExtendedDto;
 import com.abiquo.server.core.enterprise.EnterpriseDto;
 import com.abiquo.server.core.infrastructure.DatacenterDto;
 import com.abiquo.server.core.infrastructure.network.PrivateIpDto;
-import com.abiquo.server.core.infrastructure.network.PrivateIpsDto;
 import com.abiquo.server.core.infrastructure.network.PublicIpDto;
-import com.abiquo.server.core.infrastructure.network.PublicIpsDto;
 import com.abiquo.server.core.infrastructure.network.VLANNetworkDto;
 import com.abiquo.server.core.infrastructure.network.VLANNetworksDto;
 import com.abiquo.server.core.infrastructure.network.VMNetworkConfigurationsDto;
@@ -190,44 +182,6 @@ public class CloudApiTest extends BaseAbiquoApiTest<CloudApi> {
 
    /*********************** Ips ***********************/
 
-   public void testListAvailablePublicIpsWithOptions() throws SecurityException, NoSuchMethodException, IOException {
-      IpOptions options = IpOptions.builder().limit(5).build();
-      Invokable<?, ?> method = method(CloudApi.class, "listAvailablePublicIps", VirtualDatacenterDto.class,
-            IpOptions.class);
-      GeneratedHttpRequest request = processor.apply(Invocation.create(method,
-            ImmutableList.<Object> of(CloudResources.virtualDatacenterPut(), options)));
-
-      assertRequestLineEquals(request,
-            "GET http://localhost/api/cloud/virtualdatacenters/1/publicips/topurchase?limit=5 HTTP/1.1");
-      assertNonPayloadHeadersEqual(request, "Accept: " + PublicIpsDto.BASE_MEDIA_TYPE + "\n");
-      assertPayloadEquals(request, null, null, false);
-
-      assertResponseParserClassEquals(method, request, ParseXMLWithJAXB.class);
-      assertSaxResponseParserClassEquals(method, null);
-      assertFallbackClassEquals(method, null);
-
-      checkFilters(request);
-   }
-
-   public void testListPurchasedPublicIpsWithOptions() throws SecurityException, NoSuchMethodException, IOException {
-      IpOptions options = IpOptions.builder().limit(5).build();
-      Invokable<?, ?> method = method(CloudApi.class, "listPurchasedPublicIps", VirtualDatacenterDto.class,
-            IpOptions.class);
-      GeneratedHttpRequest request = processor.apply(Invocation.create(method,
-            ImmutableList.<Object> of(CloudResources.virtualDatacenterPut(), options)));
-
-      assertRequestLineEquals(request,
-            "GET http://localhost/api/cloud/virtualdatacenters/1/publicips/purchased?limit=5 HTTP/1.1");
-      assertNonPayloadHeadersEqual(request, "Accept: " + PublicIpsDto.BASE_MEDIA_TYPE + "\n");
-      assertPayloadEquals(request, null, null, false);
-
-      assertResponseParserClassEquals(method, request, ParseXMLWithJAXB.class);
-      assertSaxResponseParserClassEquals(method, null);
-      assertFallbackClassEquals(method, null);
-
-      checkFilters(request);
-   }
-
    public void testPurchasePublicIp() throws SecurityException, NoSuchMethodException, IOException {
       Invokable<?, ?> method = method(CloudApi.class, "purchasePublicIp", PublicIpDto.class);
       GeneratedHttpRequest request = processor.apply(Invocation.create(method,
@@ -264,42 +218,6 @@ public class CloudApiTest extends BaseAbiquoApiTest<CloudApi> {
 
    /*********************** Available templates ***********************/
 
-   public void testListAvailableTemplates() throws SecurityException, NoSuchMethodException, IOException {
-      Invokable<?, ?> method = method(CloudApi.class, "listAvailableTemplates", VirtualDatacenterDto.class);
-      GeneratedHttpRequest request = processor.apply(Invocation.create(method,
-            ImmutableList.<Object> of(CloudResources.virtualDatacenterPut())));
-
-      assertRequestLineEquals(request, "GET http://localhost/api/cloud/virtualdatacenters/1/action/templates HTTP/1.1");
-      assertNonPayloadHeadersEqual(request, "Accept: " + VirtualMachineTemplatesDto.BASE_MEDIA_TYPE + "\n");
-      assertPayloadEquals(request, null, null, false);
-
-      assertResponseParserClassEquals(method, request, ParseXMLWithJAXB.class);
-      assertSaxResponseParserClassEquals(method, null);
-      assertFallbackClassEquals(method, null);
-
-      checkFilters(request);
-   }
-
-   public void testListAvailableTemplatesWithOptions() throws SecurityException, NoSuchMethodException, IOException {
-      Invokable<?, ?> method = method(CloudApi.class, "listAvailableTemplates", VirtualDatacenterDto.class,
-            VirtualMachineTemplateOptions.class);
-      GeneratedHttpRequest request = processor.apply(Invocation.create(
-            method,
-            ImmutableList.<Object> of(CloudResources.virtualDatacenterPut(), VirtualMachineTemplateOptions.builder()
-                  .hypervisorType(HypervisorType.XENSERVER).categoryName("Firewalls").idTemplate(1).build())));
-
-      assertRequestLineEquals(request, "GET http://localhost/api/cloud/virtualdatacenters/1/action/templates"
-            + "?hypervisorTypeName=XENSERVER&categoryName=Firewalls&idTemplate=1 HTTP/1.1");
-      assertNonPayloadHeadersEqual(request, "Accept: " + VirtualMachineTemplatesDto.BASE_MEDIA_TYPE + "\n");
-      assertPayloadEquals(request, null, null, false);
-
-      assertResponseParserClassEquals(method, request, ParseXMLWithJAXB.class);
-      assertSaxResponseParserClassEquals(method, null);
-      assertFallbackClassEquals(method, null);
-
-      checkFilters(request);
-   }
-
    /*********************** Storage Tiers ***********************/
 
    public void testListStorageTiers() throws SecurityException, NoSuchMethodException, IOException {
@@ -480,41 +398,6 @@ public class CloudApiTest extends BaseAbiquoApiTest<CloudApi> {
 
    /*********************** Private Network IPs ***********************/
 
-   public void testListPrivateNetworkIps() throws SecurityException, NoSuchMethodException, IOException {
-      Invokable<?, ?> method = method(CloudApi.class, "listPrivateNetworkIps", VLANNetworkDto.class);
-      GeneratedHttpRequest request = processor.apply(Invocation.create(method,
-            ImmutableList.<Object> of(NetworkResources.privateNetworkPut())));
-
-      assertRequestLineEquals(request,
-            "GET http://localhost/api/cloud/virtualdatacenters/1/privatenetworks/1/ips HTTP/1.1");
-      assertNonPayloadHeadersEqual(request, "Accept: " + PrivateIpsDto.BASE_MEDIA_TYPE + "\n");
-      assertPayloadEquals(request, null, null, false);
-
-      assertResponseParserClassEquals(method, request, ParseXMLWithJAXB.class);
-      assertSaxResponseParserClassEquals(method, null);
-      assertFallbackClassEquals(method, null);
-
-      checkFilters(request);
-   }
-
-   public void testListPrivateNetworkIpsWithOptions() throws SecurityException, NoSuchMethodException, IOException {
-      IpOptions options = IpOptions.builder().startWith(10).build();
-      Invokable<?, ?> method = method(CloudApi.class, "listPrivateNetworkIps", VLANNetworkDto.class, IpOptions.class);
-      GeneratedHttpRequest request = processor.apply(Invocation.create(method,
-            ImmutableList.<Object> of(NetworkResources.privateNetworkPut(), options)));
-
-      assertRequestLineEquals(request,
-            "GET http://localhost/api/cloud/virtualdatacenters/1/privatenetworks/1/ips?startwith=10 HTTP/1.1");
-      assertNonPayloadHeadersEqual(request, "Accept: " + PrivateIpsDto.BASE_MEDIA_TYPE + "\n");
-      assertPayloadEquals(request, null, null, false);
-
-      assertResponseParserClassEquals(method, request, ParseXMLWithJAXB.class);
-      assertSaxResponseParserClassEquals(method, null);
-      assertFallbackClassEquals(method, null);
-
-      checkFilters(request);
-   }
-
    public void testGetPrivateNetworkIp() throws SecurityException, NoSuchMethodException, IOException {
       Invokable<?, ?> method = method(CloudApi.class, "getPrivateNetworkIp", VLANNetworkDto.class, Integer.class);
       GeneratedHttpRequest request = processor.apply(Invocation.create(method,
@@ -695,43 +578,6 @@ public class CloudApiTest extends BaseAbiquoApiTest<CloudApi> {
 
    /*********************** Virtual Machine ***********************/
 
-   public void testListVirtualMachines() throws SecurityException, NoSuchMethodException, IOException {
-      Invokable<?, ?> method = method(CloudApi.class, "listVirtualMachines", VirtualApplianceDto.class);
-      GeneratedHttpRequest request = processor.apply(Invocation.create(method,
-            ImmutableList.<Object> of(CloudResources.virtualAppliancePut())));
-
-      assertRequestLineEquals(request,
-            "GET http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines HTTP/1.1");
-      assertNonPayloadHeadersEqual(request, "Accept: " + VirtualMachinesWithNodeExtendedDto.BASE_MEDIA_TYPE + "\n");
-      assertPayloadEquals(request, null, null, false);
-
-      assertResponseParserClassEquals(method, request, ParseXMLWithJAXB.class);
-      assertSaxResponseParserClassEquals(method, null);
-      assertFallbackClassEquals(method, null);
-
-      checkFilters(request);
-   }
-
-   public void testListVirtualMachinesWithOptions() throws SecurityException, NoSuchMethodException, IOException {
-      Invokable<?, ?> method = method(CloudApi.class, "listVirtualMachines", VirtualApplianceDto.class,
-            VirtualMachineOptions.class);
-      GeneratedHttpRequest request = processor.apply(Invocation.create(
-            method,
-            ImmutableList.<Object> of(CloudResources.virtualAppliancePut(), VirtualMachineOptions.builder()
-                  .disablePagination().build())));
-
-      assertRequestLineEquals(request,
-            "GET http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines?limit=0 HTTP/1.1");
-      assertNonPayloadHeadersEqual(request, "Accept: " + VirtualMachinesWithNodeExtendedDto.BASE_MEDIA_TYPE + "\n");
-      assertPayloadEquals(request, null, null, false);
-
-      assertResponseParserClassEquals(method, request, ParseXMLWithJAXB.class);
-      assertSaxResponseParserClassEquals(method, null);
-      assertFallbackClassEquals(method, null);
-
-      checkFilters(request);
-   }
-
    public void testGetVirtualMachine() throws SecurityException, NoSuchMethodException, IOException {
       Invokable<?, ?> method = method(CloudApi.class, "getVirtualMachine", VirtualApplianceDto.class, Integer.class);
       GeneratedHttpRequest request = processor.apply(Invocation.create(method,
@@ -1166,61 +1012,6 @@ public class CloudApiTest extends BaseAbiquoApiTest<CloudApi> {
 
    /*********************** Volumes ***********************/
 
-   public void testListVolumes() throws SecurityException, NoSuchMethodException, IOException {
-      Invokable<?, ?> method = method(CloudApi.class, "listVolumes", VirtualDatacenterDto.class);
-      GeneratedHttpRequest request = processor.apply(Invocation.create(method,
-            ImmutableList.<Object> of(CloudResources.virtualDatacenterPut())));
-
-      assertRequestLineEquals(request, "GET http://localhost/api/cloud/virtualdatacenters/1/volumes HTTP/1.1");
-      assertNonPayloadHeadersEqual(request, "Accept: " + VolumesManagementDto.BASE_MEDIA_TYPE + "\n");
-      assertPayloadEquals(request, null, null, false);
-
-      assertResponseParserClassEquals(method, request, ParseXMLWithJAXB.class);
-      assertSaxResponseParserClassEquals(method, null);
-      assertFallbackClassEquals(method, null);
-
-      checkFilters(request);
-   }
-
-   public void testListVolumesWithOptions() throws SecurityException, NoSuchMethodException, IOException {
-      Invokable<?, ?> method = method(CloudApi.class, "listVolumes", VirtualDatacenterDto.class, VolumeOptions.class);
-      GeneratedHttpRequest request = processor.apply(Invocation.create(
-            method,
-            ImmutableList.<Object> of(CloudResources.virtualDatacenterPut(), VolumeOptions.builder()
-                  .onlyAvailable(true).build())));
-
-      assertRequestLineEquals(request,
-            "GET http://localhost/api/cloud/virtualdatacenters/1/volumes?available=true HTTP/1.1");
-      assertNonPayloadHeadersEqual(request, "Accept: " + VolumesManagementDto.BASE_MEDIA_TYPE + "\n");
-      assertPayloadEquals(request, null, null, false);
-
-      assertResponseParserClassEquals(method, request, ParseXMLWithJAXB.class);
-      assertSaxResponseParserClassEquals(method, null);
-      assertFallbackClassEquals(method, null);
-
-      checkFilters(request);
-   }
-
-   public void testListVolumesWithFilterOptions() throws SecurityException, NoSuchMethodException, IOException {
-      Invokable<?, ?> method = method(CloudApi.class, "listVolumes", VirtualDatacenterDto.class, VolumeOptions.class);
-
-      GeneratedHttpRequest request = processor.apply(Invocation.create(
-            method,
-            ImmutableList.<Object> of(CloudResources.virtualDatacenterPut(), VolumeOptions.builder().has("vol")
-                  .orderBy("name").ascendant(true).build())));
-
-      assertRequestLineEquals(request,
-            "GET http://localhost/api/cloud/virtualdatacenters/1/volumes?has=vol&by=name&asc=true HTTP/1.1");
-      assertNonPayloadHeadersEqual(request, "Accept: " + VolumesManagementDto.BASE_MEDIA_TYPE + "\n");
-      assertPayloadEquals(request, null, null, false);
-
-      assertResponseParserClassEquals(method, request, ParseXMLWithJAXB.class);
-      assertSaxResponseParserClassEquals(method, null);
-      assertFallbackClassEquals(method, null);
-
-      checkFilters(request);
-   }
-
    public void testGetVolume() throws SecurityException, NoSuchMethodException, IOException {
       Invokable<?, ?> method = method(CloudApi.class, "getVolume", VirtualDatacenterDto.class, Integer.class);
       GeneratedHttpRequest request = processor.apply(Invocation.create(method,

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/features/EnterpriseApiExpectTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/features/EnterpriseApiExpectTest.java b/abiquo/src/test/java/org/jclouds/abiquo/features/EnterpriseApiExpectTest.java
index cd05564..4bc3ff2 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/features/EnterpriseApiExpectTest.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/features/EnterpriseApiExpectTest.java
@@ -17,78 +17,194 @@
 package org.jclouds.abiquo.features;
 
 import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
 
 import java.net.URI;
+import java.util.List;
 
 import org.jclouds.abiquo.AbiquoApi;
+import org.jclouds.abiquo.domain.PaginatedCollection;
+import org.jclouds.abiquo.domain.enterprise.options.EnterpriseOptions;
 import org.jclouds.abiquo.domain.enterprise.options.UserOptions;
+import org.jclouds.collect.PagedIterable;
 import org.jclouds.http.HttpRequest;
-import org.jclouds.http.HttpRequest.Builder;
 import org.jclouds.http.HttpResponse;
 import org.testng.annotations.Test;
 
 import com.abiquo.model.rest.RESTLink;
 import com.abiquo.server.core.enterprise.EnterpriseDto;
+import com.abiquo.server.core.enterprise.EnterprisesDto;
+import com.abiquo.server.core.enterprise.UserDto;
 import com.abiquo.server.core.enterprise.UsersDto;
+import com.abiquo.server.core.infrastructure.DatacenterDto;
 
 /**
  * Expect tests for the {@link EnterpriseApi} class.
  * 
  * @author Carlos Garcia
+ * @author Ignasi Barrera
  */
 @Test(groups = "unit", testName = "EnterpriseApiExpectTest")
 public class EnterpriseApiExpectTest extends BaseAbiquoApiExpectTest<EnterpriseApi> {
 
-   private EnterpriseApi buildMockEnterpriseApi(String payloadFile, Builder<?> requestBuilder) {
-      return requestSendsResponse(requestBuilder.build(),
-            HttpResponse.builder().statusCode(200).payload(
-                  payloadFromResourceWithContentType(payloadFile,
-                        normalize(UsersDto.MEDIA_TYPE))) //
-                        .build());
-   }
-
-   public Builder<?> getRequestBuilder() {
-      return HttpRequest.builder() //
-            .method("GET")
-            .endpoint(URI.create("http://localhost/api/admin/enterprises/1/users"))
-            .addHeader("Cookie", tokenAuth)
-            .addHeader("Accept", normalize(UsersDto.MEDIA_TYPE));
-   }
-
    public void testListUsersWithoutPagination() {
-      EnterpriseApi api = buildMockEnterpriseApi("/payloads/usr-list.xml",
-            getRequestBuilder());
+      EnterpriseApi api = requestsSendResponses(
+            HttpRequest.builder().method("GET").endpoint(URI.create("http://localhost/api/admin/enterprises/1/users")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(UsersDto.MEDIA_TYPE)) //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/users-page.xml", normalize(UsersDto.MEDIA_TYPE))) //
+                  .build(),
+            HttpRequest.builder().method("GET").endpoint(URI.create("http://localhost/api/admin/enterprises/1/users")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(UsersDto.MEDIA_TYPE)) //
+                  .addQueryParam("numResults", "2") //
+                  .addQueryParam("page", "1") //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/users-lastpage.xml",
+                              normalize(UsersDto.MEDIA_TYPE))) //
+                  .build());
 
       EnterpriseDto enterprise = new EnterpriseDto();
-      enterprise.addLink(new RESTLink("users",
-            "http://localhost/api/admin/enterprises/1/users"));
-
-      UsersDto users = api.listUsers(enterprise);
-      assertEquals(users.getCollection().size(), 3);
-      assertEquals(users.getCollection().get(0).getNick(), "potter");
-      assertEquals(users.getCollection().get(1).getNick(), "granger");
-      assertEquals(users.getCollection().get(2).getNick(), "ron");
+      enterprise.addLink(new RESTLink("users", "http://localhost/api/admin/enterprises/1/users"));
+
+      PagedIterable<UserDto> result = api.listUsers(enterprise);
+      List<UserDto> all = result.concat().toList();
+
+      assertEquals(all.size(), 3);
+      assertEquals(all.get(0).getId().intValue(), 1);
+      assertEquals(all.get(1).getId().intValue(), 2);
+      assertEquals(all.get(2).getId().intValue(), 3);
    }
 
    public void testListUsersWithPagination() {
-      Builder<?> builder = getRequestBuilder();
-      builder.addQueryParam("numResults", "2"); 
-      builder.addQueryParam("page", "2");
-      EnterpriseApi api = buildMockEnterpriseApi("/payloads/usr-list-page-2.xml", builder);
+      EnterpriseApi api = requestSendsResponse(
+            HttpRequest.builder().method("GET").endpoint(URI.create("http://localhost/api/admin/enterprises/1/users")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(UsersDto.MEDIA_TYPE)) //
+                  .addQueryParam("page", "1") //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/users-lastpage.xml",
+                              normalize(UsersDto.MEDIA_TYPE))) //
+                  .build());
 
       EnterpriseDto enterprise = new EnterpriseDto();
-      enterprise.addLink(new RESTLink("users",
-            "http://localhost/api/admin/enterprises/1/users"));
+      enterprise.addLink(new RESTLink("users", "http://localhost/api/admin/enterprises/1/users"));
+
+      UserOptions options = UserOptions.builder().page(1).build();
+      PaginatedCollection<UserDto, UsersDto> result = api.listUsers(enterprise, options);
+
+      assertEquals(result.size(), 1);
+      assertEquals(result.getTotalSize().intValue(), 3);
+      assertEquals(result.get(0).getId().intValue(), 3);
+      assertNotNull(result.searchLink("first"));
+      assertNotNull(result.searchLink("last"));
+   }
+
+   public void testListEnterprises() {
+      EnterpriseApi api = requestSendsResponse(
+            HttpRequest.builder().method("GET").endpoint(URI.create("http://localhost/api/admin/enterprises")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(EnterprisesDto.MEDIA_TYPE)) //
+                  .addQueryParam("limit", "1") //
+                  .addQueryParam("has", "text") //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/enterprises-page.xml",
+                              normalize(EnterprisesDto.MEDIA_TYPE))) //
+                  .build());
+
+      EnterpriseOptions options = EnterpriseOptions.builder().limit(1).has("text").build();
+      PaginatedCollection<EnterpriseDto, EnterprisesDto> result = api.listEnterprises(options);
 
-      UsersDto users = api.listUsers(enterprise, 
-            UserOptions.builder().limit(2).page(2).build());
-      assertEquals(users.getCollection().size(), 1);
-      assertEquals(users.getCollection().get(0).getNick(), "ron");
+      assertEquals(result.size(), 1);
+      assertEquals(result.getTotalSize().intValue(), 2);
+      assertEquals(result.get(0).getId().intValue(), 1);
+      assertNotNull(result.searchLink("first"));
+      assertNotNull(result.searchLink("last"));
+   }
+
+   public void testListEnterprisesByDatacenterWithOptions() {
+      EnterpriseApi api = requestSendsResponse(
+            HttpRequest.builder().method("GET")
+                  .endpoint(URI.create("http://localhost/api/admin/datacenters/1/action/enterprises")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(EnterprisesDto.MEDIA_TYPE)) //
+                  .addQueryParam("limit", "1") //
+                  .addQueryParam("has", "text") //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/enterprises-page.xml",
+                              normalize(EnterprisesDto.MEDIA_TYPE))) //
+                  .build());
+
+      DatacenterDto datacenter = new DatacenterDto();
+      datacenter.addLink(new RESTLink("enterprises", "http://localhost/api/admin/datacenters/1/action/enterprises"));
+
+      EnterpriseOptions options = EnterpriseOptions.builder().limit(1).has("text").build();
+      PaginatedCollection<EnterpriseDto, EnterprisesDto> result = api.listEnterprises(datacenter, options);
+
+      assertEquals(result.size(), 1);
+      assertEquals(result.getTotalSize().intValue(), 2);
+      assertEquals(result.get(0).getId().intValue(), 1);
+      assertNotNull(result.searchLink("first"));
+      assertNotNull(result.searchLink("last"));
+   }
+
+   public void testListEnterprisesReturns2xx() {
+      EnterpriseApi api = requestsSendResponses(
+            HttpRequest.builder().method("GET").endpoint(URI.create("http://localhost/api/admin/enterprises")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(EnterprisesDto.MEDIA_TYPE)) //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/enterprises-page.xml",
+                              normalize(EnterprisesDto.MEDIA_TYPE))) //
+                  .build(),
+            HttpRequest.builder().method("GET").endpoint(URI.create("http://localhost/api/admin/enterprises")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(EnterprisesDto.MEDIA_TYPE)) //
+                  .addQueryParam("startwith", "1") //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/enterprises-lastpage.xml",
+                              normalize(EnterprisesDto.MEDIA_TYPE))) //
+                  .build());
+
+      PagedIterable<EnterpriseDto> result = api.listEnterprises();
+      List<EnterpriseDto> all = result.concat().toList();
+
+      assertEquals(all.size(), 2);
+      assertEquals(all.get(0).getId().intValue(), 1);
+      assertEquals(all.get(1).getId().intValue(), 2);
    }
 
    @Override
    protected EnterpriseApi clientFrom(AbiquoApi api) {
       return api.getEnterpriseApi();
    }
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/features/EnterpriseApiTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/features/EnterpriseApiTest.java b/abiquo/src/test/java/org/jclouds/abiquo/features/EnterpriseApiTest.java
index b6b9f19..dab4357 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/features/EnterpriseApiTest.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/features/EnterpriseApiTest.java
@@ -24,7 +24,6 @@ import java.io.IOException;
 import org.jclouds.Fallbacks.NullOnNotFoundOr404;
 import org.jclouds.abiquo.domain.EnterpriseResources;
 import org.jclouds.abiquo.domain.InfrastructureResources;
-import org.jclouds.abiquo.domain.enterprise.options.EnterpriseOptions;
 import org.jclouds.fallbacks.MapHttp4xxCodesToExceptions;
 import org.jclouds.http.functions.ParseXMLWithJAXB;
 import org.jclouds.http.functions.ReleasePayloadAndReturn;
@@ -43,9 +42,7 @@ import com.abiquo.server.core.enterprise.DatacenterLimitsDto;
 import com.abiquo.server.core.enterprise.DatacentersLimitsDto;
 import com.abiquo.server.core.enterprise.EnterpriseDto;
 import com.abiquo.server.core.enterprise.EnterprisePropertiesDto;
-import com.abiquo.server.core.enterprise.EnterprisesDto;
 import com.abiquo.server.core.enterprise.UserDto;
-import com.abiquo.server.core.enterprise.UsersDto;
 import com.abiquo.server.core.infrastructure.DatacenterDto;
 import com.abiquo.server.core.infrastructure.DatacentersDto;
 import com.abiquo.server.core.infrastructure.MachinesDto;
@@ -63,58 +60,6 @@ import com.google.common.reflect.Invokable;
 public class EnterpriseApiTest extends BaseAbiquoApiTest<EnterpriseApi> {
    /*********************** Enterprise ********************** */
 
-   public void testListEnterprises() throws SecurityException, NoSuchMethodException, IOException {
-      Invokable<?, ?> method = method(EnterpriseApi.class, "listEnterprises");
-      GeneratedHttpRequest request = processor.apply(Invocation.create(method, ImmutableList.of()));
-
-      assertRequestLineEquals(request, "GET http://localhost/api/admin/enterprises HTTP/1.1");
-      assertNonPayloadHeadersEqual(request, "Accept: " + EnterprisesDto.BASE_MEDIA_TYPE + "\n");
-      assertPayloadEquals(request, null, null, false);
-
-      assertResponseParserClassEquals(method, request, ParseXMLWithJAXB.class);
-      assertSaxResponseParserClassEquals(method, null);
-      assertFallbackClassEquals(method, null);
-
-      checkFilters(request);
-   }
-
-   public void testListEnterprisesWithOptions() throws SecurityException, NoSuchMethodException, IOException {
-      EnterpriseOptions options = EnterpriseOptions.builder().has("abi").orderBy("name").ascendant(true).build();
-
-      Invokable<?, ?> method = method(EnterpriseApi.class, "listEnterprises", EnterpriseOptions.class);
-      GeneratedHttpRequest request = processor.apply(Invocation.create(method, ImmutableList.<Object> of(options)));
-
-      assertRequestLineEquals(request, "GET http://localhost/api/admin/enterprises?has=abi&by=name&asc=true HTTP/1.1");
-      assertNonPayloadHeadersEqual(request, "Accept: " + EnterprisesDto.BASE_MEDIA_TYPE + "\n");
-      assertPayloadEquals(request, null, null, false);
-
-      assertResponseParserClassEquals(method, request, ParseXMLWithJAXB.class);
-      assertSaxResponseParserClassEquals(method, null);
-      assertFallbackClassEquals(method, null);
-
-      checkFilters(request);
-   }
-
-   public void testListEnterprisesByDatacenter() throws SecurityException, NoSuchMethodException, IOException {
-      EnterpriseOptions options = EnterpriseOptions.builder().startWith(0).limit(25).network(true).build();
-
-      Invokable<?, ?> method = method(EnterpriseApi.class, "listEnterprises", DatacenterDto.class,
-            EnterpriseOptions.class);
-      GeneratedHttpRequest request = processor.apply(Invocation.create(method,
-            ImmutableList.<Object> of(InfrastructureResources.datacenterPut(), options)));
-
-      assertRequestLineEquals(request,
-            "GET http://localhost/api/admin/datacenters/1/action/enterprises?network=true&startwith=0&limit=25 HTTP/1.1");
-      assertNonPayloadHeadersEqual(request, "Accept: " + EnterprisesDto.BASE_MEDIA_TYPE + "\n");
-      assertPayloadEquals(request, null, null, false);
-
-      assertResponseParserClassEquals(method, request, ParseXMLWithJAXB.class);
-      assertSaxResponseParserClassEquals(method, null);
-      assertFallbackClassEquals(method, null);
-
-      checkFilters(request);
-   }
-
    public void testCreateEnterprise() throws SecurityException, NoSuchMethodException, IOException {
       Invokable<?, ?> method = method(EnterpriseApi.class, "createEnterprise", EnterpriseDto.class);
       GeneratedHttpRequest request = processor.apply(Invocation.create(method,
@@ -367,22 +312,6 @@ public class EnterpriseApiTest extends BaseAbiquoApiTest<EnterpriseApi> {
       checkFilters(request);
    }
 
-   public void testListUsers() throws SecurityException, NoSuchMethodException, IOException {
-      Invokable<?, ?> method = method(EnterpriseApi.class, "listUsers", EnterpriseDto.class);
-      GeneratedHttpRequest request = processor.apply(Invocation.create(method,
-            ImmutableList.<Object> of(EnterpriseResources.enterprisePut())));
-
-      assertRequestLineEquals(request, "GET http://localhost/api/admin/enterprises/1/users HTTP/1.1");
-      assertNonPayloadHeadersEqual(request, "Accept: " + UsersDto.BASE_MEDIA_TYPE + "\n");
-      assertPayloadEquals(request, null, null, false);
-
-      assertResponseParserClassEquals(method, request, ParseXMLWithJAXB.class);
-      assertSaxResponseParserClassEquals(method, null);
-      assertFallbackClassEquals(method, null);
-
-      checkFilters(request);
-   }
-
    public void testCreateUser() throws SecurityException, NoSuchMethodException, IOException {
       EnterpriseDto enterprise = EnterpriseResources.enterprisePut();
       UserDto user = EnterpriseResources.userPost();

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/features/EventApiExpectTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/features/EventApiExpectTest.java b/abiquo/src/test/java/org/jclouds/abiquo/features/EventApiExpectTest.java
new file mode 100644
index 0000000..4c1d3c1
--- /dev/null
+++ b/abiquo/src/test/java/org/jclouds/abiquo/features/EventApiExpectTest.java
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.abiquo.features;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+import java.net.URI;
+import java.util.List;
+
+import org.jclouds.abiquo.AbiquoApi;
+import org.jclouds.abiquo.domain.PaginatedCollection;
+import org.jclouds.abiquo.domain.event.options.EventOptions;
+import org.jclouds.collect.PagedIterable;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
+import org.testng.annotations.Test;
+
+import com.abiquo.server.core.event.EventDto;
+import com.abiquo.server.core.event.EventsDto;
+
+/**
+ * Expect tests for the {@link EventApi}.
+ * 
+ * @author Ignasi Barrera
+ */
+@Test(groups = "unit", testName = "EventApiExpectTest")
+public class EventApiExpectTest extends BaseAbiquoApiExpectTest<EventApi> {
+
+   public void testListEventsWithPagination() {
+      EventApi api = requestSendsResponse(
+            HttpRequest.builder().method("GET").endpoint(URI.create("http://localhost/api/events")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(EventsDto.MEDIA_TYPE)) //
+                  .addQueryParam("limit", "1") //
+                  .addQueryParam("has", "text") //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/events-page.xml", normalize(EventsDto.MEDIA_TYPE))) //
+                  .build());
+
+      EventOptions options = EventOptions.builder().limit(1).has("text").build();
+      PaginatedCollection<EventDto, EventsDto> result = api.listEvents(options);
+
+      assertEquals(result.size(), 2);
+      assertEquals(result.getTotalSize().intValue(), 4);
+      assertEquals(result.get(0).getId().intValue(), 109);
+      assertNotNull(result.searchLink("first"));
+      assertNotNull(result.searchLink("last"));
+   }
+
+   public void testListEventsReturns2xx() {
+      EventApi api = requestsSendResponses(
+            HttpRequest.builder().method("GET").endpoint(URI.create("http://localhost/api/events")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(EventsDto.MEDIA_TYPE)) //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/events-page.xml", normalize(EventsDto.MEDIA_TYPE))) //
+                  .build(),
+            HttpRequest.builder().method("GET").endpoint(URI.create("http://localhost/api/events")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(EventsDto.MEDIA_TYPE)) //
+                  .addQueryParam("startwith", "1") //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/events-lastpage.xml",
+                              normalize(EventsDto.MEDIA_TYPE))) //
+                  .build());
+
+      PagedIterable<EventDto> result = api.listEvents();
+      List<EventDto> all = result.concat().toList();
+
+      assertEquals(all.size(), 4);
+      assertEquals(all.get(0).getId().intValue(), 109);
+      assertEquals(all.get(1).getId().intValue(), 108);
+      assertEquals(all.get(2).getId().intValue(), 110);
+      assertEquals(all.get(3).getId().intValue(), 111);
+   }
+
+   @Override
+   protected EventApi clientFrom(AbiquoApi api) {
+      return api.getEventApi();
+   }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/features/EventApiTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/features/EventApiTest.java b/abiquo/src/test/java/org/jclouds/abiquo/features/EventApiTest.java
deleted file mode 100644
index b0aa4a6..0000000
--- a/abiquo/src/test/java/org/jclouds/abiquo/features/EventApiTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF 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.abiquo.features;
-
-import static org.jclouds.reflect.Reflection2.method;
-
-import java.io.IOException;
-
-import org.jclouds.http.functions.ParseXMLWithJAXB;
-import org.jclouds.reflect.Invocation;
-import org.jclouds.rest.internal.GeneratedHttpRequest;
-import org.testng.annotations.Test;
-
-import com.abiquo.server.core.event.EventsDto;
-import com.google.common.collect.ImmutableList;
-import com.google.common.reflect.Invokable;
-
-/**
- * Tests annotation parsing of {@code EventApi}
- * 
- * @author Ignasi Barrera
- * @author Vivien Mahé
- */
-@Test(groups = "unit", testName = "EventApiTest")
-public class EventApiTest extends BaseAbiquoApiTest<EventApi> {
-   public void testListEvents() throws SecurityException, NoSuchMethodException, IOException {
-      Invokable<?, ?> method = method(EventApi.class, "listEvents");
-      GeneratedHttpRequest request = processor.apply(Invocation.create(method, ImmutableList.of()));
-
-      assertRequestLineEquals(request, "GET http://localhost/api/events HTTP/1.1");
-      assertNonPayloadHeadersEqual(request, "Accept: " + EventsDto.BASE_MEDIA_TYPE + "\n");
-      assertPayloadEquals(request, null, null, false);
-
-      assertResponseParserClassEquals(method, request, ParseXMLWithJAXB.class);
-      assertSaxResponseParserClassEquals(method, null);
-      assertFallbackClassEquals(method, null);
-
-      checkFilters(request);
-   }
-}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/features/InfrastructureApiExpectTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/features/InfrastructureApiExpectTest.java b/abiquo/src/test/java/org/jclouds/abiquo/features/InfrastructureApiExpectTest.java
index 90683ed..fcdc3a3 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/features/InfrastructureApiExpectTest.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/features/InfrastructureApiExpectTest.java
@@ -21,16 +21,27 @@ import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertNull;
 
 import java.net.URI;
+import java.util.List;
 
 import org.jclouds.abiquo.AbiquoApi;
+import org.jclouds.abiquo.domain.PaginatedCollection;
+import org.jclouds.abiquo.domain.network.options.IpOptions;
+import org.jclouds.collect.PagedIterable;
 import org.jclouds.http.HttpRequest;
 import org.jclouds.http.HttpResponse;
 import org.testng.annotations.Test;
 
 import com.abiquo.model.rest.RESTLink;
 import com.abiquo.server.core.infrastructure.DatacenterDto;
+import com.abiquo.server.core.infrastructure.network.ExternalIpDto;
+import com.abiquo.server.core.infrastructure.network.ExternalIpsDto;
 import com.abiquo.server.core.infrastructure.network.NetworkServiceTypeDto;
 import com.abiquo.server.core.infrastructure.network.NetworkServiceTypesDto;
+import com.abiquo.server.core.infrastructure.network.PublicIpDto;
+import com.abiquo.server.core.infrastructure.network.PublicIpsDto;
+import com.abiquo.server.core.infrastructure.network.UnmanagedIpDto;
+import com.abiquo.server.core.infrastructure.network.UnmanagedIpsDto;
+import com.abiquo.server.core.infrastructure.network.VLANNetworkDto;
 
 /**
  * Expect tests for the {@link InfrastructureApi} class.
@@ -191,6 +202,222 @@ public class InfrastructureApiExpectTest extends BaseAbiquoApiExpectTest<Infrast
       api.deleteNetworkServiceType(nst);
    }
 
+   public void testListPublicIps() {
+      InfrastructureApi api = requestsSendResponses(
+            HttpRequest.builder() //
+                  .method("GET") //
+                  .endpoint(URI.create("http://localhost/api/admin/datacenters/1/network/1/ips")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(PublicIpsDto.MEDIA_TYPE)) //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/publicips-page.xml",
+                              normalize(PublicIpsDto.MEDIA_TYPE))) //
+                  .build(),
+            HttpRequest.builder() //
+                  .method("GET") //
+                  .endpoint(URI.create("http://localhost/api/admin/datacenters/1/network/1/ips")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(PublicIpsDto.MEDIA_TYPE)) //
+                  .addQueryParam("startwith", "3") //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/publicips-lastpage.xml",
+                              normalize(PublicIpsDto.MEDIA_TYPE))) //
+                  .build());
+
+      VLANNetworkDto vlan = new VLANNetworkDto();
+      vlan.addLink(new RESTLink("ips", "http://localhost/api/admin/datacenters/1/network/1/ips"));
+
+      PagedIterable<PublicIpDto> publicIps = api.listPublicIps(vlan);
+      List<PublicIpDto> ips = publicIps.concat().toList();
+
+      assertEquals(ips.size(), 4);
+      assertEquals(ips.get(0).getId().intValue(), 1);
+      assertEquals(ips.get(1).getId().intValue(), 2);
+      assertEquals(ips.get(2).getId().intValue(), 3);
+      assertEquals(ips.get(3).getId().intValue(), 4);
+   }
+
+   public void testListPublicIpsWithPagination() {
+      InfrastructureApi api = requestSendsResponse(
+            HttpRequest.builder() //
+                  .method("GET") //
+                  .endpoint(URI.create("http://localhost/api/admin/datacenters/1/network/1/ips")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(PublicIpsDto.MEDIA_TYPE)) //
+                  .addQueryParam("startwith", "3") //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/publicips-lastpage.xml",
+                              normalize(PublicIpsDto.MEDIA_TYPE))) //
+                  .build());
+
+      VLANNetworkDto vlan = new VLANNetworkDto();
+      vlan.addLink(new RESTLink("ips", "http://localhost/api/admin/datacenters/1/network/1/ips"));
+
+      IpOptions options = IpOptions.builder().startWith(3).build();
+      PaginatedCollection<PublicIpDto, PublicIpsDto> ips = api.listPublicIps(vlan, options);
+
+      assertEquals(ips.size(), 2);
+      assertEquals(ips.getTotalSize().intValue(), 4);
+      assertEquals(ips.get(0).getId().intValue(), 3);
+      assertEquals(ips.get(1).getId().intValue(), 4);
+   }
+
+   public void testListExternalIps() {
+      InfrastructureApi api = requestsSendResponses(
+            HttpRequest.builder() //
+                  .method("GET") //
+                  .endpoint(URI.create("http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(ExternalIpsDto.MEDIA_TYPE)) //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/externalips-page.xml",
+                              normalize(ExternalIpsDto.MEDIA_TYPE))) //
+                  .build(),
+            HttpRequest.builder() //
+                  .method("GET") //
+                  .endpoint(URI.create("http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(ExternalIpsDto.MEDIA_TYPE)) //
+                  .addQueryParam("startwith", "3") //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/externalips-lastpage.xml",
+                              normalize(ExternalIpsDto.MEDIA_TYPE))) //
+                  .build());
+
+      VLANNetworkDto vlan = new VLANNetworkDto();
+      vlan.addLink(new RESTLink("ips", "http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips"));
+
+      PagedIterable<ExternalIpDto> publicIps = api.listExternalIps(vlan);
+      List<ExternalIpDto> ips = publicIps.concat().toList();
+
+      assertEquals(ips.size(), 4);
+      assertEquals(ips.get(0).getId().intValue(), 1);
+      assertEquals(ips.get(1).getId().intValue(), 2);
+      assertEquals(ips.get(2).getId().intValue(), 3);
+      assertEquals(ips.get(3).getId().intValue(), 4);
+   }
+
+   public void testListExternalIpsWithPagination() {
+      InfrastructureApi api = requestSendsResponse(
+            HttpRequest.builder() //
+                  .method("GET") //
+                  .endpoint(URI.create("http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(ExternalIpsDto.MEDIA_TYPE)) //
+                  .addQueryParam("startwith", "3") //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/externalips-lastpage.xml",
+                              normalize(ExternalIpsDto.MEDIA_TYPE))) //
+                  .build());
+
+      VLANNetworkDto vlan = new VLANNetworkDto();
+      vlan.addLink(new RESTLink("ips", "http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips"));
+
+      IpOptions options = IpOptions.builder().startWith(3).build();
+      PaginatedCollection<ExternalIpDto, ExternalIpsDto> ips = api.listExternalIps(vlan, options);
+
+      assertEquals(ips.size(), 2);
+      assertEquals(ips.getTotalSize().intValue(), 4);
+      assertEquals(ips.get(0).getId().intValue(), 3);
+      assertEquals(ips.get(1).getId().intValue(), 4);
+   }
+
+   public void testListUnmanagedIps() {
+      InfrastructureApi api = requestsSendResponses(
+            HttpRequest.builder() //
+                  .method("GET") //
+                  .endpoint(URI.create("http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(UnmanagedIpsDto.MEDIA_TYPE)) //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/unmanagedips-page.xml",
+                              normalize(UnmanagedIpsDto.MEDIA_TYPE))) //
+                  .build(),
+            HttpRequest.builder() //
+                  .method("GET") //
+                  .endpoint(URI.create("http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(UnmanagedIpsDto.MEDIA_TYPE)) //
+                  .addQueryParam("startwith", "3") //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/unmanagedips-lastpage.xml",
+                              normalize(UnmanagedIpsDto.MEDIA_TYPE))) //
+                  .build());
+
+      VLANNetworkDto vlan = new VLANNetworkDto();
+      vlan.addLink(new RESTLink("ips", "http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips"));
+
+      PagedIterable<UnmanagedIpDto> unmanagedIps = api.listUnmanagedIps(vlan);
+      List<UnmanagedIpDto> ips = unmanagedIps.concat().toList();
+
+      assertEquals(ips.size(), 4);
+      assertEquals(ips.get(0).getId().intValue(), 1);
+      assertEquals(ips.get(1).getId().intValue(), 2);
+      assertEquals(ips.get(2).getId().intValue(), 3);
+      assertEquals(ips.get(3).getId().intValue(), 4);
+   }
+
+   public void testListUnmanagedIpsWithPagination() {
+      InfrastructureApi api = requestSendsResponse(
+            HttpRequest.builder() //
+                  .method("GET") //
+                  .endpoint(URI.create("http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(UnmanagedIpsDto.MEDIA_TYPE)) //
+                  .addQueryParam("startwith", "3") //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/unmanagedips-lastpage.xml",
+                              normalize(UnmanagedIpsDto.MEDIA_TYPE))) //
+                  .build());
+
+      VLANNetworkDto vlan = new VLANNetworkDto();
+      vlan.addLink(new RESTLink("ips", "http://localhost/api/admin/enterprises/2/limits/2/externalnetworks/2/ips"));
+
+      IpOptions options = IpOptions.builder().startWith(3).build();
+      PaginatedCollection<UnmanagedIpDto, UnmanagedIpsDto> ips = api.listUnmanagedIps(vlan, options);
+
+      assertEquals(ips.size(), 2);
+      assertEquals(ips.getTotalSize().intValue(), 4);
+      assertEquals(ips.get(0).getId().intValue(), 3);
+      assertEquals(ips.get(1).getId().intValue(), 4);
+   }
+
    @Override
    protected InfrastructureApi clientFrom(AbiquoApi api) {
       return api.getInfrastructureApi();

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/features/InfrastructureApiTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/features/InfrastructureApiTest.java b/abiquo/src/test/java/org/jclouds/abiquo/features/InfrastructureApiTest.java
index 3064935..36eb667 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/features/InfrastructureApiTest.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/features/InfrastructureApiTest.java
@@ -33,7 +33,6 @@ import org.jclouds.abiquo.domain.infrastructure.options.DatacenterOptions;
 import org.jclouds.abiquo.domain.infrastructure.options.IpmiOptions;
 import org.jclouds.abiquo.domain.infrastructure.options.MachineOptions;
 import org.jclouds.abiquo.domain.infrastructure.options.StoragePoolOptions;
-import org.jclouds.abiquo.domain.network.options.IpOptions;
 import org.jclouds.abiquo.domain.network.options.NetworkOptions;
 import org.jclouds.fallbacks.MapHttp4xxCodesToExceptions;
 import org.jclouds.http.functions.ParseXMLWithJAXB;
@@ -63,11 +62,8 @@ import com.abiquo.server.core.infrastructure.RacksDto;
 import com.abiquo.server.core.infrastructure.RemoteServiceDto;
 import com.abiquo.server.core.infrastructure.RemoteServicesDto;
 import com.abiquo.server.core.infrastructure.network.ExternalIpDto;
-import com.abiquo.server.core.infrastructure.network.ExternalIpsDto;
 import com.abiquo.server.core.infrastructure.network.PublicIpDto;
-import com.abiquo.server.core.infrastructure.network.PublicIpsDto;
 import com.abiquo.server.core.infrastructure.network.UnmanagedIpDto;
-import com.abiquo.server.core.infrastructure.network.UnmanagedIpsDto;
 import com.abiquo.server.core.infrastructure.network.VLANNetworkDto;
 import com.abiquo.server.core.infrastructure.network.VLANNetworksDto;
 import com.abiquo.server.core.infrastructure.network.VlanTagAvailabilityDto;
@@ -1231,40 +1227,6 @@ public class InfrastructureApiTest extends BaseAbiquoApiTest<InfrastructureApi>
 
    /*********************** Network IPs ***********************/
 
-   public void testListPublicIps() throws SecurityException, NoSuchMethodException, IOException {
-      Invokable<?, ?> method = method(InfrastructureApi.class, "listPublicIps", VLANNetworkDto.class);
-      GeneratedHttpRequest request = processor.apply(Invocation.create(method,
-            ImmutableList.<Object> of(NetworkResources.publicNetworkPut())));
-
-      assertRequestLineEquals(request, "GET http://localhost/api/admin/datacenters/1/network/1/ips HTTP/1.1");
-      assertNonPayloadHeadersEqual(request, "Accept: " + PublicIpsDto.BASE_MEDIA_TYPE + "\n");
-      assertPayloadEquals(request, null, null, false);
-
-      assertResponseParserClassEquals(method, request, ParseXMLWithJAXB.class);
-      assertSaxResponseParserClassEquals(method, null);
-      assertFallbackClassEquals(method, null);
-
-      checkFilters(request);
-   }
-
-   public void testListPublicIpsWithOptions() throws SecurityException, NoSuchMethodException, IOException {
-      IpOptions options = IpOptions.builder().startWith(10).build();
-      Invokable<?, ?> method = method(InfrastructureApi.class, "listPublicIps", VLANNetworkDto.class, IpOptions.class);
-      GeneratedHttpRequest request = processor.apply(Invocation.create(method,
-            ImmutableList.<Object> of(NetworkResources.publicNetworkPut(), options)));
-
-      assertRequestLineEquals(request,
-            "GET http://localhost/api/admin/datacenters/1/network/1/ips?startwith=10 HTTP/1.1");
-      assertNonPayloadHeadersEqual(request, "Accept: " + PublicIpsDto.BASE_MEDIA_TYPE + "\n");
-      assertPayloadEquals(request, null, null, false);
-
-      assertResponseParserClassEquals(method, request, ParseXMLWithJAXB.class);
-      assertSaxResponseParserClassEquals(method, null);
-      assertFallbackClassEquals(method, null);
-
-      checkFilters(request);
-   }
-
    public void testGetPublicIp() throws SecurityException, NoSuchMethodException, IOException {
       Invokable<?, ?> method = method(InfrastructureApi.class, "getPublicIp", VLANNetworkDto.class, Integer.class);
       GeneratedHttpRequest request = processor.apply(Invocation.create(method,
@@ -1281,41 +1243,6 @@ public class InfrastructureApiTest extends BaseAbiquoApiTest<InfrastructureApi>
       checkFilters(request);
    }
 
-   public void testListExternalIps() throws SecurityException, NoSuchMethodException, IOException {
-      Invokable<?, ?> method = method(InfrastructureApi.class, "listExternalIps", VLANNetworkDto.class);
-      GeneratedHttpRequest request = processor.apply(Invocation.create(method,
-            ImmutableList.<Object> of(NetworkResources.externalNetworkPut())));
-
-      assertRequestLineEquals(request,
-            "GET http://localhost/api/admin/enterprises/1/limits/1/externalnetworks/1/ips HTTP/1.1");
-      assertNonPayloadHeadersEqual(request, "Accept: " + ExternalIpsDto.BASE_MEDIA_TYPE + "\n");
-      assertPayloadEquals(request, null, null, false);
-
-      assertResponseParserClassEquals(method, request, ParseXMLWithJAXB.class);
-      assertSaxResponseParserClassEquals(method, null);
-      assertFallbackClassEquals(method, null);
-
-      checkFilters(request);
-   }
-
-   public void testListExternalIpsWithOptions() throws SecurityException, NoSuchMethodException, IOException {
-      IpOptions options = IpOptions.builder().startWith(10).build();
-      Invokable<?, ?> method = method(InfrastructureApi.class, "listExternalIps", VLANNetworkDto.class, IpOptions.class);
-      GeneratedHttpRequest request = processor.apply(Invocation.create(method,
-            ImmutableList.<Object> of(NetworkResources.externalNetworkPut(), options)));
-
-      assertRequestLineEquals(request,
-            "GET http://localhost/api/admin/enterprises/1/limits/1/externalnetworks/1/ips?startwith=10 HTTP/1.1");
-      assertNonPayloadHeadersEqual(request, "Accept: " + ExternalIpsDto.BASE_MEDIA_TYPE + "\n");
-      assertPayloadEquals(request, null, null, false);
-
-      assertResponseParserClassEquals(method, request, ParseXMLWithJAXB.class);
-      assertSaxResponseParserClassEquals(method, null);
-      assertFallbackClassEquals(method, null);
-
-      checkFilters(request);
-   }
-
    public void testGetExternalIp() throws SecurityException, NoSuchMethodException, IOException {
       Invokable<?, ?> method = method(InfrastructureApi.class, "getExternalIp", VLANNetworkDto.class, Integer.class);
       GeneratedHttpRequest request = processor.apply(Invocation.create(method,
@@ -1333,42 +1260,6 @@ public class InfrastructureApiTest extends BaseAbiquoApiTest<InfrastructureApi>
       checkFilters(request);
    }
 
-   public void testListUnmanagedIps() throws SecurityException, NoSuchMethodException, IOException {
-      Invokable<?, ?> method = method(InfrastructureApi.class, "listUnmanagedIps", VLANNetworkDto.class);
-      GeneratedHttpRequest request = processor.apply(Invocation.create(method,
-            ImmutableList.<Object> of(NetworkResources.unmanagedNetworkPut())));
-
-      assertRequestLineEquals(request,
-            "GET http://localhost/api/admin/enterprises/1/limits/1/externalnetworks/1/ips HTTP/1.1");
-      assertNonPayloadHeadersEqual(request, "Accept: " + UnmanagedIpsDto.BASE_MEDIA_TYPE + "\n");
-      assertPayloadEquals(request, null, null, false);
-
-      assertResponseParserClassEquals(method, request, ParseXMLWithJAXB.class);
-      assertSaxResponseParserClassEquals(method, null);
-      assertFallbackClassEquals(method, null);
-
-      checkFilters(request);
-   }
-
-   public void testListUnmanagedIpsWithOptions() throws SecurityException, NoSuchMethodException, IOException {
-      IpOptions options = IpOptions.builder().startWith(10).build();
-      Invokable<?, ?> method = method(InfrastructureApi.class, "listUnmanagedIps", VLANNetworkDto.class,
-            IpOptions.class);
-      GeneratedHttpRequest request = processor.apply(Invocation.create(method,
-            ImmutableList.<Object> of(NetworkResources.unmanagedNetworkPut(), options)));
-
-      assertRequestLineEquals(request,
-            "GET http://localhost/api/admin/enterprises/1/limits/1/externalnetworks/1/ips?startwith=10 HTTP/1.1");
-      assertNonPayloadHeadersEqual(request, "Accept: " + UnmanagedIpsDto.BASE_MEDIA_TYPE + "\n");
-      assertPayloadEquals(request, null, null, false);
-
-      assertResponseParserClassEquals(method, request, ParseXMLWithJAXB.class);
-      assertSaxResponseParserClassEquals(method, null);
-      assertFallbackClassEquals(method, null);
-
-      checkFilters(request);
-   }
-
    public void testGetUnmanagedIp() throws SecurityException, NoSuchMethodException, IOException {
       Invokable<?, ?> method = method(InfrastructureApi.class, "getUnmanagedIp", VLANNetworkDto.class, Integer.class);
       GeneratedHttpRequest request = processor.apply(Invocation.create(method,

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/features/VirtualMachineTemplateApiExpectTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/features/VirtualMachineTemplateApiExpectTest.java b/abiquo/src/test/java/org/jclouds/abiquo/features/VirtualMachineTemplateApiExpectTest.java
index e9aabe4..7f8f267 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/features/VirtualMachineTemplateApiExpectTest.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/features/VirtualMachineTemplateApiExpectTest.java
@@ -20,13 +20,17 @@ import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 
 import java.net.URI;
+import java.util.List;
 
 import org.jclouds.abiquo.AbiquoApi;
+import org.jclouds.abiquo.domain.PaginatedCollection;
 import org.jclouds.abiquo.domain.cloud.options.VirtualMachineTemplateOptions;
+import org.jclouds.collect.PagedIterable;
 import org.jclouds.http.HttpRequest;
 import org.jclouds.http.HttpResponse;
 import org.testng.annotations.Test;
 
+import com.abiquo.server.core.appslibrary.VirtualMachineTemplateDto;
 import com.abiquo.server.core.appslibrary.VirtualMachineTemplatesDto;
 
 /**
@@ -59,16 +63,59 @@ public class VirtualMachineTemplateApiExpectTest extends BaseAbiquoApiExpectTest
                   .build());
 
       VirtualMachineTemplateOptions options = VirtualMachineTemplateOptions.builder().limit(1).has("text").build();
-      VirtualMachineTemplatesDto result = api.listVirtualMachineTemplates(1, 1, options);
+      PaginatedCollection<VirtualMachineTemplateDto, VirtualMachineTemplatesDto> result = api
+            .listVirtualMachineTemplates(1, 1, options);
 
-      assertEquals(result.getCollection().size(), 1);
+      assertEquals(result.size(), 1);
       assertEquals(result.getTotalSize().intValue(), 2);
-      assertEquals(result.getCollection().get(0).getId().intValue(), 151);
+      assertEquals(result.get(0).getId().intValue(), 151);
       assertNotNull(result.searchLink("first"));
       assertNotNull(result.searchLink("last"));
       assertNotNull(result.searchLink("next"));
    }
 
+   public void testListVirtualMachineTemplatesReturns2xx() {
+      VirtualMachineTemplateApi api = requestsSendResponses(
+            HttpRequest
+                  .builder()
+                  .method("GET")
+                  .endpoint(
+                        URI.create("http://localhost/api/admin/enterprises/1/datacenterrepositories/1/virtualmachinetemplates")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(VirtualMachineTemplatesDto.MEDIA_TYPE)) //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/templates-page.xml",
+                              normalize(VirtualMachineTemplatesDto.MEDIA_TYPE))) //
+                  .build(),
+            HttpRequest
+                  .builder()
+                  .method("GET")
+                  .endpoint(
+                        URI.create("http://localhost/api/admin/enterprises/1/datacenterrepositories/1/virtualmachinetemplates")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(VirtualMachineTemplatesDto.MEDIA_TYPE)) //
+                  .addQueryParam("startwith", "1") //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/templates-lastpage.xml",
+                              normalize(VirtualMachineTemplatesDto.MEDIA_TYPE))) //
+                  .build());
+
+      PagedIterable<VirtualMachineTemplateDto> result = api.listVirtualMachineTemplates(1, 1);
+      List<VirtualMachineTemplateDto> all = result.concat().toList();
+
+      assertEquals(all.size(), 2);
+      assertEquals(all.get(0).getId().intValue(), 151);
+      assertEquals(all.get(1).getId().intValue(), 152);
+   }
+
    @Override
    protected VirtualMachineTemplateApi clientFrom(AbiquoApi api) {
       return api.getVirtualMachineTemplateApi();

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/features/VirtualMachineTemplateApiTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/features/VirtualMachineTemplateApiTest.java b/abiquo/src/test/java/org/jclouds/abiquo/features/VirtualMachineTemplateApiTest.java
index 86a0046..4739871 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/features/VirtualMachineTemplateApiTest.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/features/VirtualMachineTemplateApiTest.java
@@ -24,7 +24,6 @@ import java.io.IOException;
 import org.jclouds.Fallbacks.NullOnNotFoundOr404;
 import org.jclouds.abiquo.domain.TemplateResources;
 import org.jclouds.abiquo.domain.cloud.options.ConversionOptions;
-import org.jclouds.abiquo.domain.cloud.options.VirtualMachineTemplateOptions;
 import org.jclouds.abiquo.functions.ReturnTaskReferenceOrNull;
 import org.jclouds.http.functions.ParseXMLWithJAXB;
 import org.jclouds.http.functions.ReleasePayloadAndReturn;
@@ -40,7 +39,6 @@ import com.abiquo.server.core.appslibrary.ConversionDto;
 import com.abiquo.server.core.appslibrary.ConversionsDto;
 import com.abiquo.server.core.appslibrary.VirtualMachineTemplateDto;
 import com.abiquo.server.core.appslibrary.VirtualMachineTemplatePersistentDto;
-import com.abiquo.server.core.appslibrary.VirtualMachineTemplatesDto;
 import com.google.common.collect.ImmutableList;
 import com.google.common.reflect.Invokable;
 
@@ -54,48 +52,6 @@ import com.google.common.reflect.Invokable;
 public class VirtualMachineTemplateApiTest extends BaseAbiquoApiTest<VirtualMachineTemplateApi> {
    /*********************** Virtual Machine Template ***********************/
 
-   public void testListVirtualMachineTemplates() throws SecurityException, NoSuchMethodException, IOException {
-      Invokable<?, ?> method = method(VirtualMachineTemplateApi.class, "listVirtualMachineTemplates", Integer.class,
-            Integer.class);
-      GeneratedHttpRequest request = processor.apply(Invocation.create(method, ImmutableList.<Object> of(1, 1)));
-
-      assertRequestLineEquals(request,
-            "GET http://localhost/api/admin/enterprises/1/datacenterrepositories/1/virtualmachinetemplates HTTP/1.1");
-      assertNonPayloadHeadersEqual(request, "Accept: " + VirtualMachineTemplatesDto.BASE_MEDIA_TYPE + "\n");
-      assertPayloadEquals(request, null, null, false);
-
-      assertResponseParserClassEquals(method, request, ParseXMLWithJAXB.class);
-      assertSaxResponseParserClassEquals(method, null);
-      assertFallbackClassEquals(method, null);
-
-      checkFilters(request);
-   }
-
-   public void testListVirtualMachineTemplatesWithOptions() throws SecurityException, NoSuchMethodException,
-         IOException {
-      Invokable<?, ?> method = method(VirtualMachineTemplateApi.class, "listVirtualMachineTemplates", Integer.class,
-            Integer.class, VirtualMachineTemplateOptions.class);
-      GeneratedHttpRequest request = processor.apply(Invocation.create(
-            method,
-            ImmutableList.<Object> of(
-                  1,
-                  1,
-                  VirtualMachineTemplateOptions.builder().hypervisorType(HypervisorType.XENSERVER)
-                        .categoryName("Firewalls").build())));
-
-      assertRequestLineEquals(request,
-            "GET http://localhost/api/admin/enterprises/1/datacenterrepositories/1/virtualmachinetemplates"
-                  + "?hypervisorTypeName=XENSERVER&categoryName=Firewalls HTTP/1.1");
-      assertNonPayloadHeadersEqual(request, "Accept: " + VirtualMachineTemplatesDto.BASE_MEDIA_TYPE + "\n");
-      assertPayloadEquals(request, null, null, false);
-
-      assertResponseParserClassEquals(method, request, ParseXMLWithJAXB.class);
-      assertSaxResponseParserClassEquals(method, null);
-      assertFallbackClassEquals(method, null);
-
-      checkFilters(request);
-   }
-
    public void testGetVirtualMachineTemplate() throws SecurityException, NoSuchMethodException, IOException {
       Invokable<?, ?> method = method(VirtualMachineTemplateApi.class, "getVirtualMachineTemplate", Integer.class,
             Integer.class, Integer.class);

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/strategy/cloud/ListAttachedNicsLiveApiTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/strategy/cloud/ListAttachedNicsLiveApiTest.java b/abiquo/src/test/java/org/jclouds/abiquo/strategy/cloud/ListAttachedNicsLiveApiTest.java
index 7bb9a7b..643254f 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/strategy/cloud/ListAttachedNicsLiveApiTest.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/strategy/cloud/ListAttachedNicsLiveApiTest.java
@@ -17,6 +17,7 @@
 package org.jclouds.abiquo.strategy.cloud;
 
 import static com.google.common.collect.Iterables.find;
+import static com.google.common.collect.Iterables.getLast;
 import static com.google.common.collect.Iterables.size;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
@@ -55,13 +56,10 @@ public class ListAttachedNicsLiveApiTest extends BaseAbiquoStrategyLiveApiTest {
    protected void setupStrategy() {
       this.strategy = env.context.utils().injector().getInstance(ListAttachedNics.class);
 
-      privateIp = env.privateNetwork.listUnusedIps().get(0);
-      assertNotNull(privateIp);
+      privateIp = getLast(env.privateNetwork.listUnusedIps());
+      externalIp = getLast(env.externalNetwork.listUnusedIps());
 
-      externalIp = env.externalNetwork.listUnusedIps().get(0);
-      assertNotNull(externalIp);
-
-      publicIp = env.virtualDatacenter.listAvailablePublicIps().get(0);
+      publicIp = getLast(env.virtualDatacenter.listAvailablePublicIps());
       env.virtualDatacenter.purchasePublicIp(publicIp);
       publicIp = find(env.virtualDatacenter.listPurchasedPublicIps(), new Predicate<PublicIp>() {
          @Override

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/logback-test.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/logback-test.xml b/abiquo/src/test/resources/logback-test.xml
index 70a88e8..ebdf6c0 100644
--- a/abiquo/src/test/resources/logback-test.xml
+++ b/abiquo/src/test/resources/logback-test.xml
@@ -15,8 +15,8 @@
             <maxHistory>5</maxHistory>
         </rollingPolicy>
     </appender>
-    <appender name="PAYLOADFILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <file>target/test-data/jclouds-payloads.log</file>
+    <appender name="WIREFILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>target/test-data/jclouds-wire.log</file>
         <append>true</append>
         <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
             <level>TRACE</level>
@@ -72,11 +72,11 @@
     <logger name="jclouds.headers">
         <level value="DEBUG" />
         <appender-ref ref="HEADERSFILE" />
-        <appender-ref ref="PAYLOADFILE" />
+        <appender-ref ref="WIREFILE" />
     </logger>
     <logger name="jclouds.wire">
         <level value="DEBUG" />
-        <appender-ref ref="PAYLOADFILE" />
+        <appender-ref ref="WIREFILE" />
     </logger>
     <logger name="jclouds.compute">
         <level value="DEBUG" />

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/all-vms-lastpage.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/all-vms-lastpage.xml b/abiquo/src/test/resources/payloads/all-vms-lastpage.xml
new file mode 100644
index 0000000..05ae6eb
--- /dev/null
+++ b/abiquo/src/test/resources/payloads/all-vms-lastpage.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<virtualmachineswithnodeextended>
+    <link href="http://localhost/api/cloud/virtualmachines" rel="first" />
+    <link href="http://localhost/api/cloud/virtualmachines?startwith=0" rel="previous" />
+    <link href="http://localhost/api/cloud/virtualmachines?startwith=2" rel="last" />
+    <totalSize>2</totalSize>
+    <virtualmachinewithnodeextended>
+        <link rel="deploy" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/action/deploy" />
+        <link rel="disks" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/storage/disks" />
+        <link rel="edit" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1" />
+        <link rel="state" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/state" />
+        <link rel="reset" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/action/reset" />
+        <link rel="tasks" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/tasks" />
+        <link rel="undeploy" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/action/undeploy" />
+        <link rel="persistent" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/action/persistent" />
+        <link rel="virtualappliance" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1" />
+        <link rel="virtualmachinetemplate" href="/admin/enterprises/1/datacenterrepositories/1/virtualmachinetemplates/1" />
+        <link rel="nics" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/network/nics" />
+        <link rel="volumes" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/storage/volumes" />
+        <link rel="configurations" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/network/configurations" />
+        <cpu>0</cpu>
+        <hdInBytes>0</hdInBytes>
+        <highDisponibility>0</highDisponibility>
+        <id>2</id>
+        <idState>0</idState>
+        <idType>0</idType>
+        <name>VM</name>
+        <ram>0</ram>
+        <vdrpPort>0</vdrpPort>
+    </virtualmachinewithnodeextended>
+</virtualmachineswithnodeextended>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/all-vms.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/all-vms.xml b/abiquo/src/test/resources/payloads/all-vms.xml
index 329f202..007fe11 100644
--- a/abiquo/src/test/resources/payloads/all-vms.xml
+++ b/abiquo/src/test/resources/payloads/all-vms.xml
@@ -1,5 +1,9 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <virtualmachineswithnodeextended>
+    <link href="http://localhost/api/cloud/virtualmachines" rel="first" />
+    <link href="http://localhost/api/cloud/virtualmachines?startwith=2" rel="next" />
+    <link href="http://localhost/api/cloud/virtualmachines?startwith=2" rel="last" />
+    <totalSize>2</totalSize>
     <virtualmachinewithnodeextended>
         <link rel="deploy" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/action/deploy" />
         <link rel="disks" href="http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines/1/storage/disks" />

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/available-templates-lastpage.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/available-templates-lastpage.xml b/abiquo/src/test/resources/payloads/available-templates-lastpage.xml
new file mode 100644
index 0000000..4e8b2f7
--- /dev/null
+++ b/abiquo/src/test/resources/payloads/available-templates-lastpage.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<virtualMachineTemplates>
+    <link href="http://example.com/api/cloud/virtualdatacenters/1/action/templates" rel="first" />
+    <link href="http://example.com/api/cloud/virtualdatacenters/1/action/templates?startwith=0" rel="previous" />
+    <link href="http://example.com/api/cloud/virtualdatacenters/1/action/templates?startwith=1" rel="last" />
+    <totalSize>2</totalSize>
+    <virtualMachineTemplate>
+        <link href="http://example.com/api/config/categories/1" rel="category" title="Others" type="application/vnd.abiquo.category+xml" />
+        <link href="http://example.com/api/admin/enterprises/1/datacenterrepositories/1/virtualmachinetemplates/16/conversions" rel="conversions" type="application/vnd.abiquo.conversions+xml" />
+        <link href="http://example.com/api/admin/datacenters/1" rel="datacenter" type="application/vnd.abiquo.datacenter+xml" />
+        <link href="http://example.com/api/admin/enterprises/1/datacenterrepositories/1" rel="datacenterrepository" type="application/vnd.abiquo.datacenterrepository+xml" />
+        <link href="http://example.com/am/erepos/1/templates/rs.bcn.abiquo.com%253A9000%252Fovf%252F71%252Fdesc.ovf?format=diskFile" rel="diskfile" />
+        <link href="http://example.com/api/admin/enterprises/1/datacenterrepositories/1/virtualmachinetemplates/16" rel="edit" title="Abiquo KVM" type="application/vnd.abiquo.virtualmachinetemplate+xml" />
+        <link href="http://example.com/api/admin/enterprises/1" rel="enterprise" type="application/vnd.abiquo.enterprise+xml" />
+        <link href="http://example.com/am/erepos/1/templates/rs.bcn.abiquo.com%253A9000%252Fovf%252F71%252Fdesc.ovf?format=envelope" rel="ovfdocument" />
+        <link href="http://example.com/api/admin/enterprises/1/datacenterrepositories/1/virtualmachinetemplates/16/tasks" rel="tasks" type="application/vnd.abiquo.tasks+xml" />
+        <link href="http://example.com/am/erepos/1/templates/rs.bcn.abiquo.com%253A9000%252Fovf%252F71%252Fdesc.ovf" rel="template" />
+        <link href="http://rs.bcn.abiquo.com:9000/ovf/71/desc.ovf" rel="templatedefinition" />
+        <link href="http://example.com/am/erepos/1/templates/rs.bcn.abiquo.com%253A9000%252Fovf%252F71%252Fdesc.ovf?format=status" rel="templatestatus" />
+        <id>16</id>
+        <name>Abiquo KVM</name>
+        <description />
+        <osType>UNRECOGNIZED</osType>
+        <osVersion />
+        <path>1/rs.bcn.abiquo.com/abiport9000/ovf/71/KVM-Recursion.qcow2</path>
+        <diskFormatType>QCOW2_SPARSE</diskFormatType>
+        <diskFileSize>320798720</diskFileSize>
+        <cpuRequired>1</cpuRequired>
+        <ramRequired>1024</ramRequired>
+        <hdRequired>4294967296</hdRequired>
+        <shared>false</shared>
+        <state>DONE</state>
+        <costCode>0</costCode>
+        <creationDate>2013-01-16T15:06:14+01:00</creationDate>
+        <creationUser>SYSTEM</creationUser>
+        <chefEnabled>false</chefEnabled>
+        <iconUrl>http://rs.bcn.abiquo.com:9000/public/icons/q.png</iconUrl>
+        <loginUser>user</loginUser>
+        <loginPassword>password</loginPassword>
+        <ethernetDriverType>E1000</ethernetDriverType>
+        <diskControllerType>SCSI</diskControllerType>
+    </virtualMachineTemplate>
+</virtualMachineTemplates>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/resources/payloads/available-templates-page.xml
----------------------------------------------------------------------
diff --git a/abiquo/src/test/resources/payloads/available-templates-page.xml b/abiquo/src/test/resources/payloads/available-templates-page.xml
new file mode 100644
index 0000000..886d364
--- /dev/null
+++ b/abiquo/src/test/resources/payloads/available-templates-page.xml
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<virtualMachineTemplates>
+    <link href="http://example.com/api/cloud/virtualdatacenters/1/action/templates" rel="first" />
+    <link href="http://example.com/api/cloud/virtualdatacenters/1/action/templates?startwith=1" rel="next" />
+    <link href="http://example.com/api/cloud/virtualdatacenters/1/action/templates?startwith=1" rel="last" />
+    <totalSize>2</totalSize>
+    <virtualMachineTemplate>
+        <link href="http://example.com/api/config/categories/1" rel="category" title="Others" type="application/vnd.abiquo.category+xml" />
+        <link href="http://example.com/api/admin/enterprises/1/datacenterrepositories/1/virtualmachinetemplates/15/conversions" rel="conversions" type="application/vnd.abiquo.conversions+xml" />
+        <link href="http://example.com/api/admin/datacenters/1" rel="datacenter" type="application/vnd.abiquo.datacenter+xml" />
+        <link href="http://example.com/api/admin/enterprises/1/datacenterrepositories/1" rel="datacenterrepository" type="application/vnd.abiquo.datacenterrepository+xml" />
+        <link href="http://example.com/am/erepos/1/templates/rs.bcn.abiquo.com%253A9000%252Fovf%252F71%252Fdesc.ovf?format=diskFile" rel="diskfile" />
+        <link href="http://example.com/api/admin/enterprises/1/datacenterrepositories/1/virtualmachinetemplates/15" rel="edit" title="Abiquo KVM" type="application/vnd.abiquo.virtualmachinetemplate+xml" />
+        <link href="http://example.com/api/admin/enterprises/1" rel="enterprise" type="application/vnd.abiquo.enterprise+xml" />
+        <link href="http://example.com/am/erepos/1/templates/rs.bcn.abiquo.com%253A9000%252Fovf%252F71%252Fdesc.ovf?format=envelope" rel="ovfdocument" />
+        <link href="http://example.com/api/admin/enterprises/1/datacenterrepositories/1/virtualmachinetemplates/15/tasks" rel="tasks" type="application/vnd.abiquo.tasks+xml" />
+        <link href="http://example.com/am/erepos/1/templates/rs.bcn.abiquo.com%253A9000%252Fovf%252F71%252Fdesc.ovf" rel="template" />
+        <link href="http://rs.bcn.abiquo.com:9000/ovf/71/desc.ovf" rel="templatedefinition" />
+        <link href="http://example.com/am/erepos/1/templates/rs.bcn.abiquo.com%253A9000%252Fovf%252F71%252Fdesc.ovf?format=status" rel="templatestatus" />
+        <id>15</id>
+        <name>Abiquo KVM</name>
+        <description />
+        <osType>UNRECOGNIZED</osType>
+        <osVersion />
+        <path>1/rs.bcn.abiquo.com/abiport9000/ovf/71/KVM-Recursion.qcow2</path>
+        <diskFormatType>QCOW2_SPARSE</diskFormatType>
+        <diskFileSize>320798720</diskFileSize>
+        <cpuRequired>1</cpuRequired>
+        <ramRequired>1024</ramRequired>
+        <hdRequired>4294967296</hdRequired>
+        <shared>false</shared>
+        <state>DONE</state>
+        <costCode>0</costCode>
+        <creationDate>2013-01-16T15:06:14+01:00</creationDate>
+        <creationUser>SYSTEM</creationUser>
+        <chefEnabled>false</chefEnabled>
+        <iconUrl>http://rs.bcn.abiquo.com:9000/public/icons/q.png</iconUrl>
+        <loginUser>user</loginUser>
+        <loginPassword>password</loginPassword>
+        <ethernetDriverType>E1000</ethernetDriverType>
+        <diskControllerType>SCSI</diskControllerType>
+    </virtualMachineTemplate>
+</virtualMachineTemplates>
\ No newline at end of file


[5/5] git commit: JCLOUDS-198: Implemented the PagedIterable in Abiquo

Posted by na...@apache.org.
JCLOUDS-198: Implemented the PagedIterable in Abiquo

* Refactored all the domain objects to return Iterables
  instead of Lists, to allow a more flexible approach when
  using the PagedIterable.
* Added a generic PaginatedCollection that knows how to advance
  any paginated collection.
* Changed all methods from the Abiquo APIs that allow pagination
  to return the corresponding PagedIterables and PaginatedCollections.
* Added Expect tests for every paginated resource.
* Handle the special case of user pagination, to bypass Abiquo issue
  http://jira.abiquo.com/browse/ABICLOUDPREMIUM-5927


Project: http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/commit/14fbe2d3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/tree/14fbe2d3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/diff/14fbe2d3

Branch: refs/heads/master
Commit: 14fbe2d3861d454283112da848a5a95ab08aa041
Parents: 0cec066
Author: Ignasi Barrera <na...@apache.org>
Authored: Sun Aug 11 22:41:09 2013 +0200
Committer: Ignasi Barrera <na...@apache.org>
Committed: Fri Aug 23 10:33:14 2013 +0200

----------------------------------------------------------------------
 .../functions/VirtualMachineToNodeMetadata.java |   4 +-
 .../abiquo/config/AbiquoHttpApiModule.java      |   9 +-
 .../abiquo/domain/DomainWithTasksWrapper.java   |   5 +-
 .../jclouds/abiquo/domain/DomainWrapper.java    |  18 +-
 .../abiquo/domain/PaginatedCollection.java      | 160 ++++++
 .../abiquo/domain/cloud/VirtualAppliance.java   |  15 +-
 .../abiquo/domain/cloud/VirtualDatacenter.java  |  73 +--
 .../abiquo/domain/cloud/VirtualMachine.java     |   6 +-
 .../domain/cloud/VirtualMachineTemplate.java    |   5 +-
 .../abiquo/domain/enterprise/Enterprise.java    |  54 +-
 .../jclouds/abiquo/domain/enterprise/Role.java  |   3 +-
 .../enterprise/TemplateDefinitionList.java      |   9 +-
 .../jclouds/abiquo/domain/enterprise/User.java  |   7 +-
 .../enterprise/options/EnterpriseOptions.java   |  56 +--
 .../domain/enterprise/options/UserOptions.java  |  12 -
 .../domain/infrastructure/Datacenter.java       |  41 +-
 .../abiquo/domain/infrastructure/Machine.java   |  15 +-
 .../abiquo/domain/infrastructure/Rack.java      |   4 +-
 .../domain/infrastructure/StorageDevice.java    |  10 +-
 .../abiquo/domain/infrastructure/Tier.java      |   4 +-
 .../abiquo/domain/network/ExternalNetwork.java  |  23 +-
 .../jclouds/abiquo/domain/network/Network.java  |  20 +-
 .../abiquo/domain/network/PrivateNetwork.java   |  32 +-
 .../abiquo/domain/network/PublicNetwork.java    |  23 +-
 .../abiquo/domain/network/UnmanagedNetwork.java |  23 +-
 .../abiquo/domain/options/FilterOptions.java    |  12 +-
 .../jclouds/abiquo/domain/task/AsyncTask.java   |   4 +-
 .../org/jclouds/abiquo/features/CloudApi.java   | 111 +++-
 .../jclouds/abiquo/features/EnterpriseApi.java  |  34 +-
 .../org/jclouds/abiquo/features/EventApi.java   |  16 +-
 .../abiquo/features/InfrastructureApi.java      |  60 ++-
 .../features/VirtualMachineTemplateApi.java     |  14 +-
 .../services/AdministrationService.java         |   6 +
 .../abiquo/features/services/CloudService.java  |   6 +
 .../pagination/BasePaginationParser.java        |  56 +++
 .../functions/pagination/ParseEnterprises.java  |  49 ++
 .../functions/pagination/ParseEvents.java       |  49 ++
 .../functions/pagination/ParseExternalIps.java  |  49 ++
 .../functions/pagination/ParsePrivateIps.java   |  49 ++
 .../functions/pagination/ParsePublicIps.java    |  49 ++
 .../functions/pagination/ParseUnmanagedIps.java |  49 ++
 .../abiquo/functions/pagination/ParseUsers.java | 157 ++++++
 .../ParseVirtualMachineTemplates.java           |  51 ++
 .../pagination/ParseVirtualMachines.java        |  51 ++
 .../functions/pagination/ParseVolumes.java      |  50 ++
 .../internal/BaseAdministrationService.java     |  14 +-
 .../abiquo/internal/BaseCloudService.java       |  15 +-
 .../abiquo/internal/BaseEventService.java       |  11 +-
 .../predicates/VirtualDatacenterPredicates.java |   7 +-
 .../enterprise/ListVirtualMachineTemplates.java |  20 +-
 .../abiquo/domain/cloud/AccountLiveTest.java    |   5 +-
 .../cloud/VirtualDatacenterLiveApiTest.java     |  10 +-
 .../domain/cloud/VirtualMachineLiveApiTest.java |   4 +-
 .../domain/cloud/VirtualMachineLiveTest.java    |  12 +-
 .../VirtualMachineNetworkingLiveApiTest.java    |  63 ++-
 .../cloud/VirtualMachineStorageLiveApiTest.java |  33 +-
 .../abiquo/domain/cloud/VolumeLiveApiTest.java  |  16 +-
 .../enterprise/EnterpriseLiveApiTest.java       |  27 +-
 .../TemplateDefinitionListLiveApiTest.java      |   4 +-
 .../domain/enterprise/UserLiveApiTest.java      |  11 -
 .../infrastructure/DatacenterLiveApiTest.java   |   7 +-
 .../infrastructure/MachineLiveApiTest.java      |   4 +-
 .../RemoteServiceLiveApiTest.java               |   5 +-
 .../domain/infrastructure/TierLiveApiTest.java  |   5 +-
 .../network/ExternalNetworkLiveApiTest.java     |  26 +-
 .../network/GenericNetworkLiveApiTest.java      |  26 +-
 .../network/PrivateNetworkLiveApiTest.java      |  22 +-
 .../network/PublicNetworkLiveApiTest.java       |  26 +-
 .../network/UnmanagedNetworkLiveApiTest.java    |  26 +-
 .../environment/CloudTestEnvironment.java       |  29 +-
 .../InfrastructureTestEnvironment.java          |   8 +-
 .../abiquo/features/CloudApiExpectTest.java     | 502 ++++++++++++++++++-
 .../jclouds/abiquo/features/CloudApiTest.java   | 209 --------
 .../features/EnterpriseApiExpectTest.java       | 192 +++++--
 .../abiquo/features/EnterpriseApiTest.java      |  71 ---
 .../abiquo/features/EventApiExpectTest.java     | 108 ++++
 .../jclouds/abiquo/features/EventApiTest.java   |  54 --
 .../features/InfrastructureApiExpectTest.java   | 227 +++++++++
 .../abiquo/features/InfrastructureApiTest.java  | 109 ----
 .../VirtualMachineTemplateApiExpectTest.java    |  53 +-
 .../features/VirtualMachineTemplateApiTest.java |  44 --
 .../cloud/ListAttachedNicsLiveApiTest.java      |  10 +-
 abiquo/src/test/resources/logback-test.xml      |   8 +-
 .../resources/payloads/all-vms-lastpage.xml     |  31 ++
 abiquo/src/test/resources/payloads/all-vms.xml  |   4 +
 .../payloads/available-templates-lastpage.xml   |  43 ++
 .../payloads/available-templates-page.xml       |  43 ++
 .../resources/payloads/enterprises-lastpage.xml |  40 ++
 .../resources/payloads/enterprises-page.xml     |  40 ++
 .../test/resources/payloads/events-lastpage.xml |  40 ++
 .../src/test/resources/payloads/events-page.xml |  40 ++
 .../resources/payloads/externalips-lastpage.xml |  27 +
 .../resources/payloads/externalips-page.xml     |  27 +
 .../resources/payloads/privateips-lastpage.xml  |  17 +
 .../test/resources/payloads/privateips-page.xml |  17 +
 .../payloads/publicips-available-lastpage.xml   |  29 ++
 .../payloads/publicips-available-page.xml       |  29 ++
 .../resources/payloads/publicips-lastpage.xml   |  25 +
 .../test/resources/payloads/publicips-page.xml  |  25 +
 .../payloads/publicips-purchased-lastpage.xml   |  29 ++
 .../payloads/publicips-purchased-page.xml       |  29 ++
 .../resources/payloads/templates-lastpage.xml   |  35 ++
 .../test/resources/payloads/templates-page.xml  |  26 +-
 .../payloads/unmanagedips-lastpage.xml          |  29 ++
 .../resources/payloads/unmanagedips-page.xml    |  29 ++
 .../test/resources/payloads/users-lastpage.xml  |  24 +
 .../src/test/resources/payloads/users-page.xml  |  39 ++
 .../test/resources/payloads/usr-list-page-2.xml |  23 -
 abiquo/src/test/resources/payloads/usr-list.xml |  54 --
 .../test/resources/payloads/vms-lastpage.xml    |  31 ++
 abiquo/src/test/resources/payloads/vms-page.xml |  31 ++
 .../resources/payloads/volumes-lastpage.xml     |  18 +
 .../test/resources/payloads/volumes-page.xml    |  18 +
 113 files changed, 3267 insertions(+), 1201 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/compute/functions/VirtualMachineToNodeMetadata.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/compute/functions/VirtualMachineToNodeMetadata.java b/abiquo/src/main/java/org/jclouds/abiquo/compute/functions/VirtualMachineToNodeMetadata.java
index 16489c4..dbeaa5c 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/compute/functions/VirtualMachineToNodeMetadata.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/compute/functions/VirtualMachineToNodeMetadata.java
@@ -20,8 +20,6 @@ import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.Iterables.filter;
 import static com.google.common.collect.Iterables.transform;
 
-import java.util.List;
-
 import javax.annotation.Resource;
 import javax.inject.Inject;
 import javax.inject.Singleton;
@@ -114,7 +112,7 @@ public class VirtualMachineToNodeMetadata implements Function<VirtualMachine, No
       builder.hardware(hardware);
 
       // Networking configuration
-      List<Ip<?, ?>> nics = vm.listAttachedNics();
+      Iterable<Ip<?, ?>> nics = vm.listAttachedNics();
       builder.privateAddresses(ips(filter(nics, Predicates.instanceOf(PrivateIp.class))));
       builder.publicAddresses(ips(filter(nics, Predicates.not(Predicates.instanceOf(PrivateIp.class)))));
 

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/config/AbiquoHttpApiModule.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/config/AbiquoHttpApiModule.java b/abiquo/src/main/java/org/jclouds/abiquo/config/AbiquoHttpApiModule.java
index e5ec1b2..0e13406 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/config/AbiquoHttpApiModule.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/config/AbiquoHttpApiModule.java
@@ -19,7 +19,6 @@ package org.jclouds.abiquo.config;
 import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL;
 import static org.jclouds.abiquo.domain.DomainWrapper.wrap;
 
-import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicReference;
@@ -98,9 +97,9 @@ public class AbiquoHttpApiModule extends HttpApiModule<AbiquoApi> {
          final AtomicReference<AuthorizationException> authException,
          @Named(PROPERTY_SESSION_INTERVAL) final long seconds, @Memoized final Supplier<Enterprise> currentEnterprise) {
       Supplier<Map<Integer, Datacenter>> availableRegionsMapSupplier = Suppliers.compose(
-            new Function<List<Datacenter>, Map<Integer, Datacenter>>() {
+            new Function<Iterable<Datacenter>, Map<Integer, Datacenter>>() {
                @Override
-               public Map<Integer, Datacenter> apply(final List<Datacenter> datacenters) {
+               public Map<Integer, Datacenter> apply(final Iterable<Datacenter> datacenters) {
                   // Index available regions by id
                   return Maps.uniqueIndex(datacenters, new Function<Datacenter, Integer>() {
                      @Override
@@ -109,9 +108,9 @@ public class AbiquoHttpApiModule extends HttpApiModule<AbiquoApi> {
                      }
                   });
                }
-            }, new Supplier<List<Datacenter>>() {
+            }, new Supplier<Iterable<Datacenter>>() {
                @Override
-               public List<Datacenter> get() {
+               public Iterable<Datacenter> get() {
                   // Get the list of regions available for the user's tenant
                   return currentEnterprise.get().listAllowedDatacenters();
                }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/domain/DomainWithTasksWrapper.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/domain/DomainWithTasksWrapper.java b/abiquo/src/main/java/org/jclouds/abiquo/domain/DomainWithTasksWrapper.java
index 741a87d..2207c24 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/domain/DomainWithTasksWrapper.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/domain/DomainWithTasksWrapper.java
@@ -26,7 +26,6 @@ import org.jclouds.rest.ApiContext;
 import com.abiquo.model.transport.SingleResourceTransportDto;
 import com.abiquo.server.core.task.TaskDto;
 import com.abiquo.server.core.task.TasksDto;
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Ordering;
 import com.google.common.primitives.Longs;
@@ -43,7 +42,7 @@ public abstract class DomainWithTasksWrapper<T extends SingleResourceTransportDt
       super(context, target);
    }
 
-   public List<AsyncTask<?, ?>> listTasks() {
+   public Iterable<AsyncTask<?, ?>> listTasks() {
       TasksDto result = context.getApi().getTaskApi().listTasks(target);
       List<AsyncTask<?, ?>> tasks = Lists.newArrayList();
       for (TaskDto dto : result.getCollection()) {
@@ -58,6 +57,6 @@ public abstract class DomainWithTasksWrapper<T extends SingleResourceTransportDt
          }
       }.reverse());
 
-      return ImmutableList.copyOf(tasks);
+      return tasks;
    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/domain/DomainWrapper.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/domain/DomainWrapper.java b/abiquo/src/main/java/org/jclouds/abiquo/domain/DomainWrapper.java
index 4e3e728..dbff107 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/domain/DomainWrapper.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/domain/DomainWrapper.java
@@ -36,6 +36,7 @@ import org.jclouds.abiquo.domain.util.LinkUtils;
 import org.jclouds.abiquo.reference.ValidationErrors;
 import org.jclouds.http.HttpResponse;
 import org.jclouds.http.functions.ParseXMLWithJAXB;
+import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.rest.ApiContext;
 
 import com.abiquo.model.rest.RESTLink;
@@ -45,7 +46,6 @@ import com.abiquo.model.transport.WrapperDto;
 import com.abiquo.server.core.task.TaskDto;
 import com.abiquo.server.core.task.enums.TaskType;
 import com.google.common.base.Function;
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.common.reflect.Invokable;
 import com.google.inject.TypeLiteral;
@@ -117,7 +117,7 @@ public abstract class DomainWrapper<T extends SingleResourceTransportDto> {
     * Wraps an object in the given wrapper class.
     */
    public static <T extends SingleResourceTransportDto, W extends DomainWrapper<T>> W wrap(
-         final ApiContext<AbiquoApi> context, final Class<W> wrapperClass, final T target) {
+         final ApiContext<AbiquoApi> context, final Class<W> wrapperClass, @Nullable final T target) {
       if (target == null) {
          return null;
       }
@@ -135,31 +135,31 @@ public abstract class DomainWrapper<T extends SingleResourceTransportDto> {
    /**
     * Wrap a collection of objects to the given wrapper class.
     */
-   public static <T extends SingleResourceTransportDto, W extends DomainWrapper<T>> List<W> wrap(
-         final ApiContext<AbiquoApi> context, final Class<W> wrapperClass, final Iterable<T> targets) {
+   public static <T extends SingleResourceTransportDto, W extends DomainWrapper<T>> Iterable<W> wrap(
+         final ApiContext<AbiquoApi> context, final Class<W> wrapperClass, @Nullable final Iterable<T> targets) {
       if (targets == null) {
          return null;
       }
 
-      return ImmutableList.copyOf(transform(targets, new Function<T, W>() {
+      return transform(targets, new Function<T, W>() {
          @Override
          public W apply(final T input) {
             return wrap(context, wrapperClass, input);
          }
-      }));
+      });
    }
 
    /**
     * Unwrap a collection of objects.
     */
-   public static <T extends SingleResourceTransportDto, W extends DomainWrapper<T>> List<T> unwrap(
+   public static <T extends SingleResourceTransportDto, W extends DomainWrapper<T>> Iterable<T> unwrap(
          final Iterable<W> targets) {
-      return ImmutableList.copyOf(transform(targets, new Function<W, T>() {
+      return transform(targets, new Function<W, T>() {
          @Override
          public T apply(final W input) {
             return input.unwrap();
          }
-      }));
+      });
    }
 
    /**

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/domain/PaginatedCollection.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/domain/PaginatedCollection.java b/abiquo/src/main/java/org/jclouds/abiquo/domain/PaginatedCollection.java
new file mode 100644
index 0000000..694a17a
--- /dev/null
+++ b/abiquo/src/main/java/org/jclouds/abiquo/domain/PaginatedCollection.java
@@ -0,0 +1,160 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF 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.abiquo.domain;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.jclouds.collect.PagedIterables.advance;
+import static org.jclouds.collect.PagedIterables.onlyPage;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.jclouds.abiquo.AbiquoApi;
+import org.jclouds.collect.IterableWithMarker;
+import org.jclouds.collect.PagedIterable;
+import org.jclouds.http.functions.ParseXMLWithJAXB;
+
+import com.abiquo.model.rest.RESTLink;
+import com.abiquo.model.transport.WrapperDto;
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+
+/**
+ * This class represents a collection that is paginated.
+ * <p>
+ * Contains a single page of the collection, and all the information needed to
+ * fetch the next page on demand.
+ * 
+ * @author Ignasi Barrera
+ * 
+ * @see PagedIterable
+ */
+public class PaginatedCollection<T, W extends WrapperDto<T>> extends IterableWithMarker<T> {
+   protected final AbiquoApi api;
+   protected final W delegate;
+   protected final ParseXMLWithJAXB<W> parser;
+
+   public PaginatedCollection(AbiquoApi api, W delegate, ParseXMLWithJAXB<W> parser) {
+      this.api = checkNotNull(api, "api must not be null");
+      this.delegate = checkNotNull(delegate, "delegate must not be null");
+      this.parser = checkNotNull(parser, "parser must not be null");
+   }
+
+   @Override
+   public Iterator<T> iterator() {
+      return delegate.getCollection().iterator();
+   }
+
+   @Override
+   public Optional<Object> nextMarker() {
+      return Optional.<Object> fromNullable(delegate.searchLink("next"));
+   }
+
+   /**
+    * Transforms this {@link PaginatedCollection} into a {@link PagedIterable}
+    * so next the pages can be easily fetched.
+    * 
+    * @return A PagedIterable that is capable of fetching more pages.
+    */
+   public PagedIterable<T> toPagedIterable() {
+      return new ToPagedIterable<T, W>(api, parser).apply(this);
+   }
+
+   /**
+    * Returns a function that transforms the PaginatedCollection into a
+    * {@link PagedIterable}.
+    * <p>
+    * The PagedIterable will fetch the next pages based on the <code>next</code>
+    * link of the current object.
+    * <p>
+    * Subclasses may overwrite this one, to provide a concrete type for the
+    * parser parameter, so this function can be injected in the different api
+    * methods and be used as a transformer for the returned collection.
+    * 
+    * @author Ignasi Barrera
+    */
+   public static class ToPagedIterable<T, W extends WrapperDto<T>> implements
+         Function<PaginatedCollection<T, W>, PagedIterable<T>> {
+      protected final AbiquoApi api;
+      protected final ParseXMLWithJAXB<W> parser;
+
+      public ToPagedIterable(AbiquoApi api, ParseXMLWithJAXB<W> parser) {
+         this.api = checkNotNull(api, "api must not be null");
+         this.parser = checkNotNull(parser, "parser must not be null");
+      }
+
+      @Override
+      public PagedIterable<T> apply(final PaginatedCollection<T, W> input) {
+         return input.nextMarker().isPresent() ? advance(input, nextPage(input)) : onlyPage(input);
+      }
+
+      protected Function<Object, IterableWithMarker<T>> nextPage(final PaginatedCollection<T, W> input) {
+         return new Function<Object, IterableWithMarker<T>>() {
+            @Override
+            public IterableWithMarker<T> apply(Object marker) {
+               checkArgument(marker instanceof RESTLink, "Marker must be a RESTLink");
+               RESTLink next = RESTLink.class.cast(marker);
+
+               // The Abiquo API does not provide the media types in the
+               // pagination links, but it will be the same type than the
+               // current page, so just set it.
+               next.setType(input.delegate.getMediaType());
+
+               W nextPage = parser.apply(api.get(next));
+               return new PaginatedCollection<T, W>(api, nextPage, parser);
+            }
+         };
+      }
+
+   }
+
+   // Delegate methods
+
+   public Integer getTotalSize() {
+      return delegate.getTotalSize();
+   }
+
+   public List<RESTLink> getLinks() {
+      return delegate.getLinks();
+   }
+
+   public RESTLink searchLink(String rel) {
+      return delegate.searchLink(rel);
+   }
+
+   public List<RESTLink> searchLinks(String rel) {
+      return delegate.searchLinks(rel);
+   }
+
+   public RESTLink searchLink(String rel, String title) {
+      return delegate.searchLink(rel, title);
+   }
+
+   public RESTLink searchLinkByHref(String href) {
+      return delegate.searchLinkByHref(href);
+   }
+
+   public Integer getIdFromLink(String rel) {
+      return delegate.getIdFromLink(rel);
+   }
+
+   public String getMediaType() {
+      return delegate.getMediaType();
+   }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/domain/cloud/VirtualAppliance.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/domain/cloud/VirtualAppliance.java b/abiquo/src/main/java/org/jclouds/abiquo/domain/cloud/VirtualAppliance.java
index e37b456..01df495 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/domain/cloud/VirtualAppliance.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/domain/cloud/VirtualAppliance.java
@@ -19,16 +19,17 @@ package org.jclouds.abiquo.domain.cloud;
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import java.util.Arrays;
-import java.util.List;
 
 import org.jclouds.abiquo.AbiquoApi;
 import org.jclouds.abiquo.domain.DomainWrapper;
+import org.jclouds.abiquo.domain.PaginatedCollection;
 import org.jclouds.abiquo.domain.cloud.options.VirtualMachineOptions;
 import org.jclouds.abiquo.domain.enterprise.Enterprise;
 import org.jclouds.abiquo.domain.task.AsyncTask;
 import org.jclouds.abiquo.domain.task.VirtualMachineTask;
 import org.jclouds.abiquo.reference.ValidationErrors;
 import org.jclouds.abiquo.reference.rest.ParentLinkName;
+import org.jclouds.collect.PagedIterable;
 import org.jclouds.rest.ApiContext;
 
 import com.abiquo.model.transport.AcceptedRequestDto;
@@ -144,8 +145,9 @@ public class VirtualAppliance extends DomainWrapper<VirtualApplianceDto> {
     *      > http://community.abiquo.com/display/ABI18/Virtual+Machine+Resource#
     *      VirtualMachineResource -RetrievethelistofVirtualMachines.</a>
     */
-   public List<VirtualMachine> listVirtualMachines() {
-      return listVirtualMachines(VirtualMachineOptions.builder().disablePagination().build());
+   public Iterable<VirtualMachine> listVirtualMachines() {
+      PagedIterable<VirtualMachineWithNodeExtendedDto> vms = context.getApi().getCloudApi().listVirtualMachines(target);
+      return wrap(context, VirtualMachine.class, vms.concat());
    }
 
    /**
@@ -157,9 +159,10 @@ public class VirtualAppliance extends DomainWrapper<VirtualApplianceDto> {
     *      > http://community.abiquo.com/display/ABI18/Virtual+Machine+Resource#
     *      VirtualMachineResource -RetrievethelistofVirtualMachines.</a>
     */
-   public List<VirtualMachine> listVirtualMachines(final VirtualMachineOptions options) {
-      VirtualMachinesWithNodeExtendedDto vms = context.getApi().getCloudApi().listVirtualMachines(target, options);
-      return wrap(context, VirtualMachine.class, vms.getCollection());
+   public Iterable<VirtualMachine> listVirtualMachines(final VirtualMachineOptions options) {
+      PaginatedCollection<VirtualMachineWithNodeExtendedDto, VirtualMachinesWithNodeExtendedDto> vms = context.getApi()
+            .getCloudApi().listVirtualMachines(target, options);
+      return wrap(context, VirtualMachine.class, vms.toPagedIterable().concat());
    }
 
    /**

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/domain/cloud/VirtualDatacenter.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/domain/cloud/VirtualDatacenter.java b/abiquo/src/main/java/org/jclouds/abiquo/domain/cloud/VirtualDatacenter.java
index c8e03f1..5bbe292 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/domain/cloud/VirtualDatacenter.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/domain/cloud/VirtualDatacenter.java
@@ -19,12 +19,12 @@ package org.jclouds.abiquo.domain.cloud;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.Iterables.find;
 
-import java.util.List;
-
 import org.jclouds.abiquo.AbiquoApi;
 import org.jclouds.abiquo.domain.DomainWithLimitsWrapper;
+import org.jclouds.abiquo.domain.PaginatedCollection;
 import org.jclouds.abiquo.domain.builder.LimitsBuilder;
 import org.jclouds.abiquo.domain.cloud.options.VirtualMachineTemplateOptions;
+import org.jclouds.abiquo.domain.cloud.options.VolumeOptions;
 import org.jclouds.abiquo.domain.enterprise.Enterprise;
 import org.jclouds.abiquo.domain.infrastructure.Datacenter;
 import org.jclouds.abiquo.domain.infrastructure.Tier;
@@ -32,19 +32,20 @@ import org.jclouds.abiquo.domain.network.ExternalNetwork;
 import org.jclouds.abiquo.domain.network.Network;
 import org.jclouds.abiquo.domain.network.PrivateNetwork;
 import org.jclouds.abiquo.domain.network.PublicIp;
-import org.jclouds.abiquo.domain.network.options.IpOptions;
 import org.jclouds.abiquo.reference.ValidationErrors;
 import org.jclouds.abiquo.reference.rest.ParentLinkName;
+import org.jclouds.collect.PagedIterable;
 import org.jclouds.rest.ApiContext;
 
 import com.abiquo.model.enumerator.HypervisorType;
 import com.abiquo.model.enumerator.NetworkType;
 import com.abiquo.model.enumerator.StatefulInclusion;
+import com.abiquo.server.core.appslibrary.VirtualMachineTemplateDto;
 import com.abiquo.server.core.appslibrary.VirtualMachineTemplatesDto;
 import com.abiquo.server.core.cloud.VirtualApplianceDto;
 import com.abiquo.server.core.cloud.VirtualAppliancesDto;
 import com.abiquo.server.core.cloud.VirtualDatacenterDto;
-import com.abiquo.server.core.infrastructure.network.PublicIpsDto;
+import com.abiquo.server.core.infrastructure.network.PublicIpDto;
 import com.abiquo.server.core.infrastructure.network.VLANNetworkDto;
 import com.abiquo.server.core.infrastructure.network.VLANNetworksDto;
 import com.abiquo.server.core.infrastructure.storage.DiskManagementDto;
@@ -54,6 +55,7 @@ import com.abiquo.server.core.infrastructure.storage.TiersDto;
 import com.abiquo.server.core.infrastructure.storage.VolumeManagementDto;
 import com.abiquo.server.core.infrastructure.storage.VolumesManagementDto;
 import com.google.common.base.Predicate;
+import com.google.common.collect.FluentIterable;
 
 /**
  * Represents a virtual datacenter.
@@ -172,7 +174,7 @@ public class VirtualDatacenter extends DomainWithLimitsWrapper<VirtualDatacenter
     *      >http://community.abiquo.com/display/ABI20/Virtual+Appliance+Resource
     *      # VirtualApplianceResource-RetrievethelistofVirtualAppliances</a>
     */
-   public List<VirtualAppliance> listVirtualAppliances() {
+   public Iterable<VirtualAppliance> listVirtualAppliances() {
       VirtualAppliancesDto vapps = context.getApi().getCloudApi().listVirtualAppliances(target);
       return wrap(context, VirtualAppliance.class, vapps.getCollection());
    }
@@ -200,7 +202,7 @@ public class VirtualDatacenter extends DomainWithLimitsWrapper<VirtualDatacenter
     *      > http://community.abiquo.com/display/ABI20/Virtual+Datacenter+
     *      Resource# VirtualDatacenterResource-Retrieveenabledtiers</a>
     */
-   public List<Tier> listStorageTiers() {
+   public Iterable<Tier> listStorageTiers() {
       TiersDto tiers = context.getApi().getCloudApi().listStorageTiers(target);
       return wrap(context, Tier.class, tiers.getCollection());
    }
@@ -227,9 +229,15 @@ public class VirtualDatacenter extends DomainWithLimitsWrapper<VirtualDatacenter
     *      > http://community.abiquo.com/display/ABI20/Volume+Resource#
     *      VolumeResource- Retrievethelistofvolumes</a>
     */
-   public List<Volume> listVolumes() {
-      VolumesManagementDto volumes = context.getApi().getCloudApi().listVolumes(target);
-      return wrap(context, Volume.class, volumes.getCollection());
+   public Iterable<Volume> listVolumes() {
+      PagedIterable<VolumeManagementDto> volumes = context.getApi().getCloudApi().listVolumes(target);
+      return wrap(context, Volume.class, volumes.concat());
+   }
+
+   public Iterable<Volume> listVolumes(VolumeOptions options) {
+      PaginatedCollection<VolumeManagementDto, VolumesManagementDto> volumes = context.getApi().getCloudApi()
+            .listVolumes(target, options);
+      return wrap(context, Volume.class, volumes.toPagedIterable().concat());
    }
 
    public Volume getVolume(final Integer id) {
@@ -243,7 +251,7 @@ public class VirtualDatacenter extends DomainWithLimitsWrapper<VirtualDatacenter
     *      > http://community.abiquo.com/display/ABI20/Hard+Disks+Resource#
     *      HardDisksResource- GetthelistofHardDisksofaVirtualDatacenter</a>
     */
-   public List<HardDisk> listHardDisks() {
+   public Iterable<HardDisk> listHardDisks() {
       DisksManagementDto hardDisks = context.getApi().getCloudApi().listHardDisks(target);
       return wrap(context, HardDisk.class, hardDisks.getCollection());
    }
@@ -273,7 +281,7 @@ public class VirtualDatacenter extends DomainWithLimitsWrapper<VirtualDatacenter
     *      > http://community.abiquo.com/display/ABI20/Private+Network+Resource#
     *      PrivateNetworkResource -RetrievealistofPrivateNetworks</a>
     */
-   public List<PrivateNetwork> listPrivateNetworks() {
+   public Iterable<PrivateNetwork> listPrivateNetworks() {
       VLANNetworksDto networks = context.getApi().getCloudApi().listPrivateNetworks(target);
       return wrap(context, PrivateNetwork.class, networks.getCollection());
    }
@@ -283,35 +291,36 @@ public class VirtualDatacenter extends DomainWithLimitsWrapper<VirtualDatacenter
       return wrap(context, PrivateNetwork.class, network);
    }
 
-   public List<VirtualMachineTemplate> listAvailableTemplates() {
-      VirtualMachineTemplatesDto templates = context.getApi().getCloudApi().listAvailableTemplates(target);
-
-      return wrap(context, VirtualMachineTemplate.class, templates.getCollection());
+   public Iterable<VirtualMachineTemplate> listAvailableTemplates() {
+      PagedIterable<VirtualMachineTemplateDto> templates = context.getApi().getCloudApi()
+            .listAvailableTemplates(target);
+      return wrap(context, VirtualMachineTemplate.class, templates.concat());
    }
 
-   public List<VirtualMachineTemplate> listAvailableTemplates(final VirtualMachineTemplateOptions options) {
-      VirtualMachineTemplatesDto templates = context.getApi().getCloudApi().listAvailableTemplates(target, options);
-
-      return wrap(context, VirtualMachineTemplate.class, templates.getCollection());
+   public Iterable<VirtualMachineTemplate> listAvailableTemplates(final VirtualMachineTemplateOptions options) {
+      PaginatedCollection<VirtualMachineTemplateDto, VirtualMachineTemplatesDto> templates = context.getApi()
+            .getCloudApi().listAvailableTemplates(target, options);
+      return wrap(context, VirtualMachineTemplate.class, templates.toPagedIterable().concat());
    }
 
    public VirtualMachineTemplate getAvailableTemplate(final Integer id) {
-      VirtualMachineTemplatesDto templates = context.getApi().getCloudApi()
+      PaginatedCollection<VirtualMachineTemplateDto, VirtualMachineTemplatesDto> templates = context.getApi()
+            .getCloudApi()
             .listAvailableTemplates(target, VirtualMachineTemplateOptions.builder().idTemplate(id).build());
 
-      return templates.getCollection().isEmpty() ? null : //
-            wrap(context, VirtualMachineTemplate.class, templates.getCollection().get(0));
+      FluentIterable<VirtualMachineTemplateDto> all = templates.toPagedIterable().concat();
+      return wrap(context, VirtualMachineTemplate.class, all.first().orNull());
    }
 
    public VirtualMachineTemplate getAvailablePersistentTemplate(final Integer id) {
-      VirtualMachineTemplatesDto templates = context
+      PaginatedCollection<VirtualMachineTemplateDto, VirtualMachineTemplatesDto> templates = context
             .getApi()
             .getCloudApi()
             .listAvailableTemplates(target,
                   VirtualMachineTemplateOptions.builder().idTemplate(id).persistent(StatefulInclusion.ALL).build());
 
-      return templates.getCollection().isEmpty() ? null : //
-            wrap(context, VirtualMachineTemplate.class, templates.getCollection().get(0));
+      FluentIterable<VirtualMachineTemplateDto> all = templates.toPagedIterable().concat();
+      return wrap(context, VirtualMachineTemplate.class, all.first().orNull());
    }
 
    /**
@@ -322,10 +331,9 @@ public class VirtualDatacenter extends DomainWithLimitsWrapper<VirtualDatacenter
     *      VirtualDatacenterResource-ListofPublicIPstopurchasebyVirtualDatacenter
     *      </a>
     */
-   public List<PublicIp> listAvailablePublicIps() {
-      IpOptions options = IpOptions.builder().build();
-      PublicIpsDto ips = context.getApi().getCloudApi().listAvailablePublicIps(target, options);
-      return wrap(context, PublicIp.class, ips.getCollection());
+   public Iterable<PublicIp> listAvailablePublicIps() {
+      PagedIterable<PublicIpDto> ips = context.getApi().getCloudApi().listAvailablePublicIps(target);
+      return wrap(context, PublicIp.class, ips.concat());
    }
 
    /**
@@ -336,10 +344,9 @@ public class VirtualDatacenter extends DomainWithLimitsWrapper<VirtualDatacenter
     *      VirtualDatacenterResource-ListofpurchasedPublicIPsbyVirtualDatacenter
     *      </a>
     */
-   public List<PublicIp> listPurchasedPublicIps() {
-      IpOptions options = IpOptions.builder().build();
-      PublicIpsDto ips = context.getApi().getCloudApi().listPurchasedPublicIps(target, options);
-      return wrap(context, PublicIp.class, ips.getCollection());
+   public Iterable<PublicIp> listPurchasedPublicIps() {
+      PagedIterable<PublicIpDto> ips = context.getApi().getCloudApi().listPurchasedPublicIps(target);
+      return wrap(context, PublicIp.class, ips.concat());
    }
 
    public void purchasePublicIp(final PublicIp ip) {

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/domain/cloud/VirtualMachine.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/domain/cloud/VirtualMachine.java b/abiquo/src/main/java/org/jclouds/abiquo/domain/cloud/VirtualMachine.java
index a0df109..d7caaa4 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/domain/cloud/VirtualMachine.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/domain/cloud/VirtualMachine.java
@@ -300,19 +300,19 @@ public class VirtualMachine extends DomainWithTasksWrapper<VirtualMachineWithNod
 
    // Children access
 
-   public List<HardDisk> listAttachedHardDisks() {
+   public Iterable<HardDisk> listAttachedHardDisks() {
       refresh();
       DisksManagementDto hardDisks = context.getApi().getCloudApi().listAttachedHardDisks(target);
       return wrap(context, HardDisk.class, hardDisks.getCollection());
    }
 
-   public List<Volume> listAttachedVolumes() {
+   public Iterable<Volume> listAttachedVolumes() {
       refresh();
       VolumesManagementDto volumes = context.getApi().getCloudApi().listAttachedVolumes(target);
       return wrap(context, Volume.class, volumes.getCollection());
    }
 
-   public List<Ip<?, ?>> listAttachedNics() {
+   public Iterable<Ip<?, ?>> listAttachedNics() {
       // The strategy will refresh the vm. There is no need to do it here
       ListAttachedNics strategy = context.utils().injector().getInstance(ListAttachedNics.class);
       return ImmutableList.copyOf(strategy.execute(this));

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/domain/cloud/VirtualMachineTemplate.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/domain/cloud/VirtualMachineTemplate.java b/abiquo/src/main/java/org/jclouds/abiquo/domain/cloud/VirtualMachineTemplate.java
index b3822d4..6cefa16 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/domain/cloud/VirtualMachineTemplate.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/domain/cloud/VirtualMachineTemplate.java
@@ -19,7 +19,6 @@ package org.jclouds.abiquo.domain.cloud;
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import java.util.Date;
-import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -204,7 +203,7 @@ public class VirtualMachineTemplate extends DomainWrapper<VirtualMachineTemplate
     *      ConversionResource- ListConversions</a>
     * @return all the conversions of the virtual machine template
     */
-   public List<Conversion> listConversions() {
+   public Iterable<Conversion> listConversions() {
       ConversionsDto convs = context.getApi().getVirtualMachineTemplateApi().listConversions(target);
       return wrap(context, Conversion.class, convs.getCollection());
    }
@@ -224,7 +223,7 @@ public class VirtualMachineTemplate extends DomainWrapper<VirtualMachineTemplate
     * @return all the conversions of the virtual machine template applying the
     *         constrains
     */
-   public List<Conversion> listConversions(final HypervisorType hypervisor, final ConversionState state) {
+   public Iterable<Conversion> listConversions(final HypervisorType hypervisor, final ConversionState state) {
       ConversionsDto convs = context
             .getApi()
             .getVirtualMachineTemplateApi()

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/Enterprise.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/Enterprise.java b/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/Enterprise.java
index c3e1c12..b198858 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/Enterprise.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/Enterprise.java
@@ -16,10 +16,9 @@
  */
 package org.jclouds.abiquo.domain.enterprise;
 
-import java.util.List;
-
 import org.jclouds.abiquo.AbiquoApi;
 import org.jclouds.abiquo.domain.DomainWithLimitsWrapper;
+import org.jclouds.abiquo.domain.PaginatedCollection;
 import org.jclouds.abiquo.domain.builder.LimitsBuilder;
 import org.jclouds.abiquo.domain.cloud.VirtualAppliance;
 import org.jclouds.abiquo.domain.cloud.VirtualDatacenter;
@@ -32,6 +31,7 @@ import org.jclouds.abiquo.domain.infrastructure.Machine;
 import org.jclouds.abiquo.domain.network.ExternalNetwork;
 import org.jclouds.abiquo.domain.network.UnmanagedNetwork;
 import org.jclouds.abiquo.strategy.enterprise.ListVirtualMachineTemplates;
+import org.jclouds.collect.PagedIterable;
 import org.jclouds.http.HttpResponse;
 import org.jclouds.http.functions.ParseXMLWithJAXB;
 import org.jclouds.rest.ApiContext;
@@ -40,7 +40,6 @@ import com.abiquo.model.rest.RESTLink;
 import com.abiquo.server.core.appslibrary.TemplateDefinitionListDto;
 import com.abiquo.server.core.appslibrary.TemplateDefinitionListsDto;
 import com.abiquo.server.core.appslibrary.VirtualMachineTemplateDto;
-import com.abiquo.server.core.appslibrary.VirtualMachineTemplatesDto;
 import com.abiquo.server.core.cloud.VirtualAppliancesDto;
 import com.abiquo.server.core.cloud.VirtualDatacentersDto;
 import com.abiquo.server.core.cloud.VirtualMachinesWithNodeExtendedDto;
@@ -55,7 +54,6 @@ import com.abiquo.server.core.infrastructure.DatacentersDto;
 import com.abiquo.server.core.infrastructure.MachinesDto;
 import com.abiquo.server.core.infrastructure.network.VLANNetworksDto;
 import com.google.common.base.Predicate;
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import com.google.inject.TypeLiteral;
 
@@ -132,7 +130,7 @@ public class Enterprise extends DomainWithLimitsWrapper<EnterpriseDto> {
     *      RetrievealistofvitualdatacentersbyanEnterprise</a>
     * @return List of virtual datacenters in this enterprise.
     */
-   public List<VirtualDatacenter> listVirtualDatacenters() {
+   public Iterable<VirtualDatacenter> listVirtualDatacenters() {
       VirtualDatacentersDto dto = context.getApi().getEnterpriseApi().listVirtualDatacenters(target);
       return wrap(context, VirtualDatacenter.class, dto.getCollection());
    }
@@ -147,7 +145,7 @@ public class Enterprise extends DomainWithLimitsWrapper<EnterpriseDto> {
     *      TemplateDefinitionListResource-Retrievealltemplatedefinitionlists</a>
     * @return List of template definition lists of the enterprise.
     */
-   public List<TemplateDefinitionList> listTemplateDefinitionLists() {
+   public Iterable<TemplateDefinitionList> listTemplateDefinitionLists() {
       TemplateDefinitionListsDto dto = context.getApi().getEnterpriseApi().listTemplateDefinitionLists(target);
       return wrap(context, TemplateDefinitionList.class, dto.getCollection());
    }
@@ -180,7 +178,7 @@ public class Enterprise extends DomainWithLimitsWrapper<EnterpriseDto> {
     *      DatacenterLimitsResource-Retrievelimitsbyenterprise</a>
     * @return List of datacenter limits by enterprise.
     */
-   public List<Limits> listLimits() {
+   public Iterable<Limits> listLimits() {
       DatacentersLimitsDto dto = context.getApi().getEnterpriseApi().listLimits(this.unwrap());
       return wrap(context, Limits.class, dto.getCollection());
    }
@@ -210,10 +208,9 @@ public class Enterprise extends DomainWithLimitsWrapper<EnterpriseDto> {
     *      Retrievealistofusers</a>
     * @return List of users of this enterprise.
     */
-   public List<User> listUsers() {
-      // Delegate the retrieval of users to the options-enabled version of the
-      // method, with pagination disabled
-      return listUsers(UserOptions.builder().disablePagination().build());
+   public Iterable<User> listUsers() {
+      PagedIterable<UserDto> dto = context.getApi().getEnterpriseApi().listUsers(target);
+      return wrap(context, User.class, dto.concat());
    }
 
    /**
@@ -226,13 +223,12 @@ public class Enterprise extends DomainWithLimitsWrapper<EnterpriseDto> {
     *      >
     *      http://community.abiquo.com/display/ABI20/UserResource#UserResource-
     *      Retrievealistofusers</a>
-    * @return List of users of this enterprise, according to the specified 
-    * pagination options
+    * @return List of users of this enterprise, according to the specified
+    *         pagination options
     */
-   public List<User> listUsers(final UserOptions options) {
-      UsersDto dto = context.getApi().getEnterpriseApi().listUsers(
-            this.unwrap(), options);
-      return wrap(context, User.class, dto.getCollection());
+   public Iterable<User> listUsers(final UserOptions options) {
+      PaginatedCollection<UserDto, UsersDto> dto = context.getApi().getEnterpriseApi().listUsers(target, options);
+      return wrap(context, User.class, dto.toPagedIterable().concat());
    }
 
    /**
@@ -257,15 +253,15 @@ public class Enterprise extends DomainWithLimitsWrapper<EnterpriseDto> {
     * 
     * @return List of roles by this enterprise.
     */
-   public List<Role> listRoles() {
+   public Iterable<Role> listRoles() {
       RolesDto dto = context.getApi().getAdminApi().listRoles(target);
       return wrap(context, Role.class, dto.getCollection());
    }
 
-   public List<VirtualMachineTemplate> listTemplatesInRepository(final Datacenter datacenter) {
-      VirtualMachineTemplatesDto dto = context.getApi().getVirtualMachineTemplateApi()
+   public Iterable<VirtualMachineTemplate> listTemplatesInRepository(final Datacenter datacenter) {
+      PagedIterable<VirtualMachineTemplateDto> templates = context.getApi().getVirtualMachineTemplateApi()
             .listVirtualMachineTemplates(target.getId(), datacenter.getId());
-      return wrap(context, VirtualMachineTemplate.class, dto.getCollection());
+      return wrap(context, VirtualMachineTemplate.class, templates.concat());
    }
 
    public VirtualMachineTemplate getTemplateInRepository(final Datacenter datacenter, final Integer id) {
@@ -274,12 +270,12 @@ public class Enterprise extends DomainWithLimitsWrapper<EnterpriseDto> {
       return wrap(context, VirtualMachineTemplate.class, template);
    }
 
-   public List<VirtualMachineTemplate> listTemplates() {
+   public Iterable<VirtualMachineTemplate> listTemplates() {
       ListVirtualMachineTemplates strategy = context.utils().injector().getInstance(ListVirtualMachineTemplates.class);
-      return ImmutableList.copyOf(strategy.execute(this));
+      return strategy.execute(this);
    }
 
-   public List<Datacenter> listAllowedDatacenters() {
+   public Iterable<Datacenter> listAllowedDatacenters() {
       DatacentersDto datacenters = context.getApi().getEnterpriseApi().listAllowedDatacenters(target.getId());
       return wrap(context, Datacenter.class, datacenters.getCollection());
    }
@@ -290,7 +286,7 @@ public class Enterprise extends DomainWithLimitsWrapper<EnterpriseDto> {
     *      > http://community.abiquo.com/display/ABI20/Enterprise+Resource#
     *      EnterpriseResource- Getthelistofexternalnetworks</a>
     */
-   public List<ExternalNetwork> listExternalNetworks(final Datacenter datacenter) {
+   public Iterable<ExternalNetwork> listExternalNetworks(final Datacenter datacenter) {
       DatacenterLimitsDto limitForDatacenter = getLimits(datacenter);
 
       HttpResponse response = context.getApi().get(limitForDatacenter.searchLink("externalnetworks"));
@@ -301,7 +297,7 @@ public class Enterprise extends DomainWithLimitsWrapper<EnterpriseDto> {
       return wrap(context, ExternalNetwork.class, parser.apply(response).getCollection());
    }
 
-   public List<UnmanagedNetwork> listUnmanagedNetworks(final Datacenter datacenter) {
+   public Iterable<UnmanagedNetwork> listUnmanagedNetworks(final Datacenter datacenter) {
       DatacenterLimitsDto limitForDatacenter = getLimits(datacenter);
 
       // The "rel" for the unmanaged networks is the same than the one used for
@@ -324,7 +320,7 @@ public class Enterprise extends DomainWithLimitsWrapper<EnterpriseDto> {
     *      RetrievethelistofvirtualappliancesbyanEnterprise</a>
     * @return List of virtual appliances by this enterprise.
     */
-   public List<VirtualAppliance> listVirtualAppliances() {
+   public Iterable<VirtualAppliance> listVirtualAppliances() {
       VirtualAppliancesDto virtualAppliances = context.getApi().getEnterpriseApi().listVirtualAppliances(target);
       return wrap(context, VirtualAppliance.class, virtualAppliances.getCollection());
    }
@@ -338,12 +334,12 @@ public class Enterprise extends DomainWithLimitsWrapper<EnterpriseDto> {
     *      EnterpriseResource- RetrievealistofvirtualmachinesbyanEnterprise</a>
     * @return List of virtual machines by this enterprise.
     */
-   public List<VirtualMachine> listVirtualMachines() {
+   public Iterable<VirtualMachine> listVirtualMachines() {
       VirtualMachinesWithNodeExtendedDto machines = context.getApi().getEnterpriseApi().listVirtualMachines(target);
       return wrap(context, VirtualMachine.class, machines.getCollection());
    }
 
-   public List<Machine> listReservedMachines() {
+   public Iterable<Machine> listReservedMachines() {
       MachinesDto machines = context.getApi().getEnterpriseApi().listReservedMachines(target);
       return wrap(context, Machine.class, machines.getCollection());
    }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/Role.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/Role.java b/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/Role.java
index ba9b279..b1271a4 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/Role.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/Role.java
@@ -126,9 +126,8 @@ public class Role extends DomainWrapper<RoleDto> {
     *      > http://community.abiquo.com/display/ABI20/Roles+Resource#
     *      RolesResource- RetrievealistofprivilegesfromaRole</a>
     */
-   public List<Privilege> listPrivileges() {
+   public Iterable<Privilege> listPrivileges() {
       PrivilegesDto dto = context.getApi().getAdminApi().listPrivileges(target);
-
       return wrap(context, Privilege.class, dto.getCollection());
    }
 

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/TemplateDefinitionList.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/TemplateDefinitionList.java b/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/TemplateDefinitionList.java
index 48b9089..1afaf8e 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/TemplateDefinitionList.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/TemplateDefinitionList.java
@@ -18,8 +18,6 @@ package org.jclouds.abiquo.domain.enterprise;
 
 import static com.google.common.collect.Iterables.filter;
 
-import java.util.List;
-
 import org.jclouds.abiquo.AbiquoApi;
 import org.jclouds.abiquo.domain.DomainWrapper;
 import org.jclouds.abiquo.domain.infrastructure.Datacenter;
@@ -28,7 +26,6 @@ import org.jclouds.rest.ApiContext;
 import com.abiquo.am.model.TemplatesStateDto;
 import com.abiquo.server.core.appslibrary.TemplateDefinitionListDto;
 import com.google.common.base.Predicate;
-import com.google.common.collect.ImmutableList;
 
 /**
  * Adds high level functionality to {@link TemplateDefinitionListDto}. A
@@ -111,7 +108,7 @@ public class TemplateDefinitionList extends DomainWrapper<TemplateDefinitionList
     *      TemplateDefinitionListResource# TemplateDefinitionListResource-
     *      Retrievealistofthestatusofalltemplatestatuslist</a>
     */
-   public List<TemplateState> listStatus(final Datacenter datacenter) {
+   public Iterable<TemplateState> listStatus(final Datacenter datacenter) {
       TemplatesStateDto states = context.getApi().getEnterpriseApi()
             .listTemplateListStatus(target, datacenter.unwrap());
       return wrap(context, TemplateState.class, states.getCollection());
@@ -134,8 +131,8 @@ public class TemplateDefinitionList extends DomainWrapper<TemplateDefinitionList
     *      TemplateDefinitionListResource# TemplateDefinitionListResource-
     *      Retrievealistofthestatusofalltemplatestatuslist</a>
     */
-   public List<TemplateState> listStatus(final Predicate<TemplateState> filter, final Datacenter datacenter) {
-      return ImmutableList.copyOf(filter(listStatus(datacenter), filter));
+   public Iterable<TemplateState> listStatus(final Predicate<TemplateState> filter, final Datacenter datacenter) {
+      return filter(listStatus(datacenter), filter);
    }
 
    // Builder

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/User.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/User.java b/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/User.java
index 4519f5c..dc9d0f6 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/User.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/User.java
@@ -35,7 +35,6 @@ import com.abiquo.server.core.cloud.VirtualMachinesWithNodeExtendedDto;
 import com.abiquo.server.core.enterprise.RoleDto;
 import com.abiquo.server.core.enterprise.UserDto;
 import com.google.common.base.Joiner;
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 
 /**
@@ -112,7 +111,7 @@ public class User extends DomainWrapper<UserDto> {
       target = context.getApi().getEnterpriseApi().updateUser(target);
    }
 
-   public List<VirtualDatacenter> listPermittedVirtualDatacenters() {
+   public Iterable<VirtualDatacenter> listPermittedVirtualDatacenters() {
       List<Integer> ids = extractAvailableDatacenters();
 
       // null value means all virtual datacenters all allowed
@@ -122,7 +121,7 @@ public class User extends DomainWrapper<UserDto> {
 
       ListVirtualDatacenters listVirtualDatacenters = context.utils().injector()
             .getInstance(ListVirtualDatacenters.class);
-      return ImmutableList.copyOf(listVirtualDatacenters.execute(ids));
+      return listVirtualDatacenters.execute(ids);
    }
 
    /**
@@ -175,7 +174,7 @@ public class User extends DomainWrapper<UserDto> {
     *      > http://community.abiquo.com/display/ABI20/User+resource#
     *      Userresource- Retrievethelistofvirtualmachinesbyuser</a>
     */
-   public List<VirtualMachine> listMachines() {
+   public Iterable<VirtualMachine> listMachines() {
       VirtualMachinesWithNodeExtendedDto machines = context.getApi().getEnterpriseApi().listVirtualMachines(target);
       return wrap(context, VirtualMachine.class, machines.getCollection());
    }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/options/EnterpriseOptions.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/options/EnterpriseOptions.java b/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/options/EnterpriseOptions.java
index 4145ba1..b1880ee 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/options/EnterpriseOptions.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/options/EnterpriseOptions.java
@@ -18,11 +18,13 @@ package org.jclouds.abiquo.domain.enterprise.options;
 
 import org.jclouds.abiquo.domain.options.FilterOptions.BaseFilterOptionsBuilder;
 import org.jclouds.http.options.BaseHttpRequestOptions;
+import org.jclouds.rest.annotations.SinceApiVersion;
 
 /**
  * Available options to query enterprises.
  * 
  * @author Francesc Montserrat
+ * @author Ignasi Barrera
  */
 public class EnterpriseOptions extends BaseHttpRequestOptions {
    public static Builder builder() {
@@ -39,43 +41,23 @@ public class EnterpriseOptions extends BaseHttpRequestOptions {
    public static class Builder extends BaseFilterOptionsBuilder<Builder> {
       private String idPricingTemplate;
 
-      private Boolean included;
-
-      private String filter;
-
-      private Integer page;
-
-      private Integer results;
+      private String idScope;
 
-      private Boolean network;
+      private Boolean included;
 
       public Builder pricingTemplate(final String idPricingTemplate) {
          this.idPricingTemplate = idPricingTemplate;
          return this;
       }
 
-      public Builder included(final boolean included) {
-         this.included = included;
-         return this;
-      }
-
-      public Builder filter(final String filter) {
-         this.filter = filter;
-         return this;
-      }
-
-      public Builder network(final boolean network) {
-         this.network = network;
-         return this;
-      }
-
-      public Builder page(final int page) {
-         this.page = page;
+      @SinceApiVersion("2.3")
+      public Builder scope(final String scope) {
+         this.idScope = scope;
          return this;
       }
 
-      public Builder results(final int results) {
-         this.results = results;
+      public Builder included(final boolean included) {
+         this.included = included;
          return this;
       }
 
@@ -86,24 +68,12 @@ public class EnterpriseOptions extends BaseHttpRequestOptions {
             options.queryParameters.put("idPricingTemplate", String.valueOf(idPricingTemplate));
          }
 
-         if (included != null) {
-            options.queryParameters.put("included", String.valueOf(included));
-         }
-
-         if (filter != null) {
-            options.queryParameters.put("filter", String.valueOf(filter));
-         }
-
-         if (page != null) {
-            options.queryParameters.put("page", String.valueOf(page));
+         if (idScope != null) {
+            options.queryParameters.put("idScope", String.valueOf(idScope));
          }
 
-         if (results != null) {
-            options.queryParameters.put("numResults", String.valueOf(results));
-         }
-
-         if (network != null) {
-            options.queryParameters.put("network", String.valueOf(network));
+         if (included != null) {
+            options.queryParameters.put("included", String.valueOf(included));
          }
 
          return addFilterOptions(options);

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/options/UserOptions.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/options/UserOptions.java b/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/options/UserOptions.java
index 3848bca..5512bef 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/options/UserOptions.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/domain/enterprise/options/UserOptions.java
@@ -54,17 +54,5 @@ public class UserOptions extends BaseHttpRequestOptions implements Cloneable {
       public UserOptions build() {
          return addFilterOptions(this.options);
       }
-
-      // FIXME: This method is overriden to change its behavior until the
-      // issue ABICLOUDPREMIUM-5927 in Abiquo isissue is solved (
-      // (http://jira.abiquo.com/browse/ABICLOUDPREMIUM-5927)
-      // Once its fixed, this method should be deleted
-      @Override
-      public Builder disablePagination() {
-         // Unlike in its parent method, disabling pagination means to set
-         // the limit attribute to the biggest value possible
-         this.limit = Integer.MAX_VALUE;
-         return (Builder) this;
-      }
    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/domain/infrastructure/Datacenter.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/domain/infrastructure/Datacenter.java b/abiquo/src/main/java/org/jclouds/abiquo/domain/infrastructure/Datacenter.java
index 25f8664..4e28d13 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/domain/infrastructure/Datacenter.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/domain/infrastructure/Datacenter.java
@@ -19,8 +19,6 @@ package org.jclouds.abiquo.domain.infrastructure;
 import static com.google.common.collect.Iterables.find;
 import static com.google.common.collect.Iterables.transform;
 
-import java.util.List;
-
 import org.jclouds.abiquo.AbiquoApi;
 import org.jclouds.abiquo.domain.DomainWrapper;
 import org.jclouds.abiquo.domain.cloud.VirtualMachineTemplate;
@@ -34,6 +32,7 @@ import org.jclouds.abiquo.domain.network.NetworkServiceType;
 import org.jclouds.abiquo.domain.network.PrivateNetwork;
 import org.jclouds.abiquo.domain.network.options.NetworkOptions;
 import org.jclouds.abiquo.predicates.NetworkServiceTypePredicates;
+import org.jclouds.collect.PagedIterable;
 import org.jclouds.rest.ApiContext;
 
 import com.abiquo.model.enumerator.HypervisorType;
@@ -43,7 +42,6 @@ import com.abiquo.model.enumerator.NetworkType;
 import com.abiquo.model.enumerator.RemoteServiceType;
 import com.abiquo.model.enumerator.VlanTagAvailabilityType;
 import com.abiquo.server.core.appslibrary.VirtualMachineTemplateDto;
-import com.abiquo.server.core.appslibrary.VirtualMachineTemplatesDto;
 import com.abiquo.server.core.cloud.HypervisorTypeDto;
 import com.abiquo.server.core.cloud.HypervisorTypesDto;
 import com.abiquo.server.core.enterprise.DatacentersLimitsDto;
@@ -65,7 +63,6 @@ import com.abiquo.server.core.infrastructure.storage.StorageDevicesDto;
 import com.abiquo.server.core.infrastructure.storage.StorageDevicesMetadataDto;
 import com.abiquo.server.core.infrastructure.storage.TiersDto;
 import com.google.common.base.Function;
-import com.google.common.collect.ImmutableList;
 
 /**
  * Adds high level functionality to {@link DatacenterDto}.
@@ -172,7 +169,7 @@ public class Datacenter extends DomainWrapper<DatacenterDto> {
     *      - RetrievealistofRacks</a>
     * @return List of unmanaged racks in this datacenter.
     */
-   public List<Rack> listRacks() {
+   public Iterable<Rack> listRacks() {
       RacksDto racks = context.getApi().getInfrastructureApi().listRacks(target);
       return wrap(context, Rack.class, racks.getCollection());
    }
@@ -205,7 +202,7 @@ public class Datacenter extends DomainWrapper<DatacenterDto> {
     *         information for the storage devices, such as the management and
     *         iscsi ports, or the default credentials to access the device.
     */
-   public List<StorageDeviceMetadata> listSupportedStorageDevices() {
+   public Iterable<StorageDeviceMetadata> listSupportedStorageDevices() {
       StorageDevicesMetadataDto devices = context.getApi().getInfrastructureApi().listSupportedStorageDevices(target);
       return wrap(context, StorageDeviceMetadata.class, devices.getCollection());
    }
@@ -219,7 +216,7 @@ public class Datacenter extends DomainWrapper<DatacenterDto> {
     *      StorageDeviceResource- Retrievethelistofstoragedevices</a>
     * @return List of storage devices in this datacenter.
     */
-   public List<StorageDevice> listStorageDevices() {
+   public Iterable<StorageDevice> listStorageDevices() {
       StorageDevicesDto devices = context.getApi().getInfrastructureApi().listStorageDevices(target);
       return wrap(context, StorageDevice.class, devices.getCollection());
    }
@@ -248,7 +245,7 @@ public class Datacenter extends DomainWrapper<DatacenterDto> {
     * 
     * @return List of network services in this datacenter.
     */
-   public List<NetworkServiceType> listNetworkServiceTypes() {
+   public Iterable<NetworkServiceType> listNetworkServiceTypes() {
       NetworkServiceTypesDto dtos = context.getApi().getInfrastructureApi().listNetworkServiceTypes(target);
       return wrap(context, NetworkServiceType.class, dtos.getCollection());
    }
@@ -286,7 +283,7 @@ public class Datacenter extends DomainWrapper<DatacenterDto> {
     *      RemoteServiceResource- RetrievealistofRemoteServices</a>
     * @return List of remote services in this datacenter.
     */
-   public List<RemoteService> listRemoteServices() {
+   public Iterable<RemoteService> listRemoteServices() {
       RemoteServicesDto remoteServices = context.getApi().getInfrastructureApi().listRemoteServices(target);
       return wrap(context, RemoteService.class, remoteServices.getCollection());
    }
@@ -316,7 +313,7 @@ public class Datacenter extends DomainWrapper<DatacenterDto> {
     *      DatacenterResource- Retrievelimitsbydatacenter</a>
     * @return List of datacenter limits by all enterprises.
     */
-   public List<Limits> listLimits() {
+   public Iterable<Limits> listLimits() {
       DatacentersLimitsDto dto = context.getApi().getInfrastructureApi().listLimits(this.unwrap());
       return DomainWrapper.wrap(context, Limits.class, dto.getCollection());
    }
@@ -331,7 +328,7 @@ public class Datacenter extends DomainWrapper<DatacenterDto> {
     *      Retrievethelistoftiers </a>
     * @return List of tiers in this datacenter.
     */
-   public List<Tier> listTiers() {
+   public Iterable<Tier> listTiers() {
       TiersDto dto = context.getApi().getInfrastructureApi().listTiers(this.unwrap());
       return DomainWrapper.wrap(context, Tier.class, dto.getCollection());
    }
@@ -347,7 +344,7 @@ public class Datacenter extends DomainWrapper<DatacenterDto> {
     * @return List of public, external and unmanaged networks in this
     *         datacenter.
     */
-   public List<Network<?>> listNetworks() {
+   public Iterable<Network<?>> listNetworks() {
       VLANNetworksDto networks = context.getApi().getInfrastructureApi().listNetworks(target);
       return Network.wrapNetworks(context, networks.getCollection());
    }
@@ -363,7 +360,7 @@ public class Datacenter extends DomainWrapper<DatacenterDto> {
     *      PublicNetworkResource- Getthelistofpublicnetworks</a>
     * @return List of networks of this datacenter matching the given type.
     */
-   public List<Network<?>> listNetworks(final NetworkType type) {
+   public Iterable<Network<?>> listNetworks(final NetworkType type) {
       NetworkOptions options = NetworkOptions.builder().type(type).build();
       VLANNetworksDto networks = context.getApi().getInfrastructureApi().listNetworks(target, options);
       return Network.wrapNetworks(context, networks.getCollection());
@@ -424,18 +421,18 @@ public class Datacenter extends DomainWrapper<DatacenterDto> {
     *      DatacenterResource- Retrieveavailablehypervisortypes</a>
     * @return List of available hypervisor types in the datacenter.
     */
-   public List<HypervisorType> listAvailableHypervisors() {
+   public Iterable<HypervisorType> listAvailableHypervisors() {
       HypervisorTypesDto types = context.getApi().getInfrastructureApi().getHypervisorTypes(target);
       return getHypervisorTypes(types);
    }
 
-   private List<HypervisorType> getHypervisorTypes(final HypervisorTypesDto dtos) {
-      return ImmutableList.copyOf(transform(dtos.getCollection(), new Function<HypervisorTypeDto, HypervisorType>() {
+   private Iterable<HypervisorType> getHypervisorTypes(final HypervisorTypesDto dtos) {
+      return transform(dtos.getCollection(), new Function<HypervisorTypeDto, HypervisorType>() {
          @Override
          public HypervisorType apply(HypervisorTypeDto input) {
             return HypervisorType.fromId(input.getId());
          }
-      }));
+      });
    }
 
    /**
@@ -519,7 +516,7 @@ public class Datacenter extends DomainWrapper<DatacenterDto> {
     *      > http://community.abiquo.com/display/ABI20/DatacenterResource#
     *      DatacenterResource- Retrievealistofremotemachineinformation</a>
     */
-   public List<Machine> discoverMultipleMachines(final String ipFrom, final String ipTo,
+   public Iterable<Machine> discoverMultipleMachines(final String ipFrom, final String ipTo,
          final HypervisorType hypervisorType, final String user, final String password) {
       return discoverMultipleMachines(ipFrom, ipTo, hypervisorType, user, password, hypervisorType.defaultPort);
    }
@@ -547,7 +544,7 @@ public class Datacenter extends DomainWrapper<DatacenterDto> {
     *      > http://community.abiquo.com/display/ABI20/DatacenterResource#
     *      DatacenterResource- Retrievealistofremotemachineinformation</a>
     */
-   public List<Machine> discoverMultipleMachines(final String ipFrom, final String ipTo,
+   public Iterable<Machine> discoverMultipleMachines(final String ipFrom, final String ipTo,
          final HypervisorType hypervisorType, final String user, final String password, final int port) {
       MachinesDto dto = context
             .getApi()
@@ -687,10 +684,10 @@ public class Datacenter extends DomainWrapper<DatacenterDto> {
     * @return List of virtual machine templates in the repository of this
     *         datacenter.
     */
-   public List<VirtualMachineTemplate> listTemplatesInRepository(final Enterprise enterprise) {
-      VirtualMachineTemplatesDto dto = context.getApi().getVirtualMachineTemplateApi()
+   public Iterable<VirtualMachineTemplate> listTemplatesInRepository(final Enterprise enterprise) {
+      PagedIterable<VirtualMachineTemplateDto> templates = context.getApi().getVirtualMachineTemplateApi()
             .listVirtualMachineTemplates(enterprise.getId(), target.getId());
-      return wrap(context, VirtualMachineTemplate.class, dto.getCollection());
+      return wrap(context, VirtualMachineTemplate.class, templates.concat());
    }
 
    /**

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/domain/infrastructure/Machine.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/domain/infrastructure/Machine.java b/abiquo/src/main/java/org/jclouds/abiquo/domain/infrastructure/Machine.java
index dd851a8..102f7d4 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/domain/infrastructure/Machine.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/domain/infrastructure/Machine.java
@@ -17,6 +17,7 @@
 package org.jclouds.abiquo.domain.infrastructure;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.collect.ImmutableList.copyOf;
 
 import java.util.List;
 
@@ -138,11 +139,11 @@ public class Machine extends DomainWrapper<MachineDto> {
 
    // Children access
 
-   public List<Datastore> getDatastores() {
+   public Iterable<Datastore> getDatastores() {
       return wrap(context, Datastore.class, target.getDatastores().getCollection());
    }
 
-   public List<NetworkInterface> getNetworkInterfaces() {
+   public Iterable<NetworkInterface> getNetworkInterfaces() {
       return wrap(context, NetworkInterface.class, target.getNetworkInterfaces().getCollection());
    }
 
@@ -156,7 +157,7 @@ public class Machine extends DomainWrapper<MachineDto> {
     *      MachineResource-
     *      Retrievethelistofvirtualmachinesbymachine'shypervisor</a>
     */
-   public List<VirtualMachine> listVirtualMachines() {
+   public Iterable<VirtualMachine> listVirtualMachines() {
       MachineOptions options = MachineOptions.builder().sync(false).build();
       VirtualMachinesWithNodeExtendedDto vms = context.getApi().getInfrastructureApi()
             .listVirtualMachinesByMachine(target, options);
@@ -180,7 +181,7 @@ public class Machine extends DomainWrapper<MachineDto> {
     *      MachineResource-
     *      Retrievethelistofvirtualmachinesbymachine'shypervisor</a>
     */
-   public List<VirtualMachine> listRemoteVirtualMachines() {
+   public Iterable<VirtualMachine> listRemoteVirtualMachines() {
       MachineOptions options = MachineOptions.builder().sync(true).build();
       VirtualMachinesWithNodeExtendedDto vms = context.getApi().getInfrastructureApi()
             .listVirtualMachinesByMachine(target, options);
@@ -430,11 +431,11 @@ public class Machine extends DomainWrapper<MachineDto> {
          dto.setState(state);
 
          DatastoresDto datastoresDto = new DatastoresDto();
-         datastoresDto.getCollection().addAll(unwrap(datastores));
+         datastoresDto.getCollection().addAll(copyOf(unwrap(datastores)));
          dto.setDatastores(datastoresDto);
 
          NetworkInterfacesDto networkInterfacesDto = new NetworkInterfacesDto();
-         networkInterfacesDto.getCollection().addAll(unwrap(networkInterfaces));
+         networkInterfacesDto.getCollection().addAll(copyOf(unwrap(networkInterfaces)));
          dto.setNetworkInterfaces(networkInterfacesDto);
 
          Machine machine = new Machine(context, dto);
@@ -533,7 +534,7 @@ public class Machine extends DomainWrapper<MachineDto> {
 
    public void setDatastores(final List<Datastore> datastores) {
       DatastoresDto datastoresDto = new DatastoresDto();
-      datastoresDto.getCollection().addAll(DomainWrapper.unwrap(datastores));
+      datastoresDto.getCollection().addAll(copyOf(unwrap(datastores)));
       target.setDatastores(datastoresDto);
    }
 

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/domain/infrastructure/Rack.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/domain/infrastructure/Rack.java b/abiquo/src/main/java/org/jclouds/abiquo/domain/infrastructure/Rack.java
index d8f31c2..0c214e7 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/domain/infrastructure/Rack.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/domain/infrastructure/Rack.java
@@ -18,8 +18,6 @@ package org.jclouds.abiquo.domain.infrastructure;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import java.util.List;
-
 import org.jclouds.abiquo.AbiquoApi;
 import org.jclouds.abiquo.domain.DomainWrapper;
 import org.jclouds.abiquo.reference.ValidationErrors;
@@ -127,7 +125,7 @@ public class Rack extends DomainWrapper<RackDto> {
     *      > http://community.abiquo.com/display/ABI20/MachineResource#
     *      MachineResource- RetrievealistofMachines</a>
     */
-   public List<Machine> listMachines() {
+   public Iterable<Machine> listMachines() {
       MachinesDto machines = context.getApi().getInfrastructureApi().listMachines(target);
       return wrap(context, Machine.class, machines.getCollection());
    }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/domain/infrastructure/StorageDevice.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/domain/infrastructure/StorageDevice.java b/abiquo/src/main/java/org/jclouds/abiquo/domain/infrastructure/StorageDevice.java
index 166cf82..bfcead3 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/domain/infrastructure/StorageDevice.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/domain/infrastructure/StorageDevice.java
@@ -18,8 +18,6 @@ package org.jclouds.abiquo.domain.infrastructure;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import java.util.List;
-
 import org.jclouds.abiquo.AbiquoApi;
 import org.jclouds.abiquo.domain.DomainWrapper;
 import org.jclouds.abiquo.domain.infrastructure.options.StoragePoolOptions;
@@ -121,11 +119,11 @@ public class StorageDevice extends DomainWrapper<StorageDeviceDto> {
     *      StoragePoolResource- Retrievestoragepools</a>
     * @return Synchronized list of storage pools in this device.
     */
-   public List<StoragePool> listRemoteStoragePools() {
+   public Iterable<StoragePool> listRemoteStoragePools() {
       StoragePoolsDto storagePools = context.getApi().getInfrastructureApi()
             .listStoragePools(target, StoragePoolOptions.builder().sync(true).build());
 
-      List<StoragePool> storagePoolList = wrap(context, StoragePool.class, storagePools.getCollection());
+      Iterable<StoragePool> storagePoolList = wrap(context, StoragePool.class, storagePools.getCollection());
 
       for (StoragePool storagePool : storagePoolList) {
          storagePool.storageDevice = this;
@@ -144,7 +142,7 @@ public class StorageDevice extends DomainWrapper<StorageDeviceDto> {
     *      StoragePoolResource- Retrievestoragepools</a>
     * @return Unsynchronized list of storage pools in this device.
     */
-   public List<StoragePool> listStoragePools() {
+   public Iterable<StoragePool> listStoragePools() {
       StoragePoolsDto storagePools = context.getApi().getInfrastructureApi()
             .listStoragePools(target, StoragePoolOptions.builder().sync(false).build());
       return wrap(context, StoragePool.class, storagePools.getCollection());
@@ -177,7 +175,7 @@ public class StorageDevice extends DomainWrapper<StorageDeviceDto> {
     *      Retrievethelistoftiers </a>
     * @return List of tiers in the datacenter using this device.
     */
-   public List<Tier> listTiersFromDatacenter() {
+   public Iterable<Tier> listTiersFromDatacenter() {
       DatacenterDto datacenter;
 
       if (this.datacenter == null) {

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/domain/infrastructure/Tier.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/domain/infrastructure/Tier.java b/abiquo/src/main/java/org/jclouds/abiquo/domain/infrastructure/Tier.java
index 0bc615a..190b81f 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/domain/infrastructure/Tier.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/domain/infrastructure/Tier.java
@@ -16,8 +16,6 @@
  */
 package org.jclouds.abiquo.domain.infrastructure;
 
-import java.util.List;
-
 import org.jclouds.abiquo.AbiquoApi;
 import org.jclouds.abiquo.domain.DomainWrapper;
 import org.jclouds.abiquo.reference.rest.ParentLinkName;
@@ -73,7 +71,7 @@ public class Tier extends DomainWrapper<TierDto> {
     *      StoragePoolResource- Retrievestoragepools</a>
     * @return List of storage pools in this tier.
     */
-   public List<StoragePool> listStoragePools() {
+   public Iterable<StoragePool> listStoragePools() {
       StoragePoolsDto storagePools = context.getApi().getInfrastructureApi().listStoragePools(target);
       return wrap(context, StoragePool.class, storagePools.getCollection());
    }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/domain/network/ExternalNetwork.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/domain/network/ExternalNetwork.java b/abiquo/src/main/java/org/jclouds/abiquo/domain/network/ExternalNetwork.java
index e6c5f05..dd10ca4 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/domain/network/ExternalNetwork.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/domain/network/ExternalNetwork.java
@@ -18,14 +18,14 @@ package org.jclouds.abiquo.domain.network;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import java.util.List;
-
 import org.jclouds.abiquo.AbiquoApi;
+import org.jclouds.abiquo.domain.PaginatedCollection;
 import org.jclouds.abiquo.domain.enterprise.Enterprise;
 import org.jclouds.abiquo.domain.infrastructure.Datacenter;
 import org.jclouds.abiquo.domain.network.options.IpOptions;
 import org.jclouds.abiquo.reference.ValidationErrors;
 import org.jclouds.abiquo.reference.rest.ParentLinkName;
+import org.jclouds.collect.PagedIterable;
 import org.jclouds.http.HttpResponse;
 import org.jclouds.http.functions.ParseXMLWithJAXB;
 import org.jclouds.rest.ApiContext;
@@ -98,16 +98,17 @@ public class ExternalNetwork extends Network<ExternalIp> {
       target = context.getApi().getInfrastructureApi().updateNetwork(target);
    }
 
-   /**
-    * @see API: <a href=
-    *      "http://community.abiquo.com/display/ABI20/Public+IPs+Resource#PublicIPsResource-ReturnthelistofIPsforaPublicNetwork"
-    *      > http://community.abiquo.com/display/ABI20/Public+IPs+Resource#
-    *      PublicIPsResource- ReturnthelistofIPsforaPublicNetwork</a>
-    */
    @Override
-   public List<ExternalIp> listIps(final IpOptions options) {
-      ExternalIpsDto ips = context.getApi().getInfrastructureApi().listExternalIps(target, options);
-      return wrap(context, ExternalIp.class, ips.getCollection());
+   public Iterable<ExternalIp> listIps() {
+      PagedIterable<ExternalIpDto> ips = context.getApi().getInfrastructureApi().listExternalIps(target);
+      return wrap(context, ExternalIp.class, ips.concat());
+   }
+
+   @Override
+   public Iterable<ExternalIp> listIps(final IpOptions options) {
+      PaginatedCollection<ExternalIpDto, ExternalIpsDto> ips = context.getApi().getInfrastructureApi()
+            .listExternalIps(target, options);
+      return wrap(context, ExternalIp.class, ips.toPagedIterable().concat());
    }
 
    @Override

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/domain/network/Network.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/domain/network/Network.java b/abiquo/src/main/java/org/jclouds/abiquo/domain/network/Network.java
index 0f1a4e7..f59c7f0 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/domain/network/Network.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/domain/network/Network.java
@@ -32,7 +32,6 @@ import org.jclouds.rest.ApiContext;
 import com.abiquo.model.enumerator.NetworkType;
 import com.abiquo.server.core.infrastructure.network.VLANNetworkDto;
 import com.google.common.base.Function;
-import com.google.common.collect.ImmutableList;
 
 /**
  * Adds generic high level functionality to {@link VLANNetworkDto}.
@@ -56,17 +55,14 @@ public abstract class Network<T extends Ip<?, ?>> extends DomainWrapper<VLANNetw
 
    public abstract void delete();
 
-   public abstract List<T> listIps(IpOptions options);
+   public abstract Iterable<T> listIps();
 
-   public abstract T getIp(Integer id);
+   public abstract Iterable<T> listIps(IpOptions options);
 
-   public List<T> listIps() {
-      // Disable pagination by default
-      return listIps(IpOptions.builder().disablePagination().build());
-   }
+   public abstract T getIp(Integer id);
 
-   public List<T> listUnusedIps() {
-      return ImmutableList.copyOf(filter(listIps(), IpPredicates.<T> notUsed()));
+   public Iterable<T> listUnusedIps() {
+      return filter(listIps(), IpPredicates.<T> notUsed());
    }
 
    // Builder
@@ -302,12 +298,12 @@ public abstract class Network<T extends Ip<?, ?>> extends DomainWrapper<VLANNetw
       return network;
    }
 
-   public static List<Network<?>> wrapNetworks(final ApiContext<AbiquoApi> context, final List<VLANNetworkDto> dtos) {
-      return ImmutableList.copyOf(transform(dtos, new Function<VLANNetworkDto, Network<?>>() {
+   public static Iterable<Network<?>> wrapNetworks(final ApiContext<AbiquoApi> context, final List<VLANNetworkDto> dtos) {
+      return transform(dtos, new Function<VLANNetworkDto, Network<?>>() {
          @Override
          public Network<?> apply(VLANNetworkDto input) {
             return wrapNetwork(context, input);
          }
-      }));
+      });
    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/main/java/org/jclouds/abiquo/domain/network/PrivateNetwork.java
----------------------------------------------------------------------
diff --git a/abiquo/src/main/java/org/jclouds/abiquo/domain/network/PrivateNetwork.java b/abiquo/src/main/java/org/jclouds/abiquo/domain/network/PrivateNetwork.java
index 531a12c..4d411f5 100644
--- a/abiquo/src/main/java/org/jclouds/abiquo/domain/network/PrivateNetwork.java
+++ b/abiquo/src/main/java/org/jclouds/abiquo/domain/network/PrivateNetwork.java
@@ -16,11 +16,11 @@
  */
 package org.jclouds.abiquo.domain.network;
 
-import java.util.List;
-
 import org.jclouds.abiquo.AbiquoApi;
+import org.jclouds.abiquo.domain.PaginatedCollection;
 import org.jclouds.abiquo.domain.cloud.VirtualDatacenter;
 import org.jclouds.abiquo.domain.network.options.IpOptions;
+import org.jclouds.collect.PagedIterable;
 import org.jclouds.rest.ApiContext;
 
 import com.abiquo.model.enumerator.NetworkType;
@@ -84,24 +84,26 @@ public class PrivateNetwork extends Network<PrivateIp> {
       target = context.getApi().getCloudApi().updatePrivateNetwork(target);
    }
 
-   /**
-    * @see API: <a href=
-    *      "http://community.abiquo.com/display/ABI20/Private+Network+Resource#PrivateNetworkResource-RetrievethelistofIPSofthePrivateNetwork"
-    *      > http://community.abiquo.com/display/ABI20/Private+Network+Resource#
-    *      PrivateNetworkResource -RetrievethelistofIPSofthePrivateNetwork</a>
-    */
    @Override
-   public List<PrivateIp> listIps(final IpOptions options) {
-      PrivateIpsDto ips = context.getApi().getCloudApi().listPrivateNetworkIps(target, options);
-      return wrap(context, PrivateIp.class, ips.getCollection());
+   public Iterable<PrivateIp> listIps() {
+      PagedIterable<PrivateIpDto> ips = context.getApi().getCloudApi().listPrivateNetworkIps(target);
+      return wrap(context, PrivateIp.class, ips.concat());
+   }
+
+   @Override
+   public Iterable<PrivateIp> listIps(final IpOptions options) {
+      PaginatedCollection<PrivateIpDto, PrivateIpsDto> ips = context.getApi().getCloudApi()
+            .listPrivateNetworkIps(target, options);
+      return wrap(context, PrivateIp.class, ips.toPagedIterable().concat());
    }
 
    // Override to apply the filter in the server side
    @Override
-   public List<PrivateIp> listUnusedIps() {
-      IpOptions options = IpOptions.builder().disablePagination().free(true).build();
-      PrivateIpsDto ips = context.getApi().getCloudApi().listPrivateNetworkIps(target, options);
-      return wrap(context, PrivateIp.class, ips.getCollection());
+   public Iterable<PrivateIp> listUnusedIps() {
+      IpOptions options = IpOptions.builder().free(true).build();
+      PaginatedCollection<PrivateIpDto, PrivateIpsDto> ips = context.getApi().getCloudApi()
+            .listPrivateNetworkIps(target, options);
+      return wrap(context, PrivateIp.class, ips.toPagedIterable().concat());
    }
 
    @Override


[3/5] JCLOUDS-198: Implemented the PagedIterable in Abiquo

Posted by na...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VirtualMachineNetworkingLiveApiTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VirtualMachineNetworkingLiveApiTest.java b/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VirtualMachineNetworkingLiveApiTest.java
index ae0a31f..4b60d4a 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VirtualMachineNetworkingLiveApiTest.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VirtualMachineNetworkingLiveApiTest.java
@@ -17,9 +17,11 @@
 package org.jclouds.abiquo.domain.cloud;
 
 import static com.google.common.collect.Iterables.find;
+import static com.google.common.collect.Iterables.get;
+import static com.google.common.collect.Iterables.getLast;
+import static com.google.common.collect.Iterables.size;
 import static org.jclouds.abiquo.util.Assert.assertHasError;
 import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertNull;
 import static org.testng.Assert.fail;
 
@@ -65,13 +67,10 @@ public class VirtualMachineNetworkingLiveApiTest extends BaseAbiquoApiLiveApiTes
 
    @BeforeClass
    public void setupIps() {
-      privateIp = env.privateNetwork.listUnusedIps().get(0);
-      assertNotNull(privateIp);
+      privateIp = getLast(env.privateNetwork.listUnusedIps());
+      externalIp = getLast(env.externalNetwork.listUnusedIps());
 
-      externalIp = env.externalNetwork.listUnusedIps().get(0);
-      assertNotNull(externalIp);
-
-      publicIpInfrastructure = env.virtualDatacenter.listAvailablePublicIps().get(0);
+      publicIpInfrastructure = getLast(env.virtualDatacenter.listAvailablePublicIps());
       env.virtualDatacenter.purchasePublicIp(publicIpInfrastructure);
 
       publicIpCloud = find(env.virtualDatacenter.listPurchasedPublicIps(), new Predicate<PublicIp>() {
@@ -87,9 +86,9 @@ public class VirtualMachineNetworkingLiveApiTest extends BaseAbiquoApiLiveApiTes
       VirtualMachineTask task = env.virtualMachine.setNics(Lists.<Ip<?, ?>> newArrayList(privateIp));
       assertNull(task);
 
-      List<Ip<?, ?>> nics = env.virtualMachine.listAttachedNics();
-      assertEquals(nics.size(), 1);
-      assertEquals(nics.get(0).getId(), privateIp.getId());
+      Iterable<Ip<?, ?>> nics = env.virtualMachine.listAttachedNics();
+      assertEquals(size(nics), 1);
+      assertEquals(get(nics, 0).getId(), privateIp.getId());
 
       final String address = publicIpCloud.getIp();
       env.virtualDatacenter.releasePublicIp(publicIpCloud);
@@ -108,18 +107,18 @@ public class VirtualMachineNetworkingLiveApiTest extends BaseAbiquoApiLiveApiTes
       VirtualMachineTask task = env.virtualMachine.setNics(Lists.<Ip<?, ?>> newArrayList(publicIpInfrastructure));
       assertNull(task);
 
-      List<Ip<?, ?>> nics = env.virtualMachine.listAttachedNics();
-      assertEquals(nics.size(), 1);
-      assertEquals(nics.get(0).getId(), publicIpInfrastructure.getId());
+      Iterable<Ip<?, ?>> nics = env.virtualMachine.listAttachedNics();
+      assertEquals(size(nics), 1);
+      assertEquals(get(nics, 0).getId(), publicIpInfrastructure.getId());
    }
 
    public void testAttachPublicIp() {
       VirtualMachineTask task = env.virtualMachine.setNics(Lists.<Ip<?, ?>> newArrayList(publicIpCloud));
       assertNull(task);
 
-      List<Ip<?, ?>> nics = env.virtualMachine.listAttachedNics();
-      assertEquals(nics.size(), 1);
-      assertEquals(nics.get(0).getId(), publicIpCloud.getId());
+      Iterable<Ip<?, ?>> nics = env.virtualMachine.listAttachedNics();
+      assertEquals(size(nics), 1);
+      assertEquals(get(nics, 0).getId(), publicIpCloud.getId());
    }
 
    @Test(dependsOnMethods = "testAttachPublicIp")
@@ -130,7 +129,7 @@ public class VirtualMachineNetworkingLiveApiTest extends BaseAbiquoApiLiveApiTes
       VirtualMachineTask task = env.virtualMachine.setNics(nics);
       assertNull(task);
 
-      nics = env.virtualMachine.listAttachedNics();
+      nics = Lists.newArrayList(env.virtualMachine.listAttachedNics());
       assertEquals(nics.size(), 2);
       assertEquals(nics.get(0).getId(), publicIpCloud.getId());
       assertEquals(nics.get(1).getId(), privateIp.getId());
@@ -144,7 +143,7 @@ public class VirtualMachineNetworkingLiveApiTest extends BaseAbiquoApiLiveApiTes
       VirtualMachineTask task = env.virtualMachine.setNics(nics);
       assertNull(task);
 
-      nics = env.virtualMachine.listAttachedNics();
+      nics = Lists.newArrayList(env.virtualMachine.listAttachedNics());
       assertEquals(nics.size(), 3);
       assertEquals(nics.get(0).getId(), publicIpCloud.getId());
       assertEquals(nics.get(1).getId(), privateIp.getId());
@@ -153,34 +152,34 @@ public class VirtualMachineNetworkingLiveApiTest extends BaseAbiquoApiLiveApiTes
 
    @Test(dependsOnMethods = "testAttachExternalIp")
    public void testAddUnmanagedNics() {
-      List<Ip<?, ?>> nics = env.virtualMachine.listAttachedNics();
+      Iterable<Ip<?, ?>> nics = env.virtualMachine.listAttachedNics();
 
-      VirtualMachineTask task = env.virtualMachine.setNics(nics,
+      VirtualMachineTask task = env.virtualMachine.setNics(Lists.newArrayList(nics),
             Lists.<UnmanagedNetwork> newArrayList(env.unmanagedNetwork, env.unmanagedNetwork));
       assertNull(task);
 
       nics = env.virtualMachine.listAttachedNics();
-      assertEquals(nics.size(), 5);
-      assertEquals(nics.get(0).getId(), publicIpCloud.getId());
-      assertEquals(nics.get(1).getId(), privateIp.getId());
-      assertEquals(nics.get(2).getId(), externalIp.getId());
+      assertEquals(size(nics), 5);
+      assertEquals(get(nics, 0).getId(), publicIpCloud.getId());
+      assertEquals(get(nics, 1).getId(), privateIp.getId());
+      assertEquals(get(nics, 2).getId(), externalIp.getId());
       // Unmanaged ips are created during the attach.
-      assertEquals(nics.get(3).getNetworkName(), env.unmanagedNetwork.getName());
-      assertEquals(nics.get(4).getNetworkName(), env.unmanagedNetwork.getName());
+      assertEquals(get(nics, 3).getNetworkName(), env.unmanagedNetwork.getName());
+      assertEquals(get(nics, 4).getNetworkName(), env.unmanagedNetwork.getName());
 
-      unmanagedIp1 = (UnmanagedIp) nics.get(3);
-      unmanagedIp2 = (UnmanagedIp) nics.get(4);
+      unmanagedIp1 = (UnmanagedIp) get(nics, 3);
+      unmanagedIp2 = (UnmanagedIp) get(nics, 4);
    }
 
    @Test(dependsOnMethods = "testAddUnmanagedNics")
    public void testReorderNics() {
-      List<Ip<?, ?>> nics = env.virtualMachine.listAttachedNics();
+      List<Ip<?, ?>> nics = Lists.newArrayList(env.virtualMachine.listAttachedNics());
 
       VirtualMachineTask task = env.virtualMachine.setNics(Lists.<Ip<?, ?>> newArrayList(nics.get(2), nics.get(1),
             nics.get(0), nics.get(4), nics.get(3)));
       assertNull(task);
 
-      nics = env.virtualMachine.listAttachedNics();
+      nics = Lists.newArrayList(env.virtualMachine.listAttachedNics());
       assertEquals(nics.size(), 5);
       assertEquals(nics.get(0).getId(), externalIp.getId());
       assertEquals(nics.get(1).getId(), privateIp.getId());
@@ -191,12 +190,12 @@ public class VirtualMachineNetworkingLiveApiTest extends BaseAbiquoApiLiveApiTes
 
    @Test(dependsOnMethods = "testReorderNics")
    public void testDetachNics() {
-      List<Ip<?, ?>> nics = env.virtualMachine.listAttachedNics();
+      List<Ip<?, ?>> nics = Lists.newArrayList(env.virtualMachine.listAttachedNics());
 
       VirtualMachineTask task = env.virtualMachine.setNics(Lists.<Ip<?, ?>> newArrayList(nics.get(1), nics.get(2)));
       assertNull(task);
 
-      nics = env.virtualMachine.listAttachedNics();
+      nics = Lists.newArrayList(env.virtualMachine.listAttachedNics());
       assertEquals(nics.size(), 2);
       assertEquals(nics.get(0).getId(), privateIp.getId());
       assertEquals(nics.get(1).getId(), publicIpCloud.getId());

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VirtualMachineStorageLiveApiTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VirtualMachineStorageLiveApiTest.java b/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VirtualMachineStorageLiveApiTest.java
index ea060cb..6d5aded 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VirtualMachineStorageLiveApiTest.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VirtualMachineStorageLiveApiTest.java
@@ -17,14 +17,15 @@
 package org.jclouds.abiquo.domain.cloud;
 
 import static com.google.common.collect.Iterables.find;
+import static com.google.common.collect.Iterables.get;
+import static com.google.common.collect.Iterables.isEmpty;
+import static com.google.common.collect.Iterables.size;
 import static org.jclouds.abiquo.reference.AbiquoTestConstants.PREFIX;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 
-import java.util.List;
-
 import org.jclouds.abiquo.domain.infrastructure.Tier;
 import org.jclouds.abiquo.domain.task.VirtualMachineTask;
 import org.jclouds.abiquo.internal.BaseAbiquoApiLiveApiTest;
@@ -51,16 +52,16 @@ public class VirtualMachineStorageLiveApiTest extends BaseAbiquoApiLiveApiTest {
       VirtualMachineTask task = env.virtualMachine.attachVolumes(volume);
       assertNull(task);
 
-      List<Volume> attached = env.virtualMachine.listAttachedVolumes();
-      assertEquals(attached.size(), 1);
-      assertEquals(attached.get(0).getId(), volume.getId());
+      Iterable<Volume> attached = env.virtualMachine.listAttachedVolumes();
+      assertEquals(size(attached), 1);
+      assertEquals(get(attached, 0).getId(), volume.getId());
    }
 
    @Test(dependsOnMethods = "testAttachVolumes")
    public void detachVolume() {
       env.virtualMachine.detachVolumes(volume);
-      List<Volume> attached = env.virtualMachine.listAttachedVolumes();
-      assertTrue(attached.isEmpty());
+      Iterable<Volume> attached = env.virtualMachine.listAttachedVolumes();
+      assertTrue(isEmpty(attached));
    }
 
    @Test(dependsOnMethods = "detachVolume")
@@ -71,8 +72,8 @@ public class VirtualMachineStorageLiveApiTest extends BaseAbiquoApiLiveApiTest {
       assertNull(task);
 
       env.virtualMachine.detachAllVolumes();
-      List<Volume> attached = env.virtualMachine.listAttachedVolumes();
-      assertTrue(attached.isEmpty());
+      Iterable<Volume> attached = env.virtualMachine.listAttachedVolumes();
+      assertTrue(isEmpty(attached));
 
       deleteVolume(volume);
    }
@@ -85,16 +86,16 @@ public class VirtualMachineStorageLiveApiTest extends BaseAbiquoApiLiveApiTest {
       VirtualMachineTask task = env.virtualMachine.attachHardDisks(hardDisk);
       assertNull(task);
 
-      List<HardDisk> attached = env.virtualMachine.listAttachedHardDisks();
-      assertEquals(attached.size(), 1);
-      assertEquals(attached.get(0).getId(), hardDisk.getId());
+      Iterable<HardDisk> attached = env.virtualMachine.listAttachedHardDisks();
+      assertEquals(size(attached), 1);
+      assertEquals(get(attached, 0).getId(), hardDisk.getId());
    }
 
    @Test(dependsOnMethods = "testAttachHardDisks")
    public void detachHardDisk() {
       env.virtualMachine.detachHardDisks(hardDisk);
-      List<HardDisk> attached = env.virtualMachine.listAttachedHardDisks();
-      assertTrue(attached.isEmpty());
+      Iterable<HardDisk> attached = env.virtualMachine.listAttachedHardDisks();
+      assertTrue(isEmpty(attached));
    }
 
    @Test(dependsOnMethods = "detachHardDisk")
@@ -105,8 +106,8 @@ public class VirtualMachineStorageLiveApiTest extends BaseAbiquoApiLiveApiTest {
       assertNull(task);
 
       env.virtualMachine.detachAllHardDisks();
-      List<HardDisk> attached = env.virtualMachine.listAttachedHardDisks();
-      assertTrue(attached.isEmpty());
+      Iterable<HardDisk> attached = env.virtualMachine.listAttachedHardDisks();
+      assertTrue(isEmpty(attached));
 
       deleteHardDisk(hardDisk);
    }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VolumeLiveApiTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VolumeLiveApiTest.java b/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VolumeLiveApiTest.java
index 02ec993..b720be5 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VolumeLiveApiTest.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/domain/cloud/VolumeLiveApiTest.java
@@ -17,14 +17,14 @@
 package org.jclouds.abiquo.domain.cloud;
 
 import static com.google.common.collect.Iterables.find;
+import static com.google.common.collect.Iterables.isEmpty;
+import static com.google.common.collect.Iterables.size;
 import static org.jclouds.abiquo.reference.AbiquoTestConstants.PREFIX;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 
-import java.util.List;
-
 import org.jclouds.abiquo.domain.cloud.options.VolumeOptions;
 import org.jclouds.abiquo.domain.infrastructure.Tier;
 import org.jclouds.abiquo.domain.network.PrivateNetwork;
@@ -32,7 +32,6 @@ import org.jclouds.abiquo.domain.task.VirtualMachineTask;
 import org.jclouds.abiquo.internal.BaseAbiquoApiLiveApiTest;
 import org.testng.annotations.Test;
 
-import com.abiquo.server.core.infrastructure.storage.VolumeManagementDto;
 import com.google.common.base.Predicate;
 
 /**
@@ -64,14 +63,11 @@ public class VolumeLiveApiTest extends BaseAbiquoApiLiveApiTest {
       VolumeOptions validOptions = VolumeOptions.builder().has("hawa").build();
       VolumeOptions invalidOptions = VolumeOptions.builder().has("cacatua").build();
 
-      List<VolumeManagementDto> volumes = env.cloudApi.listVolumes(env.virtualDatacenter.unwrap(), validOptions)
-            .getCollection();
-
-      assertEquals(volumes.size(), 1);
-
-      volumes = env.cloudApi.listVolumes(env.virtualDatacenter.unwrap(), invalidOptions).getCollection();
+      Iterable<Volume> volumes = env.virtualDatacenter.listVolumes(validOptions);
+      assertEquals(size(volumes), 1);
 
-      assertEquals(volumes.size(), 0);
+      volumes = env.virtualDatacenter.listVolumes(invalidOptions);
+      assertTrue(isEmpty(volumes));
    }
 
    @Test(dependsOnMethods = "testFilterVolumes")

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/domain/enterprise/EnterpriseLiveApiTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/domain/enterprise/EnterpriseLiveApiTest.java b/abiquo/src/test/java/org/jclouds/abiquo/domain/enterprise/EnterpriseLiveApiTest.java
index 473ef5e..24fbd76 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/domain/enterprise/EnterpriseLiveApiTest.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/domain/enterprise/EnterpriseLiveApiTest.java
@@ -16,6 +16,9 @@
  */
 package org.jclouds.abiquo.domain.enterprise;
 
+import static com.google.common.collect.Iterables.get;
+import static com.google.common.collect.Iterables.isEmpty;
+import static com.google.common.collect.Iterables.size;
 import static org.jclouds.abiquo.reference.AbiquoTestConstants.PREFIX;
 import static org.jclouds.abiquo.util.Assert.assertHasError;
 import static org.testng.Assert.assertEquals;
@@ -24,8 +27,6 @@ import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 
-import java.util.List;
-
 import javax.ws.rs.core.Response.Status;
 
 import org.jclouds.abiquo.domain.cloud.VirtualAppliance;
@@ -78,9 +79,9 @@ public class EnterpriseLiveApiTest extends BaseAbiquoApiLiveApiTest {
          assertHasError(ex, Status.CONFLICT, "ENTERPRISE-10");
       }
 
-      List<Datacenter> allowed = enterprise.listAllowedDatacenters();
+      Iterable<Datacenter> allowed = enterprise.listAllowedDatacenters();
       assertNotNull(allowed);
-      assertTrue(allowed.isEmpty());
+      assertTrue(isEmpty(allowed));
 
       enterprise.delete();
    }
@@ -118,9 +119,9 @@ public class EnterpriseLiveApiTest extends BaseAbiquoApiLiveApiTest {
    }
 
    public void testListLimits() {
-      List<Limits> allLimits = enterprise.listLimits();
+      Iterable<Limits> allLimits = enterprise.listLimits();
       assertNotNull(allLimits);
-      assertEquals(allLimits.size(), 1);
+      assertEquals(size(allLimits), 1);
    }
 
    public void testUpdateInvalidLimits() {
@@ -146,20 +147,20 @@ public class EnterpriseLiveApiTest extends BaseAbiquoApiLiveApiTest {
    }
 
    public void testListAllowedDatacenters() {
-      List<Datacenter> allowed = enterprise.listAllowedDatacenters();
+      Iterable<Datacenter> allowed = enterprise.listAllowedDatacenters();
 
       assertNotNull(allowed);
-      assertFalse(allowed.isEmpty());
-      assertEquals(allowed.get(0).getId(), env.datacenter.getId());
+      assertFalse(isEmpty(allowed));
+      assertEquals(get(allowed, 0).getId(), env.datacenter.getId());
    }
 
    public void testListVirtualMachines() {
-      List<VirtualMachine> machines = env.defaultEnterprise.listVirtualMachines();
-      assertTrue(machines.size() > 0);
+      Iterable<VirtualMachine> machines = env.defaultEnterprise.listVirtualMachines();
+      assertTrue(size(machines) > 0);
    }
 
    public void testListVirtualAppliances() {
-      List<VirtualAppliance> vapps = env.defaultEnterprise.listVirtualAppliances();
-      assertTrue(vapps.size() > 0);
+      Iterable<VirtualAppliance> vapps = env.defaultEnterprise.listVirtualAppliances();
+      assertTrue(size(vapps) > 0);
    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/domain/enterprise/TemplateDefinitionListLiveApiTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/domain/enterprise/TemplateDefinitionListLiveApiTest.java b/abiquo/src/test/java/org/jclouds/abiquo/domain/enterprise/TemplateDefinitionListLiveApiTest.java
index b5909a5..c618e93 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/domain/enterprise/TemplateDefinitionListLiveApiTest.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/domain/enterprise/TemplateDefinitionListLiveApiTest.java
@@ -22,8 +22,6 @@ import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertNull;
 
-import java.util.List;
-
 import org.jclouds.abiquo.internal.BaseAbiquoApiLiveApiTest;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
@@ -56,7 +54,7 @@ public class TemplateDefinitionListLiveApiTest extends BaseAbiquoApiLiveApiTest
    }
 
    public void testListStates() {
-      List<TemplateState> states = list.listStatus(env.datacenter);
+      Iterable<TemplateState> states = list.listStatus(env.datacenter);
       assertNotNull(states);
    }
 

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/domain/enterprise/UserLiveApiTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/domain/enterprise/UserLiveApiTest.java b/abiquo/src/test/java/org/jclouds/abiquo/domain/enterprise/UserLiveApiTest.java
index b27cb45..14fdc5a 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/domain/enterprise/UserLiveApiTest.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/domain/enterprise/UserLiveApiTest.java
@@ -26,7 +26,6 @@ import static org.testng.Assert.fail;
 
 import javax.ws.rs.core.Response.Status;
 
-import org.jclouds.abiquo.domain.enterprise.options.UserOptions;
 import org.jclouds.abiquo.domain.exception.AbiquoException;
 import org.jclouds.abiquo.internal.BaseAbiquoApiLiveApiTest;
 import org.testng.annotations.Test;
@@ -90,16 +89,6 @@ public class UserLiveApiTest extends BaseAbiquoApiLiveApiTest {
       users = filter(env.enterprise.listUsers(), nick(env.user.getName() + "FAIL"));
       assertEquals(size(users), 0);
    }
-   
-   public void testListUserWithOptions() {
-      Iterable<User> users = env.enterprise.listUsers(UserOptions.builder()
-            .limit(1).startWith(0).build());
-      assertEquals(size(users),  1);
-
-      users = env.enterprise.listUsers(UserOptions.builder()
-            .limit(1).page(2).build());
-      assertEquals(size(users),  1);
-   }
 
    public void testGetCurrentUser() {
       User user = env.context.getAdministrationService().getCurrentUser();

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/domain/infrastructure/DatacenterLiveApiTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/domain/infrastructure/DatacenterLiveApiTest.java b/abiquo/src/test/java/org/jclouds/abiquo/domain/infrastructure/DatacenterLiveApiTest.java
index 5d34eb5..ad17ab4 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/domain/infrastructure/DatacenterLiveApiTest.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/domain/infrastructure/DatacenterLiveApiTest.java
@@ -16,14 +16,13 @@
  */
 package org.jclouds.abiquo.domain.infrastructure;
 
+import static com.google.common.collect.Iterables.size;
 import static org.jclouds.abiquo.util.Assert.assertHasError;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 
-import java.util.List;
-
 import javax.ws.rs.core.Response.Status;
 
 import org.jclouds.abiquo.domain.enterprise.Limits;
@@ -71,9 +70,9 @@ public class DatacenterLiveApiTest extends BaseAbiquoApiLiveApiTest {
    }
 
    public void testListLimits() {
-      List<Limits> limits = env.datacenter.listLimits();
+      Iterable<Limits> limits = env.datacenter.listLimits();
       assertNotNull(limits);
-      assertTrue(limits.size() > 0);
+      assertTrue(size(limits) > 0);
    }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/domain/infrastructure/MachineLiveApiTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/domain/infrastructure/MachineLiveApiTest.java b/abiquo/src/test/java/org/jclouds/abiquo/domain/infrastructure/MachineLiveApiTest.java
index e4eafd7..31cc7ef 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/domain/infrastructure/MachineLiveApiTest.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/domain/infrastructure/MachineLiveApiTest.java
@@ -25,7 +25,6 @@ import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
 
 import java.net.URI;
-import java.util.List;
 
 import javax.ws.rs.core.Response.Status;
 
@@ -115,9 +114,8 @@ public class MachineLiveApiTest extends BaseAbiquoApiLiveApiTest {
    }
 
    public void testListVirtualMachines() {
-      List<VirtualMachine> machines = env.machine.listRemoteVirtualMachines();
+      Iterable<VirtualMachine> machines = env.machine.listRemoteVirtualMachines();
       assertNotNull(machines);
-      assertTrue(machines.size() >= 0);
    }
 
    public void testReserveMachine() {

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/domain/infrastructure/RemoteServiceLiveApiTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/domain/infrastructure/RemoteServiceLiveApiTest.java b/abiquo/src/test/java/org/jclouds/abiquo/domain/infrastructure/RemoteServiceLiveApiTest.java
index 4c75f62..8abcde9 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/domain/infrastructure/RemoteServiceLiveApiTest.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/domain/infrastructure/RemoteServiceLiveApiTest.java
@@ -18,6 +18,7 @@ package org.jclouds.abiquo.domain.infrastructure;
 
 import static com.google.common.collect.Iterables.filter;
 import static com.google.common.collect.Iterables.find;
+import static com.google.common.collect.Iterables.get;
 import static com.google.common.collect.Iterables.size;
 import static org.jclouds.abiquo.util.Assert.assertHasError;
 import static org.testng.Assert.assertEquals;
@@ -87,7 +88,7 @@ public class RemoteServiceLiveApiTest extends BaseAbiquoApiLiveApiTest {
    }
 
    public void testCreateRepeated() {
-      RemoteService repeated = Builder.fromRemoteService(env.remoteServices.get(1)).build();
+      RemoteService repeated = Builder.fromRemoteService(get(env.remoteServices, 1)).build();
 
       try {
          repeated.save();
@@ -99,7 +100,7 @@ public class RemoteServiceLiveApiTest extends BaseAbiquoApiLiveApiTest {
 
    public void testListRemoteServices() {
       Iterable<RemoteService> remoteServices = env.datacenter.listRemoteServices();
-      assertEquals(size(remoteServices), env.remoteServices.size());
+      assertEquals(size(remoteServices), size(env.remoteServices));
 
       remoteServices = filter(env.datacenter.listRemoteServices(), type(RemoteServiceType.NODE_COLLECTOR));
       assertEquals(size(remoteServices), 1);

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/domain/infrastructure/TierLiveApiTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/domain/infrastructure/TierLiveApiTest.java b/abiquo/src/test/java/org/jclouds/abiquo/domain/infrastructure/TierLiveApiTest.java
index c04b3b6..76cbbd8 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/domain/infrastructure/TierLiveApiTest.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/domain/infrastructure/TierLiveApiTest.java
@@ -18,9 +18,9 @@ package org.jclouds.abiquo.domain.infrastructure;
 
 import static com.google.common.collect.Iterables.filter;
 import static com.google.common.collect.Iterables.find;
+import static com.google.common.collect.Iterables.getLast;
 import static com.google.common.collect.Iterables.size;
 import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
 
 import org.jclouds.abiquo.internal.BaseAbiquoApiLiveApiTest;
 import org.testng.annotations.Test;
@@ -37,8 +37,7 @@ import com.google.common.base.Predicate;
 public class TierLiveApiTest extends BaseAbiquoApiLiveApiTest {
 
    public void testUpdate() {
-      Tier tier = env.datacenter.listTiers().get(0);
-      assertNotNull(tier);
+      Tier tier = getLast(env.datacenter.listTiers());
 
       String previousName = tier.getName();
       tier.setName("Updated tier");

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/domain/network/ExternalNetworkLiveApiTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/domain/network/ExternalNetworkLiveApiTest.java b/abiquo/src/test/java/org/jclouds/abiquo/domain/network/ExternalNetworkLiveApiTest.java
index e0056dc..0224ff6 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/domain/network/ExternalNetworkLiveApiTest.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/domain/network/ExternalNetworkLiveApiTest.java
@@ -17,16 +17,16 @@
 package org.jclouds.abiquo.domain.network;
 
 import static com.google.common.collect.Iterables.find;
+import static com.google.common.collect.Iterables.size;
 import static org.jclouds.abiquo.reference.AbiquoTestConstants.PREFIX;
 import static org.jclouds.abiquo.util.Assert.assertHasError;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.fail;
 
-import java.util.List;
-
 import javax.ws.rs.core.Response.Status;
 
+import org.jclouds.abiquo.domain.PaginatedCollection;
 import org.jclouds.abiquo.domain.exception.AbiquoException;
 import org.jclouds.abiquo.domain.network.options.IpOptions;
 import org.jclouds.abiquo.internal.BaseAbiquoApiLiveApiTest;
@@ -35,6 +35,7 @@ import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
+import com.abiquo.server.core.infrastructure.network.ExternalIpDto;
 import com.abiquo.server.core.infrastructure.network.ExternalIpsDto;
 import com.google.common.base.Predicate;
 
@@ -58,27 +59,26 @@ public class ExternalNetworkLiveApiTest extends BaseAbiquoApiLiveApiTest {
    }
 
    public void testListIps() {
-      ExternalIpsDto ipsDto = env.context.getApiContext().getApi().getInfrastructureApi()
-            .listExternalIps(externalNetwork.unwrap(), IpOptions.builder().limit(1).build());
+      PaginatedCollection<ExternalIpDto, ExternalIpsDto> ipsDto = env.context.getApiContext().getApi()
+            .getInfrastructureApi().listExternalIps(externalNetwork.unwrap(), IpOptions.builder().limit(1).build());
       int totalIps = ipsDto.getTotalSize();
 
-      List<ExternalIp> ips = externalNetwork.listIps();
-
-      assertEquals(ips.size(), totalIps);
+      Iterable<ExternalIp> ips = externalNetwork.listIps();
+      assertEquals(size(ips), totalIps);
    }
 
    public void testListIpsWithOptions() {
-      List<ExternalIp> ips = externalNetwork.listIps(IpOptions.builder().limit(5).build());
-      assertEquals(ips.size(), 5);
+      Iterable<ExternalIp> ips = externalNetwork.listIps(IpOptions.builder().limit(5).build());
+      assertEquals(size(ips), 5);
    }
 
    public void testListUnusedIps() {
-      ExternalIpsDto ipsDto = env.context.getApiContext().getApi().getInfrastructureApi()
-            .listExternalIps(externalNetwork.unwrap(), IpOptions.builder().limit(1).build());
+      PaginatedCollection<ExternalIpDto, ExternalIpsDto> ipsDto = env.context.getApiContext().getApi()
+            .getInfrastructureApi().listExternalIps(externalNetwork.unwrap(), IpOptions.builder().limit(1).build());
       int totalIps = ipsDto.getTotalSize();
 
-      List<ExternalIp> ips = externalNetwork.listUnusedIps();
-      assertEquals(ips.size(), totalIps);
+      Iterable<ExternalIp> ips = externalNetwork.listUnusedIps();
+      assertEquals(size(ips), totalIps);
    }
 
    public void testUpdateBasicInfo() {

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/domain/network/GenericNetworkLiveApiTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/domain/network/GenericNetworkLiveApiTest.java b/abiquo/src/test/java/org/jclouds/abiquo/domain/network/GenericNetworkLiveApiTest.java
index 52d0cde..b464f1a 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/domain/network/GenericNetworkLiveApiTest.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/domain/network/GenericNetworkLiveApiTest.java
@@ -16,12 +16,12 @@
  */
 package org.jclouds.abiquo.domain.network;
 
+import static com.google.common.collect.Iterables.get;
+import static com.google.common.collect.Iterables.size;
 import static org.jclouds.abiquo.util.Assert.assertHasError;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 
-import java.util.List;
-
 import javax.ws.rs.core.Response.Status;
 
 import org.jclouds.abiquo.domain.exception.AbiquoException;
@@ -39,36 +39,36 @@ import com.abiquo.model.enumerator.NetworkType;
 public class GenericNetworkLiveApiTest extends BaseAbiquoApiLiveApiTest {
    public void testListDatacenterNetworks() {
       // Make sure all network types are listed
-      List<Network<?>> networks = env.datacenter.listNetworks();
+      Iterable<Network<?>> networks = env.datacenter.listNetworks();
       assertNotNull(networks);
-      assertEquals(networks.size(), 3);
+      assertEquals(size(networks), 3);
    }
 
    public void testListPublicNetworks() {
-      List<Network<?>> networks = env.datacenter.listNetworks(NetworkType.PUBLIC);
+      Iterable<Network<?>> networks = env.datacenter.listNetworks(NetworkType.PUBLIC);
       assertNotNull(networks);
-      assertEquals(networks.size(), 1);
+      assertEquals(size(networks), 1);
 
       // Make sure it can be converted
-      networks.get(0).toPublicNetwork();
+      get(networks, 0).toPublicNetwork();
    }
 
    public void testListExternaletworks() {
-      List<Network<?>> networks = env.datacenter.listNetworks(NetworkType.EXTERNAL);
+      Iterable<Network<?>> networks = env.datacenter.listNetworks(NetworkType.EXTERNAL);
       assertNotNull(networks);
-      assertEquals(networks.size(), 1);
+      assertEquals(size(networks), 1);
 
       // Make sure it can be converted
-      networks.get(0).toExternalNetwork();
+      get(networks, 0).toExternalNetwork();
    }
 
    public void testListUnmanagedNetworks() {
-      List<Network<?>> networks = env.datacenter.listNetworks(NetworkType.UNMANAGED);
+      Iterable<Network<?>> networks = env.datacenter.listNetworks(NetworkType.UNMANAGED);
       assertNotNull(networks);
-      assertEquals(networks.size(), 1);
+      assertEquals(size(networks), 1);
 
       // Make sure it can be converted
-      networks.get(0).toUnmanagedNetwork();
+      get(networks, 0).toUnmanagedNetwork();
    }
 
    public void testListPrivateNetworks() {

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/domain/network/PrivateNetworkLiveApiTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/domain/network/PrivateNetworkLiveApiTest.java b/abiquo/src/test/java/org/jclouds/abiquo/domain/network/PrivateNetworkLiveApiTest.java
index ac1fb2b..f54f50d 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/domain/network/PrivateNetworkLiveApiTest.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/domain/network/PrivateNetworkLiveApiTest.java
@@ -17,16 +17,16 @@
 package org.jclouds.abiquo.domain.network;
 
 import static com.google.common.collect.Iterables.find;
+import static com.google.common.collect.Iterables.size;
 import static org.jclouds.abiquo.reference.AbiquoTestConstants.PREFIX;
 import static org.jclouds.abiquo.util.Assert.assertHasError;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.fail;
 
-import java.util.List;
-
 import javax.ws.rs.core.Response.Status;
 
+import org.jclouds.abiquo.domain.PaginatedCollection;
 import org.jclouds.abiquo.domain.cloud.VirtualDatacenter;
 import org.jclouds.abiquo.domain.exception.AbiquoException;
 import org.jclouds.abiquo.domain.network.options.IpOptions;
@@ -36,6 +36,7 @@ import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
+import com.abiquo.server.core.infrastructure.network.PrivateIpDto;
 import com.abiquo.server.core.infrastructure.network.PrivateIpsDto;
 
 /**
@@ -58,27 +59,26 @@ public class PrivateNetworkLiveApiTest extends BaseAbiquoApiLiveApiTest {
    }
 
    public void testListIps() {
-      PrivateIpsDto ipsDto = env.context.getApiContext().getApi().getCloudApi()
+      PaginatedCollection<PrivateIpDto, PrivateIpsDto> ipsDto = env.context.getApiContext().getApi().getCloudApi()
             .listPrivateNetworkIps(privateNetwork.unwrap(), IpOptions.builder().limit(1).build());
       int totalIps = ipsDto.getTotalSize();
 
-      List<PrivateIp> ips = privateNetwork.listIps();
-
-      assertEquals(ips.size(), totalIps);
+      Iterable<PrivateIp> ips = privateNetwork.listIps();
+      assertEquals(size(ips), totalIps);
    }
 
    public void testListIpsWithOptions() {
-      List<PrivateIp> ips = privateNetwork.listIps(IpOptions.builder().limit(5).build());
-      assertEquals(ips.size(), 5);
+      Iterable<PrivateIp> ips = privateNetwork.listIps(IpOptions.builder().limit(5).build());
+      assertEquals(size(ips), 5);
    }
 
    public void testListUnusedIps() {
-      PrivateIpsDto ipsDto = env.context.getApiContext().getApi().getCloudApi()
+      PaginatedCollection<PrivateIpDto, PrivateIpsDto> ipsDto = env.context.getApiContext().getApi().getCloudApi()
             .listPrivateNetworkIps(privateNetwork.unwrap(), IpOptions.builder().limit(1).build());
       int totalIps = ipsDto.getTotalSize();
 
-      List<PrivateIp> ips = privateNetwork.listUnusedIps();
-      assertEquals(ips.size(), totalIps);
+      Iterable<PrivateIp> ips = privateNetwork.listUnusedIps();
+      assertEquals(size(ips), totalIps);
    }
 
    public void testUpdateBasicInfo() {

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/domain/network/PublicNetworkLiveApiTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/domain/network/PublicNetworkLiveApiTest.java b/abiquo/src/test/java/org/jclouds/abiquo/domain/network/PublicNetworkLiveApiTest.java
index 203aba6..95b56e3 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/domain/network/PublicNetworkLiveApiTest.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/domain/network/PublicNetworkLiveApiTest.java
@@ -17,16 +17,16 @@
 package org.jclouds.abiquo.domain.network;
 
 import static com.google.common.collect.Iterables.find;
+import static com.google.common.collect.Iterables.size;
 import static org.jclouds.abiquo.reference.AbiquoTestConstants.PREFIX;
 import static org.jclouds.abiquo.util.Assert.assertHasError;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.fail;
 
-import java.util.List;
-
 import javax.ws.rs.core.Response.Status;
 
+import org.jclouds.abiquo.domain.PaginatedCollection;
 import org.jclouds.abiquo.domain.exception.AbiquoException;
 import org.jclouds.abiquo.domain.network.options.IpOptions;
 import org.jclouds.abiquo.internal.BaseAbiquoApiLiveApiTest;
@@ -35,6 +35,7 @@ import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
+import com.abiquo.server.core.infrastructure.network.PublicIpDto;
 import com.abiquo.server.core.infrastructure.network.PublicIpsDto;
 
 /**
@@ -57,27 +58,26 @@ public class PublicNetworkLiveApiTest extends BaseAbiquoApiLiveApiTest {
    }
 
    public void testListIps() {
-      PublicIpsDto ipsDto = env.context.getApiContext().getApi().getInfrastructureApi()
-            .listPublicIps(publicNetwork.unwrap(), IpOptions.builder().limit(1).build());
+      PaginatedCollection<PublicIpDto, PublicIpsDto> ipsDto = env.context.getApiContext().getApi()
+            .getInfrastructureApi().listPublicIps(publicNetwork.unwrap(), IpOptions.builder().limit(1).build());
       int totalIps = ipsDto.getTotalSize();
 
-      List<PublicIp> ips = publicNetwork.listIps();
-
-      assertEquals(ips.size(), totalIps);
+      Iterable<PublicIp> ips = publicNetwork.listIps();
+      assertEquals(size(ips), totalIps);
    }
 
    public void testListIpsWithOptions() {
-      List<PublicIp> ips = publicNetwork.listIps(IpOptions.builder().limit(5).build());
-      assertEquals(ips.size(), 5);
+      Iterable<PublicIp> ips = publicNetwork.listIps(IpOptions.builder().limit(5).build());
+      assertEquals(size(ips), 5);
    }
 
    public void testListUnusedIps() {
-      PublicIpsDto ipsDto = env.context.getApiContext().getApi().getInfrastructureApi()
-            .listPublicIps(publicNetwork.unwrap(), IpOptions.builder().limit(1).build());
+      PaginatedCollection<PublicIpDto, PublicIpsDto> ipsDto = env.context.getApiContext().getApi()
+            .getInfrastructureApi().listPublicIps(publicNetwork.unwrap(), IpOptions.builder().limit(1).build());
       int totalIps = ipsDto.getTotalSize();
 
-      List<PublicIp> ips = publicNetwork.listUnusedIps();
-      assertEquals(ips.size(), totalIps);
+      Iterable<PublicIp> ips = publicNetwork.listUnusedIps();
+      assertEquals(size(ips), totalIps);
    }
 
    public void testUpdateBasicInfo() {

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/domain/network/UnmanagedNetworkLiveApiTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/domain/network/UnmanagedNetworkLiveApiTest.java b/abiquo/src/test/java/org/jclouds/abiquo/domain/network/UnmanagedNetworkLiveApiTest.java
index 96981b3..fb3184c 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/domain/network/UnmanagedNetworkLiveApiTest.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/domain/network/UnmanagedNetworkLiveApiTest.java
@@ -17,6 +17,7 @@
 package org.jclouds.abiquo.domain.network;
 
 import static com.google.common.collect.Iterables.find;
+import static com.google.common.collect.Iterables.size;
 import static org.jclouds.abiquo.reference.AbiquoTestConstants.PREFIX;
 import static org.jclouds.abiquo.util.Assert.assertHasError;
 import static org.testng.Assert.assertEquals;
@@ -24,10 +25,9 @@ import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertNull;
 import static org.testng.Assert.fail;
 
-import java.util.List;
-
 import javax.ws.rs.core.Response.Status;
 
+import org.jclouds.abiquo.domain.PaginatedCollection;
 import org.jclouds.abiquo.domain.exception.AbiquoException;
 import org.jclouds.abiquo.domain.network.options.IpOptions;
 import org.jclouds.abiquo.internal.BaseAbiquoApiLiveApiTest;
@@ -36,6 +36,7 @@ import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
+import com.abiquo.server.core.infrastructure.network.UnmanagedIpDto;
 import com.abiquo.server.core.infrastructure.network.UnmanagedIpsDto;
 import com.google.common.base.Predicate;
 
@@ -59,28 +60,27 @@ public class UnmanagedNetworkLiveApiTest extends BaseAbiquoApiLiveApiTest {
    }
 
    public void testListIps() {
-      UnmanagedIpsDto ipsDto = env.context.getApiContext().getApi().getInfrastructureApi()
-            .listUnmanagedIps(unmanagedNetwork.unwrap(), IpOptions.builder().limit(1).build());
+      PaginatedCollection<UnmanagedIpDto, UnmanagedIpsDto> ipsDto = env.context.getApiContext().getApi()
+            .getInfrastructureApi().listUnmanagedIps(unmanagedNetwork.unwrap(), IpOptions.builder().limit(1).build());
       int totalIps = ipsDto.getTotalSize();
 
-      List<UnmanagedIp> ips = unmanagedNetwork.listIps();
-
-      assertEquals(ips.size(), totalIps);
+      Iterable<UnmanagedIp> ips = unmanagedNetwork.listIps();
+      assertEquals(size(ips), totalIps);
    }
 
    public void testListIpsWithOptions() {
-      List<UnmanagedIp> ips = unmanagedNetwork.listIps(IpOptions.builder().limit(5).build());
+      Iterable<UnmanagedIp> ips = unmanagedNetwork.listIps(IpOptions.builder().limit(5).build());
       // Unmanaged networks do not have IPs until attached to VMs
-      assertEquals(ips.size(), 0);
+      assertEquals(size(ips), 0);
    }
 
    public void testListUnusedIps() {
-      UnmanagedIpsDto ipsDto = env.context.getApiContext().getApi().getInfrastructureApi()
-            .listUnmanagedIps(unmanagedNetwork.unwrap(), IpOptions.builder().limit(1).build());
+      PaginatedCollection<UnmanagedIpDto, UnmanagedIpsDto> ipsDto = env.context.getApiContext().getApi()
+            .getInfrastructureApi().listUnmanagedIps(unmanagedNetwork.unwrap(), IpOptions.builder().limit(1).build());
       int totalIps = ipsDto.getTotalSize();
 
-      List<UnmanagedIp> ips = unmanagedNetwork.listUnusedIps();
-      assertEquals(ips.size(), totalIps);
+      Iterable<UnmanagedIp> ips = unmanagedNetwork.listUnusedIps();
+      assertEquals(size(ips), totalIps);
    }
 
    public void testUpdateBasicInfo() {

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/environment/CloudTestEnvironment.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/environment/CloudTestEnvironment.java b/abiquo/src/test/java/org/jclouds/abiquo/environment/CloudTestEnvironment.java
index 4a3579c..7873450 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/environment/CloudTestEnvironment.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/environment/CloudTestEnvironment.java
@@ -18,14 +18,12 @@ package org.jclouds.abiquo.environment;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.collect.Iterables.find;
+import static com.google.common.collect.Iterables.isEmpty;
 import static org.jclouds.abiquo.reference.AbiquoTestConstants.PREFIX;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertNull;
 
-import java.util.Collections;
-import java.util.List;
-
 import org.jclouds.ContextBuilder;
 import org.jclouds.abiquo.AbiquoApiMetadata;
 import org.jclouds.abiquo.AbiquoContext;
@@ -37,7 +35,6 @@ import org.jclouds.abiquo.domain.enterprise.Enterprise;
 import org.jclouds.abiquo.domain.network.PrivateNetwork;
 import org.jclouds.abiquo.features.CloudApi;
 import org.jclouds.abiquo.features.services.EventService;
-import org.testng.collections.Lists;
 
 import com.google.common.base.Predicate;
 import com.google.common.collect.Ordering;
@@ -163,20 +160,10 @@ public class CloudTestEnvironment extends InfrastructureTestEnvironment {
    }
 
    protected void createVirtualMachine() {
-      List<VirtualMachineTemplate> templates = virtualDatacenter.listAvailableTemplates();
-      assertFalse(templates.isEmpty());
-
-      List<VirtualMachineTemplate> sorted = Lists.newArrayList(templates);
+      Iterable<VirtualMachineTemplate> templates = virtualDatacenter.listAvailableTemplates();
+      assertFalse(isEmpty(templates));
 
-      // Sort by size to use the smallest one
-      Collections.sort(sorted, new Ordering<VirtualMachineTemplate>() {
-         @Override
-         public int compare(final VirtualMachineTemplate left, final VirtualMachineTemplate right) {
-            return Longs.compare(left.getDiskFileSize(), right.getDiskFileSize());
-         }
-      });
-
-      template = sorted.get(0);
+      template = templateBySize().min(templates);
 
       virtualMachine = VirtualMachine.builder(context.getApiContext(), virtualAppliance, template).cpu(2)
             .nameLabel(PREFIX + "VM Aloha").ram(128).build();
@@ -222,7 +209,15 @@ public class CloudTestEnvironment extends InfrastructureTestEnvironment {
          virtualMachine.delete();
          assertNull(cloudApi.getVirtualMachine(virtualAppliance.unwrap(), idVirtualMachine));
       }
+   }
 
+   public static Ordering<VirtualMachineTemplate> templateBySize() {
+      return new Ordering<VirtualMachineTemplate>() {
+         @Override
+         public int compare(final VirtualMachineTemplate left, final VirtualMachineTemplate right) {
+            return Longs.compare(left.getDiskFileSize(), right.getDiskFileSize());
+         }
+      };
    }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/environment/InfrastructureTestEnvironment.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/environment/InfrastructureTestEnvironment.java b/abiquo/src/test/java/org/jclouds/abiquo/environment/InfrastructureTestEnvironment.java
index 0c2add5..4f2ce71 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/environment/InfrastructureTestEnvironment.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/environment/InfrastructureTestEnvironment.java
@@ -17,6 +17,7 @@
 package org.jclouds.abiquo.environment;
 
 import static com.google.common.collect.Iterables.find;
+import static com.google.common.collect.Iterables.size;
 import static org.jclouds.abiquo.reference.AbiquoTestConstants.PREFIX;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
@@ -26,7 +27,6 @@ import java.io.IOException;
 import java.net.URI;
 import java.net.URL;
 import java.nio.charset.Charset;
-import java.util.List;
 import java.util.UUID;
 
 import org.jclouds.abiquo.AbiquoContext;
@@ -94,7 +94,7 @@ public class InfrastructureTestEnvironment implements TestEnvironment {
 
    public UnmanagedNetwork unmanagedNetwork;
 
-   public List<RemoteService> remoteServices;
+   public Iterable<RemoteService> remoteServices;
 
    public Rack rack;
 
@@ -190,7 +190,7 @@ public class InfrastructureTestEnvironment implements TestEnvironment {
       assertNotNull(datacenter.getId());
 
       remoteServices = datacenter.listRemoteServices();
-      assertEquals(remoteServices.size(), 7);
+      assertEquals(size(remoteServices), 7);
    }
 
    protected void createMachine() {
@@ -237,7 +237,7 @@ public class InfrastructureTestEnvironment implements TestEnvironment {
       String user = Config.get("abiquo.storage.user");
       String pass = Config.get("abiquo.storage.pass");
 
-      List<StorageDeviceMetadata> devices = datacenter.listSupportedStorageDevices();
+      Iterable<StorageDeviceMetadata> devices = datacenter.listSupportedStorageDevices();
       StorageDeviceMetadata metadata = find(devices, new Predicate<StorageDeviceMetadata>() {
          @Override
          public boolean apply(StorageDeviceMetadata input) {

http://git-wip-us.apache.org/repos/asf/incubator-jclouds-labs/blob/14fbe2d3/abiquo/src/test/java/org/jclouds/abiquo/features/CloudApiExpectTest.java
----------------------------------------------------------------------
diff --git a/abiquo/src/test/java/org/jclouds/abiquo/features/CloudApiExpectTest.java b/abiquo/src/test/java/org/jclouds/abiquo/features/CloudApiExpectTest.java
index 27df7cf..760d245 100644
--- a/abiquo/src/test/java/org/jclouds/abiquo/features/CloudApiExpectTest.java
+++ b/abiquo/src/test/java/org/jclouds/abiquo/features/CloudApiExpectTest.java
@@ -22,17 +22,36 @@ import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 
 import java.net.URI;
+import java.util.List;
 
 import org.jclouds.abiquo.AbiquoApi;
+import org.jclouds.abiquo.domain.PaginatedCollection;
+import org.jclouds.abiquo.domain.cloud.options.VirtualMachineOptions;
+import org.jclouds.abiquo.domain.cloud.options.VirtualMachineTemplateOptions;
+import org.jclouds.abiquo.domain.cloud.options.VolumeOptions;
+import org.jclouds.abiquo.domain.network.options.IpOptions;
+import org.jclouds.collect.PagedIterable;
 import org.jclouds.http.HttpRequest;
 import org.jclouds.http.HttpResponse;
 import org.testng.annotations.Test;
 
 import com.abiquo.model.rest.RESTLink;
 import com.abiquo.model.transport.AcceptedRequestDto;
+import com.abiquo.server.core.appslibrary.VirtualMachineTemplateDto;
+import com.abiquo.server.core.appslibrary.VirtualMachineTemplatesDto;
+import com.abiquo.server.core.cloud.VirtualApplianceDto;
+import com.abiquo.server.core.cloud.VirtualDatacenterDto;
 import com.abiquo.server.core.cloud.VirtualMachineDto;
 import com.abiquo.server.core.cloud.VirtualMachineInstanceDto;
+import com.abiquo.server.core.cloud.VirtualMachineWithNodeExtendedDto;
 import com.abiquo.server.core.cloud.VirtualMachinesWithNodeExtendedDto;
+import com.abiquo.server.core.infrastructure.network.PrivateIpDto;
+import com.abiquo.server.core.infrastructure.network.PrivateIpsDto;
+import com.abiquo.server.core.infrastructure.network.PublicIpDto;
+import com.abiquo.server.core.infrastructure.network.PublicIpsDto;
+import com.abiquo.server.core.infrastructure.network.VLANNetworkDto;
+import com.abiquo.server.core.infrastructure.storage.VolumeManagementDto;
+import com.abiquo.server.core.infrastructure.storage.VolumesManagementDto;
 
 /**
  * Expect tests for the {@link CloudApi} class.
@@ -43,7 +62,7 @@ import com.abiquo.server.core.cloud.VirtualMachinesWithNodeExtendedDto;
 public class CloudApiExpectTest extends BaseAbiquoApiExpectTest<CloudApi> {
 
    public void testListAllVirtualMachinesWhenResponseIs2xx() {
-      CloudApi api = requestSendsResponse(
+      CloudApi api = requestsSendResponses(
             HttpRequest.builder() //
                   .method("GET") //
                   .endpoint(URI.create("http://localhost/api/cloud/virtualmachines")) //
@@ -56,13 +75,132 @@ public class CloudApiExpectTest extends BaseAbiquoApiExpectTest<CloudApi> {
                   .payload(
                         payloadFromResourceWithContentType("/payloads/all-vms.xml",
                               normalize(VirtualMachinesWithNodeExtendedDto.MEDIA_TYPE))) //
+                  .build(),
+            HttpRequest.builder() //
+                  .method("GET") //
+                  .endpoint(URI.create("http://localhost/api/cloud/virtualmachines")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(VirtualMachinesWithNodeExtendedDto.MEDIA_TYPE)) //
+                  .addQueryParam("startwith", "2").build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/all-vms-lastpage.xml",
+                              normalize(VirtualMachinesWithNodeExtendedDto.MEDIA_TYPE))) //
+                  .build());
+
+      PagedIterable<VirtualMachineWithNodeExtendedDto> result = api.listAllVirtualMachines();
+      List<VirtualMachineWithNodeExtendedDto> vms = result.concat().toList();
+
+      assertEquals(vms.size(), 2);
+      assertEquals(vms.get(0).getId(), Integer.valueOf(1));
+      assertEquals(vms.get(1).getId(), Integer.valueOf(2));
+      assertEquals(vms.get(0).getName(), "VM");
+      assertNotNull(vms.get(0).getEditLink());
+   }
+
+   public void testListAllVirtualMachinesWithPagination() {
+      CloudApi api = requestSendsResponse(
+            HttpRequest.builder() //
+                  .method("GET") //
+                  .endpoint(URI.create("http://localhost/api/cloud/virtualmachines")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(VirtualMachinesWithNodeExtendedDto.MEDIA_TYPE)) //
+                  .addQueryParam("startwith", "2").build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/all-vms-lastpage.xml",
+                              normalize(VirtualMachinesWithNodeExtendedDto.MEDIA_TYPE))) //
+                  .build());
+
+      VirtualMachineOptions options = VirtualMachineOptions.builder().startWith(2).build();
+      PaginatedCollection<VirtualMachineWithNodeExtendedDto, VirtualMachinesWithNodeExtendedDto> vms = api
+            .listAllVirtualMachines(options);
+
+      assertEquals(vms.size(), 1);
+      assertEquals(vms.getTotalSize().intValue(), 2);
+      assertEquals(vms.get(0).getId().intValue(), 2);
+   }
+
+   public void testListVirtualMachinesWhenResponseIs2xx() {
+      CloudApi api = requestsSendResponses(
+            HttpRequest.builder() //
+                  .method("GET")
+                  //
+                  .endpoint(
+                        URI.create("http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(VirtualMachinesWithNodeExtendedDto.MEDIA_TYPE)) //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/vms-page.xml",
+                              normalize(VirtualMachinesWithNodeExtendedDto.MEDIA_TYPE))) //
+                  .build(),
+            HttpRequest.builder() //
+                  .method("GET")
+                  //
+                  .endpoint(
+                        URI.create("http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(VirtualMachinesWithNodeExtendedDto.MEDIA_TYPE)) //
+                  .addQueryParam("startwith", "2").build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/vms-lastpage.xml",
+                              normalize(VirtualMachinesWithNodeExtendedDto.MEDIA_TYPE))) //
                   .build());
 
-      VirtualMachinesWithNodeExtendedDto vms = api.listAllVirtualMachines();
-      assertEquals(vms.getCollection().size(), 1);
-      assertEquals(vms.getCollection().get(0).getId(), Integer.valueOf(1));
-      assertEquals(vms.getCollection().get(0).getName(), "VM");
-      assertNotNull(vms.getCollection().get(0).getEditLink());
+      VirtualApplianceDto vapp = new VirtualApplianceDto();
+      vapp.addLink(new RESTLink("virtualmachines",
+            "http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines"));
+
+      PagedIterable<VirtualMachineWithNodeExtendedDto> result = api.listVirtualMachines(vapp);
+      List<VirtualMachineWithNodeExtendedDto> vms = result.concat().toList();
+
+      assertEquals(vms.size(), 2);
+      assertEquals(vms.get(0).getId(), Integer.valueOf(1));
+      assertEquals(vms.get(1).getId(), Integer.valueOf(2));
+      assertEquals(vms.get(0).getName(), "VM");
+      assertNotNull(vms.get(0).getEditLink());
+   }
+
+   public void testLisVirtualMachinesWithPagination() {
+      CloudApi api = requestSendsResponse(
+            HttpRequest.builder() //
+                  .method("GET")
+                  //
+                  .endpoint(
+                        URI.create("http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(VirtualMachinesWithNodeExtendedDto.MEDIA_TYPE)) //
+                  .addQueryParam("startwith", "2").build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/vms-lastpage.xml",
+                              normalize(VirtualMachinesWithNodeExtendedDto.MEDIA_TYPE))) //
+                  .build());
+
+      VirtualApplianceDto vapp = new VirtualApplianceDto();
+      vapp.addLink(new RESTLink("virtualmachines",
+            "http://localhost/api/cloud/virtualdatacenters/1/virtualappliances/1/virtualmachines"));
+
+      VirtualMachineOptions options = VirtualMachineOptions.builder().startWith(2).build();
+      PaginatedCollection<VirtualMachineWithNodeExtendedDto, VirtualMachinesWithNodeExtendedDto> vms = api
+            .listVirtualMachines(vapp, options);
+
+      assertEquals(vms.size(), 1);
+      assertEquals(vms.getTotalSize().intValue(), 2);
+      assertEquals(vms.get(0).getId().intValue(), 2);
    }
 
    public void testSnapshotVirtualMachineReturns2xx() {
@@ -95,6 +233,358 @@ public class CloudApiExpectTest extends BaseAbiquoApiExpectTest<CloudApi> {
       assertNotNull(taskRef);
    }
 
+   public void testListAvailablePublicIps() {
+      CloudApi api = requestsSendResponses(
+            HttpRequest.builder() //
+                  .method("GET") //
+                  .endpoint(URI.create("http://localhost/api/cloud/virtualdatacenters/1/publicips/topurchase")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(PublicIpsDto.MEDIA_TYPE)) //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/publicips-available-page.xml",
+                              normalize(PublicIpsDto.MEDIA_TYPE))) //
+                  .build(),
+            HttpRequest.builder() //
+                  .method("GET") //
+                  .endpoint(URI.create("http://localhost/api/cloud/virtualdatacenters/1/publicips/topurchase")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(PublicIpsDto.MEDIA_TYPE)) //
+                  .addQueryParam("startwith", "3") //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/publicips-available-lastpage.xml",
+                              normalize(PublicIpsDto.MEDIA_TYPE))) //
+                  .build());
+
+      VirtualDatacenterDto vdc = new VirtualDatacenterDto();
+      vdc.addLink(new RESTLink("topurchase", "http://localhost/api/cloud/virtualdatacenters/1/publicips/topurchase"));
+
+      PagedIterable<PublicIpDto> publicIps = api.listAvailablePublicIps(vdc);
+      List<PublicIpDto> ips = publicIps.concat().toList();
+
+      assertEquals(ips.size(), 4);
+      assertEquals(ips.get(0).getId().intValue(), 1);
+      assertEquals(ips.get(1).getId().intValue(), 2);
+      assertEquals(ips.get(2).getId().intValue(), 3);
+      assertEquals(ips.get(3).getId().intValue(), 4);
+   }
+
+   public void testListAvailablePublicIpsWithPagination() {
+      CloudApi api = requestSendsResponse(
+            HttpRequest.builder() //
+                  .method("GET") //
+                  .endpoint(URI.create("http://localhost/api/cloud/virtualdatacenters/1/publicips/topurchase")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(PublicIpsDto.MEDIA_TYPE)) //
+                  .addQueryParam("startwith", "3") //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/publicips-available-lastpage.xml",
+                              normalize(PublicIpsDto.MEDIA_TYPE))) //
+                  .build());
+
+      VirtualDatacenterDto vdc = new VirtualDatacenterDto();
+      vdc.addLink(new RESTLink("topurchase", "http://localhost/api/cloud/virtualdatacenters/1/publicips/topurchase"));
+
+      IpOptions options = IpOptions.builder().startWith(3).build();
+      PaginatedCollection<PublicIpDto, PublicIpsDto> ips = api.listAvailablePublicIps(vdc, options);
+
+      assertEquals(ips.size(), 2);
+      assertEquals(ips.getTotalSize().intValue(), 4);
+      assertEquals(ips.get(0).getId().intValue(), 3);
+      assertEquals(ips.get(1).getId().intValue(), 4);
+   }
+
+   public void testListPurchasedPublicIps() {
+      CloudApi api = requestsSendResponses(
+            HttpRequest.builder() //
+                  .method("GET") //
+                  .endpoint(URI.create("http://localhost/api/cloud/virtualdatacenters/1/publicips/purchased")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(PublicIpsDto.MEDIA_TYPE)) //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/publicips-purchased-page.xml",
+                              normalize(PublicIpsDto.MEDIA_TYPE))) //
+                  .build(),
+            HttpRequest.builder() //
+                  .method("GET") //
+                  .endpoint(URI.create("http://localhost/api/cloud/virtualdatacenters/1/publicips/purchased")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(PublicIpsDto.MEDIA_TYPE)) //
+                  .addQueryParam("startwith", "3") //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/publicips-purchased-lastpage.xml",
+                              normalize(PublicIpsDto.MEDIA_TYPE))) //
+                  .build());
+
+      VirtualDatacenterDto vdc = new VirtualDatacenterDto();
+      vdc.addLink(new RESTLink("purchased", "http://localhost/api/cloud/virtualdatacenters/1/publicips/purchased"));
+
+      PagedIterable<PublicIpDto> publicIps = api.listPurchasedPublicIps(vdc);
+      List<PublicIpDto> ips = publicIps.concat().toList();
+
+      assertEquals(ips.size(), 4);
+      assertEquals(ips.get(0).getId().intValue(), 1);
+      assertEquals(ips.get(1).getId().intValue(), 2);
+      assertEquals(ips.get(2).getId().intValue(), 3);
+      assertEquals(ips.get(3).getId().intValue(), 4);
+   }
+
+   public void testListPurchasedPublicIpsWithPagination() {
+      CloudApi api = requestSendsResponse(
+            HttpRequest.builder() //
+                  .method("GET") //
+                  .endpoint(URI.create("http://localhost/api/cloud/virtualdatacenters/1/publicips/purchased")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(PublicIpsDto.MEDIA_TYPE)) //
+                  .addQueryParam("startwith", "3") //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/publicips-purchased-lastpage.xml",
+                              normalize(PublicIpsDto.MEDIA_TYPE))) //
+                  .build());
+
+      VirtualDatacenterDto vdc = new VirtualDatacenterDto();
+      vdc.addLink(new RESTLink("purchased", "http://localhost/api/cloud/virtualdatacenters/1/publicips/purchased"));
+
+      IpOptions options = IpOptions.builder().startWith(3).build();
+      PaginatedCollection<PublicIpDto, PublicIpsDto> ips = api.listPurchasedPublicIps(vdc, options);
+
+      assertEquals(ips.size(), 2);
+      assertEquals(ips.getTotalSize().intValue(), 4);
+      assertEquals(ips.get(0).getId().intValue(), 3);
+      assertEquals(ips.get(1).getId().intValue(), 4);
+   }
+
+   public void testListPrivteIps() {
+      CloudApi api = requestsSendResponses(
+            HttpRequest.builder() //
+                  .method("GET") //
+                  .endpoint(URI.create("http://localhost/api/cloud/virtualdatacenters/1/privatenetworks/1/ips")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(PrivateIpsDto.MEDIA_TYPE)) //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/privateips-page.xml",
+                              normalize(PublicIpsDto.MEDIA_TYPE))) //
+                  .build(),
+            HttpRequest.builder() //
+                  .method("GET") //
+                  .endpoint(URI.create("http://localhost/api/cloud/virtualdatacenters/1/privatenetworks/1/ips")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(PrivateIpsDto.MEDIA_TYPE)) //
+                  .addQueryParam("startwith", "1") //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/privateips-lastpage.xml",
+                              normalize(PrivateIpsDto.MEDIA_TYPE))) //
+                  .build());
+
+      VLANNetworkDto vlan = new VLANNetworkDto();
+      vlan.addLink(new RESTLink("ips", "http://localhost/api/cloud/virtualdatacenters/1/privatenetworks/1/ips"));
+
+      PagedIterable<PrivateIpDto> privateIps = api.listPrivateNetworkIps(vlan);
+      List<PrivateIpDto> ips = privateIps.concat().toList();
+
+      assertEquals(ips.size(), 2);
+      assertEquals(ips.get(0).getId().intValue(), 1);
+      assertEquals(ips.get(1).getId().intValue(), 2);
+   }
+
+   public void testListPrivateIpsWithPagination() {
+      CloudApi api = requestSendsResponse(
+            HttpRequest.builder() //
+                  .method("GET") //
+                  .endpoint(URI.create("http://localhost/api/cloud/virtualdatacenters/1/privatenetworks/1/ips")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(PrivateIpsDto.MEDIA_TYPE)) //
+                  .addQueryParam("startwith", "1") //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/privateips-lastpage.xml",
+                              normalize(PrivateIpsDto.MEDIA_TYPE))) //
+                  .build());
+
+      VLANNetworkDto vlan = new VLANNetworkDto();
+      vlan.addLink(new RESTLink("ips", "http://localhost/api/cloud/virtualdatacenters/1/privatenetworks/1/ips"));
+
+      IpOptions options = IpOptions.builder().startWith(1).build();
+      PaginatedCollection<PrivateIpDto, PrivateIpsDto> ips = api.listPrivateNetworkIps(vlan, options);
+
+      assertEquals(ips.size(), 1);
+      assertEquals(ips.getTotalSize().intValue(), 2);
+      assertEquals(ips.get(0).getId().intValue(), 2);
+   }
+
+   public void testListAvailableTemplates() {
+      CloudApi api = requestsSendResponses(
+            HttpRequest.builder() //
+                  .method("GET") //
+                  .endpoint(URI.create("http://example.com/api/cloud/virtualdatacenters/1/action/templates")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(VirtualMachineTemplatesDto.MEDIA_TYPE)) //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/available-templates-page.xml",
+                              normalize(VirtualMachineTemplatesDto.MEDIA_TYPE))) //
+                  .build(),
+            HttpRequest.builder() //
+                  .method("GET") //
+                  .endpoint(URI.create("http://example.com/api/cloud/virtualdatacenters/1/action/templates")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(VirtualMachineTemplatesDto.MEDIA_TYPE)) //
+                  .addQueryParam("startwith", "1") //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/available-templates-lastpage.xml",
+                              normalize(VirtualMachineTemplatesDto.MEDIA_TYPE))) //
+                  .build());
+
+      VirtualDatacenterDto vdc = new VirtualDatacenterDto();
+      vdc.addLink(new RESTLink("templates", "http://example.com/api/cloud/virtualdatacenters/1/action/templates"));
+
+      PagedIterable<VirtualMachineTemplateDto> templates = api.listAvailableTemplates(vdc);
+      List<VirtualMachineTemplateDto> all = templates.concat().toList();
+
+      assertEquals(all.size(), 2);
+      assertEquals(all.get(0).getId().intValue(), 15);
+      assertEquals(all.get(1).getId().intValue(), 16);
+   }
+
+   public void testListAvailableTemplatesWithPagination() {
+      CloudApi api = requestSendsResponse(
+            HttpRequest.builder() //
+                  .method("GET") //
+                  .endpoint(URI.create("http://example.com/api/cloud/virtualdatacenters/1/action/templates")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(VirtualMachineTemplatesDto.MEDIA_TYPE)) //
+                  .addQueryParam("startwith", "1") //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/available-templates-lastpage.xml",
+                              normalize(VirtualMachineTemplatesDto.MEDIA_TYPE))) //
+                  .build());
+
+      VirtualDatacenterDto vdc = new VirtualDatacenterDto();
+      vdc.addLink(new RESTLink("templates", "http://example.com/api/cloud/virtualdatacenters/1/action/templates"));
+
+      VirtualMachineTemplateOptions options = VirtualMachineTemplateOptions.builder().startWith(1).build();
+      PaginatedCollection<VirtualMachineTemplateDto, VirtualMachineTemplatesDto> templates = api
+            .listAvailableTemplates(vdc, options);
+
+      assertEquals(templates.size(), 1);
+      assertEquals(templates.getTotalSize().intValue(), 2);
+      assertEquals(templates.get(0).getId().intValue(), 16);
+   }
+
+   public void testListVolumes() {
+      CloudApi api = requestsSendResponses(
+            HttpRequest.builder() //
+                  .method("GET") //
+                  .endpoint(URI.create("http://example.com/api/cloud/virtualdatacenters/1/volumes")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(VolumesManagementDto.MEDIA_TYPE)) //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/volumes-page.xml",
+                              normalize(VolumesManagementDto.MEDIA_TYPE))) //
+                  .build(),
+            HttpRequest.builder() //
+                  .method("GET") //
+                  .endpoint(URI.create("http://example.com/api/cloud/virtualdatacenters/1/volumes")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(VolumesManagementDto.MEDIA_TYPE)) //
+                  .addQueryParam("startwith", "1") //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/volumes-lastpage.xml",
+                              normalize(VolumesManagementDto.MEDIA_TYPE))) //
+                  .build());
+
+      VirtualDatacenterDto vdc = new VirtualDatacenterDto();
+      vdc.addLink(new RESTLink("volumes", "http://example.com/api/cloud/virtualdatacenters/1/volumes"));
+
+      PagedIterable<VolumeManagementDto> volumes = api.listVolumes(vdc);
+      List<VolumeManagementDto> all = volumes.concat().toList();
+
+      assertEquals(all.size(), 2);
+      assertEquals(all.get(0).getId().intValue(), 1530);
+      assertEquals(all.get(1).getId().intValue(), 1531);
+   }
+
+   public void testListVolumesWithPagination() {
+      CloudApi api = requestSendsResponse(
+            HttpRequest.builder() //
+                  .method("GET") //
+                  .endpoint(URI.create("http://example.com/api/cloud/virtualdatacenters/1/volumes")) //
+                  .addHeader("Cookie", tokenAuth) //
+                  .addHeader("Accept", normalize(VolumesManagementDto.MEDIA_TYPE)) //
+                  .addQueryParam("startwith", "1") //
+                  .build(),
+            HttpResponse
+                  .builder()
+                  .statusCode(200)
+                  .payload(
+                        payloadFromResourceWithContentType("/payloads/volumes-lastpage.xml",
+                              normalize(VolumesManagementDto.MEDIA_TYPE))) //
+                  .build());
+
+      VirtualDatacenterDto vdc = new VirtualDatacenterDto();
+      vdc.addLink(new RESTLink("volumes", "http://example.com/api/cloud/virtualdatacenters/1/volumes"));
+
+      VolumeOptions options = VolumeOptions.builder().startWith(1).build();
+      PaginatedCollection<VolumeManagementDto, VolumesManagementDto> templates = api.listVolumes(vdc, options);
+
+      assertEquals(templates.size(), 1);
+      assertEquals(templates.getTotalSize().intValue(), 2);
+      assertEquals(templates.get(0).getId().intValue(), 1531);
+   }
+
    @Override
    protected CloudApi clientFrom(AbiquoApi api) {
       return api.getCloudApi();