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:44 UTC

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

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