http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/internal/NullSafeCopies.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/internal/NullSafeCopies.java
 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/internal/NullSafeCopies.java
deleted file mode 100644
index 3e5c961..0000000
--- 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/internal/NullSafeCopies.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.googlecomputeengine.internal;
-
-import java.util.List;
-import java.util.Map;
-
-import org.jclouds.javax.annotation.Nullable;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-
-public final class NullSafeCopies {
-
-   public static <K, V> Map<K, V> copyOf(@Nullable Map<K, V> map) {
-      return map != null ? ImmutableMap.copyOf(map) : ImmutableMap.<K, V>of();
-   }
-
-   public static <E> List<E> copyOf(@Nullable List<E> list) {
-      return list != null ? ImmutableList.copyOf(list) : ImmutableList.<E>of();
-   }
-
-   private NullSafeCopies() {
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/internal/PATCH.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/internal/PATCH.java
 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/internal/PATCH.java
deleted file mode 100644
index 4efeee2..0000000
--- 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/internal/PATCH.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.googlecomputeengine.internal;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-import javax.ws.rs.HttpMethod;
-
-/**
- * Indicates that the annotated method responds to HTTP PATCH requests
- *
- * @see javax.ws.rs.HttpMethod
- */
-@Target({ElementType.METHOD})
-@Retention(RetentionPolicy.RUNTIME)
-@HttpMethod("PATCH")
-public @interface PATCH {
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/options/ListOptions.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/options/ListOptions.java
 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/options/ListOptions.java
index 0c46000..314f157 100644
--- 
a/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/options/ListOptions.java
+++ 
b/google-compute-engine/src/main/java/org/jclouds/googlecomputeengine/options/ListOptions.java
@@ -18,12 +18,10 @@ package org.jclouds.googlecomputeengine.options;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import org.jclouds.http.options.BaseHttpRequestOptions;
-
 /**
- * Allows to optionally specify a filter, max results and a page token for 
<code>listFirstPage()</code> REST methods.
+ * Allows to optionally specify a filter, max results and a page token for 
<code>listPage</code> REST methods.
  */
-public final class ListOptions extends BaseHttpRequestOptions {
+public final class ListOptions extends 
org.jclouds.googlecloud.options.ListOptions {
 
    /**
     * Optional. Filter expression for filtering listed resources, in the form 
filter={expression}. Your {expression}
@@ -65,9 +63,8 @@ public final class ListOptions extends BaseHttpRequestOptions 
{
     * Sets Maximum count of results to be returned. Maximum and default value 
is 100. Acceptable items are 0 to
     * 100, inclusive. (Default: 100)
     */
-   public ListOptions maxResults(Integer maxResults) {
-      this.queryParameters.put("maxResults", checkNotNull(maxResults, 
"maxResults") + "");
-      return this;
+   @Override public ListOptions maxResults(Integer maxResults) {
+      return (ListOptions) super.maxResults(maxResults);
    }
 
    public static final class Builder {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/GoogleComputeEngineAuthenticatedRestContextLiveTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/GoogleComputeEngineAuthenticatedRestContextLiveTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/GoogleComputeEngineAuthenticatedRestContextLiveTest.java
deleted file mode 100644
index b6ceeee..0000000
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/GoogleComputeEngineAuthenticatedRestContextLiveTest.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.googlecomputeengine;
-
-import java.util.Properties;
-
-import org.jclouds.googlecomputeengine.internal.TestProperties;
-import org.jclouds.oauth.v2.internal.BaseOAuthAuthenticatedApiLiveTest;
-import org.testng.annotations.Test;
-
-@Test(groups = "live")
-public class GoogleComputeEngineAuthenticatedRestContextLiveTest extends 
BaseOAuthAuthenticatedApiLiveTest<GoogleComputeEngineApi> {
-
-   public GoogleComputeEngineAuthenticatedRestContextLiveTest() {
-      provider = "google-compute-engine";
-   }
-
-   @Override
-   public String getScopes() {
-      return "https://www.googleapis.com/auth/compute";;
-   }
-
-   @Override protected Properties setupProperties() {
-      return TestProperties.apply(super.setupProperties());
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/GoogleComputeEngineProviderMetadataTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/GoogleComputeEngineProviderMetadataTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/GoogleComputeEngineProviderMetadataTest.java
index d7d52eb..6204f64 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/GoogleComputeEngineProviderMetadataTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/GoogleComputeEngineProviderMetadataTest.java
@@ -26,7 +26,7 @@ import org.testng.annotations.Test;
  * META-INF/services/org.jclouds.providers.ProviderMetadata
  * </pre>
  */
-@Test(groups = "unit", testName = "GoogleComputeProviderMetadataTest")
+@Test(groups = "unit", testName = "GoogleComputeEngineProviderMetadataTest")
 public class GoogleComputeEngineProviderMetadataTest extends 
BaseProviderMetadataTest {
    public GoogleComputeEngineProviderMetadataTest() {
       super(new GoogleComputeEngineProviderMetadata(), new 
GoogleComputeEngineApiMetadata());

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceLiveTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceLiveTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceLiveTest.java
index b27944c..9d528cc 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceLiveTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/GoogleComputeEngineServiceLiveTest.java
@@ -25,9 +25,9 @@ import java.util.Properties;
 import org.jclouds.compute.domain.Hardware;
 import org.jclouds.compute.domain.NodeMetadata;
 import org.jclouds.compute.internal.BaseComputeServiceLiveTest;
+import org.jclouds.googlecloud.internal.TestProperties;
 import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
 import org.jclouds.googlecomputeengine.domain.MachineType;
-import org.jclouds.googlecomputeengine.internal.TestProperties;
 import org.jclouds.sshj.config.SshjSshClientModule;
 import org.testng.annotations.Test;
 
@@ -45,7 +45,7 @@ public class GoogleComputeEngineServiceLiveTest extends 
BaseComputeServiceLiveTe
    }
 
    @Override protected Properties setupProperties() {
-      return TestProperties.apply(super.setupProperties());
+      return TestProperties.apply(provider, super.setupProperties());
    }
 
    public void testListHardwareProfiles() throws Exception {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/extensions/GoogleComputeEngineSecurityGroupExtensionLiveTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/extensions/GoogleComputeEngineSecurityGroupExtensionLiveTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/extensions/GoogleComputeEngineSecurityGroupExtensionLiveTest.java
index a50de5a..1cc00b0 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/extensions/GoogleComputeEngineSecurityGroupExtensionLiveTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/extensions/GoogleComputeEngineSecurityGroupExtensionLiveTest.java
@@ -19,7 +19,7 @@ package org.jclouds.googlecomputeengine.compute.extensions;
 import java.util.Properties;
 
 import 
org.jclouds.compute.extensions.internal.BaseSecurityGroupExtensionLiveTest;
-import org.jclouds.googlecomputeengine.internal.TestProperties;
+import org.jclouds.googlecloud.internal.TestProperties;
 import org.testng.annotations.Test;
 
 @Test(groups = "live", singleThreaded = true, testName = 
"GoogleComputeEngineSecurityGroupExtensionLiveTest")
@@ -30,6 +30,6 @@ public class 
GoogleComputeEngineSecurityGroupExtensionLiveTest extends BaseSecur
    }
 
    @Override protected Properties setupProperties() {
-      return TestProperties.apply(super.setupProperties());
+      return TestProperties.apply(provider, super.setupProperties());
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/NetworkToSecurityGroupTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/NetworkToSecurityGroupTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/NetworkToSecurityGroupTest.java
index 55bbf2d..d42cab5 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/NetworkToSecurityGroupTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/compute/functions/NetworkToSecurityGroupTest.java
@@ -29,8 +29,8 @@ import static org.testng.Assert.assertTrue;
 import java.net.URI;
 
 import org.jclouds.compute.domain.SecurityGroup;
+import org.jclouds.googlecloud.domain.ForwardingListPage;
 import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
-import org.jclouds.googlecomputeengine.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.Network;
 import org.jclouds.googlecomputeengine.features.FirewallApi;
 import org.jclouds.googlecomputeengine.options.ListOptions;
@@ -53,7 +53,7 @@ public class NetworkToSecurityGroupTest {
       ListOptions options = filter("network eq .*/party-test");
       expect(api.firewalls()).andReturn(fwApi);
       expect(fwApi.list(options)).andReturn(
-            
singletonIterator(ListPage.create(ImmutableList.of(FirewallToIpPermissionTest.fwForTest()),
 null)));
+            
singletonIterator(ForwardingListPage.create(ImmutableList.of(FirewallToIpPermissionTest.fwForTest()),
 null)));
 
       replay(api, fwApi);
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/config/UseApiToResolveProjectNameMockTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/config/UseApiToResolveProjectNameMockTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/config/UseApiToResolveProjectNameMockTest.java
index 512f70e..25f3431 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/config/UseApiToResolveProjectNameMockTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/config/UseApiToResolveProjectNameMockTest.java
@@ -63,7 +63,7 @@ public class UseApiToResolveProjectNameMockTest extends 
BaseGoogleComputeEngineA
          fn().apply(new Credentials(projectNumber, credential));
          fail();
       } catch (IllegalArgumentException e) {
-         assertEquals(e.getMessage(), String.format("Identity %s is malformed. 
Should be %s", projectNumber,
+         assertEquals(e.getMessage(), String.format("Client email %s is 
malformed. Should be %s", projectNumber,
                new GoogleComputeEngineApiMetadata().getIdentityName()));
       }
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/AddressApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/AddressApiLiveTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/AddressApiLiveTest.java
index e5feef5..cee41f6 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/AddressApiLiveTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/AddressApiLiveTest.java
@@ -22,8 +22,8 @@ import static org.testng.Assert.assertNotNull;
 
 import java.util.Iterator;
 
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.Address;
-import org.jclouds.googlecomputeengine.domain.ListPage;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiLiveTest;
 import org.testng.annotations.Test;
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/AggregatedListApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/AggregatedListApiLiveTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/AggregatedListApiLiveTest.java
index 9c34ad7..436fea0 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/AggregatedListApiLiveTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/AggregatedListApiLiveTest.java
@@ -23,7 +23,7 @@ import static org.testng.Assert.assertTrue;
 import java.util.Iterator;
 import java.util.List;
 
-import org.jclouds.googlecomputeengine.domain.ListPage;
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.MachineType;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiLiveTest;
 import org.testng.annotations.Test;

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/DiskApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/DiskApiLiveTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/DiskApiLiveTest.java
index 32a1943..b53761a 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/DiskApiLiveTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/DiskApiLiveTest.java
@@ -24,8 +24,8 @@ import java.net.URI;
 import java.util.Iterator;
 import java.util.List;
 
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.Disk;
-import org.jclouds.googlecomputeengine.domain.ListPage;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiLiveTest;
 import org.jclouds.googlecomputeengine.options.DiskCreationOptions;
 import org.testng.annotations.Test;

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/DiskTypeApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/DiskTypeApiLiveTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/DiskTypeApiLiveTest.java
index e776a20..6d43913 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/DiskTypeApiLiveTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/DiskTypeApiLiveTest.java
@@ -23,8 +23,8 @@ import static org.testng.Assert.assertTrue;
 
 import java.util.Iterator;
 
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.DiskType;
-import org.jclouds.googlecomputeengine.domain.ListPage;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiLiveTest;
 import org.testng.annotations.Test;
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/FirewallApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/FirewallApiLiveTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/FirewallApiLiveTest.java
index a4098c2..a56cc3e 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/FirewallApiLiveTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/FirewallApiLiveTest.java
@@ -23,8 +23,8 @@ import static org.testng.Assert.assertNotNull;
 
 import java.util.Iterator;
 
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.Firewall;
-import org.jclouds.googlecomputeengine.domain.ListPage;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiLiveTest;
 import org.jclouds.googlecomputeengine.options.FirewallOptions;
 import org.testng.annotations.Test;

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ForwardingRuleApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ForwardingRuleApiLiveTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ForwardingRuleApiLiveTest.java
index 5a1b6a0..1beb95c 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ForwardingRuleApiLiveTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ForwardingRuleApiLiveTest.java
@@ -20,9 +20,9 @@ import static 
org.jclouds.googlecomputeengine.options.ListOptions.Builder.filter
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.Address;
 import org.jclouds.googlecomputeengine.domain.ForwardingRule;
-import org.jclouds.googlecomputeengine.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.TargetPool;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiLiveTest;
 import org.jclouds.googlecomputeengine.options.ForwardingRuleCreationOptions;

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/HttpHealthCheckApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/HttpHealthCheckApiLiveTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/HttpHealthCheckApiLiveTest.java
index 989fe25..e8863da 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/HttpHealthCheckApiLiveTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/HttpHealthCheckApiLiveTest.java
@@ -21,8 +21,8 @@ import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotEquals;
 import static org.testng.Assert.assertNotNull;
 
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.HttpHealthCheck;
-import org.jclouds.googlecomputeengine.domain.ListPage;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiLiveTest;
 import org.jclouds.googlecomputeengine.options.HttpHealthCheckCreationOptions;
 import org.testng.annotations.Test;

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ImageApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ImageApiLiveTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ImageApiLiveTest.java
index bbe2e4c..5699edb 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ImageApiLiveTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ImageApiLiveTest.java
@@ -23,9 +23,9 @@ import java.net.URI;
 import java.util.Iterator;
 import java.util.List;
 
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.Disk;
 import org.jclouds.googlecomputeengine.domain.Image;
-import org.jclouds.googlecomputeengine.domain.ListPage;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiLiveTest;
 import org.testng.annotations.Test;
 

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/InstanceApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/InstanceApiLiveTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/InstanceApiLiveTest.java
index 5f6f8dc..2c3e832 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/InstanceApiLiveTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/InstanceApiLiveTest.java
@@ -27,11 +27,11 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Properties;
 
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
 import org.jclouds.googlecomputeengine.domain.Image;
 import org.jclouds.googlecomputeengine.domain.Instance;
 import org.jclouds.googlecomputeengine.domain.Instance.AttachedDisk;
-import org.jclouds.googlecomputeengine.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.Metadata;
 import org.jclouds.googlecomputeengine.domain.NewInstance;
 import org.jclouds.googlecomputeengine.domain.NewInstance.Disk;

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/MachineTypeApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/MachineTypeApiLiveTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/MachineTypeApiLiveTest.java
index ba90d44..e286971 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/MachineTypeApiLiveTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/MachineTypeApiLiveTest.java
@@ -24,7 +24,7 @@ import static org.testng.Assert.assertTrue;
 import java.util.Iterator;
 import java.util.List;
 
-import org.jclouds.googlecomputeengine.domain.ListPage;
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.MachineType;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiLiveTest;
 import org.testng.annotations.Test;

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/NetworkApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/NetworkApiLiveTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/NetworkApiLiveTest.java
index 5daf174..5fac64c 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/NetworkApiLiveTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/NetworkApiLiveTest.java
@@ -23,7 +23,7 @@ import static org.testng.Assert.assertNotNull;
 import java.util.Iterator;
 import java.util.List;
 
-import org.jclouds.googlecomputeengine.domain.ListPage;
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.Network;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiLiveTest;
 import org.testng.annotations.Test;

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/OperationApiExpectTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/OperationApiExpectTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/OperationApiExpectTest.java
index 5d3474e..5b5f4e1 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/OperationApiExpectTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/OperationApiExpectTest.java
@@ -21,8 +21,9 @@ import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNull;
 
+import org.jclouds.googlecloud.domain.ForwardingListPage;
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
-import org.jclouds.googlecomputeengine.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.Operation;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineExpectTest;
 import org.jclouds.googlecomputeengine.parse.ParseGlobalOperationListTest;
@@ -156,7 +157,7 @@ public class OperationApiExpectTest extends 
BaseGoogleComputeEngineExpectTest<Go
    }
 
    private ListPage<Operation> regionList() {
-      return ListPage.create( //
+      return ForwardingListPage.create( //
             ImmutableList.of(new ParseRegionOperationTest().expected()), // 
items
             null // nextPageToken
       );
@@ -214,7 +215,7 @@ public class OperationApiExpectTest extends 
BaseGoogleComputeEngineExpectTest<Go
    }
 
    private ListPage<Operation> zoneList() {
-      return ListPage.create( //
+      return ForwardingListPage.create( //
             ImmutableList.of(new ParseZoneOperationTest().expected()), // items
             null // nextPageToken
       );

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/OperationApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/OperationApiLiveTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/OperationApiLiveTest.java
index a9e15e4..1ba2aee 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/OperationApiLiveTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/OperationApiLiveTest.java
@@ -22,7 +22,7 @@ import static org.testng.Assert.assertNotNull;
 
 import java.util.Iterator;
 
-import org.jclouds.googlecomputeengine.domain.ListPage;
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.Operation;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiLiveTest;
 import org.testng.SkipException;

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/RegionApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/RegionApiLiveTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/RegionApiLiveTest.java
index 2afeb97..7ddefe9 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/RegionApiLiveTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/RegionApiLiveTest.java
@@ -24,7 +24,7 @@ import static org.testng.Assert.assertTrue;
 import java.util.Iterator;
 import java.util.List;
 
-import org.jclouds.googlecomputeengine.domain.ListPage;
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.Region;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiLiveTest;
 import org.testng.annotations.Test;

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/RouteApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/RouteApiLiveTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/RouteApiLiveTest.java
index 71ccc59..8e87712 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/RouteApiLiveTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/RouteApiLiveTest.java
@@ -22,7 +22,7 @@ import static org.testng.Assert.assertNotNull;
 import java.util.Iterator;
 import java.util.List;
 
-import org.jclouds.googlecomputeengine.domain.ListPage;
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.Route;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiLiveTest;
 import org.jclouds.googlecomputeengine.options.ListOptions;

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/SnapshotApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/SnapshotApiLiveTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/SnapshotApiLiveTest.java
index bd61b5c..ec1f17a 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/SnapshotApiLiveTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/SnapshotApiLiveTest.java
@@ -22,8 +22,8 @@ import static org.testng.Assert.assertEquals;
 import java.util.Iterator;
 import java.util.List;
 
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.Disk;
-import org.jclouds.googlecomputeengine.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.Snapshot;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiLiveTest;
 import org.testng.annotations.Test;

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/TargetPoolApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/TargetPoolApiLiveTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/TargetPoolApiLiveTest.java
index 1683b88..1744076 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/TargetPoolApiLiveTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/TargetPoolApiLiveTest.java
@@ -25,10 +25,10 @@ import java.net.URI;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.HttpHealthCheck;
 import org.jclouds.googlecomputeengine.domain.Image;
 import org.jclouds.googlecomputeengine.domain.Instance;
-import org.jclouds.googlecomputeengine.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.NewInstance;
 import org.jclouds.googlecomputeengine.domain.TargetPool;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiLiveTest;

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ZoneApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ZoneApiLiveTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ZoneApiLiveTest.java
index fb5a4cb..91c9ea1 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ZoneApiLiveTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/features/ZoneApiLiveTest.java
@@ -24,7 +24,7 @@ import static org.testng.Assert.assertTrue;
 import java.util.Iterator;
 import java.util.List;
 
-import org.jclouds.googlecomputeengine.domain.ListPage;
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.Zone;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineApiLiveTest;
 import org.testng.annotations.Test;

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineApiLiveTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineApiLiveTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineApiLiveTest.java
index 17f1405..cdf9be9 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineApiLiveTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineApiLiveTest.java
@@ -19,7 +19,7 @@ package org.jclouds.googlecomputeengine.internal;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkState;
 import static org.testng.Assert.assertEquals;
-import static org.testng.AssertJUnit.assertTrue;
+import static org.testng.Assert.assertTrue;
 
 import java.net.URI;
 import java.util.Properties;
@@ -27,8 +27,9 @@ import java.util.concurrent.atomic.AtomicReference;
 import java.util.logging.Logger;
 
 import org.jclouds.apis.BaseApiLiveTest;
+import org.jclouds.googlecloud.config.CurrentProject;
+import org.jclouds.googlecloud.internal.TestProperties;
 import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
-import org.jclouds.googlecomputeengine.config.CurrentProject;
 import org.jclouds.googlecomputeengine.domain.Operation;
 import org.jclouds.javax.annotation.Nullable;
 
@@ -40,7 +41,6 @@ import com.google.inject.Key;
 import com.google.inject.Module;
 import com.google.inject.TypeLiteral;
 
-
 public class BaseGoogleComputeEngineApiLiveTest extends 
BaseApiLiveTest<GoogleComputeEngineApi> {
 
    protected static final String ZONE_API_URL_SUFFIX = "/zones/";
@@ -62,7 +62,7 @@ public class BaseGoogleComputeEngineApiLiveTest extends 
BaseApiLiveTest<GoogleCo
    }
 
    @Override protected Properties setupProperties() {
-      return TestProperties.apply(super.setupProperties());
+      return TestProperties.apply(provider, super.setupProperties());
    }
 
    @Override protected GoogleComputeEngineApi create(Properties props, 
Iterable<Module> modules) {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineApiMockTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineApiMockTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineApiMockTest.java
index 0f53fba..d0c8dee 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineApiMockTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineApiMockTest.java
@@ -20,9 +20,9 @@ import static com.google.common.base.Charsets.UTF_8;
 import static com.google.common.base.Throwables.propagate;
 import static 
com.google.common.util.concurrent.MoreExecutors.sameThreadExecutor;
 import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
-import static 
org.jclouds.googlecomputeengine.config.GoogleComputeEngineProperties.CREDENTIAL_TYPE;
+import static 
org.jclouds.googlecloud.config.GoogleCloudProperties.CREDENTIAL_TYPE;
+import static 
org.jclouds.googlecloud.config.GoogleCloudProperties.PROJECT_NAME;
 import static 
org.jclouds.googlecomputeengine.config.GoogleComputeEngineProperties.IMAGE_PROJECTS;
-import static 
org.jclouds.googlecomputeengine.config.GoogleComputeEngineProperties.PROJECT_NAME;
 import static 
org.jclouds.oauth.v2.config.CredentialType.BEARER_TOKEN_CREDENTIALS;
 import static org.jclouds.util.Strings2.toStringAndClose;
 import static org.testng.Assert.assertEquals;

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineExpectTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineExpectTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineExpectTest.java
index 3deb22a..593da14 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineExpectTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/BaseGoogleComputeEngineExpectTest.java
@@ -20,7 +20,7 @@ import static com.google.common.base.Charsets.UTF_8;
 import static com.google.common.base.Throwables.propagate;
 import static com.google.common.io.BaseEncoding.base64Url;
 import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
-import static 
org.jclouds.googlecomputeengine.config.GoogleComputeEngineProperties.PROJECT_NAME;
+import static 
org.jclouds.googlecloud.config.GoogleCloudProperties.PROJECT_NAME;
 import static org.jclouds.oauth.v2.JWSAlgorithms.NONE;
 import static org.jclouds.oauth.v2.config.OAuthProperties.JWS_ALG;
 import static org.jclouds.util.Strings2.toStringAndClose;

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/TestProperties.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/TestProperties.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/TestProperties.java
deleted file mode 100644
index 7c43910..0000000
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/TestProperties.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.jclouds.googlecomputeengine.internal;
-
-import static 
org.jclouds.googlecomputeengine.config.GoogleComputeEngineProperties.CREDENTIAL_TYPE;
-import static 
org.jclouds.googlecomputeengine.config.GoogleComputeEngineProperties.PROJECT_NAME;
-import static org.jclouds.oauth.v2.OAuthTestUtils.setCredential;
-import static 
org.jclouds.oauth.v2.config.CredentialType.P12_PRIVATE_KEY_CREDENTIALS;
-
-import java.util.Properties;
-
-import org.jclouds.oauth.v2.config.CredentialType;
-
-/** Changes to this mandate changes to pom.xml and README.md */
-public final class TestProperties {
-
-   public static Properties apply(Properties props) {
-      setIfTestSystemPropertyPresent(props, PROJECT_NAME);
-      setIfTestSystemPropertyPresent(props, CREDENTIAL_TYPE);
-      if (props.containsKey(CREDENTIAL_TYPE)
-            && CredentialType.fromValue(props.getProperty(CREDENTIAL_TYPE)) == 
P12_PRIVATE_KEY_CREDENTIALS) {
-         setCredential(props, "google-compute-engine.credential");
-      }
-      return props;
-   }
-
-   // TODO: make BaseApiLiveTest.setIfTestSystemPropertyPresent static
-   private static String setIfTestSystemPropertyPresent(Properties overrides, 
String key) {
-      if (System.getProperties().containsKey("test." + key)) {
-         String val = System.getProperty("test." + key);
-         overrides.setProperty(key, val);
-         return val;
-      }
-      return null;
-   }
-
-   private TestProperties() {
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/ToIteratorOfListPageExpectTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/ToIteratorOfListPageExpectTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/ToIteratorOfListPageExpectTest.java
index 2e0aa87..1bad3b3 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/ToIteratorOfListPageExpectTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/internal/ToIteratorOfListPageExpectTest.java
@@ -22,12 +22,13 @@ import static org.testng.Assert.assertEquals;
 import java.util.Iterator;
 import java.util.List;
 
+import org.jclouds.googlecloud.domain.ForwardingListPage;
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.GoogleComputeEngineApi;
 import org.jclouds.googlecomputeengine.config.GoogleComputeEngineParserModule;
 import org.jclouds.googlecomputeengine.domain.Address;
 import org.jclouds.googlecomputeengine.domain.Image;
 import org.jclouds.googlecomputeengine.domain.Instance;
-import org.jclouds.googlecomputeengine.domain.ListPage;
 import org.jclouds.googlecomputeengine.features.AddressApi;
 import org.jclouds.googlecomputeengine.features.ImageApi;
 import org.jclouds.googlecomputeengine.features.InstanceApi;
@@ -85,13 +86,13 @@ public class ToIteratorOfListPageExpectTest extends 
BaseGoogleComputeEngineExpec
       List<Image> items = ImmutableList.of(new ParseImageTest().expected());
 
       HttpResponse list1Response = HttpResponse.builder().statusCode(200)
-              .payload(json.toJson(ListPage.create(items, "token1"))).build();
+              .payload(json.toJson(ForwardingListPage.create(items, 
"token1"))).build();
 
       HttpResponse list2Response = HttpResponse.builder().statusCode(200)
-            .payload(json.toJson(ListPage.create(items, "token2"))).build();
+            .payload(json.toJson(ForwardingListPage.create(items, 
"token2"))).build();
 
       HttpResponse list3Response = HttpResponse.builder().statusCode(200)
-            .payload(json.toJson(ListPage.create(items, null))).build();
+            .payload(json.toJson(ForwardingListPage.create(items, 
null))).build();
 
       ImageApi imageApi = 
orderedRequestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE),
               TOKEN_RESPONSE, list1, list1Response, list2, list2Response, 
list3, list3Response).images();
@@ -122,13 +123,13 @@ public class ToIteratorOfListPageExpectTest extends 
BaseGoogleComputeEngineExpec
       List<Address> items = ImmutableList.of(new 
ParseAddressTest().expected());
 
       HttpResponse list1Response = HttpResponse.builder().statusCode(200)
-            .payload(json.toJson(ListPage.create(items, "token1"))).build();
+            .payload(json.toJson(ForwardingListPage.create(items, 
"token1"))).build();
 
       HttpResponse list2Response = HttpResponse.builder().statusCode(200)
-            .payload(json.toJson(ListPage.create(items, "token2"))).build();
+            .payload(json.toJson(ForwardingListPage.create(items, 
"token2"))).build();
 
       HttpResponse list3Response = HttpResponse.builder().statusCode(200)
-            .payload(json.toJson(ListPage.create(items, null))).build();
+            .payload(json.toJson(ForwardingListPage.create(items, 
null))).build();
 
       AddressApi addressApi = 
orderedRequestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE),
             TOKEN_RESPONSE, list1, list1Response, list2, list2Response, list3, 
list3Response)
@@ -160,13 +161,13 @@ public class ToIteratorOfListPageExpectTest extends 
BaseGoogleComputeEngineExpec
       List<Instance> items = ImmutableList.of(new 
ParseInstanceTest().expected());
 
       HttpResponse list1Response = HttpResponse.builder().statusCode(200)
-            .payload(json.toJson(ListPage.create(items, "token1"))).build();
+            .payload(json.toJson(ForwardingListPage.create(items, 
"token1"))).build();
 
       HttpResponse list2Response = HttpResponse.builder().statusCode(200)
-            .payload(json.toJson(ListPage.create(items, "token2"))).build();
+            .payload(json.toJson(ForwardingListPage.create(items, 
"token2"))).build();
 
       HttpResponse list3Response = HttpResponse.builder().statusCode(200)
-            .payload(json.toJson(ListPage.create(items, null))).build();
+            .payload(json.toJson(ForwardingListPage.create(items, 
null))).build();
 
       InstanceApi instanceApi = 
orderedRequestsSendResponses(requestForScopes(COMPUTE_READONLY_SCOPE),
             TOKEN_RESPONSE, list1, list1Response, list2, list2Response, list3, 
list3Response)

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseAddressListTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseAddressListTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseAddressListTest.java
index 5a21279..1908914 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseAddressListTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseAddressListTest.java
@@ -22,8 +22,9 @@ import java.net.URI;
 
 import javax.ws.rs.Consumes;
 
+import org.jclouds.googlecloud.domain.ForwardingListPage;
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.Address;
-import org.jclouds.googlecomputeengine.domain.ListPage;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest;
 import org.testng.annotations.Test;
 
@@ -50,7 +51,7 @@ public class ParseAddressListTest extends 
BaseGoogleComputeEngineParseTest<ListP
             URI.create(BASE_URL + "/party/regions/us-central1"), // region
             "173.255.118.115" // address
       );
-      return ListPage.create( //
+      return ForwardingListPage.create( //
             ImmutableList.of(address1, address2), // items
             null // nextPageToken
       );

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseDiskListTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseDiskListTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseDiskListTest.java
index 6909f23..ab76aca 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseDiskListTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseDiskListTest.java
@@ -20,8 +20,9 @@ import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
 
 import javax.ws.rs.Consumes;
 
+import org.jclouds.googlecloud.domain.ForwardingListPage;
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.Disk;
-import org.jclouds.googlecomputeengine.domain.ListPage;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest;
 import org.testng.annotations.Test;
 
@@ -37,7 +38,7 @@ public class ParseDiskListTest extends 
BaseGoogleComputeEngineParseTest<ListPage
 
    @Override @Consumes(APPLICATION_JSON)
    public ListPage<Disk> expected() {
-      return ListPage.create( //
+      return ForwardingListPage.create( //
             ImmutableList.of(new ParseDiskTest().expected()), // items
             null // nextPageToken
       );

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseDiskTypeListTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseDiskTypeListTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseDiskTypeListTest.java
index e7f0488..edf1c73 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseDiskTypeListTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseDiskTypeListTest.java
@@ -22,8 +22,9 @@ import java.net.URI;
 
 import javax.ws.rs.Consumes;
 
+import org.jclouds.googlecloud.domain.ForwardingListPage;
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.DiskType;
-import org.jclouds.googlecomputeengine.domain.ListPage;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest;
 import org.testng.annotations.Test;
 
@@ -50,7 +51,7 @@ public class ParseDiskTypeListTest extends 
BaseGoogleComputeEngineParseTest<List
             500 // defaultDiskSizeGb
       );
       DiskType diskType2 = new ParseDiskTypeTest().expected();
-      return ListPage.create( //
+      return ForwardingListPage.create( //
             ImmutableList.of(diskType1, diskType2), // items
             null // nextPageToken
       );

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseFirewallListTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseFirewallListTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseFirewallListTest.java
index 1b0e13b..8b02a82 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseFirewallListTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseFirewallListTest.java
@@ -22,8 +22,9 @@ import java.net.URI;
 
 import javax.ws.rs.Consumes;
 
+import org.jclouds.googlecloud.domain.ForwardingListPage;
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.Firewall;
-import org.jclouds.googlecomputeengine.domain.ListPage;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest;
 import org.testng.annotations.Test;
 
@@ -51,7 +52,7 @@ public class ParseFirewallListTest extends 
BaseGoogleComputeEngineParseTest<List
             null, // targetTags
             ImmutableList.of(Firewall.Rule.create("tcp", 
ImmutableList.of("22"))) // allowed
       );
-      return ListPage.create( //
+      return ForwardingListPage.create( //
             ImmutableList.of(firewall1, firewall2), // items
             null // nextPageToken
       );

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseForwardingRuleListTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseForwardingRuleListTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseForwardingRuleListTest.java
index 551c06e..2cc546f 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseForwardingRuleListTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseForwardingRuleListTest.java
@@ -20,8 +20,9 @@ import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
 
 import javax.ws.rs.Consumes;
 
+import org.jclouds.googlecloud.domain.ForwardingListPage;
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.ForwardingRule;
-import org.jclouds.googlecomputeengine.domain.ListPage;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest;
 import org.testng.annotations.Test;
 
@@ -37,7 +38,7 @@ public class ParseForwardingRuleListTest extends 
BaseGoogleComputeEngineParseTes
 
    @Override @Consumes(APPLICATION_JSON)
    public ListPage<ForwardingRule> expected() {
-      return ListPage.create( //
+      return ForwardingListPage.create( //
             ImmutableList.of(new ParseForwardingRuleTest().expected()), // 
items
             null // nextPageToken
       );

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseGlobalOperationListTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseGlobalOperationListTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseGlobalOperationListTest.java
index 3ebd1a3..d071a48 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseGlobalOperationListTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseGlobalOperationListTest.java
@@ -20,7 +20,8 @@ import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
 
 import javax.ws.rs.Consumes;
 
-import org.jclouds.googlecomputeengine.domain.ListPage;
+import org.jclouds.googlecloud.domain.ForwardingListPage;
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.Operation;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest;
 import org.testng.annotations.Test;
@@ -37,7 +38,7 @@ public class ParseGlobalOperationListTest extends 
BaseGoogleComputeEngineParseTe
 
    @Override @Consumes(APPLICATION_JSON)
    public ListPage<Operation> expected() {
-      return ListPage.create( //
+      return ForwardingListPage.create( //
             ImmutableList.of(new ParseGlobalOperationTest().expected()), // 
items
             null // nextPageToken
       );

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseHttpHealthCheckListTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseHttpHealthCheckListTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseHttpHealthCheckListTest.java
index d52e3f5..9d9c269 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseHttpHealthCheckListTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseHttpHealthCheckListTest.java
@@ -22,8 +22,9 @@ import java.net.URI;
 
 import javax.ws.rs.Consumes;
 
+import org.jclouds.googlecloud.domain.ForwardingListPage;
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.HttpHealthCheck;
-import org.jclouds.googlecomputeengine.domain.ListPage;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest;
 import org.testng.annotations.Test;
 
@@ -68,7 +69,7 @@ public class ParseHttpHealthCheckListTest extends 
BaseGoogleComputeEngineParseTe
             2,  // unhealthyThreshold
             null // healthyThreshold
       );
-      return ListPage.create( //
+      return ForwardingListPage.create( //
             ImmutableList.of(healthCheck1, healthCheck2, healthCheck3), // 
items
             null // nextPageToken
       );

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseImageListTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseImageListTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseImageListTest.java
index dadc1f0..c128875 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseImageListTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseImageListTest.java
@@ -19,8 +19,9 @@ package org.jclouds.googlecomputeengine.parse;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.core.MediaType;
 
+import org.jclouds.googlecloud.domain.ForwardingListPage;
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.Image;
-import org.jclouds.googlecomputeengine.domain.ListPage;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest;
 import org.testng.annotations.Test;
 
@@ -36,7 +37,7 @@ public class ParseImageListTest extends 
BaseGoogleComputeEngineParseTest<ListPag
 
    @Override @Consumes(MediaType.APPLICATION_JSON)
    public ListPage<Image> expected() {
-      return ListPage.create( //
+      return ForwardingListPage.create( //
             ImmutableList.of(new ParseImageTest().expected()), // items
             null // nextPageToken
       );

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseInstanceListTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseInstanceListTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseInstanceListTest.java
index 49ebe26..762de45 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseInstanceListTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseInstanceListTest.java
@@ -20,8 +20,9 @@ import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
 
 import javax.ws.rs.Consumes;
 
+import org.jclouds.googlecloud.domain.ForwardingListPage;
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.Instance;
-import org.jclouds.googlecomputeengine.domain.ListPage;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest;
 import org.testng.annotations.Test;
 
@@ -37,7 +38,7 @@ public class ParseInstanceListTest extends 
BaseGoogleComputeEngineParseTest<List
 
    @Override @Consumes(APPLICATION_JSON)
    public ListPage<Instance> expected() {
-      return ListPage.create( //
+      return ForwardingListPage.create( //
             ImmutableList.of(new ParseInstanceTest().expected()), // items
             null // nextPageToken
       );

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseMachineTypeListTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseMachineTypeListTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseMachineTypeListTest.java
index 082e989..7bd42d7 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseMachineTypeListTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseMachineTypeListTest.java
@@ -22,7 +22,8 @@ import java.net.URI;
 
 import javax.ws.rs.Consumes;
 
-import org.jclouds.googlecomputeengine.domain.ListPage;
+import org.jclouds.googlecloud.domain.ForwardingListPage;
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.MachineType;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest;
 import org.testng.annotations.Test;
@@ -78,7 +79,7 @@ public class ParseMachineTypeListTest extends 
BaseGoogleComputeEngineParseTest<L
             "us-central1-a", // zone
             null // deprecated
       );
-      return ListPage.create( //
+      return ForwardingListPage.create( //
             ImmutableList.of(machineType1, machineType2, machineType3), // 
items
             null // nextPageToken
       );

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseNetworkListTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseNetworkListTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseNetworkListTest.java
index 2f0bd11..fdb8e9f 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseNetworkListTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseNetworkListTest.java
@@ -20,7 +20,8 @@ import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
 
 import javax.ws.rs.Consumes;
 
-import org.jclouds.googlecomputeengine.domain.ListPage;
+import org.jclouds.googlecloud.domain.ForwardingListPage;
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.Network;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest;
 import org.testng.annotations.Test;
@@ -37,7 +38,7 @@ public class ParseNetworkListTest extends 
BaseGoogleComputeEngineParseTest<ListP
 
    @Override @Consumes(APPLICATION_JSON)
    public ListPage<Network> expected() {
-      return ListPage.create( //
+      return ForwardingListPage.create( //
             ImmutableList.of(new ParseNetworkTest().expected()), // items
             null // nextPageToken
       );

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseRegionListTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseRegionListTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseRegionListTest.java
index 6cebdff..846410a 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseRegionListTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseRegionListTest.java
@@ -22,7 +22,8 @@ import java.net.URI;
 
 import javax.ws.rs.Consumes;
 
-import org.jclouds.googlecomputeengine.domain.ListPage;
+import org.jclouds.googlecloud.domain.ForwardingListPage;
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.Quota;
 import org.jclouds.googlecomputeengine.domain.Region;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest;
@@ -59,7 +60,7 @@ public class ParseRegionListTest extends 
BaseGoogleComputeEngineParseTest<ListPa
                   Quota.create("FIREWALLS", 2, 100), //
                   Quota.create("IMAGES", 0, 100)) // quotas
       );
-      return ListPage.create( //
+      return ForwardingListPage.create( //
             ImmutableList.of(region1, region2), // items
             null // nextPageToken
       );

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseRouteListTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseRouteListTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseRouteListTest.java
index f6c23a5..9eb18f9 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseRouteListTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseRouteListTest.java
@@ -21,7 +21,8 @@ import java.net.URI;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.core.MediaType;
 
-import org.jclouds.googlecomputeengine.domain.ListPage;
+import org.jclouds.googlecloud.domain.ForwardingListPage;
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.Route;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest;
 import org.testng.annotations.Test;
@@ -54,7 +55,7 @@ public class ParseRouteListTest extends 
BaseGoogleComputeEngineParseTest<ListPag
             URI.create(BASE_URL + 
"/party/global/gateways/default-internet-gateway"), // nextHopGateway
             null // warnings
       );
-      return ListPage.create( //
+      return ForwardingListPage.create( //
             ImmutableList.of(route1, route2), // items
             null // nextPageToken
       );

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseSnapshotListTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseSnapshotListTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseSnapshotListTest.java
index 27d28ba..76e32e3 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseSnapshotListTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseSnapshotListTest.java
@@ -22,7 +22,8 @@ import java.net.URI;
 
 import javax.ws.rs.Consumes;
 
-import org.jclouds.googlecomputeengine.domain.ListPage;
+import org.jclouds.googlecloud.domain.ForwardingListPage;
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.Snapshot;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest;
 import org.testng.annotations.Test;
@@ -50,7 +51,7 @@ public class ParseSnapshotListTest extends 
BaseGoogleComputeEngineParseTest<List
             URI.create(BASE_URL + 
"/party/zones/us-central1-a/disks/testimage1"), // sourceDisk
             "8243603669926824540"// sourceDiskId
       );
-      return ListPage.create( //
+      return ForwardingListPage.create( //
             ImmutableList.of(snapshot1, snapshot2), // items
             null // nextPageToken
       );

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseTargetPoolListTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseTargetPoolListTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseTargetPoolListTest.java
index d900f90..c4071e2 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseTargetPoolListTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseTargetPoolListTest.java
@@ -20,7 +20,8 @@ import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
 
 import javax.ws.rs.Consumes;
 
-import org.jclouds.googlecomputeengine.domain.ListPage;
+import org.jclouds.googlecloud.domain.ForwardingListPage;
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.TargetPool;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest;
 import org.testng.annotations.Test;
@@ -37,7 +38,7 @@ public class ParseTargetPoolListTest extends 
BaseGoogleComputeEngineParseTest<Li
 
    @Override @Consumes(APPLICATION_JSON)
    public ListPage<TargetPool> expected() {
-      return ListPage.create( //
+      return ForwardingListPage.create( //
             ImmutableList.of(new ParseTargetPoolTest().expected()), // items
             null // nextPageToken
       );

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseZoneListTest.java
----------------------------------------------------------------------
diff --git 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseZoneListTest.java
 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseZoneListTest.java
index 47019b4..06b8808 100644
--- 
a/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseZoneListTest.java
+++ 
b/google-compute-engine/src/test/java/org/jclouds/googlecomputeengine/parse/ParseZoneListTest.java
@@ -22,7 +22,8 @@ import java.net.URI;
 
 import javax.ws.rs.Consumes;
 
-import org.jclouds.googlecomputeengine.domain.ListPage;
+import org.jclouds.googlecloud.domain.ForwardingListPage;
+import org.jclouds.googlecloud.domain.ListPage;
 import org.jclouds.googlecomputeengine.domain.Zone;
 import 
org.jclouds.googlecomputeengine.internal.BaseGoogleComputeEngineParseTest;
 import org.testng.annotations.Test;
@@ -55,7 +56,7 @@ public class ParseZoneListTest extends 
BaseGoogleComputeEngineParseTest<ListPage
                   )), //
             null // availableMachineTypes
       );
-      return ListPage.create( //
+      return ForwardingListPage.create( //
             ImmutableList.of(zone1, zone2), // items
             null // nextPageToken
       );

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/googlecloud/pom.xml
----------------------------------------------------------------------
diff --git a/googlecloud/pom.xml b/googlecloud/pom.xml
new file mode 100644
index 0000000..8e06883
--- /dev/null
+++ b/googlecloud/pom.xml
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+    Licensed to the Apache Software Foundation (ASF) under one or more
+    contributor license agreements.  See the NOTICE file distributed with
+    this work for additional information regarding copyright ownership.
+    The ASF licenses this file to You under the Apache License, Version 2.0
+    (the "License"); you may not use this file except in compliance with
+    the License.  You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd";>
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.apache.jclouds.labs</groupId>
+        <artifactId>jclouds-labs-google</artifactId>
+        <version>2.0.0-SNAPSHOT</version>
+    </parent>
+
+    <!-- TODO: when out of labs, switch to org.jclouds.provider -->
+    <groupId>org.apache.jclouds.labs</groupId>
+    <artifactId>googlecloud</artifactId>
+    <name>jclouds Google Cloud Core</name>
+    <description>jclouds components common to Google Cloud 
products</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.jclouds.labs</groupId>
+            <artifactId>oauth</artifactId>
+            <version>${project.version}</version>
+            <type>jar</type>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jclouds.labs</groupId>
+            <artifactId>oauth</artifactId>
+            <version>${project.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>com.google.auto.value</groupId>
+            <artifactId>auto-value</artifactId>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jclouds</groupId>
+            <artifactId>jclouds-core</artifactId>
+            <version>${jclouds.version}</version>
+            <type>test-jar</type>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+</project>

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/googlecloud/src/main/java/org/jclouds/googlecloud/config/CurrentProject.java
----------------------------------------------------------------------
diff --git 
a/googlecloud/src/main/java/org/jclouds/googlecloud/config/CurrentProject.java 
b/googlecloud/src/main/java/org/jclouds/googlecloud/config/CurrentProject.java
new file mode 100644
index 0000000..d60b2d0
--- /dev/null
+++ 
b/googlecloud/src/main/java/org/jclouds/googlecloud/config/CurrentProject.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.googlecloud.config;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.inject.Qualifier;
+
+/** Associated bindings with the current <a 
href="https://cloud.google.com/compute/docs/projects";>project</a>. */
+@Retention(value = RetentionPolicy.RUNTIME)
+@Target(value = {ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER, 
ElementType.METHOD})
+@Qualifier
+public @interface CurrentProject {
+
+   /** Utilities related to the email associated with the service account of a 
project. */
+   public static final class ClientEmail {
+      public static final String DESCRIPTION = "" //
+            + "client_email which usually looks like 
[email protected] or " //
+            + "[email protected]";
+      private static final Pattern PROJECT_NUMBER_PATTERN = 
Pattern.compile("^([0-9]+)[@-].*");
+
+      /** Parses the project number from the client email or throws an 
{@linkplain IllegalArgumentException}. */
+      public static String toProjectNumber(String email) {
+         Matcher matcher = PROJECT_NUMBER_PATTERN.matcher(email);
+         checkArgument(matcher.find(), "Client email %s is malformed. Should 
be %s", email, DESCRIPTION);
+         return matcher.group(1);
+      }
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/googlecloud/src/main/java/org/jclouds/googlecloud/config/GoogleCloudProperties.java
----------------------------------------------------------------------
diff --git 
a/googlecloud/src/main/java/org/jclouds/googlecloud/config/GoogleCloudProperties.java
 
b/googlecloud/src/main/java/org/jclouds/googlecloud/config/GoogleCloudProperties.java
new file mode 100644
index 0000000..baa6f8a
--- /dev/null
+++ 
b/googlecloud/src/main/java/org/jclouds/googlecloud/config/GoogleCloudProperties.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.googlecloud.config;
+
+import org.jclouds.oauth.v2.config.OAuthProperties;
+
+/** Configuration properties keys used in {@link 
org.jclouds.ContextBuilder#overrides(java.util.Properties)}. */
+public final class GoogleCloudProperties {
+
+   /**
+    * How requests are authorized using OAuth. Defaults to {@link 
org.jclouds.oauth.v2.config.CredentialType#P12_PRIVATE_KEY_CREDENTIALS}.
+    *
+    * @see org.jclouds.oauth.v2.config.CredentialType
+    */
+   public static final String CREDENTIAL_TYPE = 
OAuthProperties.CREDENTIAL_TYPE;
+
+   /**
+    * Set this property to specify the <a 
href="https://cloud.google.com/compute/docs/projects";>project name</a> this
+    * context applies to.
+    * <p/> This is an alternative to looking up the project name at runtime.
+    */
+   public static final String PROJECT_NAME = 
"jclouds.googlecloud.project-name";
+
+   private GoogleCloudProperties() {
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-google/blob/f191c8fb/googlecloud/src/main/java/org/jclouds/googlecloud/config/ListPageAdapterFactory.java
----------------------------------------------------------------------
diff --git 
a/googlecloud/src/main/java/org/jclouds/googlecloud/config/ListPageAdapterFactory.java
 
b/googlecloud/src/main/java/org/jclouds/googlecloud/config/ListPageAdapterFactory.java
new file mode 100644
index 0000000..5f8618f
--- /dev/null
+++ 
b/googlecloud/src/main/java/org/jclouds/googlecloud/config/ListPageAdapterFactory.java
@@ -0,0 +1,109 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jclouds.googlecloud.config;
+
+import java.io.IOException;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+
+import org.jclouds.googlecloud.domain.ForwardingListPage;
+import org.jclouds.googlecloud.domain.ListPage;
+
+import com.google.common.collect.ImmutableList;
+import com.google.gson.Gson;
+import com.google.gson.TypeAdapter;
+import com.google.gson.TypeAdapterFactory;
+import com.google.gson.reflect.TypeToken;
+import com.google.gson.stream.JsonReader;
+import com.google.gson.stream.JsonToken;
+import com.google.gson.stream.JsonWriter;
+
+public final class ListPageAdapterFactory implements TypeAdapterFactory {
+   static final class ListPageAdapter extends TypeAdapter<ListPage<?>> {
+      private final TypeAdapter<?> itemAdapter;
+
+      ListPageAdapter(TypeAdapter<?> itemAdapter) {
+         this.itemAdapter = itemAdapter;
+         nullSafe();
+      }
+
+      public void write(JsonWriter out, ListPage<?> value) throws IOException {
+         throw new UnsupportedOperationException("We only read ListPages!");
+      }
+
+      public ListPage<?> read(JsonReader in) throws IOException {
+         ImmutableList.Builder<Object> items = ImmutableList.builder();
+         String nextPageToken = null;
+         in.beginObject();
+         while (in.hasNext()) {
+            String name = in.nextName();
+            if (name.equals("items")) {
+               if (in.peek() == JsonToken.BEGIN_ARRAY) {
+                  readItems(in, items);
+               } else { // aggregated
+                  readAggregate(in, items);
+               }
+            } else if (name.equals("nextPageToken")) {
+               nextPageToken = in.nextString();
+            } else {
+               in.skipValue();
+            }
+         }
+         in.endObject();
+         return ForwardingListPage.create(items.build(), nextPageToken);
+      }
+
+      private void readItems(JsonReader in, ImmutableList.Builder<Object> 
items) throws IOException {
+         in.beginArray();
+         while (in.hasNext()) {
+            Object item = itemAdapter.read(in);
+            if (item != null) {
+               items.add(item);
+            }
+         }
+         in.endArray();
+      }
+
+      private void readAggregate(JsonReader in, ImmutableList.Builder<Object> 
items) throws IOException {
+         in.beginObject(); // enter zone name -> type -> items map
+         while (in.hasNext()) {
+            String scope = in.nextName(); // skip zone name
+            in.beginObject(); // enter zone map
+            while (in.hasNext()) {
+               String resourceTypeOrWarning = in.nextName();
+               if (!resourceTypeOrWarning.equals("warning")) {
+                  readItems(in, items);
+               } else {
+                  in.skipValue();
+               }
+            }
+            in.endObject(); // end zone map
+         }
+         in.endObject(); // end item wrapper
+      }
+   }
+
+   @SuppressWarnings("unchecked") public <T> TypeAdapter<T> create(Gson gson, 
TypeToken<T> ownerType) {
+      Type type = ownerType.getType();
+      if (ownerType.getRawType() != ListPage.class || !(type instanceof 
ParameterizedType)) {
+         return null;
+      }
+      Type elementType = ((ParameterizedType) 
type).getActualTypeArguments()[0];
+      TypeAdapter<?> itemAdapter = gson.getAdapter(TypeToken.get(elementType));
+      return (TypeAdapter<T>) new ListPageAdapter(itemAdapter);
+   }
+}

Reply via email to