From b491007737646f111b68fd3a1df1e172447136cd Mon Sep 17 00:00:00 2001 From: Michael Darakananda Date: Wed, 12 Apr 2017 15:25:39 +1000 Subject: [PATCH 1/3] bump grpc dependency to 1.2.0 also move various protobuf-generated dependencies to 0.1.7. --- google-cloud-core/pom.xml | 4 +- google-cloud-errorreporting/pom.xml | 2 +- .../spi/v1beta1/ErrorStatsServiceClient.java | 12 +- .../v1beta1/ErrorStatsServiceSettings.java | 40 +- .../spi/v1beta1/PagedResponseWrappers.java | 167 ++++++- .../v1beta1/ErrorStatsServiceClientTest.java | 4 +- .../cloud/examples/pubsub/PubSubExample.java | 6 +- .../SubscriptionAdminClientSnippets.java | 2 +- .../snippets/TopicAdminClientSnippets.java | 4 +- .../ITSubscriptionAdminClientSnippets.java | 2 +- .../snippets/ITTopicAdminClientSnippets.java | 4 +- google-cloud-language/pom.xml | 4 +- google-cloud-logging/pom.xml | 2 +- .../cloud/logging/spi/v2/ConfigClient.java | 6 +- .../cloud/logging/spi/v2/ConfigSettings.java | 20 +- .../cloud/logging/spi/v2/LoggingClient.java | 16 +- .../cloud/logging/spi/v2/LoggingSettings.java | 63 ++- .../cloud/logging/spi/v2/MetricsClient.java | 6 +- .../cloud/logging/spi/v2/MetricsSettings.java | 20 +- .../logging/spi/v2/PagedResponseWrappers.java | 411 +++++++++++++++-- .../logging/spi/v2/ConfigClientTest.java | 2 +- .../logging/spi/v2/LoggingClientTest.java | 4 +- .../logging/spi/v2/MetricsClientTest.java | 2 +- google-cloud-monitoring/pom.xml | 2 +- .../monitoring/spi/v3/GroupServiceClient.java | 10 +- .../spi/v3/GroupServiceSettings.java | 42 +- .../spi/v3/MetricServiceClient.java | 18 +- .../spi/v3/MetricServiceSettings.java | 69 +-- .../spi/v3/PagedResponseWrappers.java | 431 +++++++++++++++--- .../spi/v3/GroupServiceClientTest.java | 2 +- .../spi/v3/MetricServiceClientTest.java | 6 +- google-cloud-pubsub/pom.xml | 2 +- .../pubsub/spi/v1/PagedResponseWrappers.java | 360 +++++++++++++-- .../spi/v1/SubscriptionAdminClient.java | 12 +- .../spi/v1/SubscriptionAdminSettings.java | 42 +- .../cloud/pubsub/spi/v1/TopicAdminClient.java | 6 +- .../pubsub/spi/v1/TopicAdminSettings.java | 42 +- .../spi/v1/SubscriptionAdminClientTest.java | 4 +- .../pubsub/spi/v1/TopicAdminClientTest.java | 4 +- google-cloud-spanner/pom.xml | 6 +- google-cloud-speech/pom.xml | 4 +- google-cloud-trace/pom.xml | 2 +- .../trace/spi/v1/PagedResponseWrappers.java | 89 +++- .../trace/spi/v1/TraceServiceClient.java | 6 +- .../trace/spi/v1/TraceServiceSettings.java | 20 +- .../trace/spi/v1/TraceServiceClientTest.java | 2 +- google-cloud-vision/pom.xml | 2 +- pom.xml | 4 +- 48 files changed, 1593 insertions(+), 397 deletions(-) diff --git a/google-cloud-core/pom.xml b/google-cloud-core/pom.xml index 332beece16df..06e7cb23b373 100644 --- a/google-cloud-core/pom.xml +++ b/google-cloud-core/pom.xml @@ -139,7 +139,7 @@ com.google.api.grpc grpc-google-common-protos - 0.1.5 + 0.1.7 io.grpc @@ -150,7 +150,7 @@ com.google.api.grpc grpc-google-iam-v1 - 0.1.5 + 0.1.7 io.grpc diff --git a/google-cloud-errorreporting/pom.xml b/google-cloud-errorreporting/pom.xml index 45ee768073d2..ce57bec808f5 100644 --- a/google-cloud-errorreporting/pom.xml +++ b/google-cloud-errorreporting/pom.xml @@ -31,7 +31,7 @@ com.google.api.grpc grpc-google-cloud-error-reporting-v1beta1 - 0.1.5 + 0.1.7 io.grpc diff --git a/google-cloud-errorreporting/src/main/java/com/google/cloud/errorreporting/spi/v1beta1/ErrorStatsServiceClient.java b/google-cloud-errorreporting/src/main/java/com/google/cloud/errorreporting/spi/v1beta1/ErrorStatsServiceClient.java index 013fdd430213..755495dfe7c0 100644 --- a/google-cloud-errorreporting/src/main/java/com/google/cloud/errorreporting/spi/v1beta1/ErrorStatsServiceClient.java +++ b/google-cloud-errorreporting/src/main/java/com/google/cloud/errorreporting/spi/v1beta1/ErrorStatsServiceClient.java @@ -181,7 +181,7 @@ public final ErrorStatsServiceSettings getSettings() { * try (ErrorStatsServiceClient errorStatsServiceClient = ErrorStatsServiceClient.create()) { * ProjectName projectName = ProjectName.create("[PROJECT]"); * QueryTimeRange timeRange = QueryTimeRange.newBuilder().build(); - * for (ErrorGroupStats element : errorStatsServiceClient.listGroupStats(projectName, timeRange).iterateAllElements()) { + * for (ErrorGroupStats element : errorStatsServiceClient.listGroupStats(projectName, timeRange).iterateAll()) { * // doThingsWith(element); * } * } @@ -224,7 +224,7 @@ public final ListGroupStatsPagedResponse listGroupStats( * .setProjectNameWithProjectName(projectName) * .setTimeRange(timeRange) * .build(); - * for (ErrorGroupStats element : errorStatsServiceClient.listGroupStats(request).iterateAllElements()) { + * for (ErrorGroupStats element : errorStatsServiceClient.listGroupStats(request).iterateAll()) { * // doThingsWith(element); * } * } @@ -253,7 +253,7 @@ public final ListGroupStatsPagedResponse listGroupStats(ListGroupStatsRequest re * .build(); * ApiFuture<ListGroupStatsPagedResponse> future = errorStatsServiceClient.listGroupStatsPagedCallable().futureCall(request); * // Do something - * for (ErrorGroupStats element : future.get().iterateAllElements()) { + * for (ErrorGroupStats element : future.get().iterateAll()) { * // doThingsWith(element); * } * } @@ -308,7 +308,7 @@ public final ListGroupStatsPagedResponse listGroupStats(ListGroupStatsRequest re * try (ErrorStatsServiceClient errorStatsServiceClient = ErrorStatsServiceClient.create()) { * ProjectName projectName = ProjectName.create("[PROJECT]"); * String groupId = ""; - * for (ErrorEvent element : errorStatsServiceClient.listEvents(projectName, groupId).iterateAllElements()) { + * for (ErrorEvent element : errorStatsServiceClient.listEvents(projectName, groupId).iterateAll()) { * // doThingsWith(element); * } * } @@ -343,7 +343,7 @@ public final ListEventsPagedResponse listEvents(ProjectName projectName, String * .setProjectNameWithProjectName(projectName) * .setGroupId(groupId) * .build(); - * for (ErrorEvent element : errorStatsServiceClient.listEvents(request).iterateAllElements()) { + * for (ErrorEvent element : errorStatsServiceClient.listEvents(request).iterateAll()) { * // doThingsWith(element); * } * } @@ -372,7 +372,7 @@ public final ListEventsPagedResponse listEvents(ListEventsRequest request) { * .build(); * ApiFuture<ListEventsPagedResponse> future = errorStatsServiceClient.listEventsPagedCallable().futureCall(request); * // Do something - * for (ErrorEvent element : future.get().iterateAllElements()) { + * for (ErrorEvent element : future.get().iterateAll()) { * // doThingsWith(element); * } * } diff --git a/google-cloud-errorreporting/src/main/java/com/google/cloud/errorreporting/spi/v1beta1/ErrorStatsServiceSettings.java b/google-cloud-errorreporting/src/main/java/com/google/cloud/errorreporting/spi/v1beta1/ErrorStatsServiceSettings.java index 694db283b3d2..3521f95a9c70 100644 --- a/google-cloud-errorreporting/src/main/java/com/google/cloud/errorreporting/spi/v1beta1/ErrorStatsServiceSettings.java +++ b/google-cloud-errorreporting/src/main/java/com/google/cloud/errorreporting/spi/v1beta1/ErrorStatsServiceSettings.java @@ -18,6 +18,7 @@ import static com.google.cloud.errorreporting.spi.v1beta1.PagedResponseWrappers.ListEventsPagedResponse; import static com.google.cloud.errorreporting.spi.v1beta1.PagedResponseWrappers.ListGroupStatsPagedResponse; +import com.google.api.gax.core.ApiFuture; import com.google.api.gax.core.GoogleCredentialsProvider; import com.google.api.gax.core.PropertiesProvider; import com.google.api.gax.core.RetrySettings; @@ -27,6 +28,7 @@ import com.google.api.gax.grpc.ExecutorProvider; import com.google.api.gax.grpc.InstantiatingChannelProvider; import com.google.api.gax.grpc.InstantiatingExecutorProvider; +import com.google.api.gax.grpc.PageContext; import com.google.api.gax.grpc.PagedCallSettings; import com.google.api.gax.grpc.PagedListDescriptor; import com.google.api.gax.grpc.PagedListResponseFactory; @@ -187,13 +189,13 @@ private ErrorStatsServiceSettings(Builder settingsBuilder) throws IOException { new PagedListDescriptor< ListGroupStatsRequest, ListGroupStatsResponse, ErrorGroupStats>() { @Override - public Object emptyToken() { + public String emptyToken() { return ""; } @Override - public ListGroupStatsRequest injectToken(ListGroupStatsRequest payload, Object token) { - return ListGroupStatsRequest.newBuilder(payload).setPageToken((String) token).build(); + public ListGroupStatsRequest injectToken(ListGroupStatsRequest payload, String token) { + return ListGroupStatsRequest.newBuilder(payload).setPageToken(token).build(); } @Override @@ -208,7 +210,7 @@ public Integer extractPageSize(ListGroupStatsRequest payload) { } @Override - public Object extractNextToken(ListGroupStatsResponse payload) { + public String extractNextToken(ListGroupStatsResponse payload) { return payload.getNextPageToken(); } @@ -222,13 +224,13 @@ public Iterable extractResources(ListGroupStatsResponse payload LIST_EVENTS_PAGE_STR_DESC = new PagedListDescriptor() { @Override - public Object emptyToken() { + public String emptyToken() { return ""; } @Override - public ListEventsRequest injectToken(ListEventsRequest payload, Object token) { - return ListEventsRequest.newBuilder(payload).setPageToken((String) token).build(); + public ListEventsRequest injectToken(ListEventsRequest payload, String token) { + return ListEventsRequest.newBuilder(payload).setPageToken(token).build(); } @Override @@ -242,7 +244,7 @@ public Integer extractPageSize(ListEventsRequest payload) { } @Override - public Object extractNextToken(ListEventsResponse payload) { + public String extractNextToken(ListEventsResponse payload) { return payload.getNextPageToken(); } @@ -258,12 +260,16 @@ public Iterable extractResources(ListEventsResponse payload) { new PagedListResponseFactory< ListGroupStatsRequest, ListGroupStatsResponse, ListGroupStatsPagedResponse>() { @Override - public ListGroupStatsPagedResponse createPagedListResponse( + public ApiFuture getFuturePagedResponse( UnaryCallable callable, ListGroupStatsRequest request, - CallContext context) { - return new ListGroupStatsPagedResponse( - callable, LIST_GROUP_STATS_PAGE_STR_DESC, request, context); + CallContext context, + ApiFuture futureResponse) { + PageContext + pageContext = + PageContext.create( + callable, LIST_GROUP_STATS_PAGE_STR_DESC, request, context); + return ListGroupStatsPagedResponse.createAsync(pageContext, futureResponse); } }; @@ -273,12 +279,14 @@ public ListGroupStatsPagedResponse createPagedListResponse( new PagedListResponseFactory< ListEventsRequest, ListEventsResponse, ListEventsPagedResponse>() { @Override - public ListEventsPagedResponse createPagedListResponse( + public ApiFuture getFuturePagedResponse( UnaryCallable callable, ListEventsRequest request, - CallContext context) { - return new ListEventsPagedResponse( - callable, LIST_EVENTS_PAGE_STR_DESC, request, context); + CallContext context, + ApiFuture futureResponse) { + PageContext pageContext = + PageContext.create(callable, LIST_EVENTS_PAGE_STR_DESC, request, context); + return ListEventsPagedResponse.createAsync(pageContext, futureResponse); } }; diff --git a/google-cloud-errorreporting/src/main/java/com/google/cloud/errorreporting/spi/v1beta1/PagedResponseWrappers.java b/google-cloud-errorreporting/src/main/java/com/google/cloud/errorreporting/spi/v1beta1/PagedResponseWrappers.java index 070fee864afe..79554b3e7b9e 100644 --- a/google-cloud-errorreporting/src/main/java/com/google/cloud/errorreporting/spi/v1beta1/PagedResponseWrappers.java +++ b/google-cloud-errorreporting/src/main/java/com/google/cloud/errorreporting/spi/v1beta1/PagedResponseWrappers.java @@ -15,10 +15,13 @@ */ package com.google.cloud.errorreporting.spi.v1beta1; -import com.google.api.gax.grpc.CallContext; -import com.google.api.gax.grpc.PagedListDescriptor; -import com.google.api.gax.grpc.PagedListResponseImpl; -import com.google.api.gax.grpc.UnaryCallable; +import com.google.api.gax.core.ApiFunction; +import com.google.api.gax.core.ApiFuture; +import com.google.api.gax.core.ApiFutures; +import com.google.api.gax.grpc.AbstractFixedSizeCollection; +import com.google.api.gax.grpc.AbstractPage; +import com.google.api.gax.grpc.AbstractPagedListResponse; +import com.google.api.gax.grpc.PageContext; import com.google.devtools.clouderrorreporting.v1beta1.ErrorEvent; import com.google.devtools.clouderrorreporting.v1beta1.ErrorGroupStats; import com.google.devtools.clouderrorreporting.v1beta1.ListEventsRequest; @@ -26,6 +29,7 @@ import com.google.devtools.clouderrorreporting.v1beta1.ListGroupStatsRequest; import com.google.devtools.clouderrorreporting.v1beta1.ListGroupStatsResponse; import com.google.protobuf.ExperimentalApi; +import java.util.List; import javax.annotation.Generated; // AUTO-GENERATED DOCUMENTATION AND CLASS @@ -39,28 +43,149 @@ public class PagedResponseWrappers { public static class ListGroupStatsPagedResponse - extends PagedListResponseImpl< - ListGroupStatsRequest, ListGroupStatsResponse, ErrorGroupStats> { + extends AbstractPagedListResponse< + ListGroupStatsRequest, ListGroupStatsResponse, ErrorGroupStats, ListGroupStatsPage, + ListGroupStatsFixedSizeCollection> { - public ListGroupStatsPagedResponse( - UnaryCallable callable, - PagedListDescriptor - pageDescriptor, - ListGroupStatsRequest request, - CallContext context) { - super(callable, pageDescriptor, request, context); + public static ApiFuture createAsync( + PageContext context, + ApiFuture futureResponse) { + ApiFuture futurePage = + ListGroupStatsPage.createEmptyPage().createPageAsync(context, futureResponse); + return ApiFutures.transform( + futurePage, + new ApiFunction() { + @Override + public ListGroupStatsPagedResponse apply(ListGroupStatsPage input) { + return new ListGroupStatsPagedResponse(input); + } + }); + } + + private ListGroupStatsPagedResponse(ListGroupStatsPage page) { + super(page, ListGroupStatsFixedSizeCollection.createEmptyCollection()); + } + } + + public static class ListGroupStatsPage + extends AbstractPage< + ListGroupStatsRequest, ListGroupStatsResponse, ErrorGroupStats, ListGroupStatsPage> { + + private ListGroupStatsPage( + PageContext context, + ListGroupStatsResponse response) { + super(context, response); + } + + private static ListGroupStatsPage createEmptyPage() { + return new ListGroupStatsPage(null, null); + } + + @Override + protected ListGroupStatsPage createPage( + PageContext context, + ListGroupStatsResponse response) { + return new ListGroupStatsPage(context, response); + } + + @Override + protected ApiFuture createPageAsync( + PageContext context, + ApiFuture futureResponse) { + return super.createPageAsync(context, futureResponse); + } + } + + public static class ListGroupStatsFixedSizeCollection + extends AbstractFixedSizeCollection< + ListGroupStatsRequest, ListGroupStatsResponse, ErrorGroupStats, ListGroupStatsPage, + ListGroupStatsFixedSizeCollection> { + + private ListGroupStatsFixedSizeCollection(List pages, int collectionSize) { + super(pages, collectionSize); + } + + private static ListGroupStatsFixedSizeCollection createEmptyCollection() { + return new ListGroupStatsFixedSizeCollection(null, 0); + } + + @Override + protected ListGroupStatsFixedSizeCollection createCollection( + List pages, int collectionSize) { + return new ListGroupStatsFixedSizeCollection(pages, collectionSize); } } public static class ListEventsPagedResponse - extends PagedListResponseImpl { - - public ListEventsPagedResponse( - UnaryCallable callable, - PagedListDescriptor pageDescriptor, - ListEventsRequest request, - CallContext context) { - super(callable, pageDescriptor, request, context); + extends AbstractPagedListResponse< + ListEventsRequest, ListEventsResponse, ErrorEvent, ListEventsPage, + ListEventsFixedSizeCollection> { + + public static ApiFuture createAsync( + PageContext context, + ApiFuture futureResponse) { + ApiFuture futurePage = + ListEventsPage.createEmptyPage().createPageAsync(context, futureResponse); + return ApiFutures.transform( + futurePage, + new ApiFunction() { + @Override + public ListEventsPagedResponse apply(ListEventsPage input) { + return new ListEventsPagedResponse(input); + } + }); + } + + private ListEventsPagedResponse(ListEventsPage page) { + super(page, ListEventsFixedSizeCollection.createEmptyCollection()); + } + } + + public static class ListEventsPage + extends AbstractPage { + + private ListEventsPage( + PageContext context, + ListEventsResponse response) { + super(context, response); + } + + private static ListEventsPage createEmptyPage() { + return new ListEventsPage(null, null); + } + + @Override + protected ListEventsPage createPage( + PageContext context, + ListEventsResponse response) { + return new ListEventsPage(context, response); + } + + @Override + protected ApiFuture createPageAsync( + PageContext context, + ApiFuture futureResponse) { + return super.createPageAsync(context, futureResponse); + } + } + + public static class ListEventsFixedSizeCollection + extends AbstractFixedSizeCollection< + ListEventsRequest, ListEventsResponse, ErrorEvent, ListEventsPage, + ListEventsFixedSizeCollection> { + + private ListEventsFixedSizeCollection(List pages, int collectionSize) { + super(pages, collectionSize); + } + + private static ListEventsFixedSizeCollection createEmptyCollection() { + return new ListEventsFixedSizeCollection(null, 0); + } + + @Override + protected ListEventsFixedSizeCollection createCollection( + List pages, int collectionSize) { + return new ListEventsFixedSizeCollection(pages, collectionSize); } } } diff --git a/google-cloud-errorreporting/src/test/java/com/google/cloud/errorreporting/spi/v1beta1/ErrorStatsServiceClientTest.java b/google-cloud-errorreporting/src/test/java/com/google/cloud/errorreporting/spi/v1beta1/ErrorStatsServiceClientTest.java index 76b3f535a433..bfd56e754cb0 100644 --- a/google-cloud-errorreporting/src/test/java/com/google/cloud/errorreporting/spi/v1beta1/ErrorStatsServiceClientTest.java +++ b/google-cloud-errorreporting/src/test/java/com/google/cloud/errorreporting/spi/v1beta1/ErrorStatsServiceClientTest.java @@ -104,7 +104,7 @@ public void listGroupStatsTest() { ListGroupStatsPagedResponse pagedListResponse = client.listGroupStats(projectName, timeRange); - List resources = Lists.newArrayList(pagedListResponse.iterateAllElements()); + List resources = Lists.newArrayList(pagedListResponse.iterateAll()); Assert.assertEquals(1, resources.size()); Assert.assertEquals(expectedResponse.getErrorGroupStatsList().get(0), resources.get(0)); @@ -151,7 +151,7 @@ public void listEventsTest() { ListEventsPagedResponse pagedListResponse = client.listEvents(projectName, groupId); - List resources = Lists.newArrayList(pagedListResponse.iterateAllElements()); + List resources = Lists.newArrayList(pagedListResponse.iterateAll()); Assert.assertEquals(1, resources.size()); Assert.assertEquals(expectedResponse.getErrorEventsList().get(0), resources.get(0)); diff --git a/google-cloud-examples/src/main/java/com/google/cloud/examples/pubsub/PubSubExample.java b/google-cloud-examples/src/main/java/com/google/cloud/examples/pubsub/PubSubExample.java index 826ee4fd3f4b..cc6fdbeacc41 100644 --- a/google-cloud-examples/src/main/java/com/google/cloud/examples/pubsub/PubSubExample.java +++ b/google-cloud-examples/src/main/java/com/google/cloud/examples/pubsub/PubSubExample.java @@ -184,7 +184,7 @@ public void run(Void arg) throws Exception { .setProjectWithProjectName(ProjectName.create(projectId)) .build(); PagedResponseWrappers.ListTopicsPagedResponse response = topicAdminClient.listTopics(listTopicsRequest); - Iterable topics = response.iterateAllElements(); + Iterable topics = response.iterateAll(); for (Topic topic : topics) { System.out.println(topic.getName()); } @@ -268,7 +268,7 @@ public void run(String topic) throws Exception { try (SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create()) { PagedResponseWrappers.ListSubscriptionsPagedResponse response = subscriptionAdminClient.listSubscriptions(ProjectName.create(projectId)); - Iterable subscriptions = response.iterateAllElements(); + Iterable subscriptions = response.iterateAll(); for (Subscription subscription : subscriptions) { System.out.println(subscription.getName()); } @@ -277,7 +277,7 @@ public void run(String topic) throws Exception { try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) { PagedResponseWrappers.ListTopicSubscriptionsPagedResponse response = topicAdminClient.listTopicSubscriptions(TopicName.create(projectId, topic)); - Iterable subscriptionNames = response.iterateAllElements(); + Iterable subscriptionNames = response.iterateAll(); for (String subscriptionName : subscriptionNames) { System.out.println(subscriptionName); } diff --git a/google-cloud-examples/src/main/java/com/google/cloud/examples/pubsub/snippets/SubscriptionAdminClientSnippets.java b/google-cloud-examples/src/main/java/com/google/cloud/examples/pubsub/snippets/SubscriptionAdminClientSnippets.java index 40df803b451f..346e5566a436 100644 --- a/google-cloud-examples/src/main/java/com/google/cloud/examples/pubsub/snippets/SubscriptionAdminClientSnippets.java +++ b/google-cloud-examples/src/main/java/com/google/cloud/examples/pubsub/snippets/SubscriptionAdminClientSnippets.java @@ -114,7 +114,7 @@ public ListSubscriptionsPagedResponse listSubscriptions() throws Exception { .build(); ListSubscriptionsPagedResponse response = subscriptionAdminClient.listSubscriptions(listSubscriptionsRequest); - Iterable subscriptions = response.iterateAllElements(); + Iterable subscriptions = response.iterateAll(); for (Subscription subscription : subscriptions) { // do something with the subscription } diff --git a/google-cloud-examples/src/main/java/com/google/cloud/examples/pubsub/snippets/TopicAdminClientSnippets.java b/google-cloud-examples/src/main/java/com/google/cloud/examples/pubsub/snippets/TopicAdminClientSnippets.java index 62855bd09081..4a4394491e71 100644 --- a/google-cloud-examples/src/main/java/com/google/cloud/examples/pubsub/snippets/TopicAdminClientSnippets.java +++ b/google-cloud-examples/src/main/java/com/google/cloud/examples/pubsub/snippets/TopicAdminClientSnippets.java @@ -66,7 +66,7 @@ public ListTopicsPagedResponse listTopics() throws Exception { .setProjectWithProjectName(ProjectName.create(projectId)) .build(); ListTopicsPagedResponse response = topicAdminClient.listTopics(listTopicsRequest); - Iterable topics = response.iterateAllElements(); + Iterable topics = response.iterateAll(); for (Topic topic : topics) { // do something with the topic } @@ -87,7 +87,7 @@ public ListTopicSubscriptionsPagedResponse listTopicSubscriptions(String topicId .build(); ListTopicSubscriptionsPagedResponse response = topicAdminClient.listTopicSubscriptions(request); - Iterable subscriptionNames = response.iterateAllElements(); + Iterable subscriptionNames = response.iterateAll(); for (String subscriptionName : subscriptionNames) { // do something with the subscription name } diff --git a/google-cloud-examples/src/test/java/com/google/cloud/examples/pubsub/snippets/ITSubscriptionAdminClientSnippets.java b/google-cloud-examples/src/test/java/com/google/cloud/examples/pubsub/snippets/ITSubscriptionAdminClientSnippets.java index 82caac5d5288..4ef0f3da6cf0 100644 --- a/google-cloud-examples/src/test/java/com/google/cloud/examples/pubsub/snippets/ITSubscriptionAdminClientSnippets.java +++ b/google-cloud-examples/src/test/java/com/google/cloud/examples/pubsub/snippets/ITSubscriptionAdminClientSnippets.java @@ -122,7 +122,7 @@ public void listSubscriptionsRetrievesAllAddedSubscriptions() throws Exception { boolean[] subFound = {false, false}; ListSubscriptionsPagedResponse response = subscriptionAdminClientSnippets.listSubscriptions(); assertNotNull(response); - Iterable subscriptions = response.iterateAllElements(); + Iterable subscriptions = response.iterateAll(); for (int i = 0; i < 2; i++) { if (!subFound[i]) { subFound[i] = Iterables.contains(subscriptions, addedSubscriptions.get(i)); diff --git a/google-cloud-examples/src/test/java/com/google/cloud/examples/pubsub/snippets/ITTopicAdminClientSnippets.java b/google-cloud-examples/src/test/java/com/google/cloud/examples/pubsub/snippets/ITTopicAdminClientSnippets.java index c3cd9cffc86e..76b641654e38 100644 --- a/google-cloud-examples/src/test/java/com/google/cloud/examples/pubsub/snippets/ITTopicAdminClientSnippets.java +++ b/google-cloud-examples/src/test/java/com/google/cloud/examples/pubsub/snippets/ITTopicAdminClientSnippets.java @@ -100,7 +100,7 @@ public void listTopicsRetreivesAddedTopics() throws Exception { ListTopicsPagedResponse response = topicAdminClientSnippets.listTopics(); assertNotNull(response); - Iterable topics = response.iterateAllElements(); + Iterable topics = response.iterateAll(); for (int i = 0; i < 2; i++) { if (!topicFound[i]) { topicFound[i] = Iterables.contains(topics, addedTopics.get(i)); @@ -127,7 +127,7 @@ public void listTopicSubscriptionsRetrievesAddedSubscriptions() throws Exception assertNotNull(response); - Iterable subscriptions = response.iterateAllElements(); + Iterable subscriptions = response.iterateAll(); for (int i = 0; i < 2; i++) { if (!subFound[i]) { subFound[i] = Iterables.contains(subscriptions, addedSubscriptions.get(i)); diff --git a/google-cloud-language/pom.xml b/google-cloud-language/pom.xml index 6c3e3f43fbc3..5985903afe5a 100644 --- a/google-cloud-language/pom.xml +++ b/google-cloud-language/pom.xml @@ -32,7 +32,7 @@ com.google.api.grpc grpc-google-cloud-language-v1 - 0.1.6 + 0.1.7 io.grpc @@ -43,7 +43,7 @@ com.google.api.grpc grpc-google-cloud-language-v1beta2 - 0.1.6 + 0.1.7 io.grpc diff --git a/google-cloud-logging/pom.xml b/google-cloud-logging/pom.xml index 6e1a85e84e1f..dfff16dc5cc6 100644 --- a/google-cloud-logging/pom.xml +++ b/google-cloud-logging/pom.xml @@ -32,7 +32,7 @@ com.google.api.grpc grpc-google-cloud-logging-v2 - 0.1.5 + 0.1.7 io.grpc diff --git a/google-cloud-logging/src/main/java/com/google/cloud/logging/spi/v2/ConfigClient.java b/google-cloud-logging/src/main/java/com/google/cloud/logging/spi/v2/ConfigClient.java index f188dbc88692..0019950ed9c5 100644 --- a/google-cloud-logging/src/main/java/com/google/cloud/logging/spi/v2/ConfigClient.java +++ b/google-cloud-logging/src/main/java/com/google/cloud/logging/spi/v2/ConfigClient.java @@ -178,7 +178,7 @@ public final ConfigSettings getSettings() { *

    * try (ConfigClient configClient = ConfigClient.create()) {
    *   ParentNameOneof parent = ParentNameOneof.from(ProjectName.create("[PROJECT]"));
-   *   for (LogSink element : configClient.listSinks(parent).iterateAllElements()) {
+   *   for (LogSink element : configClient.listSinks(parent).iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -207,7 +207,7 @@ public final ListSinksPagedResponse listSinks(ParentNameOneof parent) {
    *   ListSinksRequest request = ListSinksRequest.newBuilder()
    *     .setParentWithParentNameOneof(parent)
    *     .build();
-   *   for (LogSink element : configClient.listSinks(request).iterateAllElements()) {
+   *   for (LogSink element : configClient.listSinks(request).iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -234,7 +234,7 @@ public final ListSinksPagedResponse listSinks(ListSinksRequest request) {
    *     .build();
    *   ApiFuture<ListSinksPagedResponse> future = configClient.listSinksPagedCallable().futureCall(request);
    *   // Do something
-   *   for (LogSink element : future.get().iterateAllElements()) {
+   *   for (LogSink element : future.get().iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
diff --git a/google-cloud-logging/src/main/java/com/google/cloud/logging/spi/v2/ConfigSettings.java b/google-cloud-logging/src/main/java/com/google/cloud/logging/spi/v2/ConfigSettings.java
index 72fc086723ec..237d478210d6 100644
--- a/google-cloud-logging/src/main/java/com/google/cloud/logging/spi/v2/ConfigSettings.java
+++ b/google-cloud-logging/src/main/java/com/google/cloud/logging/spi/v2/ConfigSettings.java
@@ -17,6 +17,7 @@
 
 import static com.google.cloud.logging.spi.v2.PagedResponseWrappers.ListSinksPagedResponse;
 
+import com.google.api.gax.core.ApiFuture;
 import com.google.api.gax.core.GoogleCredentialsProvider;
 import com.google.api.gax.core.PropertiesProvider;
 import com.google.api.gax.core.RetrySettings;
@@ -26,6 +27,7 @@
 import com.google.api.gax.grpc.ExecutorProvider;
 import com.google.api.gax.grpc.InstantiatingChannelProvider;
 import com.google.api.gax.grpc.InstantiatingExecutorProvider;
+import com.google.api.gax.grpc.PageContext;
 import com.google.api.gax.grpc.PagedCallSettings;
 import com.google.api.gax.grpc.PagedListDescriptor;
 import com.google.api.gax.grpc.PagedListResponseFactory;
@@ -198,13 +200,13 @@ private ConfigSettings(Builder settingsBuilder) throws IOException {
       LIST_SINKS_PAGE_STR_DESC =
           new PagedListDescriptor() {
             @Override
-            public Object emptyToken() {
+            public String emptyToken() {
               return "";
             }
 
             @Override
-            public ListSinksRequest injectToken(ListSinksRequest payload, Object token) {
-              return ListSinksRequest.newBuilder(payload).setPageToken((String) token).build();
+            public ListSinksRequest injectToken(ListSinksRequest payload, String token) {
+              return ListSinksRequest.newBuilder(payload).setPageToken(token).build();
             }
 
             @Override
@@ -218,7 +220,7 @@ public Integer extractPageSize(ListSinksRequest payload) {
             }
 
             @Override
-            public Object extractNextToken(ListSinksResponse payload) {
+            public String extractNextToken(ListSinksResponse payload) {
               return payload.getNextPageToken();
             }
 
@@ -234,12 +236,14 @@ public Iterable extractResources(ListSinksResponse payload) {
           new PagedListResponseFactory<
               ListSinksRequest, ListSinksResponse, ListSinksPagedResponse>() {
             @Override
-            public ListSinksPagedResponse createPagedListResponse(
+            public ApiFuture getFuturePagedResponse(
                 UnaryCallable callable,
                 ListSinksRequest request,
-                CallContext context) {
-              return new ListSinksPagedResponse(
-                  callable, LIST_SINKS_PAGE_STR_DESC, request, context);
+                CallContext context,
+                ApiFuture futureResponse) {
+              PageContext pageContext =
+                  PageContext.create(callable, LIST_SINKS_PAGE_STR_DESC, request, context);
+              return ListSinksPagedResponse.createAsync(pageContext, futureResponse);
             }
           };
 
diff --git a/google-cloud-logging/src/main/java/com/google/cloud/logging/spi/v2/LoggingClient.java b/google-cloud-logging/src/main/java/com/google/cloud/logging/spi/v2/LoggingClient.java
index 17a83d7ee384..cb16f295f983 100644
--- a/google-cloud-logging/src/main/java/com/google/cloud/logging/spi/v2/LoggingClient.java
+++ b/google-cloud-logging/src/main/java/com/google/cloud/logging/spi/v2/LoggingClient.java
@@ -384,7 +384,7 @@ public final WriteLogEntriesResponse writeLogEntries(WriteLogEntriesRequest requ
    *   List<String> resourceNames = new ArrayList<>();
    *   String filter = "";
    *   String orderBy = "";
-   *   for (LogEntry element : loggingClient.listLogEntries(resourceNames, filter, orderBy).iterateAllElements()) {
+   *   for (LogEntry element : loggingClient.listLogEntries(resourceNames, filter, orderBy).iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -432,7 +432,7 @@ public final ListLogEntriesPagedResponse listLogEntries(
    *   ListLogEntriesRequest request = ListLogEntriesRequest.newBuilder()
    *     .addAllResourceNames(resourceNames)
    *     .build();
-   *   for (LogEntry element : loggingClient.listLogEntries(request).iterateAllElements()) {
+   *   for (LogEntry element : loggingClient.listLogEntries(request).iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -460,7 +460,7 @@ public final ListLogEntriesPagedResponse listLogEntries(ListLogEntriesRequest re
    *     .build();
    *   ApiFuture<ListLogEntriesPagedResponse> future = loggingClient.listLogEntriesPagedCallable().futureCall(request);
    *   // Do something
-   *   for (LogEntry element : future.get().iterateAllElements()) {
+   *   for (LogEntry element : future.get().iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -513,7 +513,7 @@ public final ListLogEntriesPagedResponse listLogEntries(ListLogEntriesRequest re
    * 

    * try (LoggingClient loggingClient = LoggingClient.create()) {
    *   ListMonitoredResourceDescriptorsRequest request = ListMonitoredResourceDescriptorsRequest.newBuilder().build();
-   *   for (MonitoredResourceDescriptor element : loggingClient.listMonitoredResourceDescriptors(request).iterateAllElements()) {
+   *   for (MonitoredResourceDescriptor element : loggingClient.listMonitoredResourceDescriptors(request).iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -538,7 +538,7 @@ public final ListMonitoredResourceDescriptorsPagedResponse listMonitoredResource
    *   ListMonitoredResourceDescriptorsRequest request = ListMonitoredResourceDescriptorsRequest.newBuilder().build();
    *   ApiFuture<ListMonitoredResourceDescriptorsPagedResponse> future = loggingClient.listMonitoredResourceDescriptorsPagedCallable().futureCall(request);
    *   // Do something
-   *   for (MonitoredResourceDescriptor element : future.get().iterateAllElements()) {
+   *   for (MonitoredResourceDescriptor element : future.get().iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -590,7 +590,7 @@ public final ListMonitoredResourceDescriptorsPagedResponse listMonitoredResource
    * 

    * try (LoggingClient loggingClient = LoggingClient.create()) {
    *   ParentNameOneof parent = ParentNameOneof.from(ProjectName.create("[PROJECT]"));
-   *   for (String element : loggingClient.listLogs(parent).iterateAllElements()) {
+   *   for (String element : loggingClient.listLogs(parent).iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -620,7 +620,7 @@ public final ListLogsPagedResponse listLogs(ParentNameOneof parent) {
    *   ListLogsRequest request = ListLogsRequest.newBuilder()
    *     .setParentWithParentNameOneof(parent)
    *     .build();
-   *   for (String element : loggingClient.listLogs(request).iterateAllElements()) {
+   *   for (String element : loggingClient.listLogs(request).iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -648,7 +648,7 @@ public final ListLogsPagedResponse listLogs(ListLogsRequest request) {
    *     .build();
    *   ApiFuture<ListLogsPagedResponse> future = loggingClient.listLogsPagedCallable().futureCall(request);
    *   // Do something
-   *   for (String element : future.get().iterateAllElements()) {
+   *   for (String element : future.get().iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
diff --git a/google-cloud-logging/src/main/java/com/google/cloud/logging/spi/v2/LoggingSettings.java b/google-cloud-logging/src/main/java/com/google/cloud/logging/spi/v2/LoggingSettings.java
index 6199d21d4532..49163c828f9a 100644
--- a/google-cloud-logging/src/main/java/com/google/cloud/logging/spi/v2/LoggingSettings.java
+++ b/google-cloud-logging/src/main/java/com/google/cloud/logging/spi/v2/LoggingSettings.java
@@ -23,6 +23,7 @@
 import com.google.api.gax.batching.BatchingSettings;
 import com.google.api.gax.batching.PartitionKey;
 import com.google.api.gax.batching.RequestBuilder;
+import com.google.api.gax.core.ApiFuture;
 import com.google.api.gax.core.FlowControlSettings;
 import com.google.api.gax.core.FlowController.LimitExceededBehavior;
 import com.google.api.gax.core.GoogleCredentialsProvider;
@@ -37,6 +38,7 @@
 import com.google.api.gax.grpc.ExecutorProvider;
 import com.google.api.gax.grpc.InstantiatingChannelProvider;
 import com.google.api.gax.grpc.InstantiatingExecutorProvider;
+import com.google.api.gax.grpc.PageContext;
 import com.google.api.gax.grpc.PagedCallSettings;
 import com.google.api.gax.grpc.PagedListDescriptor;
 import com.google.api.gax.grpc.PagedListResponseFactory;
@@ -226,13 +228,13 @@ private LoggingSettings(Builder settingsBuilder) throws IOException {
       LIST_LOG_ENTRIES_PAGE_STR_DESC =
           new PagedListDescriptor() {
             @Override
-            public Object emptyToken() {
+            public String emptyToken() {
               return "";
             }
 
             @Override
-            public ListLogEntriesRequest injectToken(ListLogEntriesRequest payload, Object token) {
-              return ListLogEntriesRequest.newBuilder(payload).setPageToken((String) token).build();
+            public ListLogEntriesRequest injectToken(ListLogEntriesRequest payload, String token) {
+              return ListLogEntriesRequest.newBuilder(payload).setPageToken(token).build();
             }
 
             @Override
@@ -247,7 +249,7 @@ public Integer extractPageSize(ListLogEntriesRequest payload) {
             }
 
             @Override
-            public Object extractNextToken(ListLogEntriesResponse payload) {
+            public String extractNextToken(ListLogEntriesResponse payload) {
               return payload.getNextPageToken();
             }
 
@@ -265,15 +267,15 @@ public Iterable extractResources(ListLogEntriesResponse payload) {
               ListMonitoredResourceDescriptorsRequest, ListMonitoredResourceDescriptorsResponse,
               MonitoredResourceDescriptor>() {
             @Override
-            public Object emptyToken() {
+            public String emptyToken() {
               return "";
             }
 
             @Override
             public ListMonitoredResourceDescriptorsRequest injectToken(
-                ListMonitoredResourceDescriptorsRequest payload, Object token) {
+                ListMonitoredResourceDescriptorsRequest payload, String token) {
               return ListMonitoredResourceDescriptorsRequest.newBuilder(payload)
-                  .setPageToken((String) token)
+                  .setPageToken(token)
                   .build();
             }
 
@@ -291,7 +293,7 @@ public Integer extractPageSize(ListMonitoredResourceDescriptorsRequest payload)
             }
 
             @Override
-            public Object extractNextToken(ListMonitoredResourceDescriptorsResponse payload) {
+            public String extractNextToken(ListMonitoredResourceDescriptorsResponse payload) {
               return payload.getNextPageToken();
             }
 
@@ -306,13 +308,13 @@ public Iterable extractResources(
       LIST_LOGS_PAGE_STR_DESC =
           new PagedListDescriptor() {
             @Override
-            public Object emptyToken() {
+            public String emptyToken() {
               return "";
             }
 
             @Override
-            public ListLogsRequest injectToken(ListLogsRequest payload, Object token) {
-              return ListLogsRequest.newBuilder(payload).setPageToken((String) token).build();
+            public ListLogsRequest injectToken(ListLogsRequest payload, String token) {
+              return ListLogsRequest.newBuilder(payload).setPageToken(token).build();
             }
 
             @Override
@@ -326,7 +328,7 @@ public Integer extractPageSize(ListLogsRequest payload) {
             }
 
             @Override
-            public Object extractNextToken(ListLogsResponse payload) {
+            public String extractNextToken(ListLogsResponse payload) {
               return payload.getNextPageToken();
             }
 
@@ -342,12 +344,14 @@ public Iterable extractResources(ListLogsResponse payload) {
           new PagedListResponseFactory<
               ListLogEntriesRequest, ListLogEntriesResponse, ListLogEntriesPagedResponse>() {
             @Override
-            public ListLogEntriesPagedResponse createPagedListResponse(
+            public ApiFuture getFuturePagedResponse(
                 UnaryCallable callable,
                 ListLogEntriesRequest request,
-                CallContext context) {
-              return new ListLogEntriesPagedResponse(
-                  callable, LIST_LOG_ENTRIES_PAGE_STR_DESC, request, context);
+                CallContext context,
+                ApiFuture futureResponse) {
+              PageContext pageContext =
+                  PageContext.create(callable, LIST_LOG_ENTRIES_PAGE_STR_DESC, request, context);
+              return ListLogEntriesPagedResponse.createAsync(pageContext, futureResponse);
             }
           };
 
@@ -359,15 +363,25 @@ public ListLogEntriesPagedResponse createPagedListResponse(
               ListMonitoredResourceDescriptorsRequest, ListMonitoredResourceDescriptorsResponse,
               ListMonitoredResourceDescriptorsPagedResponse>() {
             @Override
-            public ListMonitoredResourceDescriptorsPagedResponse createPagedListResponse(
+            public ApiFuture getFuturePagedResponse(
                 UnaryCallable<
                         ListMonitoredResourceDescriptorsRequest,
                         ListMonitoredResourceDescriptorsResponse>
                     callable,
                 ListMonitoredResourceDescriptorsRequest request,
-                CallContext context) {
-              return new ListMonitoredResourceDescriptorsPagedResponse(
-                  callable, LIST_MONITORED_RESOURCE_DESCRIPTORS_PAGE_STR_DESC, request, context);
+                CallContext context,
+                ApiFuture futureResponse) {
+              PageContext<
+                      ListMonitoredResourceDescriptorsRequest,
+                      ListMonitoredResourceDescriptorsResponse, MonitoredResourceDescriptor>
+                  pageContext =
+                      PageContext.create(
+                          callable,
+                          LIST_MONITORED_RESOURCE_DESCRIPTORS_PAGE_STR_DESC,
+                          request,
+                          context);
+              return ListMonitoredResourceDescriptorsPagedResponse.createAsync(
+                  pageContext, futureResponse);
             }
           };
 
@@ -376,11 +390,14 @@ public ListMonitoredResourceDescriptorsPagedResponse createPagedListResponse(
       LIST_LOGS_PAGE_STR_FACT =
           new PagedListResponseFactory() {
             @Override
-            public ListLogsPagedResponse createPagedListResponse(
+            public ApiFuture getFuturePagedResponse(
                 UnaryCallable callable,
                 ListLogsRequest request,
-                CallContext context) {
-              return new ListLogsPagedResponse(callable, LIST_LOGS_PAGE_STR_DESC, request, context);
+                CallContext context,
+                ApiFuture futureResponse) {
+              PageContext pageContext =
+                  PageContext.create(callable, LIST_LOGS_PAGE_STR_DESC, request, context);
+              return ListLogsPagedResponse.createAsync(pageContext, futureResponse);
             }
           };
 
diff --git a/google-cloud-logging/src/main/java/com/google/cloud/logging/spi/v2/MetricsClient.java b/google-cloud-logging/src/main/java/com/google/cloud/logging/spi/v2/MetricsClient.java
index af0aeb7cb9e9..28d008bbbd7c 100644
--- a/google-cloud-logging/src/main/java/com/google/cloud/logging/spi/v2/MetricsClient.java
+++ b/google-cloud-logging/src/main/java/com/google/cloud/logging/spi/v2/MetricsClient.java
@@ -179,7 +179,7 @@ public final MetricsSettings getSettings() {
    * 

    * try (MetricsClient metricsClient = MetricsClient.create()) {
    *   ParentNameOneof parent = ParentNameOneof.from(ProjectName.create("[PROJECT]"));
-   *   for (LogMetric element : metricsClient.listLogMetrics(parent).iterateAllElements()) {
+   *   for (LogMetric element : metricsClient.listLogMetrics(parent).iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -207,7 +207,7 @@ public final ListLogMetricsPagedResponse listLogMetrics(ParentNameOneof parent)
    *   ListLogMetricsRequest request = ListLogMetricsRequest.newBuilder()
    *     .setParentWithParentNameOneof(parent)
    *     .build();
-   *   for (LogMetric element : metricsClient.listLogMetrics(request).iterateAllElements()) {
+   *   for (LogMetric element : metricsClient.listLogMetrics(request).iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -234,7 +234,7 @@ public final ListLogMetricsPagedResponse listLogMetrics(ListLogMetricsRequest re
    *     .build();
    *   ApiFuture<ListLogMetricsPagedResponse> future = metricsClient.listLogMetricsPagedCallable().futureCall(request);
    *   // Do something
-   *   for (LogMetric element : future.get().iterateAllElements()) {
+   *   for (LogMetric element : future.get().iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
diff --git a/google-cloud-logging/src/main/java/com/google/cloud/logging/spi/v2/MetricsSettings.java b/google-cloud-logging/src/main/java/com/google/cloud/logging/spi/v2/MetricsSettings.java
index 7606629adbe7..460d245d0ab8 100644
--- a/google-cloud-logging/src/main/java/com/google/cloud/logging/spi/v2/MetricsSettings.java
+++ b/google-cloud-logging/src/main/java/com/google/cloud/logging/spi/v2/MetricsSettings.java
@@ -17,6 +17,7 @@
 
 import static com.google.cloud.logging.spi.v2.PagedResponseWrappers.ListLogMetricsPagedResponse;
 
+import com.google.api.gax.core.ApiFuture;
 import com.google.api.gax.core.GoogleCredentialsProvider;
 import com.google.api.gax.core.PropertiesProvider;
 import com.google.api.gax.core.RetrySettings;
@@ -26,6 +27,7 @@
 import com.google.api.gax.grpc.ExecutorProvider;
 import com.google.api.gax.grpc.InstantiatingChannelProvider;
 import com.google.api.gax.grpc.InstantiatingExecutorProvider;
+import com.google.api.gax.grpc.PageContext;
 import com.google.api.gax.grpc.PagedCallSettings;
 import com.google.api.gax.grpc.PagedListDescriptor;
 import com.google.api.gax.grpc.PagedListResponseFactory;
@@ -200,13 +202,13 @@ private MetricsSettings(Builder settingsBuilder) throws IOException {
       LIST_LOG_METRICS_PAGE_STR_DESC =
           new PagedListDescriptor() {
             @Override
-            public Object emptyToken() {
+            public String emptyToken() {
               return "";
             }
 
             @Override
-            public ListLogMetricsRequest injectToken(ListLogMetricsRequest payload, Object token) {
-              return ListLogMetricsRequest.newBuilder(payload).setPageToken((String) token).build();
+            public ListLogMetricsRequest injectToken(ListLogMetricsRequest payload, String token) {
+              return ListLogMetricsRequest.newBuilder(payload).setPageToken(token).build();
             }
 
             @Override
@@ -221,7 +223,7 @@ public Integer extractPageSize(ListLogMetricsRequest payload) {
             }
 
             @Override
-            public Object extractNextToken(ListLogMetricsResponse payload) {
+            public String extractNextToken(ListLogMetricsResponse payload) {
               return payload.getNextPageToken();
             }
 
@@ -237,12 +239,14 @@ public Iterable extractResources(ListLogMetricsResponse payload) {
           new PagedListResponseFactory<
               ListLogMetricsRequest, ListLogMetricsResponse, ListLogMetricsPagedResponse>() {
             @Override
-            public ListLogMetricsPagedResponse createPagedListResponse(
+            public ApiFuture getFuturePagedResponse(
                 UnaryCallable callable,
                 ListLogMetricsRequest request,
-                CallContext context) {
-              return new ListLogMetricsPagedResponse(
-                  callable, LIST_LOG_METRICS_PAGE_STR_DESC, request, context);
+                CallContext context,
+                ApiFuture futureResponse) {
+              PageContext pageContext =
+                  PageContext.create(callable, LIST_LOG_METRICS_PAGE_STR_DESC, request, context);
+              return ListLogMetricsPagedResponse.createAsync(pageContext, futureResponse);
             }
           };
 
diff --git a/google-cloud-logging/src/main/java/com/google/cloud/logging/spi/v2/PagedResponseWrappers.java b/google-cloud-logging/src/main/java/com/google/cloud/logging/spi/v2/PagedResponseWrappers.java
index 061da4e7b6fa..29cb0798f684 100644
--- a/google-cloud-logging/src/main/java/com/google/cloud/logging/spi/v2/PagedResponseWrappers.java
+++ b/google-cloud-logging/src/main/java/com/google/cloud/logging/spi/v2/PagedResponseWrappers.java
@@ -16,10 +16,13 @@
 package com.google.cloud.logging.spi.v2;
 
 import com.google.api.MonitoredResourceDescriptor;
-import com.google.api.gax.grpc.CallContext;
-import com.google.api.gax.grpc.PagedListDescriptor;
-import com.google.api.gax.grpc.PagedListResponseImpl;
-import com.google.api.gax.grpc.UnaryCallable;
+import com.google.api.gax.core.ApiFunction;
+import com.google.api.gax.core.ApiFuture;
+import com.google.api.gax.core.ApiFutures;
+import com.google.api.gax.grpc.AbstractFixedSizeCollection;
+import com.google.api.gax.grpc.AbstractPage;
+import com.google.api.gax.grpc.AbstractPagedListResponse;
+import com.google.api.gax.grpc.PageContext;
 import com.google.logging.v2.ListLogEntriesRequest;
 import com.google.logging.v2.ListLogEntriesResponse;
 import com.google.logging.v2.ListLogMetricsRequest;
@@ -34,6 +37,7 @@
 import com.google.logging.v2.LogMetric;
 import com.google.logging.v2.LogSink;
 import com.google.protobuf.ExperimentalApi;
+import java.util.List;
 import javax.annotation.Generated;
 
 // AUTO-GENERATED DOCUMENTATION AND CLASS
@@ -47,70 +51,387 @@
 public class PagedResponseWrappers {
 
   public static class ListLogEntriesPagedResponse
-      extends PagedListResponseImpl {
+      extends AbstractPagedListResponse<
+          ListLogEntriesRequest, ListLogEntriesResponse, LogEntry, ListLogEntriesPage,
+          ListLogEntriesFixedSizeCollection> {
 
-    public ListLogEntriesPagedResponse(
-        UnaryCallable callable,
-        PagedListDescriptor pageDescriptor,
-        ListLogEntriesRequest request,
-        CallContext context) {
-      super(callable, pageDescriptor, request, context);
+    public static ApiFuture createAsync(
+        PageContext context,
+        ApiFuture futureResponse) {
+      ApiFuture futurePage =
+          ListLogEntriesPage.createEmptyPage().createPageAsync(context, futureResponse);
+      return ApiFutures.transform(
+          futurePage,
+          new ApiFunction() {
+            @Override
+            public ListLogEntriesPagedResponse apply(ListLogEntriesPage input) {
+              return new ListLogEntriesPagedResponse(input);
+            }
+          });
+    }
+
+    private ListLogEntriesPagedResponse(ListLogEntriesPage page) {
+      super(page, ListLogEntriesFixedSizeCollection.createEmptyCollection());
+    }
+  }
+
+  public static class ListLogEntriesPage
+      extends AbstractPage<
+          ListLogEntriesRequest, ListLogEntriesResponse, LogEntry, ListLogEntriesPage> {
+
+    private ListLogEntriesPage(
+        PageContext context,
+        ListLogEntriesResponse response) {
+      super(context, response);
+    }
+
+    private static ListLogEntriesPage createEmptyPage() {
+      return new ListLogEntriesPage(null, null);
+    }
+
+    @Override
+    protected ListLogEntriesPage createPage(
+        PageContext context,
+        ListLogEntriesResponse response) {
+      return new ListLogEntriesPage(context, response);
+    }
+
+    @Override
+    protected ApiFuture createPageAsync(
+        PageContext context,
+        ApiFuture futureResponse) {
+      return super.createPageAsync(context, futureResponse);
+    }
+  }
+
+  public static class ListLogEntriesFixedSizeCollection
+      extends AbstractFixedSizeCollection<
+          ListLogEntriesRequest, ListLogEntriesResponse, LogEntry, ListLogEntriesPage,
+          ListLogEntriesFixedSizeCollection> {
+
+    private ListLogEntriesFixedSizeCollection(List pages, int collectionSize) {
+      super(pages, collectionSize);
+    }
+
+    private static ListLogEntriesFixedSizeCollection createEmptyCollection() {
+      return new ListLogEntriesFixedSizeCollection(null, 0);
+    }
+
+    @Override
+    protected ListLogEntriesFixedSizeCollection createCollection(
+        List pages, int collectionSize) {
+      return new ListLogEntriesFixedSizeCollection(pages, collectionSize);
     }
   }
 
   public static class ListMonitoredResourceDescriptorsPagedResponse
-      extends PagedListResponseImpl<
+      extends AbstractPagedListResponse<
           ListMonitoredResourceDescriptorsRequest, ListMonitoredResourceDescriptorsResponse,
-          MonitoredResourceDescriptor> {
+          MonitoredResourceDescriptor, ListMonitoredResourceDescriptorsPage,
+          ListMonitoredResourceDescriptorsFixedSizeCollection> {
 
-    public ListMonitoredResourceDescriptorsPagedResponse(
-        UnaryCallable<
-                ListMonitoredResourceDescriptorsRequest, ListMonitoredResourceDescriptorsResponse>
-            callable,
-        PagedListDescriptor<
+    public static ApiFuture createAsync(
+        PageContext<
                 ListMonitoredResourceDescriptorsRequest, ListMonitoredResourceDescriptorsResponse,
                 MonitoredResourceDescriptor>
-            pageDescriptor,
-        ListMonitoredResourceDescriptorsRequest request,
-        CallContext context) {
-      super(callable, pageDescriptor, request, context);
+            context,
+        ApiFuture futureResponse) {
+      ApiFuture futurePage =
+          ListMonitoredResourceDescriptorsPage.createEmptyPage()
+              .createPageAsync(context, futureResponse);
+      return ApiFutures.transform(
+          futurePage,
+          new ApiFunction<
+              ListMonitoredResourceDescriptorsPage,
+              ListMonitoredResourceDescriptorsPagedResponse>() {
+            @Override
+            public ListMonitoredResourceDescriptorsPagedResponse apply(
+                ListMonitoredResourceDescriptorsPage input) {
+              return new ListMonitoredResourceDescriptorsPagedResponse(input);
+            }
+          });
+    }
+
+    private ListMonitoredResourceDescriptorsPagedResponse(
+        ListMonitoredResourceDescriptorsPage page) {
+      super(page, ListMonitoredResourceDescriptorsFixedSizeCollection.createEmptyCollection());
+    }
+  }
+
+  public static class ListMonitoredResourceDescriptorsPage
+      extends AbstractPage<
+          ListMonitoredResourceDescriptorsRequest, ListMonitoredResourceDescriptorsResponse,
+          MonitoredResourceDescriptor, ListMonitoredResourceDescriptorsPage> {
+
+    private ListMonitoredResourceDescriptorsPage(
+        PageContext<
+                ListMonitoredResourceDescriptorsRequest, ListMonitoredResourceDescriptorsResponse,
+                MonitoredResourceDescriptor>
+            context,
+        ListMonitoredResourceDescriptorsResponse response) {
+      super(context, response);
+    }
+
+    private static ListMonitoredResourceDescriptorsPage createEmptyPage() {
+      return new ListMonitoredResourceDescriptorsPage(null, null);
+    }
+
+    @Override
+    protected ListMonitoredResourceDescriptorsPage createPage(
+        PageContext<
+                ListMonitoredResourceDescriptorsRequest, ListMonitoredResourceDescriptorsResponse,
+                MonitoredResourceDescriptor>
+            context,
+        ListMonitoredResourceDescriptorsResponse response) {
+      return new ListMonitoredResourceDescriptorsPage(context, response);
+    }
+
+    @Override
+    protected ApiFuture createPageAsync(
+        PageContext<
+                ListMonitoredResourceDescriptorsRequest, ListMonitoredResourceDescriptorsResponse,
+                MonitoredResourceDescriptor>
+            context,
+        ApiFuture futureResponse) {
+      return super.createPageAsync(context, futureResponse);
+    }
+  }
+
+  public static class ListMonitoredResourceDescriptorsFixedSizeCollection
+      extends AbstractFixedSizeCollection<
+          ListMonitoredResourceDescriptorsRequest, ListMonitoredResourceDescriptorsResponse,
+          MonitoredResourceDescriptor, ListMonitoredResourceDescriptorsPage,
+          ListMonitoredResourceDescriptorsFixedSizeCollection> {
+
+    private ListMonitoredResourceDescriptorsFixedSizeCollection(
+        List pages, int collectionSize) {
+      super(pages, collectionSize);
+    }
+
+    private static ListMonitoredResourceDescriptorsFixedSizeCollection createEmptyCollection() {
+      return new ListMonitoredResourceDescriptorsFixedSizeCollection(null, 0);
+    }
+
+    @Override
+    protected ListMonitoredResourceDescriptorsFixedSizeCollection createCollection(
+        List pages, int collectionSize) {
+      return new ListMonitoredResourceDescriptorsFixedSizeCollection(pages, collectionSize);
     }
   }
 
   public static class ListLogsPagedResponse
-      extends PagedListResponseImpl {
+      extends AbstractPagedListResponse<
+          ListLogsRequest, ListLogsResponse, String, ListLogsPage, ListLogsFixedSizeCollection> {
 
-    public ListLogsPagedResponse(
-        UnaryCallable callable,
-        PagedListDescriptor pageDescriptor,
-        ListLogsRequest request,
-        CallContext context) {
-      super(callable, pageDescriptor, request, context);
+    public static ApiFuture createAsync(
+        PageContext context,
+        ApiFuture futureResponse) {
+      ApiFuture futurePage =
+          ListLogsPage.createEmptyPage().createPageAsync(context, futureResponse);
+      return ApiFutures.transform(
+          futurePage,
+          new ApiFunction() {
+            @Override
+            public ListLogsPagedResponse apply(ListLogsPage input) {
+              return new ListLogsPagedResponse(input);
+            }
+          });
+    }
+
+    private ListLogsPagedResponse(ListLogsPage page) {
+      super(page, ListLogsFixedSizeCollection.createEmptyCollection());
+    }
+  }
+
+  public static class ListLogsPage
+      extends AbstractPage {
+
+    private ListLogsPage(
+        PageContext context, ListLogsResponse response) {
+      super(context, response);
+    }
+
+    private static ListLogsPage createEmptyPage() {
+      return new ListLogsPage(null, null);
+    }
+
+    @Override
+    protected ListLogsPage createPage(
+        PageContext context, ListLogsResponse response) {
+      return new ListLogsPage(context, response);
+    }
+
+    @Override
+    protected ApiFuture createPageAsync(
+        PageContext context,
+        ApiFuture futureResponse) {
+      return super.createPageAsync(context, futureResponse);
+    }
+  }
+
+  public static class ListLogsFixedSizeCollection
+      extends AbstractFixedSizeCollection<
+          ListLogsRequest, ListLogsResponse, String, ListLogsPage, ListLogsFixedSizeCollection> {
+
+    private ListLogsFixedSizeCollection(List pages, int collectionSize) {
+      super(pages, collectionSize);
+    }
+
+    private static ListLogsFixedSizeCollection createEmptyCollection() {
+      return new ListLogsFixedSizeCollection(null, 0);
+    }
+
+    @Override
+    protected ListLogsFixedSizeCollection createCollection(
+        List pages, int collectionSize) {
+      return new ListLogsFixedSizeCollection(pages, collectionSize);
     }
   }
 
   public static class ListSinksPagedResponse
-      extends PagedListResponseImpl {
+      extends AbstractPagedListResponse<
+          ListSinksRequest, ListSinksResponse, LogSink, ListSinksPage,
+          ListSinksFixedSizeCollection> {
+
+    public static ApiFuture createAsync(
+        PageContext context,
+        ApiFuture futureResponse) {
+      ApiFuture futurePage =
+          ListSinksPage.createEmptyPage().createPageAsync(context, futureResponse);
+      return ApiFutures.transform(
+          futurePage,
+          new ApiFunction() {
+            @Override
+            public ListSinksPagedResponse apply(ListSinksPage input) {
+              return new ListSinksPagedResponse(input);
+            }
+          });
+    }
+
+    private ListSinksPagedResponse(ListSinksPage page) {
+      super(page, ListSinksFixedSizeCollection.createEmptyCollection());
+    }
+  }
+
+  public static class ListSinksPage
+      extends AbstractPage {
+
+    private ListSinksPage(
+        PageContext context,
+        ListSinksResponse response) {
+      super(context, response);
+    }
+
+    private static ListSinksPage createEmptyPage() {
+      return new ListSinksPage(null, null);
+    }
+
+    @Override
+    protected ListSinksPage createPage(
+        PageContext context,
+        ListSinksResponse response) {
+      return new ListSinksPage(context, response);
+    }
+
+    @Override
+    protected ApiFuture createPageAsync(
+        PageContext context,
+        ApiFuture futureResponse) {
+      return super.createPageAsync(context, futureResponse);
+    }
+  }
+
+  public static class ListSinksFixedSizeCollection
+      extends AbstractFixedSizeCollection<
+          ListSinksRequest, ListSinksResponse, LogSink, ListSinksPage,
+          ListSinksFixedSizeCollection> {
+
+    private ListSinksFixedSizeCollection(List pages, int collectionSize) {
+      super(pages, collectionSize);
+    }
 
-    public ListSinksPagedResponse(
-        UnaryCallable callable,
-        PagedListDescriptor pageDescriptor,
-        ListSinksRequest request,
-        CallContext context) {
-      super(callable, pageDescriptor, request, context);
+    private static ListSinksFixedSizeCollection createEmptyCollection() {
+      return new ListSinksFixedSizeCollection(null, 0);
+    }
+
+    @Override
+    protected ListSinksFixedSizeCollection createCollection(
+        List pages, int collectionSize) {
+      return new ListSinksFixedSizeCollection(pages, collectionSize);
     }
   }
 
   public static class ListLogMetricsPagedResponse
-      extends PagedListResponseImpl {
-
-    public ListLogMetricsPagedResponse(
-        UnaryCallable callable,
-        PagedListDescriptor
-            pageDescriptor,
-        ListLogMetricsRequest request,
-        CallContext context) {
-      super(callable, pageDescriptor, request, context);
+      extends AbstractPagedListResponse<
+          ListLogMetricsRequest, ListLogMetricsResponse, LogMetric, ListLogMetricsPage,
+          ListLogMetricsFixedSizeCollection> {
+
+    public static ApiFuture createAsync(
+        PageContext context,
+        ApiFuture futureResponse) {
+      ApiFuture futurePage =
+          ListLogMetricsPage.createEmptyPage().createPageAsync(context, futureResponse);
+      return ApiFutures.transform(
+          futurePage,
+          new ApiFunction() {
+            @Override
+            public ListLogMetricsPagedResponse apply(ListLogMetricsPage input) {
+              return new ListLogMetricsPagedResponse(input);
+            }
+          });
+    }
+
+    private ListLogMetricsPagedResponse(ListLogMetricsPage page) {
+      super(page, ListLogMetricsFixedSizeCollection.createEmptyCollection());
+    }
+  }
+
+  public static class ListLogMetricsPage
+      extends AbstractPage<
+          ListLogMetricsRequest, ListLogMetricsResponse, LogMetric, ListLogMetricsPage> {
+
+    private ListLogMetricsPage(
+        PageContext context,
+        ListLogMetricsResponse response) {
+      super(context, response);
+    }
+
+    private static ListLogMetricsPage createEmptyPage() {
+      return new ListLogMetricsPage(null, null);
+    }
+
+    @Override
+    protected ListLogMetricsPage createPage(
+        PageContext context,
+        ListLogMetricsResponse response) {
+      return new ListLogMetricsPage(context, response);
+    }
+
+    @Override
+    protected ApiFuture createPageAsync(
+        PageContext context,
+        ApiFuture futureResponse) {
+      return super.createPageAsync(context, futureResponse);
+    }
+  }
+
+  public static class ListLogMetricsFixedSizeCollection
+      extends AbstractFixedSizeCollection<
+          ListLogMetricsRequest, ListLogMetricsResponse, LogMetric, ListLogMetricsPage,
+          ListLogMetricsFixedSizeCollection> {
+
+    private ListLogMetricsFixedSizeCollection(List pages, int collectionSize) {
+      super(pages, collectionSize);
+    }
+
+    private static ListLogMetricsFixedSizeCollection createEmptyCollection() {
+      return new ListLogMetricsFixedSizeCollection(null, 0);
+    }
+
+    @Override
+    protected ListLogMetricsFixedSizeCollection createCollection(
+        List pages, int collectionSize) {
+      return new ListLogMetricsFixedSizeCollection(pages, collectionSize);
     }
   }
 }
diff --git a/google-cloud-logging/src/test/java/com/google/cloud/logging/spi/v2/ConfigClientTest.java b/google-cloud-logging/src/test/java/com/google/cloud/logging/spi/v2/ConfigClientTest.java
index 8d9bbcef1888..377901cfe6c1 100644
--- a/google-cloud-logging/src/test/java/com/google/cloud/logging/spi/v2/ConfigClientTest.java
+++ b/google-cloud-logging/src/test/java/com/google/cloud/logging/spi/v2/ConfigClientTest.java
@@ -102,7 +102,7 @@ public void listSinksTest() {
 
     ListSinksPagedResponse pagedListResponse = client.listSinks(parent);
 
-    List resources = Lists.newArrayList(pagedListResponse.iterateAllElements());
+    List resources = Lists.newArrayList(pagedListResponse.iterateAll());
     Assert.assertEquals(1, resources.size());
     Assert.assertEquals(expectedResponse.getSinksList().get(0), resources.get(0));
 
diff --git a/google-cloud-logging/src/test/java/com/google/cloud/logging/spi/v2/LoggingClientTest.java b/google-cloud-logging/src/test/java/com/google/cloud/logging/spi/v2/LoggingClientTest.java
index 639ba66957a7..ea4b9c0e91c4 100644
--- a/google-cloud-logging/src/test/java/com/google/cloud/logging/spi/v2/LoggingClientTest.java
+++ b/google-cloud-logging/src/test/java/com/google/cloud/logging/spi/v2/LoggingClientTest.java
@@ -190,7 +190,7 @@ public void listLogEntriesTest() {
     ListLogEntriesPagedResponse pagedListResponse =
         client.listLogEntries(resourceNames, filter, orderBy);
 
-    List resources = Lists.newArrayList(pagedListResponse.iterateAllElements());
+    List resources = Lists.newArrayList(pagedListResponse.iterateAll());
     Assert.assertEquals(1, resources.size());
     Assert.assertEquals(expectedResponse.getEntriesList().get(0), resources.get(0));
 
@@ -238,7 +238,7 @@ public void listLogsTest() {
 
     ListLogsPagedResponse pagedListResponse = client.listLogs(parent);
 
-    List resources = Lists.newArrayList(pagedListResponse.iterateAllElements());
+    List resources = Lists.newArrayList(pagedListResponse.iterateAll());
     Assert.assertEquals(1, resources.size());
     Assert.assertEquals(expectedResponse.getLogNamesList().get(0), resources.get(0));
 
diff --git a/google-cloud-logging/src/test/java/com/google/cloud/logging/spi/v2/MetricsClientTest.java b/google-cloud-logging/src/test/java/com/google/cloud/logging/spi/v2/MetricsClientTest.java
index d8955b76f1c2..766ad0319a76 100644
--- a/google-cloud-logging/src/test/java/com/google/cloud/logging/spi/v2/MetricsClientTest.java
+++ b/google-cloud-logging/src/test/java/com/google/cloud/logging/spi/v2/MetricsClientTest.java
@@ -104,7 +104,7 @@ public void listLogMetricsTest() {
 
     ListLogMetricsPagedResponse pagedListResponse = client.listLogMetrics(parent);
 
-    List resources = Lists.newArrayList(pagedListResponse.iterateAllElements());
+    List resources = Lists.newArrayList(pagedListResponse.iterateAll());
     Assert.assertEquals(1, resources.size());
     Assert.assertEquals(expectedResponse.getMetricsList().get(0), resources.get(0));
 
diff --git a/google-cloud-monitoring/pom.xml b/google-cloud-monitoring/pom.xml
index 156f95ba0124..24bc07cd0b4d 100644
--- a/google-cloud-monitoring/pom.xml
+++ b/google-cloud-monitoring/pom.xml
@@ -31,7 +31,7 @@
     
       com.google.api.grpc
       grpc-google-cloud-monitoring-v3
-      0.1.5
+      0.1.7
       
         
           io.grpc
diff --git a/google-cloud-monitoring/src/main/java/com/google/cloud/monitoring/spi/v3/GroupServiceClient.java b/google-cloud-monitoring/src/main/java/com/google/cloud/monitoring/spi/v3/GroupServiceClient.java
index b024c9e8cdf3..613f88fe3815 100644
--- a/google-cloud-monitoring/src/main/java/com/google/cloud/monitoring/spi/v3/GroupServiceClient.java
+++ b/google-cloud-monitoring/src/main/java/com/google/cloud/monitoring/spi/v3/GroupServiceClient.java
@@ -201,7 +201,7 @@ public final GroupServiceSettings getSettings() {
    *   ListGroupsRequest request = ListGroupsRequest.newBuilder()
    *     .setNameWithProjectName(name)
    *     .build();
-   *   for (Group element : groupServiceClient.listGroups(request).iterateAllElements()) {
+   *   for (Group element : groupServiceClient.listGroups(request).iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -228,7 +228,7 @@ public final ListGroupsPagedResponse listGroups(ListGroupsRequest request) {
    *     .build();
    *   ApiFuture<ListGroupsPagedResponse> future = groupServiceClient.listGroupsPagedCallable().futureCall(request);
    *   // Do something
-   *   for (Group element : future.get().iterateAllElements()) {
+   *   for (Group element : future.get().iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -558,7 +558,7 @@ public final UnaryCallable deleteGroupCallable() {
    * 

    * try (GroupServiceClient groupServiceClient = GroupServiceClient.create()) {
    *   GroupName name = GroupName.create("[PROJECT]", "[GROUP]");
-   *   for (MonitoredResource element : groupServiceClient.listGroupMembers(name).iterateAllElements()) {
+   *   for (MonitoredResource element : groupServiceClient.listGroupMembers(name).iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -586,7 +586,7 @@ public final ListGroupMembersPagedResponse listGroupMembers(GroupName name) {
    *   ListGroupMembersRequest request = ListGroupMembersRequest.newBuilder()
    *     .setNameWithGroupName(name)
    *     .build();
-   *   for (MonitoredResource element : groupServiceClient.listGroupMembers(request).iterateAllElements()) {
+   *   for (MonitoredResource element : groupServiceClient.listGroupMembers(request).iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -613,7 +613,7 @@ public final ListGroupMembersPagedResponse listGroupMembers(ListGroupMembersRequ
    *     .build();
    *   ApiFuture<ListGroupMembersPagedResponse> future = groupServiceClient.listGroupMembersPagedCallable().futureCall(request);
    *   // Do something
-   *   for (MonitoredResource element : future.get().iterateAllElements()) {
+   *   for (MonitoredResource element : future.get().iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
diff --git a/google-cloud-monitoring/src/main/java/com/google/cloud/monitoring/spi/v3/GroupServiceSettings.java b/google-cloud-monitoring/src/main/java/com/google/cloud/monitoring/spi/v3/GroupServiceSettings.java
index efcf63783b42..1f206c9c9b44 100644
--- a/google-cloud-monitoring/src/main/java/com/google/cloud/monitoring/spi/v3/GroupServiceSettings.java
+++ b/google-cloud-monitoring/src/main/java/com/google/cloud/monitoring/spi/v3/GroupServiceSettings.java
@@ -19,6 +19,7 @@
 import static com.google.cloud.monitoring.spi.v3.PagedResponseWrappers.ListGroupsPagedResponse;
 
 import com.google.api.MonitoredResource;
+import com.google.api.gax.core.ApiFuture;
 import com.google.api.gax.core.GoogleCredentialsProvider;
 import com.google.api.gax.core.PropertiesProvider;
 import com.google.api.gax.core.RetrySettings;
@@ -28,6 +29,7 @@
 import com.google.api.gax.grpc.ExecutorProvider;
 import com.google.api.gax.grpc.InstantiatingChannelProvider;
 import com.google.api.gax.grpc.InstantiatingExecutorProvider;
+import com.google.api.gax.grpc.PageContext;
 import com.google.api.gax.grpc.PagedCallSettings;
 import com.google.api.gax.grpc.PagedListDescriptor;
 import com.google.api.gax.grpc.PagedListResponseFactory;
@@ -213,13 +215,13 @@ private GroupServiceSettings(Builder settingsBuilder) throws IOException {
       LIST_GROUPS_PAGE_STR_DESC =
           new PagedListDescriptor() {
             @Override
-            public Object emptyToken() {
+            public String emptyToken() {
               return "";
             }
 
             @Override
-            public ListGroupsRequest injectToken(ListGroupsRequest payload, Object token) {
-              return ListGroupsRequest.newBuilder(payload).setPageToken((String) token).build();
+            public ListGroupsRequest injectToken(ListGroupsRequest payload, String token) {
+              return ListGroupsRequest.newBuilder(payload).setPageToken(token).build();
             }
 
             @Override
@@ -233,7 +235,7 @@ public Integer extractPageSize(ListGroupsRequest payload) {
             }
 
             @Override
-            public Object extractNextToken(ListGroupsResponse payload) {
+            public String extractNextToken(ListGroupsResponse payload) {
               return payload.getNextPageToken();
             }
 
@@ -249,16 +251,14 @@ public Iterable extractResources(ListGroupsResponse payload) {
           new PagedListDescriptor<
               ListGroupMembersRequest, ListGroupMembersResponse, MonitoredResource>() {
             @Override
-            public Object emptyToken() {
+            public String emptyToken() {
               return "";
             }
 
             @Override
             public ListGroupMembersRequest injectToken(
-                ListGroupMembersRequest payload, Object token) {
-              return ListGroupMembersRequest.newBuilder(payload)
-                  .setPageToken((String) token)
-                  .build();
+                ListGroupMembersRequest payload, String token) {
+              return ListGroupMembersRequest.newBuilder(payload).setPageToken(token).build();
             }
 
             @Override
@@ -273,7 +273,7 @@ public Integer extractPageSize(ListGroupMembersRequest payload) {
             }
 
             @Override
-            public Object extractNextToken(ListGroupMembersResponse payload) {
+            public String extractNextToken(ListGroupMembersResponse payload) {
               return payload.getNextPageToken();
             }
 
@@ -289,12 +289,14 @@ public Iterable extractResources(ListGroupMembersResponse pay
           new PagedListResponseFactory<
               ListGroupsRequest, ListGroupsResponse, ListGroupsPagedResponse>() {
             @Override
-            public ListGroupsPagedResponse createPagedListResponse(
+            public ApiFuture getFuturePagedResponse(
                 UnaryCallable callable,
                 ListGroupsRequest request,
-                CallContext context) {
-              return new ListGroupsPagedResponse(
-                  callable, LIST_GROUPS_PAGE_STR_DESC, request, context);
+                CallContext context,
+                ApiFuture futureResponse) {
+              PageContext pageContext =
+                  PageContext.create(callable, LIST_GROUPS_PAGE_STR_DESC, request, context);
+              return ListGroupsPagedResponse.createAsync(pageContext, futureResponse);
             }
           };
 
@@ -304,12 +306,16 @@ public ListGroupsPagedResponse createPagedListResponse(
           new PagedListResponseFactory<
               ListGroupMembersRequest, ListGroupMembersResponse, ListGroupMembersPagedResponse>() {
             @Override
-            public ListGroupMembersPagedResponse createPagedListResponse(
+            public ApiFuture getFuturePagedResponse(
                 UnaryCallable callable,
                 ListGroupMembersRequest request,
-                CallContext context) {
-              return new ListGroupMembersPagedResponse(
-                  callable, LIST_GROUP_MEMBERS_PAGE_STR_DESC, request, context);
+                CallContext context,
+                ApiFuture futureResponse) {
+              PageContext
+                  pageContext =
+                      PageContext.create(
+                          callable, LIST_GROUP_MEMBERS_PAGE_STR_DESC, request, context);
+              return ListGroupMembersPagedResponse.createAsync(pageContext, futureResponse);
             }
           };
 
diff --git a/google-cloud-monitoring/src/main/java/com/google/cloud/monitoring/spi/v3/MetricServiceClient.java b/google-cloud-monitoring/src/main/java/com/google/cloud/monitoring/spi/v3/MetricServiceClient.java
index c52a521ed660..312304ebcbdf 100644
--- a/google-cloud-monitoring/src/main/java/com/google/cloud/monitoring/spi/v3/MetricServiceClient.java
+++ b/google-cloud-monitoring/src/main/java/com/google/cloud/monitoring/spi/v3/MetricServiceClient.java
@@ -224,7 +224,7 @@ public final MetricServiceSettings getSettings() {
    * 

    * try (MetricServiceClient metricServiceClient = MetricServiceClient.create()) {
    *   ProjectName name = ProjectName.create("[PROJECT]");
-   *   for (MonitoredResourceDescriptor element : metricServiceClient.listMonitoredResourceDescriptors(name).iterateAllElements()) {
+   *   for (MonitoredResourceDescriptor element : metricServiceClient.listMonitoredResourceDescriptors(name).iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -254,7 +254,7 @@ public final ListMonitoredResourceDescriptorsPagedResponse listMonitoredResource
    *   ListMonitoredResourceDescriptorsRequest request = ListMonitoredResourceDescriptorsRequest.newBuilder()
    *     .setNameWithProjectName(name)
    *     .build();
-   *   for (MonitoredResourceDescriptor element : metricServiceClient.listMonitoredResourceDescriptors(request).iterateAllElements()) {
+   *   for (MonitoredResourceDescriptor element : metricServiceClient.listMonitoredResourceDescriptors(request).iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -283,7 +283,7 @@ public final ListMonitoredResourceDescriptorsPagedResponse listMonitoredResource
    *     .build();
    *   ApiFuture<ListMonitoredResourceDescriptorsPagedResponse> future = metricServiceClient.listMonitoredResourceDescriptorsPagedCallable().futureCall(request);
    *   // Do something
-   *   for (MonitoredResourceDescriptor element : future.get().iterateAllElements()) {
+   *   for (MonitoredResourceDescriptor element : future.get().iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -417,7 +417,7 @@ private final MonitoredResourceDescriptor getMonitoredResourceDescriptor(
    * 

    * try (MetricServiceClient metricServiceClient = MetricServiceClient.create()) {
    *   ProjectName name = ProjectName.create("[PROJECT]");
-   *   for (MetricDescriptor element : metricServiceClient.listMetricDescriptors(name).iterateAllElements()) {
+   *   for (MetricDescriptor element : metricServiceClient.listMetricDescriptors(name).iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -446,7 +446,7 @@ public final ListMetricDescriptorsPagedResponse listMetricDescriptors(ProjectNam
    *   ListMetricDescriptorsRequest request = ListMetricDescriptorsRequest.newBuilder()
    *     .setNameWithProjectName(name)
    *     .build();
-   *   for (MetricDescriptor element : metricServiceClient.listMetricDescriptors(request).iterateAllElements()) {
+   *   for (MetricDescriptor element : metricServiceClient.listMetricDescriptors(request).iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -475,7 +475,7 @@ public final ListMetricDescriptorsPagedResponse listMetricDescriptors(
    *     .build();
    *   ApiFuture<ListMetricDescriptorsPagedResponse> future = metricServiceClient.listMetricDescriptorsPagedCallable().futureCall(request);
    *   // Do something
-   *   for (MetricDescriptor element : future.get().iterateAllElements()) {
+   *   for (MetricDescriptor element : future.get().iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -759,7 +759,7 @@ private final void deleteMetricDescriptor(DeleteMetricDescriptorRequest request)
    *   String filter = "";
    *   TimeInterval interval = TimeInterval.newBuilder().build();
    *   ListTimeSeriesRequest.TimeSeriesView view = ListTimeSeriesRequest.TimeSeriesView.FULL;
-   *   for (TimeSeries element : metricServiceClient.listTimeSeries(name, filter, interval, view).iterateAllElements()) {
+   *   for (TimeSeries element : metricServiceClient.listTimeSeries(name, filter, interval, view).iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -810,7 +810,7 @@ public final ListTimeSeriesPagedResponse listTimeSeries(
    *     .setInterval(interval)
    *     .setView(view)
    *     .build();
-   *   for (TimeSeries element : metricServiceClient.listTimeSeries(request).iterateAllElements()) {
+   *   for (TimeSeries element : metricServiceClient.listTimeSeries(request).iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -843,7 +843,7 @@ public final ListTimeSeriesPagedResponse listTimeSeries(ListTimeSeriesRequest re
    *     .build();
    *   ApiFuture<ListTimeSeriesPagedResponse> future = metricServiceClient.listTimeSeriesPagedCallable().futureCall(request);
    *   // Do something
-   *   for (TimeSeries element : future.get().iterateAllElements()) {
+   *   for (TimeSeries element : future.get().iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
diff --git a/google-cloud-monitoring/src/main/java/com/google/cloud/monitoring/spi/v3/MetricServiceSettings.java b/google-cloud-monitoring/src/main/java/com/google/cloud/monitoring/spi/v3/MetricServiceSettings.java
index cb549bc18ed7..8ce919dbf3a5 100644
--- a/google-cloud-monitoring/src/main/java/com/google/cloud/monitoring/spi/v3/MetricServiceSettings.java
+++ b/google-cloud-monitoring/src/main/java/com/google/cloud/monitoring/spi/v3/MetricServiceSettings.java
@@ -21,6 +21,7 @@
 
 import com.google.api.MetricDescriptor;
 import com.google.api.MonitoredResourceDescriptor;
+import com.google.api.gax.core.ApiFuture;
 import com.google.api.gax.core.GoogleCredentialsProvider;
 import com.google.api.gax.core.PropertiesProvider;
 import com.google.api.gax.core.RetrySettings;
@@ -30,6 +31,7 @@
 import com.google.api.gax.grpc.ExecutorProvider;
 import com.google.api.gax.grpc.InstantiatingChannelProvider;
 import com.google.api.gax.grpc.InstantiatingExecutorProvider;
+import com.google.api.gax.grpc.PageContext;
 import com.google.api.gax.grpc.PagedCallSettings;
 import com.google.api.gax.grpc.PagedListDescriptor;
 import com.google.api.gax.grpc.PagedListResponseFactory;
@@ -256,15 +258,15 @@ private MetricServiceSettings(Builder settingsBuilder) throws IOException {
               ListMonitoredResourceDescriptorsRequest, ListMonitoredResourceDescriptorsResponse,
               MonitoredResourceDescriptor>() {
             @Override
-            public Object emptyToken() {
+            public String emptyToken() {
               return "";
             }
 
             @Override
             public ListMonitoredResourceDescriptorsRequest injectToken(
-                ListMonitoredResourceDescriptorsRequest payload, Object token) {
+                ListMonitoredResourceDescriptorsRequest payload, String token) {
               return ListMonitoredResourceDescriptorsRequest.newBuilder(payload)
-                  .setPageToken((String) token)
+                  .setPageToken(token)
                   .build();
             }
 
@@ -282,7 +284,7 @@ public Integer extractPageSize(ListMonitoredResourceDescriptorsRequest payload)
             }
 
             @Override
-            public Object extractNextToken(ListMonitoredResourceDescriptorsResponse payload) {
+            public String extractNextToken(ListMonitoredResourceDescriptorsResponse payload) {
               return payload.getNextPageToken();
             }
 
@@ -299,16 +301,14 @@ public Iterable extractResources(
           new PagedListDescriptor<
               ListMetricDescriptorsRequest, ListMetricDescriptorsResponse, MetricDescriptor>() {
             @Override
-            public Object emptyToken() {
+            public String emptyToken() {
               return "";
             }
 
             @Override
             public ListMetricDescriptorsRequest injectToken(
-                ListMetricDescriptorsRequest payload, Object token) {
-              return ListMetricDescriptorsRequest.newBuilder(payload)
-                  .setPageToken((String) token)
-                  .build();
+                ListMetricDescriptorsRequest payload, String token) {
+              return ListMetricDescriptorsRequest.newBuilder(payload).setPageToken(token).build();
             }
 
             @Override
@@ -323,7 +323,7 @@ public Integer extractPageSize(ListMetricDescriptorsRequest payload) {
             }
 
             @Override
-            public Object extractNextToken(ListMetricDescriptorsResponse payload) {
+            public String extractNextToken(ListMetricDescriptorsResponse payload) {
               return payload.getNextPageToken();
             }
 
@@ -339,13 +339,13 @@ public Iterable extractResources(
       LIST_TIME_SERIES_PAGE_STR_DESC =
           new PagedListDescriptor() {
             @Override
-            public Object emptyToken() {
+            public String emptyToken() {
               return "";
             }
 
             @Override
-            public ListTimeSeriesRequest injectToken(ListTimeSeriesRequest payload, Object token) {
-              return ListTimeSeriesRequest.newBuilder(payload).setPageToken((String) token).build();
+            public ListTimeSeriesRequest injectToken(ListTimeSeriesRequest payload, String token) {
+              return ListTimeSeriesRequest.newBuilder(payload).setPageToken(token).build();
             }
 
             @Override
@@ -360,7 +360,7 @@ public Integer extractPageSize(ListTimeSeriesRequest payload) {
             }
 
             @Override
-            public Object extractNextToken(ListTimeSeriesResponse payload) {
+            public String extractNextToken(ListTimeSeriesResponse payload) {
               return payload.getNextPageToken();
             }
 
@@ -378,15 +378,25 @@ public Iterable extractResources(ListTimeSeriesResponse payload) {
               ListMonitoredResourceDescriptorsRequest, ListMonitoredResourceDescriptorsResponse,
               ListMonitoredResourceDescriptorsPagedResponse>() {
             @Override
-            public ListMonitoredResourceDescriptorsPagedResponse createPagedListResponse(
+            public ApiFuture getFuturePagedResponse(
                 UnaryCallable<
                         ListMonitoredResourceDescriptorsRequest,
                         ListMonitoredResourceDescriptorsResponse>
                     callable,
                 ListMonitoredResourceDescriptorsRequest request,
-                CallContext context) {
-              return new ListMonitoredResourceDescriptorsPagedResponse(
-                  callable, LIST_MONITORED_RESOURCE_DESCRIPTORS_PAGE_STR_DESC, request, context);
+                CallContext context,
+                ApiFuture futureResponse) {
+              PageContext<
+                      ListMonitoredResourceDescriptorsRequest,
+                      ListMonitoredResourceDescriptorsResponse, MonitoredResourceDescriptor>
+                  pageContext =
+                      PageContext.create(
+                          callable,
+                          LIST_MONITORED_RESOURCE_DESCRIPTORS_PAGE_STR_DESC,
+                          request,
+                          context);
+              return ListMonitoredResourceDescriptorsPagedResponse.createAsync(
+                  pageContext, futureResponse);
             }
           };
 
@@ -398,12 +408,17 @@ public ListMonitoredResourceDescriptorsPagedResponse createPagedListResponse(
               ListMetricDescriptorsRequest, ListMetricDescriptorsResponse,
               ListMetricDescriptorsPagedResponse>() {
             @Override
-            public ListMetricDescriptorsPagedResponse createPagedListResponse(
+            public ApiFuture getFuturePagedResponse(
                 UnaryCallable callable,
                 ListMetricDescriptorsRequest request,
-                CallContext context) {
-              return new ListMetricDescriptorsPagedResponse(
-                  callable, LIST_METRIC_DESCRIPTORS_PAGE_STR_DESC, request, context);
+                CallContext context,
+                ApiFuture futureResponse) {
+              PageContext<
+                      ListMetricDescriptorsRequest, ListMetricDescriptorsResponse, MetricDescriptor>
+                  pageContext =
+                      PageContext.create(
+                          callable, LIST_METRIC_DESCRIPTORS_PAGE_STR_DESC, request, context);
+              return ListMetricDescriptorsPagedResponse.createAsync(pageContext, futureResponse);
             }
           };
 
@@ -413,12 +428,14 @@ public ListMetricDescriptorsPagedResponse createPagedListResponse(
           new PagedListResponseFactory<
               ListTimeSeriesRequest, ListTimeSeriesResponse, ListTimeSeriesPagedResponse>() {
             @Override
-            public ListTimeSeriesPagedResponse createPagedListResponse(
+            public ApiFuture getFuturePagedResponse(
                 UnaryCallable callable,
                 ListTimeSeriesRequest request,
-                CallContext context) {
-              return new ListTimeSeriesPagedResponse(
-                  callable, LIST_TIME_SERIES_PAGE_STR_DESC, request, context);
+                CallContext context,
+                ApiFuture futureResponse) {
+              PageContext pageContext =
+                  PageContext.create(callable, LIST_TIME_SERIES_PAGE_STR_DESC, request, context);
+              return ListTimeSeriesPagedResponse.createAsync(pageContext, futureResponse);
             }
           };
 
diff --git a/google-cloud-monitoring/src/main/java/com/google/cloud/monitoring/spi/v3/PagedResponseWrappers.java b/google-cloud-monitoring/src/main/java/com/google/cloud/monitoring/spi/v3/PagedResponseWrappers.java
index 83ff4f730566..822424872969 100644
--- a/google-cloud-monitoring/src/main/java/com/google/cloud/monitoring/spi/v3/PagedResponseWrappers.java
+++ b/google-cloud-monitoring/src/main/java/com/google/cloud/monitoring/spi/v3/PagedResponseWrappers.java
@@ -18,10 +18,13 @@
 import com.google.api.MetricDescriptor;
 import com.google.api.MonitoredResource;
 import com.google.api.MonitoredResourceDescriptor;
-import com.google.api.gax.grpc.CallContext;
-import com.google.api.gax.grpc.PagedListDescriptor;
-import com.google.api.gax.grpc.PagedListResponseImpl;
-import com.google.api.gax.grpc.UnaryCallable;
+import com.google.api.gax.core.ApiFunction;
+import com.google.api.gax.core.ApiFuture;
+import com.google.api.gax.core.ApiFutures;
+import com.google.api.gax.grpc.AbstractFixedSizeCollection;
+import com.google.api.gax.grpc.AbstractPage;
+import com.google.api.gax.grpc.AbstractPagedListResponse;
+import com.google.api.gax.grpc.PageContext;
 import com.google.monitoring.v3.Group;
 import com.google.monitoring.v3.ListGroupMembersRequest;
 import com.google.monitoring.v3.ListGroupMembersResponse;
@@ -35,6 +38,7 @@
 import com.google.monitoring.v3.ListTimeSeriesResponse;
 import com.google.monitoring.v3.TimeSeries;
 import com.google.protobuf.ExperimentalApi;
+import java.util.List;
 import javax.annotation.Generated;
 
 // AUTO-GENERATED DOCUMENTATION AND CLASS
@@ -48,75 +52,400 @@
 public class PagedResponseWrappers {
 
   public static class ListGroupsPagedResponse
-      extends PagedListResponseImpl {
+      extends AbstractPagedListResponse<
+          ListGroupsRequest, ListGroupsResponse, Group, ListGroupsPage,
+          ListGroupsFixedSizeCollection> {
 
-    public ListGroupsPagedResponse(
-        UnaryCallable callable,
-        PagedListDescriptor pageDescriptor,
-        ListGroupsRequest request,
-        CallContext context) {
-      super(callable, pageDescriptor, request, context);
+    public static ApiFuture createAsync(
+        PageContext context,
+        ApiFuture futureResponse) {
+      ApiFuture futurePage =
+          ListGroupsPage.createEmptyPage().createPageAsync(context, futureResponse);
+      return ApiFutures.transform(
+          futurePage,
+          new ApiFunction() {
+            @Override
+            public ListGroupsPagedResponse apply(ListGroupsPage input) {
+              return new ListGroupsPagedResponse(input);
+            }
+          });
+    }
+
+    private ListGroupsPagedResponse(ListGroupsPage page) {
+      super(page, ListGroupsFixedSizeCollection.createEmptyCollection());
+    }
+  }
+
+  public static class ListGroupsPage
+      extends AbstractPage {
+
+    private ListGroupsPage(
+        PageContext context,
+        ListGroupsResponse response) {
+      super(context, response);
+    }
+
+    private static ListGroupsPage createEmptyPage() {
+      return new ListGroupsPage(null, null);
+    }
+
+    @Override
+    protected ListGroupsPage createPage(
+        PageContext context,
+        ListGroupsResponse response) {
+      return new ListGroupsPage(context, response);
+    }
+
+    @Override
+    protected ApiFuture createPageAsync(
+        PageContext context,
+        ApiFuture futureResponse) {
+      return super.createPageAsync(context, futureResponse);
+    }
+  }
+
+  public static class ListGroupsFixedSizeCollection
+      extends AbstractFixedSizeCollection<
+          ListGroupsRequest, ListGroupsResponse, Group, ListGroupsPage,
+          ListGroupsFixedSizeCollection> {
+
+    private ListGroupsFixedSizeCollection(List pages, int collectionSize) {
+      super(pages, collectionSize);
+    }
+
+    private static ListGroupsFixedSizeCollection createEmptyCollection() {
+      return new ListGroupsFixedSizeCollection(null, 0);
+    }
+
+    @Override
+    protected ListGroupsFixedSizeCollection createCollection(
+        List pages, int collectionSize) {
+      return new ListGroupsFixedSizeCollection(pages, collectionSize);
     }
   }
 
   public static class ListGroupMembersPagedResponse
-      extends PagedListResponseImpl<
-          ListGroupMembersRequest, ListGroupMembersResponse, MonitoredResource> {
+      extends AbstractPagedListResponse<
+          ListGroupMembersRequest, ListGroupMembersResponse, MonitoredResource,
+          ListGroupMembersPage, ListGroupMembersFixedSizeCollection> {
+
+    public static ApiFuture createAsync(
+        PageContext context,
+        ApiFuture futureResponse) {
+      ApiFuture futurePage =
+          ListGroupMembersPage.createEmptyPage().createPageAsync(context, futureResponse);
+      return ApiFutures.transform(
+          futurePage,
+          new ApiFunction() {
+            @Override
+            public ListGroupMembersPagedResponse apply(ListGroupMembersPage input) {
+              return new ListGroupMembersPagedResponse(input);
+            }
+          });
+    }
 
-    public ListGroupMembersPagedResponse(
-        UnaryCallable callable,
-        PagedListDescriptor
-            pageDescriptor,
-        ListGroupMembersRequest request,
-        CallContext context) {
-      super(callable, pageDescriptor, request, context);
+    private ListGroupMembersPagedResponse(ListGroupMembersPage page) {
+      super(page, ListGroupMembersFixedSizeCollection.createEmptyCollection());
+    }
+  }
+
+  public static class ListGroupMembersPage
+      extends AbstractPage<
+          ListGroupMembersRequest, ListGroupMembersResponse, MonitoredResource,
+          ListGroupMembersPage> {
+
+    private ListGroupMembersPage(
+        PageContext context,
+        ListGroupMembersResponse response) {
+      super(context, response);
+    }
+
+    private static ListGroupMembersPage createEmptyPage() {
+      return new ListGroupMembersPage(null, null);
+    }
+
+    @Override
+    protected ListGroupMembersPage createPage(
+        PageContext context,
+        ListGroupMembersResponse response) {
+      return new ListGroupMembersPage(context, response);
+    }
+
+    @Override
+    protected ApiFuture createPageAsync(
+        PageContext context,
+        ApiFuture futureResponse) {
+      return super.createPageAsync(context, futureResponse);
+    }
+  }
+
+  public static class ListGroupMembersFixedSizeCollection
+      extends AbstractFixedSizeCollection<
+          ListGroupMembersRequest, ListGroupMembersResponse, MonitoredResource,
+          ListGroupMembersPage, ListGroupMembersFixedSizeCollection> {
+
+    private ListGroupMembersFixedSizeCollection(
+        List pages, int collectionSize) {
+      super(pages, collectionSize);
+    }
+
+    private static ListGroupMembersFixedSizeCollection createEmptyCollection() {
+      return new ListGroupMembersFixedSizeCollection(null, 0);
+    }
+
+    @Override
+    protected ListGroupMembersFixedSizeCollection createCollection(
+        List pages, int collectionSize) {
+      return new ListGroupMembersFixedSizeCollection(pages, collectionSize);
     }
   }
 
   public static class ListMonitoredResourceDescriptorsPagedResponse
-      extends PagedListResponseImpl<
+      extends AbstractPagedListResponse<
           ListMonitoredResourceDescriptorsRequest, ListMonitoredResourceDescriptorsResponse,
-          MonitoredResourceDescriptor> {
+          MonitoredResourceDescriptor, ListMonitoredResourceDescriptorsPage,
+          ListMonitoredResourceDescriptorsFixedSizeCollection> {
+
+    public static ApiFuture createAsync(
+        PageContext<
+                ListMonitoredResourceDescriptorsRequest, ListMonitoredResourceDescriptorsResponse,
+                MonitoredResourceDescriptor>
+            context,
+        ApiFuture futureResponse) {
+      ApiFuture futurePage =
+          ListMonitoredResourceDescriptorsPage.createEmptyPage()
+              .createPageAsync(context, futureResponse);
+      return ApiFutures.transform(
+          futurePage,
+          new ApiFunction<
+              ListMonitoredResourceDescriptorsPage,
+              ListMonitoredResourceDescriptorsPagedResponse>() {
+            @Override
+            public ListMonitoredResourceDescriptorsPagedResponse apply(
+                ListMonitoredResourceDescriptorsPage input) {
+              return new ListMonitoredResourceDescriptorsPagedResponse(input);
+            }
+          });
+    }
+
+    private ListMonitoredResourceDescriptorsPagedResponse(
+        ListMonitoredResourceDescriptorsPage page) {
+      super(page, ListMonitoredResourceDescriptorsFixedSizeCollection.createEmptyCollection());
+    }
+  }
+
+  public static class ListMonitoredResourceDescriptorsPage
+      extends AbstractPage<
+          ListMonitoredResourceDescriptorsRequest, ListMonitoredResourceDescriptorsResponse,
+          MonitoredResourceDescriptor, ListMonitoredResourceDescriptorsPage> {
+
+    private ListMonitoredResourceDescriptorsPage(
+        PageContext<
+                ListMonitoredResourceDescriptorsRequest, ListMonitoredResourceDescriptorsResponse,
+                MonitoredResourceDescriptor>
+            context,
+        ListMonitoredResourceDescriptorsResponse response) {
+      super(context, response);
+    }
+
+    private static ListMonitoredResourceDescriptorsPage createEmptyPage() {
+      return new ListMonitoredResourceDescriptorsPage(null, null);
+    }
 
-    public ListMonitoredResourceDescriptorsPagedResponse(
-        UnaryCallable<
-                ListMonitoredResourceDescriptorsRequest, ListMonitoredResourceDescriptorsResponse>
-            callable,
-        PagedListDescriptor<
+    @Override
+    protected ListMonitoredResourceDescriptorsPage createPage(
+        PageContext<
                 ListMonitoredResourceDescriptorsRequest, ListMonitoredResourceDescriptorsResponse,
                 MonitoredResourceDescriptor>
-            pageDescriptor,
-        ListMonitoredResourceDescriptorsRequest request,
-        CallContext context) {
-      super(callable, pageDescriptor, request, context);
+            context,
+        ListMonitoredResourceDescriptorsResponse response) {
+      return new ListMonitoredResourceDescriptorsPage(context, response);
+    }
+
+    @Override
+    protected ApiFuture createPageAsync(
+        PageContext<
+                ListMonitoredResourceDescriptorsRequest, ListMonitoredResourceDescriptorsResponse,
+                MonitoredResourceDescriptor>
+            context,
+        ApiFuture futureResponse) {
+      return super.createPageAsync(context, futureResponse);
+    }
+  }
+
+  public static class ListMonitoredResourceDescriptorsFixedSizeCollection
+      extends AbstractFixedSizeCollection<
+          ListMonitoredResourceDescriptorsRequest, ListMonitoredResourceDescriptorsResponse,
+          MonitoredResourceDescriptor, ListMonitoredResourceDescriptorsPage,
+          ListMonitoredResourceDescriptorsFixedSizeCollection> {
+
+    private ListMonitoredResourceDescriptorsFixedSizeCollection(
+        List pages, int collectionSize) {
+      super(pages, collectionSize);
+    }
+
+    private static ListMonitoredResourceDescriptorsFixedSizeCollection createEmptyCollection() {
+      return new ListMonitoredResourceDescriptorsFixedSizeCollection(null, 0);
+    }
+
+    @Override
+    protected ListMonitoredResourceDescriptorsFixedSizeCollection createCollection(
+        List pages, int collectionSize) {
+      return new ListMonitoredResourceDescriptorsFixedSizeCollection(pages, collectionSize);
     }
   }
 
   public static class ListMetricDescriptorsPagedResponse
-      extends PagedListResponseImpl<
-          ListMetricDescriptorsRequest, ListMetricDescriptorsResponse, MetricDescriptor> {
-
-    public ListMetricDescriptorsPagedResponse(
-        UnaryCallable callable,
-        PagedListDescriptor<
-                ListMetricDescriptorsRequest, ListMetricDescriptorsResponse, MetricDescriptor>
-            pageDescriptor,
-        ListMetricDescriptorsRequest request,
-        CallContext context) {
-      super(callable, pageDescriptor, request, context);
+      extends AbstractPagedListResponse<
+          ListMetricDescriptorsRequest, ListMetricDescriptorsResponse, MetricDescriptor,
+          ListMetricDescriptorsPage, ListMetricDescriptorsFixedSizeCollection> {
+
+    public static ApiFuture createAsync(
+        PageContext
+            context,
+        ApiFuture futureResponse) {
+      ApiFuture futurePage =
+          ListMetricDescriptorsPage.createEmptyPage().createPageAsync(context, futureResponse);
+      return ApiFutures.transform(
+          futurePage,
+          new ApiFunction() {
+            @Override
+            public ListMetricDescriptorsPagedResponse apply(ListMetricDescriptorsPage input) {
+              return new ListMetricDescriptorsPagedResponse(input);
+            }
+          });
+    }
+
+    private ListMetricDescriptorsPagedResponse(ListMetricDescriptorsPage page) {
+      super(page, ListMetricDescriptorsFixedSizeCollection.createEmptyCollection());
+    }
+  }
+
+  public static class ListMetricDescriptorsPage
+      extends AbstractPage<
+          ListMetricDescriptorsRequest, ListMetricDescriptorsResponse, MetricDescriptor,
+          ListMetricDescriptorsPage> {
+
+    private ListMetricDescriptorsPage(
+        PageContext
+            context,
+        ListMetricDescriptorsResponse response) {
+      super(context, response);
+    }
+
+    private static ListMetricDescriptorsPage createEmptyPage() {
+      return new ListMetricDescriptorsPage(null, null);
+    }
+
+    @Override
+    protected ListMetricDescriptorsPage createPage(
+        PageContext
+            context,
+        ListMetricDescriptorsResponse response) {
+      return new ListMetricDescriptorsPage(context, response);
+    }
+
+    @Override
+    protected ApiFuture createPageAsync(
+        PageContext
+            context,
+        ApiFuture futureResponse) {
+      return super.createPageAsync(context, futureResponse);
+    }
+  }
+
+  public static class ListMetricDescriptorsFixedSizeCollection
+      extends AbstractFixedSizeCollection<
+          ListMetricDescriptorsRequest, ListMetricDescriptorsResponse, MetricDescriptor,
+          ListMetricDescriptorsPage, ListMetricDescriptorsFixedSizeCollection> {
+
+    private ListMetricDescriptorsFixedSizeCollection(
+        List pages, int collectionSize) {
+      super(pages, collectionSize);
+    }
+
+    private static ListMetricDescriptorsFixedSizeCollection createEmptyCollection() {
+      return new ListMetricDescriptorsFixedSizeCollection(null, 0);
+    }
+
+    @Override
+    protected ListMetricDescriptorsFixedSizeCollection createCollection(
+        List pages, int collectionSize) {
+      return new ListMetricDescriptorsFixedSizeCollection(pages, collectionSize);
     }
   }
 
   public static class ListTimeSeriesPagedResponse
-      extends PagedListResponseImpl {
-
-    public ListTimeSeriesPagedResponse(
-        UnaryCallable callable,
-        PagedListDescriptor
-            pageDescriptor,
-        ListTimeSeriesRequest request,
-        CallContext context) {
-      super(callable, pageDescriptor, request, context);
+      extends AbstractPagedListResponse<
+          ListTimeSeriesRequest, ListTimeSeriesResponse, TimeSeries, ListTimeSeriesPage,
+          ListTimeSeriesFixedSizeCollection> {
+
+    public static ApiFuture createAsync(
+        PageContext context,
+        ApiFuture futureResponse) {
+      ApiFuture futurePage =
+          ListTimeSeriesPage.createEmptyPage().createPageAsync(context, futureResponse);
+      return ApiFutures.transform(
+          futurePage,
+          new ApiFunction() {
+            @Override
+            public ListTimeSeriesPagedResponse apply(ListTimeSeriesPage input) {
+              return new ListTimeSeriesPagedResponse(input);
+            }
+          });
+    }
+
+    private ListTimeSeriesPagedResponse(ListTimeSeriesPage page) {
+      super(page, ListTimeSeriesFixedSizeCollection.createEmptyCollection());
+    }
+  }
+
+  public static class ListTimeSeriesPage
+      extends AbstractPage<
+          ListTimeSeriesRequest, ListTimeSeriesResponse, TimeSeries, ListTimeSeriesPage> {
+
+    private ListTimeSeriesPage(
+        PageContext context,
+        ListTimeSeriesResponse response) {
+      super(context, response);
+    }
+
+    private static ListTimeSeriesPage createEmptyPage() {
+      return new ListTimeSeriesPage(null, null);
+    }
+
+    @Override
+    protected ListTimeSeriesPage createPage(
+        PageContext context,
+        ListTimeSeriesResponse response) {
+      return new ListTimeSeriesPage(context, response);
+    }
+
+    @Override
+    protected ApiFuture createPageAsync(
+        PageContext context,
+        ApiFuture futureResponse) {
+      return super.createPageAsync(context, futureResponse);
+    }
+  }
+
+  public static class ListTimeSeriesFixedSizeCollection
+      extends AbstractFixedSizeCollection<
+          ListTimeSeriesRequest, ListTimeSeriesResponse, TimeSeries, ListTimeSeriesPage,
+          ListTimeSeriesFixedSizeCollection> {
+
+    private ListTimeSeriesFixedSizeCollection(List pages, int collectionSize) {
+      super(pages, collectionSize);
+    }
+
+    private static ListTimeSeriesFixedSizeCollection createEmptyCollection() {
+      return new ListTimeSeriesFixedSizeCollection(null, 0);
+    }
+
+    @Override
+    protected ListTimeSeriesFixedSizeCollection createCollection(
+        List pages, int collectionSize) {
+      return new ListTimeSeriesFixedSizeCollection(pages, collectionSize);
     }
   }
 }
diff --git a/google-cloud-monitoring/src/test/java/com/google/cloud/monitoring/spi/v3/GroupServiceClientTest.java b/google-cloud-monitoring/src/test/java/com/google/cloud/monitoring/spi/v3/GroupServiceClientTest.java
index e145ebba9a9a..497d4cee827f 100644
--- a/google-cloud-monitoring/src/test/java/com/google/cloud/monitoring/spi/v3/GroupServiceClientTest.java
+++ b/google-cloud-monitoring/src/test/java/com/google/cloud/monitoring/spi/v3/GroupServiceClientTest.java
@@ -275,7 +275,7 @@ public void listGroupMembersTest() {
 
     ListGroupMembersPagedResponse pagedListResponse = client.listGroupMembers(name);
 
-    List resources = Lists.newArrayList(pagedListResponse.iterateAllElements());
+    List resources = Lists.newArrayList(pagedListResponse.iterateAll());
     Assert.assertEquals(1, resources.size());
     Assert.assertEquals(expectedResponse.getMembersList().get(0), resources.get(0));
 
diff --git a/google-cloud-monitoring/src/test/java/com/google/cloud/monitoring/spi/v3/MetricServiceClientTest.java b/google-cloud-monitoring/src/test/java/com/google/cloud/monitoring/spi/v3/MetricServiceClientTest.java
index b6d3f705d14a..27bae083fba1 100644
--- a/google-cloud-monitoring/src/test/java/com/google/cloud/monitoring/spi/v3/MetricServiceClientTest.java
+++ b/google-cloud-monitoring/src/test/java/com/google/cloud/monitoring/spi/v3/MetricServiceClientTest.java
@@ -115,7 +115,7 @@ public void listMonitoredResourceDescriptorsTest() {
         client.listMonitoredResourceDescriptors(name);
 
     List resources =
-        Lists.newArrayList(pagedListResponse.iterateAllElements());
+        Lists.newArrayList(pagedListResponse.iterateAll());
     Assert.assertEquals(1, resources.size());
     Assert.assertEquals(expectedResponse.getResourceDescriptorsList().get(0), resources.get(0));
 
@@ -207,7 +207,7 @@ public void listMetricDescriptorsTest() {
 
     ListMetricDescriptorsPagedResponse pagedListResponse = client.listMetricDescriptors(name);
 
-    List resources = Lists.newArrayList(pagedListResponse.iterateAllElements());
+    List resources = Lists.newArrayList(pagedListResponse.iterateAll());
     Assert.assertEquals(1, resources.size());
     Assert.assertEquals(expectedResponse.getMetricDescriptorsList().get(0), resources.get(0));
 
@@ -386,7 +386,7 @@ public void listTimeSeriesTest() {
     ListTimeSeriesPagedResponse pagedListResponse =
         client.listTimeSeries(name, filter, interval, view);
 
-    List resources = Lists.newArrayList(pagedListResponse.iterateAllElements());
+    List resources = Lists.newArrayList(pagedListResponse.iterateAll());
     Assert.assertEquals(1, resources.size());
     Assert.assertEquals(expectedResponse.getTimeSeriesList().get(0), resources.get(0));
 
diff --git a/google-cloud-pubsub/pom.xml b/google-cloud-pubsub/pom.xml
index 466bcc8f216e..ca9b0d7cea99 100644
--- a/google-cloud-pubsub/pom.xml
+++ b/google-cloud-pubsub/pom.xml
@@ -31,7 +31,7 @@
     
       com.google.api.grpc
       grpc-google-cloud-pubsub-v1
-      0.1.6
+      0.1.7
       
         
           io.grpc
diff --git a/google-cloud-pubsub/src/main/java/com/google/cloud/pubsub/spi/v1/PagedResponseWrappers.java b/google-cloud-pubsub/src/main/java/com/google/cloud/pubsub/spi/v1/PagedResponseWrappers.java
index 09a450592ae3..ea39aeae9f91 100644
--- a/google-cloud-pubsub/src/main/java/com/google/cloud/pubsub/spi/v1/PagedResponseWrappers.java
+++ b/google-cloud-pubsub/src/main/java/com/google/cloud/pubsub/spi/v1/PagedResponseWrappers.java
@@ -15,10 +15,13 @@
  */
 package com.google.cloud.pubsub.spi.v1;
 
-import com.google.api.gax.grpc.CallContext;
-import com.google.api.gax.grpc.PagedListDescriptor;
-import com.google.api.gax.grpc.PagedListResponseImpl;
-import com.google.api.gax.grpc.UnaryCallable;
+import com.google.api.gax.core.ApiFunction;
+import com.google.api.gax.core.ApiFuture;
+import com.google.api.gax.core.ApiFutures;
+import com.google.api.gax.grpc.AbstractFixedSizeCollection;
+import com.google.api.gax.grpc.AbstractPage;
+import com.google.api.gax.grpc.AbstractPagedListResponse;
+import com.google.api.gax.grpc.PageContext;
 import com.google.common.base.Function;
 import com.google.common.collect.Iterables;
 import com.google.protobuf.ExperimentalApi;
@@ -34,6 +37,7 @@
 import com.google.pubsub.v1.Subscription;
 import com.google.pubsub.v1.SubscriptionName;
 import com.google.pubsub.v1.Topic;
+import java.util.List;
 import javax.annotation.Generated;
 
 // AUTO-GENERATED DOCUMENTATION AND CLASS
@@ -47,33 +51,189 @@
 public class PagedResponseWrappers {
 
   public static class ListTopicsPagedResponse
-      extends PagedListResponseImpl {
+      extends AbstractPagedListResponse<
+          ListTopicsRequest, ListTopicsResponse, Topic, ListTopicsPage,
+          ListTopicsFixedSizeCollection> {
 
-    public ListTopicsPagedResponse(
-        UnaryCallable callable,
-        PagedListDescriptor pageDescriptor,
-        ListTopicsRequest request,
-        CallContext context) {
-      super(callable, pageDescriptor, request, context);
+    public static ApiFuture createAsync(
+        PageContext context,
+        ApiFuture futureResponse) {
+      ApiFuture futurePage =
+          ListTopicsPage.createEmptyPage().createPageAsync(context, futureResponse);
+      return ApiFutures.transform(
+          futurePage,
+          new ApiFunction() {
+            @Override
+            public ListTopicsPagedResponse apply(ListTopicsPage input) {
+              return new ListTopicsPagedResponse(input);
+            }
+          });
+    }
+
+    private ListTopicsPagedResponse(ListTopicsPage page) {
+      super(page, ListTopicsFixedSizeCollection.createEmptyCollection());
+    }
+  }
+
+  public static class ListTopicsPage
+      extends AbstractPage {
+
+    private ListTopicsPage(
+        PageContext context,
+        ListTopicsResponse response) {
+      super(context, response);
+    }
+
+    private static ListTopicsPage createEmptyPage() {
+      return new ListTopicsPage(null, null);
+    }
+
+    @Override
+    protected ListTopicsPage createPage(
+        PageContext context,
+        ListTopicsResponse response) {
+      return new ListTopicsPage(context, response);
+    }
+
+    @Override
+    protected ApiFuture createPageAsync(
+        PageContext context,
+        ApiFuture futureResponse) {
+      return super.createPageAsync(context, futureResponse);
+    }
+  }
+
+  public static class ListTopicsFixedSizeCollection
+      extends AbstractFixedSizeCollection<
+          ListTopicsRequest, ListTopicsResponse, Topic, ListTopicsPage,
+          ListTopicsFixedSizeCollection> {
+
+    private ListTopicsFixedSizeCollection(List pages, int collectionSize) {
+      super(pages, collectionSize);
+    }
+
+    private static ListTopicsFixedSizeCollection createEmptyCollection() {
+      return new ListTopicsFixedSizeCollection(null, 0);
+    }
+
+    @Override
+    protected ListTopicsFixedSizeCollection createCollection(
+        List pages, int collectionSize) {
+      return new ListTopicsFixedSizeCollection(pages, collectionSize);
     }
   }
 
   public static class ListTopicSubscriptionsPagedResponse
-      extends PagedListResponseImpl<
-          ListTopicSubscriptionsRequest, ListTopicSubscriptionsResponse, String> {
+      extends AbstractPagedListResponse<
+          ListTopicSubscriptionsRequest, ListTopicSubscriptionsResponse, String,
+          ListTopicSubscriptionsPage, ListTopicSubscriptionsFixedSizeCollection> {
 
-    public ListTopicSubscriptionsPagedResponse(
-        UnaryCallable callable,
-        PagedListDescriptor
-            pageDescriptor,
-        ListTopicSubscriptionsRequest request,
-        CallContext context) {
-      super(callable, pageDescriptor, request, context);
+    public static ApiFuture createAsync(
+        PageContext context,
+        ApiFuture futureResponse) {
+      ApiFuture futurePage =
+          ListTopicSubscriptionsPage.createEmptyPage().createPageAsync(context, futureResponse);
+      return ApiFutures.transform(
+          futurePage,
+          new ApiFunction() {
+            @Override
+            public ListTopicSubscriptionsPagedResponse apply(ListTopicSubscriptionsPage input) {
+              return new ListTopicSubscriptionsPagedResponse(input);
+            }
+          });
+    }
+
+    private ListTopicSubscriptionsPagedResponse(ListTopicSubscriptionsPage page) {
+      super(page, ListTopicSubscriptionsFixedSizeCollection.createEmptyCollection());
     }
 
     public Iterable iterateAllAsSubscriptionName() {
       return Iterables.transform(
-          iterateAllElements(),
+          iterateAll(),
+          new Function() {
+            @Override
+            public SubscriptionName apply(String arg0) {
+              return SubscriptionName.parse(arg0);
+            }
+          });
+    }
+  }
+
+  public static class ListTopicSubscriptionsPage
+      extends AbstractPage<
+          ListTopicSubscriptionsRequest, ListTopicSubscriptionsResponse, String,
+          ListTopicSubscriptionsPage> {
+
+    private ListTopicSubscriptionsPage(
+        PageContext context,
+        ListTopicSubscriptionsResponse response) {
+      super(context, response);
+    }
+
+    private static ListTopicSubscriptionsPage createEmptyPage() {
+      return new ListTopicSubscriptionsPage(null, null);
+    }
+
+    @Override
+    protected ListTopicSubscriptionsPage createPage(
+        PageContext context,
+        ListTopicSubscriptionsResponse response) {
+      return new ListTopicSubscriptionsPage(context, response);
+    }
+
+    @Override
+    protected ApiFuture createPageAsync(
+        PageContext context,
+        ApiFuture futureResponse) {
+      return super.createPageAsync(context, futureResponse);
+    }
+
+    public Iterable iterateAllAsSubscriptionName() {
+      return Iterables.transform(
+          iterateAll(),
+          new Function() {
+            @Override
+            public SubscriptionName apply(String arg0) {
+              return SubscriptionName.parse(arg0);
+            }
+          });
+    }
+
+    public Iterable getValuesAsSubscriptionName() {
+      return Iterables.transform(
+          getValues(),
+          new Function() {
+            @Override
+            public SubscriptionName apply(String arg0) {
+              return SubscriptionName.parse(arg0);
+            }
+          });
+    }
+  }
+
+  public static class ListTopicSubscriptionsFixedSizeCollection
+      extends AbstractFixedSizeCollection<
+          ListTopicSubscriptionsRequest, ListTopicSubscriptionsResponse, String,
+          ListTopicSubscriptionsPage, ListTopicSubscriptionsFixedSizeCollection> {
+
+    private ListTopicSubscriptionsFixedSizeCollection(
+        List pages, int collectionSize) {
+      super(pages, collectionSize);
+    }
+
+    private static ListTopicSubscriptionsFixedSizeCollection createEmptyCollection() {
+      return new ListTopicSubscriptionsFixedSizeCollection(null, 0);
+    }
+
+    @Override
+    protected ListTopicSubscriptionsFixedSizeCollection createCollection(
+        List pages, int collectionSize) {
+      return new ListTopicSubscriptionsFixedSizeCollection(pages, collectionSize);
+    }
+
+    public Iterable getValuesAsSubscriptionName() {
+      return Iterables.transform(
+          getValues(),
           new Function() {
             @Override
             public SubscriptionName apply(String arg0) {
@@ -84,28 +244,152 @@ public SubscriptionName apply(String arg0) {
   }
 
   public static class ListSubscriptionsPagedResponse
-      extends PagedListResponseImpl<
-          ListSubscriptionsRequest, ListSubscriptionsResponse, Subscription> {
+      extends AbstractPagedListResponse<
+          ListSubscriptionsRequest, ListSubscriptionsResponse, Subscription, ListSubscriptionsPage,
+          ListSubscriptionsFixedSizeCollection> {
+
+    public static ApiFuture createAsync(
+        PageContext context,
+        ApiFuture futureResponse) {
+      ApiFuture futurePage =
+          ListSubscriptionsPage.createEmptyPage().createPageAsync(context, futureResponse);
+      return ApiFutures.transform(
+          futurePage,
+          new ApiFunction() {
+            @Override
+            public ListSubscriptionsPagedResponse apply(ListSubscriptionsPage input) {
+              return new ListSubscriptionsPagedResponse(input);
+            }
+          });
+    }
+
+    private ListSubscriptionsPagedResponse(ListSubscriptionsPage page) {
+      super(page, ListSubscriptionsFixedSizeCollection.createEmptyCollection());
+    }
+  }
+
+  public static class ListSubscriptionsPage
+      extends AbstractPage<
+          ListSubscriptionsRequest, ListSubscriptionsResponse, Subscription,
+          ListSubscriptionsPage> {
+
+    private ListSubscriptionsPage(
+        PageContext context,
+        ListSubscriptionsResponse response) {
+      super(context, response);
+    }
+
+    private static ListSubscriptionsPage createEmptyPage() {
+      return new ListSubscriptionsPage(null, null);
+    }
+
+    @Override
+    protected ListSubscriptionsPage createPage(
+        PageContext context,
+        ListSubscriptionsResponse response) {
+      return new ListSubscriptionsPage(context, response);
+    }
+
+    @Override
+    protected ApiFuture createPageAsync(
+        PageContext context,
+        ApiFuture futureResponse) {
+      return super.createPageAsync(context, futureResponse);
+    }
+  }
+
+  public static class ListSubscriptionsFixedSizeCollection
+      extends AbstractFixedSizeCollection<
+          ListSubscriptionsRequest, ListSubscriptionsResponse, Subscription, ListSubscriptionsPage,
+          ListSubscriptionsFixedSizeCollection> {
+
+    private ListSubscriptionsFixedSizeCollection(
+        List pages, int collectionSize) {
+      super(pages, collectionSize);
+    }
 
-    public ListSubscriptionsPagedResponse(
-        UnaryCallable callable,
-        PagedListDescriptor
-            pageDescriptor,
-        ListSubscriptionsRequest request,
-        CallContext context) {
-      super(callable, pageDescriptor, request, context);
+    private static ListSubscriptionsFixedSizeCollection createEmptyCollection() {
+      return new ListSubscriptionsFixedSizeCollection(null, 0);
+    }
+
+    @Override
+    protected ListSubscriptionsFixedSizeCollection createCollection(
+        List pages, int collectionSize) {
+      return new ListSubscriptionsFixedSizeCollection(pages, collectionSize);
     }
   }
 
   public static class ListSnapshotsPagedResponse
-      extends PagedListResponseImpl {
-
-    public ListSnapshotsPagedResponse(
-        UnaryCallable callable,
-        PagedListDescriptor pageDescriptor,
-        ListSnapshotsRequest request,
-        CallContext context) {
-      super(callable, pageDescriptor, request, context);
+      extends AbstractPagedListResponse<
+          ListSnapshotsRequest, ListSnapshotsResponse, Snapshot, ListSnapshotsPage,
+          ListSnapshotsFixedSizeCollection> {
+
+    public static ApiFuture createAsync(
+        PageContext context,
+        ApiFuture futureResponse) {
+      ApiFuture futurePage =
+          ListSnapshotsPage.createEmptyPage().createPageAsync(context, futureResponse);
+      return ApiFutures.transform(
+          futurePage,
+          new ApiFunction() {
+            @Override
+            public ListSnapshotsPagedResponse apply(ListSnapshotsPage input) {
+              return new ListSnapshotsPagedResponse(input);
+            }
+          });
+    }
+
+    private ListSnapshotsPagedResponse(ListSnapshotsPage page) {
+      super(page, ListSnapshotsFixedSizeCollection.createEmptyCollection());
+    }
+  }
+
+  public static class ListSnapshotsPage
+      extends AbstractPage<
+          ListSnapshotsRequest, ListSnapshotsResponse, Snapshot, ListSnapshotsPage> {
+
+    private ListSnapshotsPage(
+        PageContext context,
+        ListSnapshotsResponse response) {
+      super(context, response);
+    }
+
+    private static ListSnapshotsPage createEmptyPage() {
+      return new ListSnapshotsPage(null, null);
+    }
+
+    @Override
+    protected ListSnapshotsPage createPage(
+        PageContext context,
+        ListSnapshotsResponse response) {
+      return new ListSnapshotsPage(context, response);
+    }
+
+    @Override
+    protected ApiFuture createPageAsync(
+        PageContext context,
+        ApiFuture futureResponse) {
+      return super.createPageAsync(context, futureResponse);
+    }
+  }
+
+  public static class ListSnapshotsFixedSizeCollection
+      extends AbstractFixedSizeCollection<
+          ListSnapshotsRequest, ListSnapshotsResponse, Snapshot, ListSnapshotsPage,
+          ListSnapshotsFixedSizeCollection> {
+
+    private ListSnapshotsFixedSizeCollection(List pages, int collectionSize) {
+      super(pages, collectionSize);
+    }
+
+    private static ListSnapshotsFixedSizeCollection createEmptyCollection() {
+      return new ListSnapshotsFixedSizeCollection(null, 0);
+    }
+
+    @Override
+    protected ListSnapshotsFixedSizeCollection createCollection(
+        List pages, int collectionSize) {
+      return new ListSnapshotsFixedSizeCollection(pages, collectionSize);
     }
   }
 }
diff --git a/google-cloud-pubsub/src/main/java/com/google/cloud/pubsub/spi/v1/SubscriptionAdminClient.java b/google-cloud-pubsub/src/main/java/com/google/cloud/pubsub/spi/v1/SubscriptionAdminClient.java
index 531dfc99fa88..2b5e95ad2695 100644
--- a/google-cloud-pubsub/src/main/java/com/google/cloud/pubsub/spi/v1/SubscriptionAdminClient.java
+++ b/google-cloud-pubsub/src/main/java/com/google/cloud/pubsub/spi/v1/SubscriptionAdminClient.java
@@ -502,7 +502,7 @@ public final UnaryCallable getSubscription
    * 

    * try (SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create()) {
    *   ProjectName project = ProjectName.create("[PROJECT]");
-   *   for (Subscription element : subscriptionAdminClient.listSubscriptions(project).iterateAllElements()) {
+   *   for (Subscription element : subscriptionAdminClient.listSubscriptions(project).iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -530,7 +530,7 @@ public final ListSubscriptionsPagedResponse listSubscriptions(ProjectName projec
    *   ListSubscriptionsRequest request = ListSubscriptionsRequest.newBuilder()
    *     .setProjectWithProjectName(project)
    *     .build();
-   *   for (Subscription element : subscriptionAdminClient.listSubscriptions(request).iterateAllElements()) {
+   *   for (Subscription element : subscriptionAdminClient.listSubscriptions(request).iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -557,7 +557,7 @@ public final ListSubscriptionsPagedResponse listSubscriptions(ListSubscriptionsR
    *     .build();
    *   ApiFuture<ListSubscriptionsPagedResponse> future = subscriptionAdminClient.listSubscriptionsPagedCallable().futureCall(request);
    *   // Do something
-   *   for (Subscription element : future.get().iterateAllElements()) {
+   *   for (Subscription element : future.get().iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -1122,7 +1122,7 @@ public final UnaryCallable modifyPushConfigCalla
    * 

    * try (SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create()) {
    *   ProjectName project = ProjectName.create("[PROJECT]");
-   *   for (Snapshot element : subscriptionAdminClient.listSnapshots(project).iterateAllElements()) {
+   *   for (Snapshot element : subscriptionAdminClient.listSnapshots(project).iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -1150,7 +1150,7 @@ public final ListSnapshotsPagedResponse listSnapshots(ProjectName project) {
    *   ListSnapshotsRequest request = ListSnapshotsRequest.newBuilder()
    *     .setProjectWithProjectName(project)
    *     .build();
-   *   for (Snapshot element : subscriptionAdminClient.listSnapshots(request).iterateAllElements()) {
+   *   for (Snapshot element : subscriptionAdminClient.listSnapshots(request).iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -1177,7 +1177,7 @@ public final ListSnapshotsPagedResponse listSnapshots(ListSnapshotsRequest reque
    *     .build();
    *   ApiFuture<ListSnapshotsPagedResponse> future = subscriptionAdminClient.listSnapshotsPagedCallable().futureCall(request);
    *   // Do something
-   *   for (Snapshot element : future.get().iterateAllElements()) {
+   *   for (Snapshot element : future.get().iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
diff --git a/google-cloud-pubsub/src/main/java/com/google/cloud/pubsub/spi/v1/SubscriptionAdminSettings.java b/google-cloud-pubsub/src/main/java/com/google/cloud/pubsub/spi/v1/SubscriptionAdminSettings.java
index f28ca0cb58ef..3b077b6a8413 100644
--- a/google-cloud-pubsub/src/main/java/com/google/cloud/pubsub/spi/v1/SubscriptionAdminSettings.java
+++ b/google-cloud-pubsub/src/main/java/com/google/cloud/pubsub/spi/v1/SubscriptionAdminSettings.java
@@ -18,6 +18,7 @@
 import static com.google.cloud.pubsub.spi.v1.PagedResponseWrappers.ListSnapshotsPagedResponse;
 import static com.google.cloud.pubsub.spi.v1.PagedResponseWrappers.ListSubscriptionsPagedResponse;
 
+import com.google.api.gax.core.ApiFuture;
 import com.google.api.gax.core.GoogleCredentialsProvider;
 import com.google.api.gax.core.PropertiesProvider;
 import com.google.api.gax.core.RetrySettings;
@@ -27,6 +28,7 @@
 import com.google.api.gax.grpc.ExecutorProvider;
 import com.google.api.gax.grpc.InstantiatingChannelProvider;
 import com.google.api.gax.grpc.InstantiatingExecutorProvider;
+import com.google.api.gax.grpc.PageContext;
 import com.google.api.gax.grpc.PagedCallSettings;
 import com.google.api.gax.grpc.PagedListDescriptor;
 import com.google.api.gax.grpc.PagedListResponseFactory;
@@ -313,16 +315,14 @@ private SubscriptionAdminSettings(Builder settingsBuilder) throws IOException {
           new PagedListDescriptor<
               ListSubscriptionsRequest, ListSubscriptionsResponse, Subscription>() {
             @Override
-            public Object emptyToken() {
+            public String emptyToken() {
               return "";
             }
 
             @Override
             public ListSubscriptionsRequest injectToken(
-                ListSubscriptionsRequest payload, Object token) {
-              return ListSubscriptionsRequest.newBuilder(payload)
-                  .setPageToken((String) token)
-                  .build();
+                ListSubscriptionsRequest payload, String token) {
+              return ListSubscriptionsRequest.newBuilder(payload).setPageToken(token).build();
             }
 
             @Override
@@ -337,7 +337,7 @@ public Integer extractPageSize(ListSubscriptionsRequest payload) {
             }
 
             @Override
-            public Object extractNextToken(ListSubscriptionsResponse payload) {
+            public String extractNextToken(ListSubscriptionsResponse payload) {
               return payload.getNextPageToken();
             }
 
@@ -351,13 +351,13 @@ public Iterable extractResources(ListSubscriptionsResponse payload
       LIST_SNAPSHOTS_PAGE_STR_DESC =
           new PagedListDescriptor() {
             @Override
-            public Object emptyToken() {
+            public String emptyToken() {
               return "";
             }
 
             @Override
-            public ListSnapshotsRequest injectToken(ListSnapshotsRequest payload, Object token) {
-              return ListSnapshotsRequest.newBuilder(payload).setPageToken((String) token).build();
+            public ListSnapshotsRequest injectToken(ListSnapshotsRequest payload, String token) {
+              return ListSnapshotsRequest.newBuilder(payload).setPageToken(token).build();
             }
 
             @Override
@@ -371,7 +371,7 @@ public Integer extractPageSize(ListSnapshotsRequest payload) {
             }
 
             @Override
-            public Object extractNextToken(ListSnapshotsResponse payload) {
+            public String extractNextToken(ListSnapshotsResponse payload) {
               return payload.getNextPageToken();
             }
 
@@ -388,12 +388,16 @@ public Iterable extractResources(ListSnapshotsResponse payload) {
               ListSubscriptionsRequest, ListSubscriptionsResponse,
               ListSubscriptionsPagedResponse>() {
             @Override
-            public ListSubscriptionsPagedResponse createPagedListResponse(
+            public ApiFuture getFuturePagedResponse(
                 UnaryCallable callable,
                 ListSubscriptionsRequest request,
-                CallContext context) {
-              return new ListSubscriptionsPagedResponse(
-                  callable, LIST_SUBSCRIPTIONS_PAGE_STR_DESC, request, context);
+                CallContext context,
+                ApiFuture futureResponse) {
+              PageContext
+                  pageContext =
+                      PageContext.create(
+                          callable, LIST_SUBSCRIPTIONS_PAGE_STR_DESC, request, context);
+              return ListSubscriptionsPagedResponse.createAsync(pageContext, futureResponse);
             }
           };
 
@@ -403,12 +407,14 @@ public ListSubscriptionsPagedResponse createPagedListResponse(
           new PagedListResponseFactory<
               ListSnapshotsRequest, ListSnapshotsResponse, ListSnapshotsPagedResponse>() {
             @Override
-            public ListSnapshotsPagedResponse createPagedListResponse(
+            public ApiFuture getFuturePagedResponse(
                 UnaryCallable callable,
                 ListSnapshotsRequest request,
-                CallContext context) {
-              return new ListSnapshotsPagedResponse(
-                  callable, LIST_SNAPSHOTS_PAGE_STR_DESC, request, context);
+                CallContext context,
+                ApiFuture futureResponse) {
+              PageContext pageContext =
+                  PageContext.create(callable, LIST_SNAPSHOTS_PAGE_STR_DESC, request, context);
+              return ListSnapshotsPagedResponse.createAsync(pageContext, futureResponse);
             }
           };
 
diff --git a/google-cloud-pubsub/src/main/java/com/google/cloud/pubsub/spi/v1/TopicAdminClient.java b/google-cloud-pubsub/src/main/java/com/google/cloud/pubsub/spi/v1/TopicAdminClient.java
index 5212f2844096..afb42f4bbfda 100644
--- a/google-cloud-pubsub/src/main/java/com/google/cloud/pubsub/spi/v1/TopicAdminClient.java
+++ b/google-cloud-pubsub/src/main/java/com/google/cloud/pubsub/spi/v1/TopicAdminClient.java
@@ -442,7 +442,7 @@ public final UnaryCallable getTopicCallable() {
    * 

    * try (TopicAdminClient topicAdminClient = TopicAdminClient.create()) {
    *   ProjectName project = ProjectName.create("[PROJECT]");
-   *   for (Topic element : topicAdminClient.listTopics(project).iterateAllElements()) {
+   *   for (Topic element : topicAdminClient.listTopics(project).iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -470,7 +470,7 @@ public final ListTopicsPagedResponse listTopics(ProjectName project) {
    *   ListTopicsRequest request = ListTopicsRequest.newBuilder()
    *     .setProjectWithProjectName(project)
    *     .build();
-   *   for (Topic element : topicAdminClient.listTopics(request).iterateAllElements()) {
+   *   for (Topic element : topicAdminClient.listTopics(request).iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -497,7 +497,7 @@ public final ListTopicsPagedResponse listTopics(ListTopicsRequest request) {
    *     .build();
    *   ApiFuture<ListTopicsPagedResponse> future = topicAdminClient.listTopicsPagedCallable().futureCall(request);
    *   // Do something
-   *   for (Topic element : future.get().iterateAllElements()) {
+   *   for (Topic element : future.get().iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
diff --git a/google-cloud-pubsub/src/main/java/com/google/cloud/pubsub/spi/v1/TopicAdminSettings.java b/google-cloud-pubsub/src/main/java/com/google/cloud/pubsub/spi/v1/TopicAdminSettings.java
index 9a98247b0985..d868b8d601f8 100644
--- a/google-cloud-pubsub/src/main/java/com/google/cloud/pubsub/spi/v1/TopicAdminSettings.java
+++ b/google-cloud-pubsub/src/main/java/com/google/cloud/pubsub/spi/v1/TopicAdminSettings.java
@@ -21,6 +21,7 @@
 import com.google.api.gax.batching.BatchingSettings;
 import com.google.api.gax.batching.PartitionKey;
 import com.google.api.gax.batching.RequestBuilder;
+import com.google.api.gax.core.ApiFuture;
 import com.google.api.gax.core.FlowControlSettings;
 import com.google.api.gax.core.FlowController.LimitExceededBehavior;
 import com.google.api.gax.core.GoogleCredentialsProvider;
@@ -35,6 +36,7 @@
 import com.google.api.gax.grpc.ExecutorProvider;
 import com.google.api.gax.grpc.InstantiatingChannelProvider;
 import com.google.api.gax.grpc.InstantiatingExecutorProvider;
+import com.google.api.gax.grpc.PageContext;
 import com.google.api.gax.grpc.PagedCallSettings;
 import com.google.api.gax.grpc.PagedListDescriptor;
 import com.google.api.gax.grpc.PagedListResponseFactory;
@@ -252,13 +254,13 @@ private TopicAdminSettings(Builder settingsBuilder) throws IOException {
       LIST_TOPICS_PAGE_STR_DESC =
           new PagedListDescriptor() {
             @Override
-            public Object emptyToken() {
+            public String emptyToken() {
               return "";
             }
 
             @Override
-            public ListTopicsRequest injectToken(ListTopicsRequest payload, Object token) {
-              return ListTopicsRequest.newBuilder(payload).setPageToken((String) token).build();
+            public ListTopicsRequest injectToken(ListTopicsRequest payload, String token) {
+              return ListTopicsRequest.newBuilder(payload).setPageToken(token).build();
             }
 
             @Override
@@ -272,7 +274,7 @@ public Integer extractPageSize(ListTopicsRequest payload) {
             }
 
             @Override
-            public Object extractNextToken(ListTopicsResponse payload) {
+            public String extractNextToken(ListTopicsResponse payload) {
               return payload.getNextPageToken();
             }
 
@@ -288,16 +290,14 @@ public Iterable extractResources(ListTopicsResponse payload) {
           new PagedListDescriptor<
               ListTopicSubscriptionsRequest, ListTopicSubscriptionsResponse, String>() {
             @Override
-            public Object emptyToken() {
+            public String emptyToken() {
               return "";
             }
 
             @Override
             public ListTopicSubscriptionsRequest injectToken(
-                ListTopicSubscriptionsRequest payload, Object token) {
-              return ListTopicSubscriptionsRequest.newBuilder(payload)
-                  .setPageToken((String) token)
-                  .build();
+                ListTopicSubscriptionsRequest payload, String token) {
+              return ListTopicSubscriptionsRequest.newBuilder(payload).setPageToken(token).build();
             }
 
             @Override
@@ -314,7 +314,7 @@ public Integer extractPageSize(ListTopicSubscriptionsRequest payload) {
             }
 
             @Override
-            public Object extractNextToken(ListTopicSubscriptionsResponse payload) {
+            public String extractNextToken(ListTopicSubscriptionsResponse payload) {
               return payload.getNextPageToken();
             }
 
@@ -330,12 +330,14 @@ public Iterable extractResources(ListTopicSubscriptionsResponse payload)
           new PagedListResponseFactory<
               ListTopicsRequest, ListTopicsResponse, ListTopicsPagedResponse>() {
             @Override
-            public ListTopicsPagedResponse createPagedListResponse(
+            public ApiFuture getFuturePagedResponse(
                 UnaryCallable callable,
                 ListTopicsRequest request,
-                CallContext context) {
-              return new ListTopicsPagedResponse(
-                  callable, LIST_TOPICS_PAGE_STR_DESC, request, context);
+                CallContext context,
+                ApiFuture futureResponse) {
+              PageContext pageContext =
+                  PageContext.create(callable, LIST_TOPICS_PAGE_STR_DESC, request, context);
+              return ListTopicsPagedResponse.createAsync(pageContext, futureResponse);
             }
           };
 
@@ -347,13 +349,17 @@ public ListTopicsPagedResponse createPagedListResponse(
               ListTopicSubscriptionsRequest, ListTopicSubscriptionsResponse,
               ListTopicSubscriptionsPagedResponse>() {
             @Override
-            public ListTopicSubscriptionsPagedResponse createPagedListResponse(
+            public ApiFuture getFuturePagedResponse(
                 UnaryCallable
                     callable,
                 ListTopicSubscriptionsRequest request,
-                CallContext context) {
-              return new ListTopicSubscriptionsPagedResponse(
-                  callable, LIST_TOPIC_SUBSCRIPTIONS_PAGE_STR_DESC, request, context);
+                CallContext context,
+                ApiFuture futureResponse) {
+              PageContext
+                  pageContext =
+                      PageContext.create(
+                          callable, LIST_TOPIC_SUBSCRIPTIONS_PAGE_STR_DESC, request, context);
+              return ListTopicSubscriptionsPagedResponse.createAsync(pageContext, futureResponse);
             }
           };
 
diff --git a/google-cloud-pubsub/src/test/java/com/google/cloud/pubsub/spi/v1/SubscriptionAdminClientTest.java b/google-cloud-pubsub/src/test/java/com/google/cloud/pubsub/spi/v1/SubscriptionAdminClientTest.java
index 8a7705e3ae87..eb2f7b13599e 100644
--- a/google-cloud-pubsub/src/test/java/com/google/cloud/pubsub/spi/v1/SubscriptionAdminClientTest.java
+++ b/google-cloud-pubsub/src/test/java/com/google/cloud/pubsub/spi/v1/SubscriptionAdminClientTest.java
@@ -225,7 +225,7 @@ public void listSubscriptionsTest() {
 
     ListSubscriptionsPagedResponse pagedListResponse = client.listSubscriptions(project);
 
-    List resources = Lists.newArrayList(pagedListResponse.iterateAllElements());
+    List resources = Lists.newArrayList(pagedListResponse.iterateAll());
     Assert.assertEquals(1, resources.size());
     Assert.assertEquals(expectedResponse.getSubscriptionsList().get(0), resources.get(0));
 
@@ -513,7 +513,7 @@ public void listSnapshotsTest() {
 
     ListSnapshotsPagedResponse pagedListResponse = client.listSnapshots(project);
 
-    List resources = Lists.newArrayList(pagedListResponse.iterateAllElements());
+    List resources = Lists.newArrayList(pagedListResponse.iterateAll());
     Assert.assertEquals(1, resources.size());
     Assert.assertEquals(expectedResponse.getSnapshotsList().get(0), resources.get(0));
 
diff --git a/google-cloud-pubsub/src/test/java/com/google/cloud/pubsub/spi/v1/TopicAdminClientTest.java b/google-cloud-pubsub/src/test/java/com/google/cloud/pubsub/spi/v1/TopicAdminClientTest.java
index 37bf7498f740..8db6bc9800a3 100644
--- a/google-cloud-pubsub/src/test/java/com/google/cloud/pubsub/spi/v1/TopicAdminClientTest.java
+++ b/google-cloud-pubsub/src/test/java/com/google/cloud/pubsub/spi/v1/TopicAdminClientTest.java
@@ -227,7 +227,7 @@ public void listTopicsTest() {
 
     ListTopicsPagedResponse pagedListResponse = client.listTopics(project);
 
-    List resources = Lists.newArrayList(pagedListResponse.iterateAllElements());
+    List resources = Lists.newArrayList(pagedListResponse.iterateAll());
     Assert.assertEquals(1, resources.size());
     Assert.assertEquals(expectedResponse.getTopicsList().get(0), resources.get(0));
 
@@ -271,7 +271,7 @@ public void listTopicSubscriptionsTest() {
 
     ListTopicSubscriptionsPagedResponse pagedListResponse = client.listTopicSubscriptions(topic);
 
-    List resources = Lists.newArrayList(pagedListResponse.iterateAllElements());
+    List resources = Lists.newArrayList(pagedListResponse.iterateAll());
     Assert.assertEquals(1, resources.size());
     Assert.assertEquals(expectedResponse.getSubscriptionsList().get(0), resources.get(0));
     List resourceNames =
diff --git a/google-cloud-spanner/pom.xml b/google-cloud-spanner/pom.xml
index d05c9020f9cb..6337b3321af4 100644
--- a/google-cloud-spanner/pom.xml
+++ b/google-cloud-spanner/pom.xml
@@ -81,7 +81,7 @@
     
       com.google.api.grpc
       grpc-google-cloud-spanner-v1
-      0.1.5
+      0.1.7
       
         
           io.grpc
@@ -92,7 +92,7 @@
     
       com.google.api.grpc
       grpc-google-cloud-spanner-admin-database-v1
-      0.1.5
+      0.1.7
       
         
           io.grpc
@@ -103,7 +103,7 @@
     
       com.google.api.grpc
       grpc-google-cloud-spanner-admin-instance-v1
-      0.1.5
+      0.1.7
       
         
           io.grpc
diff --git a/google-cloud-speech/pom.xml b/google-cloud-speech/pom.xml
index 071e68a12da3..4ce41e7fda3b 100644
--- a/google-cloud-speech/pom.xml
+++ b/google-cloud-speech/pom.xml
@@ -31,7 +31,7 @@
     
       com.google.api.grpc
       grpc-google-cloud-speech-v1beta1
-      0.1.5
+      0.1.7
       
         
           io.grpc
@@ -42,7 +42,7 @@
     
       com.google.api.grpc
       grpc-google-cloud-speech-v1
-      0.1.6
+      0.1.7
       
         
           io.grpc
diff --git a/google-cloud-trace/pom.xml b/google-cloud-trace/pom.xml
index 38927afaf265..c4f0f0ec4cec 100644
--- a/google-cloud-trace/pom.xml
+++ b/google-cloud-trace/pom.xml
@@ -31,7 +31,7 @@
     
       com.google.api.grpc
       grpc-google-cloud-trace-v1
-      0.1.5
+      0.1.7
       
         
           io.grpc
diff --git a/google-cloud-trace/src/main/java/com/google/cloud/trace/spi/v1/PagedResponseWrappers.java b/google-cloud-trace/src/main/java/com/google/cloud/trace/spi/v1/PagedResponseWrappers.java
index 0b51f402e6fc..a4f0e49bfd0a 100644
--- a/google-cloud-trace/src/main/java/com/google/cloud/trace/spi/v1/PagedResponseWrappers.java
+++ b/google-cloud-trace/src/main/java/com/google/cloud/trace/spi/v1/PagedResponseWrappers.java
@@ -15,14 +15,18 @@
  */
 package com.google.cloud.trace.spi.v1;
 
-import com.google.api.gax.grpc.CallContext;
-import com.google.api.gax.grpc.PagedListDescriptor;
-import com.google.api.gax.grpc.PagedListResponseImpl;
-import com.google.api.gax.grpc.UnaryCallable;
+import com.google.api.gax.core.ApiFunction;
+import com.google.api.gax.core.ApiFuture;
+import com.google.api.gax.core.ApiFutures;
+import com.google.api.gax.grpc.AbstractFixedSizeCollection;
+import com.google.api.gax.grpc.AbstractPage;
+import com.google.api.gax.grpc.AbstractPagedListResponse;
+import com.google.api.gax.grpc.PageContext;
 import com.google.devtools.cloudtrace.v1.ListTracesRequest;
 import com.google.devtools.cloudtrace.v1.ListTracesResponse;
 import com.google.devtools.cloudtrace.v1.Trace;
 import com.google.protobuf.ExperimentalApi;
+import java.util.List;
 import javax.annotation.Generated;
 
 // AUTO-GENERATED DOCUMENTATION AND CLASS
@@ -36,14 +40,75 @@
 public class PagedResponseWrappers {
 
   public static class ListTracesPagedResponse
-      extends PagedListResponseImpl {
-
-    public ListTracesPagedResponse(
-        UnaryCallable callable,
-        PagedListDescriptor pageDescriptor,
-        ListTracesRequest request,
-        CallContext context) {
-      super(callable, pageDescriptor, request, context);
+      extends AbstractPagedListResponse<
+          ListTracesRequest, ListTracesResponse, Trace, ListTracesPage,
+          ListTracesFixedSizeCollection> {
+
+    public static ApiFuture createAsync(
+        PageContext context,
+        ApiFuture futureResponse) {
+      ApiFuture futurePage =
+          ListTracesPage.createEmptyPage().createPageAsync(context, futureResponse);
+      return ApiFutures.transform(
+          futurePage,
+          new ApiFunction() {
+            @Override
+            public ListTracesPagedResponse apply(ListTracesPage input) {
+              return new ListTracesPagedResponse(input);
+            }
+          });
+    }
+
+    private ListTracesPagedResponse(ListTracesPage page) {
+      super(page, ListTracesFixedSizeCollection.createEmptyCollection());
+    }
+  }
+
+  public static class ListTracesPage
+      extends AbstractPage {
+
+    private ListTracesPage(
+        PageContext context,
+        ListTracesResponse response) {
+      super(context, response);
+    }
+
+    private static ListTracesPage createEmptyPage() {
+      return new ListTracesPage(null, null);
+    }
+
+    @Override
+    protected ListTracesPage createPage(
+        PageContext context,
+        ListTracesResponse response) {
+      return new ListTracesPage(context, response);
+    }
+
+    @Override
+    protected ApiFuture createPageAsync(
+        PageContext context,
+        ApiFuture futureResponse) {
+      return super.createPageAsync(context, futureResponse);
+    }
+  }
+
+  public static class ListTracesFixedSizeCollection
+      extends AbstractFixedSizeCollection<
+          ListTracesRequest, ListTracesResponse, Trace, ListTracesPage,
+          ListTracesFixedSizeCollection> {
+
+    private ListTracesFixedSizeCollection(List pages, int collectionSize) {
+      super(pages, collectionSize);
+    }
+
+    private static ListTracesFixedSizeCollection createEmptyCollection() {
+      return new ListTracesFixedSizeCollection(null, 0);
+    }
+
+    @Override
+    protected ListTracesFixedSizeCollection createCollection(
+        List pages, int collectionSize) {
+      return new ListTracesFixedSizeCollection(pages, collectionSize);
     }
   }
 }
diff --git a/google-cloud-trace/src/main/java/com/google/cloud/trace/spi/v1/TraceServiceClient.java b/google-cloud-trace/src/main/java/com/google/cloud/trace/spi/v1/TraceServiceClient.java
index a829e434920a..71f7c329e3a7 100644
--- a/google-cloud-trace/src/main/java/com/google/cloud/trace/spi/v1/TraceServiceClient.java
+++ b/google-cloud-trace/src/main/java/com/google/cloud/trace/spi/v1/TraceServiceClient.java
@@ -330,7 +330,7 @@ public final UnaryCallable getTraceCallable() {
    * 

    * try (TraceServiceClient traceServiceClient = TraceServiceClient.create()) {
    *   String projectId = "";
-   *   for (Trace element : traceServiceClient.listTraces(projectId).iterateAllElements()) {
+   *   for (Trace element : traceServiceClient.listTraces(projectId).iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -356,7 +356,7 @@ public final ListTracesPagedResponse listTraces(String projectId) {
    *   ListTracesRequest request = ListTracesRequest.newBuilder()
    *     .setProjectId(projectId)
    *     .build();
-   *   for (Trace element : traceServiceClient.listTraces(request).iterateAllElements()) {
+   *   for (Trace element : traceServiceClient.listTraces(request).iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
@@ -383,7 +383,7 @@ public final ListTracesPagedResponse listTraces(ListTracesRequest request) {
    *     .build();
    *   ApiFuture<ListTracesPagedResponse> future = traceServiceClient.listTracesPagedCallable().futureCall(request);
    *   // Do something
-   *   for (Trace element : future.get().iterateAllElements()) {
+   *   for (Trace element : future.get().iterateAll()) {
    *     // doThingsWith(element);
    *   }
    * }
diff --git a/google-cloud-trace/src/main/java/com/google/cloud/trace/spi/v1/TraceServiceSettings.java b/google-cloud-trace/src/main/java/com/google/cloud/trace/spi/v1/TraceServiceSettings.java
index 32fe957aafa7..ac865ece087a 100644
--- a/google-cloud-trace/src/main/java/com/google/cloud/trace/spi/v1/TraceServiceSettings.java
+++ b/google-cloud-trace/src/main/java/com/google/cloud/trace/spi/v1/TraceServiceSettings.java
@@ -17,6 +17,7 @@
 
 import static com.google.cloud.trace.spi.v1.PagedResponseWrappers.ListTracesPagedResponse;
 
+import com.google.api.gax.core.ApiFuture;
 import com.google.api.gax.core.GoogleCredentialsProvider;
 import com.google.api.gax.core.PropertiesProvider;
 import com.google.api.gax.core.RetrySettings;
@@ -26,6 +27,7 @@
 import com.google.api.gax.grpc.ExecutorProvider;
 import com.google.api.gax.grpc.InstantiatingChannelProvider;
 import com.google.api.gax.grpc.InstantiatingExecutorProvider;
+import com.google.api.gax.grpc.PageContext;
 import com.google.api.gax.grpc.PagedCallSettings;
 import com.google.api.gax.grpc.PagedListDescriptor;
 import com.google.api.gax.grpc.PagedListResponseFactory;
@@ -181,13 +183,13 @@ private TraceServiceSettings(Builder settingsBuilder) throws IOException {
       LIST_TRACES_PAGE_STR_DESC =
           new PagedListDescriptor() {
             @Override
-            public Object emptyToken() {
+            public String emptyToken() {
               return "";
             }
 
             @Override
-            public ListTracesRequest injectToken(ListTracesRequest payload, Object token) {
-              return ListTracesRequest.newBuilder(payload).setPageToken((String) token).build();
+            public ListTracesRequest injectToken(ListTracesRequest payload, String token) {
+              return ListTracesRequest.newBuilder(payload).setPageToken(token).build();
             }
 
             @Override
@@ -203,7 +205,7 @@ public Integer extractPageSize(ListTracesRequest payload) {
             }
 
             @Override
-            public Object extractNextToken(ListTracesResponse payload) {
+            public String extractNextToken(ListTracesResponse payload) {
               return payload.getNextPageToken();
             }
 
@@ -219,12 +221,14 @@ public Iterable extractResources(ListTracesResponse payload) {
           new PagedListResponseFactory<
               ListTracesRequest, ListTracesResponse, ListTracesPagedResponse>() {
             @Override
-            public ListTracesPagedResponse createPagedListResponse(
+            public ApiFuture getFuturePagedResponse(
                 UnaryCallable callable,
                 ListTracesRequest request,
-                CallContext context) {
-              return new ListTracesPagedResponse(
-                  callable, LIST_TRACES_PAGE_STR_DESC, request, context);
+                CallContext context,
+                ApiFuture futureResponse) {
+              PageContext pageContext =
+                  PageContext.create(callable, LIST_TRACES_PAGE_STR_DESC, request, context);
+              return ListTracesPagedResponse.createAsync(pageContext, futureResponse);
             }
           };
 
diff --git a/google-cloud-trace/src/test/java/com/google/cloud/trace/spi/v1/TraceServiceClientTest.java b/google-cloud-trace/src/test/java/com/google/cloud/trace/spi/v1/TraceServiceClientTest.java
index e312d100a984..0bdebe0538fa 100644
--- a/google-cloud-trace/src/test/java/com/google/cloud/trace/spi/v1/TraceServiceClientTest.java
+++ b/google-cloud-trace/src/test/java/com/google/cloud/trace/spi/v1/TraceServiceClientTest.java
@@ -168,7 +168,7 @@ public void listTracesTest() {
 
     ListTracesPagedResponse pagedListResponse = client.listTraces(projectId);
 
-    List resources = Lists.newArrayList(pagedListResponse.iterateAllElements());
+    List resources = Lists.newArrayList(pagedListResponse.iterateAll());
     Assert.assertEquals(1, resources.size());
     Assert.assertEquals(expectedResponse.getTracesList().get(0), resources.get(0));
 
diff --git a/google-cloud-vision/pom.xml b/google-cloud-vision/pom.xml
index 557587cc979b..726b9faedeea 100644
--- a/google-cloud-vision/pom.xml
+++ b/google-cloud-vision/pom.xml
@@ -32,7 +32,7 @@
     
       com.google.api.grpc
       grpc-google-cloud-vision-v1
-      0.1.6
+      0.1.7
       
         
           io.grpc
diff --git a/pom.xml b/pom.xml
index 1cfb34f8bee5..6488eda4bc0b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -91,8 +91,8 @@
     UTF-8
     github
     0.6.1
-    1.0.3
-    0.8.1
+    1.2.0
+    0.9.1-SNAPSHOT
     0.1.5
     0.12.1-alpha-SNAPSHOT
     0.12.1-beta-SNAPSHOT

From b72e1ab579ed13eae1baafabe043bf305042065b Mon Sep 17 00:00:00 2001
From: Michael Darakananda 
Date: Wed, 12 Apr 2017 18:56:40 +1000
Subject: [PATCH 2/3] fix up

---
 google-cloud-core/pom.xml                                     | 4 ++--
 .../google/cloud/spanner/spi/v1/WatchdogInterceptorTest.java  | 3 ++-
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/google-cloud-core/pom.xml b/google-cloud-core/pom.xml
index 06e7cb23b373..92c91e90f395 100644
--- a/google-cloud-core/pom.xml
+++ b/google-cloud-core/pom.xml
@@ -113,12 +113,12 @@
     
       com.google.protobuf
       protobuf-java
-      3.0.0
+      3.2.0
     
     
       com.google.protobuf
       protobuf-java-util
-      3.0.0
+      3.2.0
     
     
       io.grpc
diff --git a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/spi/v1/WatchdogInterceptorTest.java b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/spi/v1/WatchdogInterceptorTest.java
index 93c09762a188..969b452e7a78 100644
--- a/google-cloud-spanner/src/test/java/com/google/cloud/spanner/spi/v1/WatchdogInterceptorTest.java
+++ b/google-cloud-spanner/src/test/java/com/google/cloud/spanner/spi/v1/WatchdogInterceptorTest.java
@@ -25,6 +25,7 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import com.google.api.gax.grpc.testing.FakeMethodDescriptor;
 import com.google.common.testing.FakeTicker;
 import io.grpc.CallOptions;
 import io.grpc.Channel;
@@ -56,9 +57,9 @@ public class WatchdogInterceptorTest {
 
   CallOptions options;
   Metadata metadata;
+  MethodDescriptor descriptor = FakeMethodDescriptor.create();
 
   @Mock Channel channel;
-  @Mock MethodDescriptor descriptor;
   @Mock ClientCall innerCall;
   @Mock ClientCall.Listener listener;
 

From 4fda1ec60c55da8c3b27ee2ba529733ca1beaa74 Mon Sep 17 00:00:00 2001
From: Michael Darakananda 
Date: Thu, 13 Apr 2017 15:51:54 +1000
Subject: [PATCH 3/3] update gax version to 0.10.0

---
 pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 6488eda4bc0b..694e8ef47c97 100644
--- a/pom.xml
+++ b/pom.xml
@@ -92,7 +92,7 @@
     github
     0.6.1
     1.2.0
-    0.9.1-SNAPSHOT
+    0.10.0
     0.1.5
     0.12.1-alpha-SNAPSHOT
     0.12.1-beta-SNAPSHOT