You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by jd...@apache.org on 2014/08/13 19:04:08 UTC

[4/4] git commit: Prefer Regions to Zones

Prefer Regions to Zones


Project: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/commit/1c3ea466
Tree: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/tree/1c3ea466
Diff: http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/diff/1c3ea466

Branch: refs/heads/master
Commit: 1c3ea466d30fa752d7a4e2ee278b6480376fdf35
Parents: 0dacbce
Author: Jeremy Daggett <je...@rackspace.com>
Authored: Fri Jul 25 09:23:35 2014 -0700
Committer: Jeremy Daggett <je...@rackspace.com>
Committed: Wed Aug 13 10:02:44 2014 -0700

----------------------------------------------------------------------
 .../RegionToEndpointNegotiateVersion.java       | 141 +++++++++++++++++++
 .../ZoneToEndpointNegotiateVersion.java         | 141 -------------------
 .../openstack/glance/v1_0/GlanceApi.java        |  14 +-
 .../glance/v1_0/GlanceApiMetadata.java          |   8 +-
 .../functions/internal/ParseImageDetails.java   |  10 +-
 .../v1_0/functions/internal/ParseImages.java    |   8 +-
 .../v1_0/handlers/GlanceErrorHandler.java       |   4 +-
 .../GlanceVersionNegotiationExpectTest.java     |   6 +-
 .../v1_0/features/ImageApiExpectTest.java       |  68 ++++-----
 .../glance/v1_0/features/ImageApiLiveTest.java  |  24 ++--
 .../v1_0/internal/BaseGlanceExpectTest.java     |   4 +-
 .../openstack/marconi/v1/MarconiApi.java        |  96 +++++++++++--
 .../marconi/v1/MarconiApiMetadata.java          |  20 +--
 .../openstack/marconi/v1/features/ClaimApi.java |  57 ++++----
 .../marconi/v1/features/MessageApi.java         |  50 +++----
 .../openstack/marconi/v1/features/QueueApi.java |  50 +++----
 .../v1/functions/QueuesToPagedIterable.java     |   4 +-
 .../marconi/v1/features/ClaimApiLiveTest.java   |  38 ++---
 .../marconi/v1/features/ClaimApiMockTest.java   |   8 +-
 .../marconi/v1/features/MessageApiLiveTest.java |  56 ++++----
 .../marconi/v1/features/MessageApiMockTest.java |  18 +--
 .../marconi/v1/features/QueueApiLiveTest.java   |  58 ++++----
 .../marconi/v1/features/QueueApiMockTest.java   |  28 ++--
 .../v1/internal/BaseMarconiApiLiveTest.java     |  10 +-
 .../openstack/neutron/v2/NeutronApi.java        |  13 ++
 .../neutron/v2/extensions/RouterApi.java        |  41 +++---
 .../openstack/neutron/v2_0/NeutronApi.java      |  68 ++++++++-
 .../neutron/v2_0/NeutronApiMetadata.java        |  15 +-
 .../v2_0/config/NeutronHttpApiModule.java       |  30 ++--
 .../neutron/v2_0/extensions/RouterApi.java      |  28 ++--
 .../v2_0/functions/ParseNetworkDetails.java     |   3 +
 .../neutron/v2_0/functions/ParseNetworks.java   |   3 +
 .../v2_0/functions/ParsePortDetails.java        |   3 +
 .../neutron/v2_0/functions/ParsePorts.java      |   3 +
 .../v2_0/functions/ParseRouterDetails.java      |   3 +
 .../neutron/v2_0/functions/ParseRouters.java    |   3 +
 .../v2_0/functions/ParseSubnetDetails.java      |   3 +
 .../neutron/v2_0/functions/ParseSubnets.java    |   3 +
 .../v2_0/extensions/RouterApiExpectTest.java    |   2 +
 .../v2_0/extensions/RouterApiLiveTest.java      |   2 +
 .../v2_0/features/NetworkApiExpectTest.java     |   2 +
 .../v2_0/features/NetworkApiLiveTest.java       |   2 +
 .../v2_0/features/PortApiExpectTest.java        |   2 +
 .../neutron/v2_0/features/PortApiLiveTest.java  |   2 +
 .../v2_0/features/SubnetApiExpectTest.java      |   2 +
 .../v2_0/features/SubnetApiLiveTest.java        |   2 +
 .../jclouds/openstack/swift/v1/SwiftApi.java    |  51 +++----
 .../swift/v1/TemporaryUrlSignerMockTest.java    |   4 +-
 .../swift/v1/features/AccountApiLiveTest.java   |  12 +-
 .../swift/v1/internal/BaseSwiftApiLiveTest.java |   8 +-
 .../uk/AutoscaleUKProviderMetadata.java         |  14 +-
 .../AutoscaleUKProviderMetadataExpectTest.java  |   6 +-
 .../us/AutoscaleUSProviderMetadata.java         |  22 +--
 .../us/v1/AutoscaleUSProviderMetadata.java      |  20 +--
 .../AutoscaleUSProviderMetadataExpectTest.java  |   5 +-
 .../rackspace/autoscale/v1/AutoscaleApi.java    |  64 ++++++---
 .../autoscale/v1/AutoscaleApiMetadata.java      |  10 +-
 .../v1/domain/CreateScalingPolicy.java          |  34 +++--
 .../autoscale/v1/domain/GroupConfiguration.java |   1 +
 .../autoscale/v1/domain/GroupState.java         |   1 +
 .../v1/domain/LaunchConfiguration.java          |   1 +
 .../autoscale/v1/features/GroupApi.java         |  67 +++++----
 .../autoscale/v1/features/PolicyApi.java        |  30 ++--
 .../autoscale/v1/features/WebhookApi.java       |  48 ++++---
 .../autoscale/v1/features/GroupApiLiveTest.java |  70 ++++-----
 .../autoscale/v1/features/GroupApiMockTest.java |  44 +++---
 .../v1/features/ScalingPolicyApiLiveTest.java   |  56 ++++----
 .../v1/features/ScalingPolicyApiMockTest.java   |  28 ++--
 .../v1/features/WebhookApiLiveTest.java         |  76 +++++-----
 .../v1/features/WebhookApiMockTest.java         |  20 +--
 rackspace-cloudbigdata-us/README.md             |   2 +-
 .../us/v1/CloudBigDataUSProviderMetadata.java   |  20 +--
 .../cloudbigdata/v1/CloudBigDataApi.java        |  53 +++++--
 .../v1/CloudBigDataApiMetadata.java             |  12 +-
 .../cloudbigdata/v1/features/ClusterApi.java    |  45 +++---
 .../cloudbigdata/v1/features/ProfileApi.java    |  19 +--
 .../v1/predicates/ClusterPredicates.java        |  36 ++---
 .../v1/features/ClusterApiLiveTest.java         |  38 ++---
 .../v1/features/ClusterApiMockTest.java         |  20 +--
 .../v1/features/ProfileApiLiveTest.java         |  16 +--
 .../v1/features/ProfileApiMockTest.java         |  28 ++--
 .../rackspace/cloudfiles/v1/CloudFilesApi.java  |  14 +-
 .../features/CloudFilesAccountApiLiveTest.java  |   4 +-
 .../v1/features/CloudFilesCDNApiLiveTest.java   |  74 +++++-----
 .../v1/features/CloudFilesCDNApiMockTest.java   |  44 +++---
 .../uk/CloudQueuesUKProviderMetadata.java       |  31 ++--
 .../us/CloudQueuesUSProviderMetadata.java       |  39 ++---
 87 files changed, 1289 insertions(+), 1054 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/1c3ea466/openstack-glance/src/main/java/org/jclouds/openstack/glance/functions/RegionToEndpointNegotiateVersion.java
----------------------------------------------------------------------
diff --git a/openstack-glance/src/main/java/org/jclouds/openstack/glance/functions/RegionToEndpointNegotiateVersion.java b/openstack-glance/src/main/java/org/jclouds/openstack/glance/functions/RegionToEndpointNegotiateVersion.java
new file mode 100644
index 0000000..f45a57d
--- /dev/null
+++ b/openstack-glance/src/main/java/org/jclouds/openstack/glance/functions/RegionToEndpointNegotiateVersion.java
@@ -0,0 +1,141 @@
+/*
+ * 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.openstack.glance.functions;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkState;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+import java.util.regex.Pattern;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.http.HttpRequest;
+import org.jclouds.json.Json;
+import org.jclouds.location.Region;
+import org.jclouds.rest.HttpClient;
+import org.jclouds.rest.annotations.ApiVersion;
+import org.jclouds.util.Strings2;
+
+import com.google.common.base.Function;
+import com.google.common.base.Joiner;
+import com.google.common.base.Splitter;
+import com.google.common.base.Supplier;
+import com.google.common.base.Throwables;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.Iterables;
+
+@Singleton
+public class RegionToEndpointNegotiateVersion implements Function<Object, URI> {
+
+   public static final String VERSION_NEGOTIATION_HEADER = "Is-Version-Negotiation-Request";
+
+   private static final Pattern versionRegex = Pattern.compile("v[0-9]+(\\.[0-9])?[0-9]*");
+
+   private static class VersionsJsonResponse{
+      public static class Version {
+         public static class Link {
+            public String href;
+            public String rel;
+         }
+         public String status;
+         public String id;
+         public List<Link> links;
+      }
+      public List<Version> versions;
+   }
+
+   private final Supplier<Map<String, Supplier<URI>>> regionToEndpointSupplier;
+   private final String apiVersion;
+   private final LoadingCache<URI, URI> endpointCache;
+
+   @Inject
+   public RegionToEndpointNegotiateVersion(@Region Supplier<Map<String, Supplier<URI>>> regionToEndpointSupplier,
+         @ApiVersion String rawApiVersionString, final HttpClient client, final Json json) {
+      this.regionToEndpointSupplier = checkNotNull(regionToEndpointSupplier, "regionToEndpointSupplier");
+      if (!rawApiVersionString.startsWith("v")) {
+         this.apiVersion = "v" + rawApiVersionString;
+      } else {
+         this.apiVersion = rawApiVersionString;
+      }
+      this.endpointCache = CacheBuilder.newBuilder()
+         .build(
+            new CacheLoader<URI, URI>() {
+               public URI load(URI baseEndpointUri) {
+                  try {
+                     List<String> baseEndpointPathParts = Splitter.on('/').omitEmptyStrings().splitToList(baseEndpointUri.getPath());
+                     if (!baseEndpointPathParts.isEmpty()
+                           && versionRegex.matcher(baseEndpointPathParts.get(baseEndpointPathParts.size() - 1)).matches()) {
+                        // Constructs a base URI Glance endpoint by stripping the version from the received URI
+                        baseEndpointUri = new URI(baseEndpointUri.getScheme(), baseEndpointUri.getUserInfo(),
+                           baseEndpointUri.getHost(), baseEndpointUri.getPort(),
+                           Joiner.on('/').join(baseEndpointPathParts.subList(0, baseEndpointPathParts.size() - 1)) + "/",
+                           baseEndpointUri.getQuery(), baseEndpointUri.getFragment());
+                     }
+
+                     HttpRequest negotiationRequest = HttpRequest.builder()
+                        .method("GET").endpoint(baseEndpointUri)
+                        .addHeader(VERSION_NEGOTIATION_HEADER, "true").build();
+                     InputStream response = client.invoke(negotiationRequest).getPayload().openStream();
+                     VersionsJsonResponse versions = json.fromJson(Strings2.toStringAndClose(response), VersionsJsonResponse.class);
+                     for (VersionsJsonResponse.Version version : versions.versions) {
+                        if (apiVersion.equals(version.id)) {
+                           // We only expect one element here, we'll get an exception here if that changes
+                           URI versionedEndpointUri = new URI(Iterables.getOnlyElement(version.links).href);
+                           return new URI(baseEndpointUri.getScheme(), versionedEndpointUri.getUserInfo(),
+                              versionedEndpointUri.getHost(), versionedEndpointUri.getPort(),
+                              versionedEndpointUri.getPath(), versionedEndpointUri.getQuery(),
+                              versionedEndpointUri.getFragment());
+                        }
+                     }
+                  } catch (URISyntaxException ex) {
+                     throw Throwables.propagate(ex);
+                  } catch (IOException ex) {
+                     throw Throwables.propagate(ex);
+                  }
+                  throw new UnsupportedOperationException("Glance endpoint does not support API version: " + apiVersion);
+              }
+         });
+   }
+
+   @Override
+   public URI apply(Object from) {
+      checkArgument(from instanceof String, "you must specify a region, as a String argument");
+      Map<String, Supplier<URI>> regionToEndpoint = regionToEndpointSupplier.get();
+      checkState(!regionToEndpoint.isEmpty(), "no region name to endpoint mappings configured!");
+      checkArgument(regionToEndpoint.containsKey(from),
+               "requested location %s, which is not in the configured locations: %s", from, regionToEndpoint);
+      URI uri = regionToEndpointSupplier.get().get(from).get();
+
+      try {
+         return endpointCache.get(uri);
+      } catch (ExecutionException ex) {
+         throw Throwables.propagate(ex);
+      }
+    }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/1c3ea466/openstack-glance/src/main/java/org/jclouds/openstack/glance/functions/ZoneToEndpointNegotiateVersion.java
----------------------------------------------------------------------
diff --git a/openstack-glance/src/main/java/org/jclouds/openstack/glance/functions/ZoneToEndpointNegotiateVersion.java b/openstack-glance/src/main/java/org/jclouds/openstack/glance/functions/ZoneToEndpointNegotiateVersion.java
deleted file mode 100644
index 7f5779d..0000000
--- a/openstack-glance/src/main/java/org/jclouds/openstack/glance/functions/ZoneToEndpointNegotiateVersion.java
+++ /dev/null
@@ -1,141 +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.openstack.glance.functions;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-
-import java.io.InputStream;
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.ExecutionException;
-import java.util.regex.Pattern;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
-import org.jclouds.http.HttpRequest;
-import org.jclouds.json.Json;
-import org.jclouds.location.Zone;
-import org.jclouds.rest.annotations.ApiVersion;
-import org.jclouds.rest.HttpClient;
-import org.jclouds.util.Strings2;
-
-import com.google.common.base.Function;
-import com.google.common.base.Joiner;
-import com.google.common.base.Splitter;
-import com.google.common.base.Supplier;
-import com.google.common.base.Throwables;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import com.google.common.collect.Iterables;
-
-@Singleton
-public class ZoneToEndpointNegotiateVersion implements Function<Object, URI> {
-
-   public static final String VERSION_NEGOTIATION_HEADER = "Is-Version-Negotiation-Request";
-
-   private static final Pattern versionRegex = Pattern.compile("v[0-9]+(\\.[0-9])?[0-9]*");
-
-   private static class VersionsJsonResponse{
-      public static class Version {
-         public static class Link {
-            public String href;
-            public String rel;
-         }
-         public String status;
-         public String id;
-         public List<Link> links;
-      }
-      public List<Version> versions;
-   }
-
-   private final Supplier<Map<String, Supplier<URI>>> zoneToEndpointSupplier;
-   private final String apiVersion;
-   private final LoadingCache<URI, URI> endpointCache;
-
-   @Inject
-   public ZoneToEndpointNegotiateVersion(@Zone Supplier<Map<String, Supplier<URI>>> zoneToEndpointSupplier,
-         @ApiVersion String rawApiVersionString, final HttpClient client, final Json json) {
-      this.zoneToEndpointSupplier = checkNotNull(zoneToEndpointSupplier, "zoneToEndpointSupplier");
-      if (!rawApiVersionString.startsWith("v")) {
-         this.apiVersion = "v" + rawApiVersionString;
-      } else {
-         this.apiVersion = rawApiVersionString;
-      }
-      this.endpointCache = CacheBuilder.newBuilder()
-         .build(
-            new CacheLoader<URI, URI>() {
-               public URI load(URI baseEndpointUri) {
-                  try {
-                     List<String> baseEndpointPathParts = Splitter.on('/').omitEmptyStrings().splitToList(baseEndpointUri.getPath());
-                     if (!baseEndpointPathParts.isEmpty()
-                           && versionRegex.matcher(baseEndpointPathParts.get(baseEndpointPathParts.size() - 1)).matches()) {
-                        // Constructs a base URI Glance endpoint by stripping the version from the received URI
-                        baseEndpointUri = new URI(baseEndpointUri.getScheme(), baseEndpointUri.getUserInfo(),
-                           baseEndpointUri.getHost(), baseEndpointUri.getPort(),
-                           Joiner.on('/').join(baseEndpointPathParts.subList(0, baseEndpointPathParts.size() - 1)) + "/",
-                           baseEndpointUri.getQuery(), baseEndpointUri.getFragment());
-                     }
-
-                     HttpRequest negotiationRequest = HttpRequest.builder()
-                        .method("GET").endpoint(baseEndpointUri)
-                        .addHeader(VERSION_NEGOTIATION_HEADER, "true").build();
-                     InputStream response = client.invoke(negotiationRequest).getPayload().openStream();
-                     VersionsJsonResponse versions = json.fromJson(Strings2.toStringAndClose(response), VersionsJsonResponse.class);
-                     for (VersionsJsonResponse.Version version : versions.versions) {
-                        if (apiVersion.equals(version.id)) {
-                           // We only expect one element here, we'll get an exception here if that changes
-                           URI versionedEndpointUri = new URI(Iterables.getOnlyElement(version.links).href);
-                           return new URI(baseEndpointUri.getScheme(), versionedEndpointUri.getUserInfo(),
-                              versionedEndpointUri.getHost(), versionedEndpointUri.getPort(),
-                              versionedEndpointUri.getPath(), versionedEndpointUri.getQuery(),
-                              versionedEndpointUri.getFragment());
-                        }
-                     }
-                  } catch (URISyntaxException ex) {
-                     throw Throwables.propagate(ex);
-                  } catch (IOException ex) {
-                     throw Throwables.propagate(ex);
-                  }
-                  throw new UnsupportedOperationException("Glance endpoint does not support API version: " + apiVersion);
-              }
-         });
-   }
-
-   @Override
-   public URI apply(Object from) {
-      checkArgument(from instanceof String, "you must specify a zone, as a String argument");
-      Map<String, Supplier<URI>> zoneToEndpoint = zoneToEndpointSupplier.get();
-      checkState(!zoneToEndpoint.isEmpty(), "no zone name to endpoint mappings configured!");
-      checkArgument(zoneToEndpoint.containsKey(from),
-               "requested location %s, which is not in the configured locations: %s", from, zoneToEndpoint);
-      URI uri = zoneToEndpointSupplier.get().get(from).get();
-
-      try {
-         return endpointCache.get(uri);
-      } catch (ExecutionException ex) {
-         throw Throwables.propagate(ex);
-      }
-    }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/1c3ea466/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/GlanceApi.java
----------------------------------------------------------------------
diff --git a/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/GlanceApi.java b/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/GlanceApi.java
index c2d43e0..db88dcc 100644
--- a/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/GlanceApi.java
+++ b/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/GlanceApi.java
@@ -20,8 +20,8 @@ import java.io.Closeable;
 import java.util.Set;
 
 import org.jclouds.javax.annotation.Nullable;
-import org.jclouds.location.Zone;
-import org.jclouds.openstack.glance.functions.ZoneToEndpointNegotiateVersion;
+import org.jclouds.location.Region;
+import org.jclouds.openstack.glance.functions.RegionToEndpointNegotiateVersion;
 import org.jclouds.openstack.glance.v1_0.features.ImageApi;
 import org.jclouds.rest.annotations.Delegate;
 import org.jclouds.rest.annotations.EndpointParam;
@@ -35,18 +35,18 @@ import com.google.inject.Provides;
  */
 public interface GlanceApi extends Closeable {
    /**
-    * Gets the configured zones.
+    * Gets the configured regions.
     *
-    * @return the zone codes currently configured
+    * @return the region codes currently configured
     */
    @Provides
-   @Zone
-   Set<String> getConfiguredZones();
+   @Region
+   Set<String> getConfiguredRegions();
 
    /**
     * Provides access to Image features.
     */
    @Delegate
-   ImageApi getImageApiForZone(@EndpointParam(parser = ZoneToEndpointNegotiateVersion.class) @Nullable String zone);
+   ImageApi getImageApi(@EndpointParam(parser = RegionToEndpointNegotiateVersion.class) @Nullable String region);
 
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/1c3ea466/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/GlanceApiMetadata.java
----------------------------------------------------------------------
diff --git a/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/GlanceApiMetadata.java b/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/GlanceApiMetadata.java
index cf546fa..fbf0f7d 100644
--- a/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/GlanceApiMetadata.java
+++ b/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/GlanceApiMetadata.java
@@ -26,7 +26,7 @@ import org.jclouds.openstack.glance.v1_0.config.GlanceHttpApiModule;
 import org.jclouds.openstack.keystone.v2_0.config.AuthenticationApiModule;
 import org.jclouds.openstack.keystone.v2_0.config.CredentialTypes;
 import org.jclouds.openstack.keystone.v2_0.config.KeystoneAuthenticationModule;
-import org.jclouds.openstack.keystone.v2_0.config.KeystoneAuthenticationModule.ZoneModule;
+import org.jclouds.openstack.keystone.v2_0.config.KeystoneAuthenticationModule.RegionModule;
 import org.jclouds.openstack.v2_0.ServiceType;
 import org.jclouds.rest.internal.BaseHttpApiMetadata;
 
@@ -34,7 +34,7 @@ import com.google.common.collect.ImmutableSet;
 import com.google.inject.Module;
 
 /**
- * Implementation of {@link ApiMetadata} for Glance 1.0 API
+ * Implementation of {@link org.jclouds.apis.ApiMetadata} for Glance 1.0 API
  */
 public class GlanceApiMetadata extends BaseHttpApiMetadata<GlanceApi> {
 
@@ -73,10 +73,10 @@ public class GlanceApiMetadata extends BaseHttpApiMetadata<GlanceApi> {
          .defaultModules(ImmutableSet.<Class<? extends Module>>builder()
                                      .add(AuthenticationApiModule.class)
                                      .add(KeystoneAuthenticationModule.class)
-                                     .add(ZoneModule.class)
+                                     .add(RegionModule.class)
                                      .add(GlanceHttpApiModule.class).build());
       }
-      
+
       @Override
       public GlanceApiMetadata build() {
          return new GlanceApiMetadata(this);

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/1c3ea466/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/functions/internal/ParseImageDetails.java
----------------------------------------------------------------------
diff --git a/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/functions/internal/ParseImageDetails.java b/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/functions/internal/ParseImageDetails.java
index 49ef9c1..cce2913 100644
--- a/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/functions/internal/ParseImageDetails.java
+++ b/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/functions/internal/ParseImageDetails.java
@@ -35,14 +35,14 @@ import org.jclouds.openstack.glance.v1_0.GlanceApi;
 import org.jclouds.openstack.glance.v1_0.domain.ImageDetails;
 import org.jclouds.openstack.glance.v1_0.features.ImageApi;
 import org.jclouds.openstack.glance.v1_0.functions.internal.ParseImageDetails.Images;
-import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
 import org.jclouds.openstack.v2_0.domain.Link;
+import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
+import org.jclouds.openstack.v2_0.options.PaginationOptions;
 
 import com.google.common.annotations.Beta;
 import com.google.common.base.Function;
 import com.google.common.base.Optional;
 import com.google.inject.TypeLiteral;
-import org.jclouds.openstack.v2_0.options.PaginationOptions;
 
 /**
  * boiler plate until we determine a better way
@@ -75,8 +75,8 @@ public class ParseImageDetails extends ParseJson<Images> {
 
       @Override
       protected Function<Object, IterableWithMarker<ImageDetails>> markerToNextForArg0(Optional<Object> arg0) {
-         String zone = arg0.isPresent() ? arg0.get().toString() : null;
-         final ImageApi imageApi = api.getImageApiForZone(zone);
+         String region = arg0.isPresent() ? arg0.get().toString() : null;
+         final ImageApi imageApi = api.getImageApi(region);
          return new Function<Object, IterableWithMarker<ImageDetails>>() {
 
             @SuppressWarnings("unchecked")
@@ -90,7 +90,7 @@ public class ParseImageDetails extends ParseJson<Images> {
                }
                else {
                   return IterableWithMarkers.EMPTY;
-               }                 
+               }
             }
 
             @Override

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/1c3ea466/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/functions/internal/ParseImages.java
----------------------------------------------------------------------
diff --git a/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/functions/internal/ParseImages.java b/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/functions/internal/ParseImages.java
index 5d02694..3ac8547 100644
--- a/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/functions/internal/ParseImages.java
+++ b/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/functions/internal/ParseImages.java
@@ -35,14 +35,14 @@ import org.jclouds.openstack.glance.v1_0.GlanceApi;
 import org.jclouds.openstack.glance.v1_0.domain.Image;
 import org.jclouds.openstack.glance.v1_0.features.ImageApi;
 import org.jclouds.openstack.glance.v1_0.functions.internal.ParseImages.Images;
-import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
 import org.jclouds.openstack.v2_0.domain.Link;
+import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
+import org.jclouds.openstack.v2_0.options.PaginationOptions;
 
 import com.google.common.annotations.Beta;
 import com.google.common.base.Function;
 import com.google.common.base.Optional;
 import com.google.inject.TypeLiteral;
-import org.jclouds.openstack.v2_0.options.PaginationOptions;
 
 /**
  * boiler plate until we determine a better way
@@ -75,8 +75,8 @@ public class ParseImages extends ParseJson<Images> {
 
       @Override
       protected Function<Object, IterableWithMarker<Image>> markerToNextForArg0(Optional<Object> arg0) {
-         String zone = arg0.isPresent() ? arg0.get().toString() : null;
-         final ImageApi imageApi = api.getImageApiForZone(zone);
+         String region = arg0.isPresent() ? arg0.get().toString() : null;
+         final ImageApi imageApi = api.getImageApi(region);
          return new Function<Object, IterableWithMarker<Image>>() {
 
             @SuppressWarnings("unchecked")

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/1c3ea466/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/handlers/GlanceErrorHandler.java
----------------------------------------------------------------------
diff --git a/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/handlers/GlanceErrorHandler.java b/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/handlers/GlanceErrorHandler.java
index 67412f2..232f5bf 100644
--- a/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/handlers/GlanceErrorHandler.java
+++ b/openstack-glance/src/main/java/org/jclouds/openstack/glance/v1_0/handlers/GlanceErrorHandler.java
@@ -24,7 +24,7 @@ import org.jclouds.http.HttpCommand;
 import org.jclouds.http.HttpErrorHandler;
 import org.jclouds.http.HttpResponse;
 import org.jclouds.http.HttpResponseException;
-import org.jclouds.openstack.glance.functions.ZoneToEndpointNegotiateVersion;
+import org.jclouds.openstack.glance.functions.RegionToEndpointNegotiateVersion;
 import org.jclouds.rest.AuthorizationException;
 import org.jclouds.rest.ResourceNotFoundException;
 
@@ -46,7 +46,7 @@ public class GlanceErrorHandler implements HttpErrorHandler {
       switch (response.getStatusCode()) {
          // do not throw exceptions on Glance version negotiation
          case 300:
-            if (command.getCurrentRequest().getFirstHeaderOrNull(ZoneToEndpointNegotiateVersion.VERSION_NEGOTIATION_HEADER) != null) {
+            if (command.getCurrentRequest().getFirstHeaderOrNull(RegionToEndpointNegotiateVersion.VERSION_NEGOTIATION_HEADER) != null) {
                return;
             }
             break;

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/1c3ea466/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/features/GlanceVersionNegotiationExpectTest.java
----------------------------------------------------------------------
diff --git a/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/features/GlanceVersionNegotiationExpectTest.java b/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/features/GlanceVersionNegotiationExpectTest.java
index e6d1b96..8694b37 100644
--- a/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/features/GlanceVersionNegotiationExpectTest.java
+++ b/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/features/GlanceVersionNegotiationExpectTest.java
@@ -53,7 +53,7 @@ public class GlanceVersionNegotiationExpectTest extends BaseGlanceExpectTest {
             responseWithKeystoneAccess, versionNegotiationRequest, versionNegotiationResponse,
             list, listResponse);
 
-      assertEquals(apiWhenExist.getImageApiForZone("az-1.region-a.geo-1").list().concat().toString(),
+      assertEquals(apiWhenExist.getImageApi("az-1.region-a.geo-1").list().concat().toString(),
             new ParseImagesTest().expected().toString());
    }
 
@@ -70,7 +70,7 @@ public class GlanceVersionNegotiationExpectTest extends BaseGlanceExpectTest {
       GlanceApi apiWhenExist = requestsSendResponses(keystoneAuthWithUsernameAndPassword,
             responseWithKeystoneAccess, versionNegotiationRequest, localVersionNegotiationResponse);
 
-      apiWhenExist.getImageApiForZone("az-1.region-a.geo-1").list();
+      apiWhenExist.getImageApi("az-1.region-a.geo-1").list();
    }
 
     /*
@@ -95,7 +95,7 @@ public class GlanceVersionNegotiationExpectTest extends BaseGlanceExpectTest {
             localResponseWithKeystoneAccess, versionNegotiationRequest, versionNegotiationResponse,
             list, listResponse);
 
-      assertEquals(apiWhenExist.getImageApiForZone("az-1.region-a.geo-1").list().concat().toString(),
+      assertEquals(apiWhenExist.getImageApi("az-1.region-a.geo-1").list().concat().toString(),
             new ParseImagesTest().expected().toString());
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/1c3ea466/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/features/ImageApiExpectTest.java
----------------------------------------------------------------------
diff --git a/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/features/ImageApiExpectTest.java b/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/features/ImageApiExpectTest.java
index 56cdd0b..d9e89df 100644
--- a/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/features/ImageApiExpectTest.java
+++ b/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/features/ImageApiExpectTest.java
@@ -58,9 +58,9 @@ public class ImageApiExpectTest extends BaseGlanceExpectTest {
             responseWithKeystoneAccess, versionNegotiationRequest, versionNegotiationResponse,
             list, listResponse);
 
-      assertEquals(apiWhenExist.getConfiguredZones(), ImmutableSet.of("az-1.region-a.geo-1"));
+      assertEquals(apiWhenExist.getConfiguredRegions(), ImmutableSet.of("az-1.region-a.geo-1"));
 
-      assertEquals(apiWhenExist.getImageApiForZone("az-1.region-a.geo-1").list().concat().toString(),
+      assertEquals(apiWhenExist.getImageApi("az-1.region-a.geo-1").list().concat().toString(),
             new ParseImagesTest().expected().toString());
    }
 
@@ -76,7 +76,7 @@ public class ImageApiExpectTest extends BaseGlanceExpectTest {
             responseWithKeystoneAccess, versionNegotiationRequest, versionNegotiationResponse,
             list, listResponse);
 
-      assertTrue(apiWhenNoExist.getImageApiForZone("az-1.region-a.geo-1").list().concat().isEmpty());
+      assertTrue(apiWhenNoExist.getImageApi("az-1.region-a.geo-1").list().concat().isEmpty());
    }
 
    public void testListInDetailWhenResponseIs2xx() throws Exception {
@@ -92,9 +92,9 @@ public class ImageApiExpectTest extends BaseGlanceExpectTest {
             responseWithKeystoneAccess, versionNegotiationRequest, versionNegotiationResponse,
             listInDetail, listInDetailResponse);
 
-      assertEquals(apiWhenExistInDetail.getConfiguredZones(), ImmutableSet.of("az-1.region-a.geo-1"));
+      assertEquals(apiWhenExistInDetail.getConfiguredRegions(), ImmutableSet.of("az-1.region-a.geo-1"));
 
-      assertEquals(apiWhenExistInDetail.getImageApiForZone("az-1.region-a.geo-1").listInDetail().concat().toString(),
+      assertEquals(apiWhenExistInDetail.getImageApi("az-1.region-a.geo-1").listInDetail().concat().toString(),
             new ParseImagesInDetailTest().expected().toString());
    }
 
@@ -110,7 +110,7 @@ public class ImageApiExpectTest extends BaseGlanceExpectTest {
             responseWithKeystoneAccess, versionNegotiationRequest, versionNegotiationResponse,
             listInDetail, listInDetailResponse);
 
-      assertTrue(apiWhenNoExistInDetail.getImageApiForZone("az-1.region-a.geo-1").listInDetail().concat().isEmpty());
+      assertTrue(apiWhenNoExistInDetail.getImageApi("az-1.region-a.geo-1").listInDetail().concat().isEmpty());
    }
 
    public void testShowWhenResponseIs2xx() throws Exception {
@@ -125,9 +125,9 @@ public class ImageApiExpectTest extends BaseGlanceExpectTest {
             responseWithKeystoneAccess, versionNegotiationRequest, versionNegotiationResponse,
             show, showResponse);
 
-      assertEquals(apiWhenExist.getConfiguredZones(), ImmutableSet.of("az-1.region-a.geo-1"));
+      assertEquals(apiWhenExist.getConfiguredRegions(), ImmutableSet.of("az-1.region-a.geo-1"));
 
-      assertEquals(apiWhenExist.getImageApiForZone("az-1.region-a.geo-1").get("fcc451d0-f6e4-4824-ad8f-70ec12326d07").toString(),
+      assertEquals(apiWhenExist.getImageApi("az-1.region-a.geo-1").get("fcc451d0-f6e4-4824-ad8f-70ec12326d07").toString(),
             new ParseImageDetailsFromHeadersTest().expected().toString());
    }
 
@@ -144,7 +144,7 @@ public class ImageApiExpectTest extends BaseGlanceExpectTest {
             responseWithKeystoneAccess, versionNegotiationRequest, versionNegotiationResponse,
             show, showResponse);
 
-      assertNull(apiWhenNoExist.getImageApiForZone("az-1.region-a.geo-1").get("fcc451d0-f6e4-4824-ad8f-70ec12326d07"));
+      assertNull(apiWhenNoExist.getImageApi("az-1.region-a.geo-1").get("fcc451d0-f6e4-4824-ad8f-70ec12326d07"));
    }
 
 
@@ -160,9 +160,9 @@ public class ImageApiExpectTest extends BaseGlanceExpectTest {
             responseWithKeystoneAccess, versionNegotiationRequest, versionNegotiationResponse,
             get, getResponse);
 
-      assertEquals(apiWhenExist.getConfiguredZones(), ImmutableSet.of("az-1.region-a.geo-1"));
+      assertEquals(apiWhenExist.getConfiguredRegions(), ImmutableSet.of("az-1.region-a.geo-1"));
 
-      assertEquals(Strings2.toStringAndClose(apiWhenExist.getImageApiForZone("az-1.region-a.geo-1").getAsStream("fcc451d0-f6e4-4824-ad8f-70ec12326d07")),
+      assertEquals(Strings2.toStringAndClose(apiWhenExist.getImageApi("az-1.region-a.geo-1").getAsStream("fcc451d0-f6e4-4824-ad8f-70ec12326d07")),
                "foo");
    }
 
@@ -178,7 +178,7 @@ public class ImageApiExpectTest extends BaseGlanceExpectTest {
             responseWithKeystoneAccess, versionNegotiationRequest, versionNegotiationResponse,
             get, getResponse);
 
-      assertNull(apiWhenNoExist.getImageApiForZone("az-1.region-a.geo-1").getAsStream("fcc451d0-f6e4-4824-ad8f-70ec12326d07"));
+      assertNull(apiWhenNoExist.getImageApi("az-1.region-a.geo-1").getAsStream("fcc451d0-f6e4-4824-ad8f-70ec12326d07"));
    }
 
    public void testCreateWhenResponseIs2xx() throws Exception {
@@ -196,9 +196,9 @@ public class ImageApiExpectTest extends BaseGlanceExpectTest {
             responseWithKeystoneAccess, versionNegotiationRequest, versionNegotiationResponse,
             get, createResponse);
 
-      assertEquals(apiWhenExist.getConfiguredZones(), ImmutableSet.of("az-1.region-a.geo-1"));
+      assertEquals(apiWhenExist.getConfiguredRegions(), ImmutableSet.of("az-1.region-a.geo-1"));
 
-      assertEquals(apiWhenExist.getImageApiForZone("az-1.region-a.geo-1").create("test", new StringPayload("somedata")),
+      assertEquals(apiWhenExist.getImageApi("az-1.region-a.geo-1").create("test", new StringPayload("somedata")),
             new ParseImageDetailsTest().expected());
    }
 
@@ -218,9 +218,9 @@ public class ImageApiExpectTest extends BaseGlanceExpectTest {
             responseWithKeystoneAccess, versionNegotiationRequest, versionNegotiationResponse,
             get, createResponse);
 
-      assertEquals(apiWhenExist.getConfiguredZones(), ImmutableSet.of("az-1.region-a.geo-1"));
+      assertEquals(apiWhenExist.getConfiguredRegions(), ImmutableSet.of("az-1.region-a.geo-1"));
 
-      apiWhenExist.getImageApiForZone("az-1.region-a.geo-1").create("test", new StringPayload("somedata"));
+      apiWhenExist.getImageApi("az-1.region-a.geo-1").create("test", new StringPayload("somedata"));
    }
 
    public void testReserveWhenResponseIs2xx() throws Exception {
@@ -237,9 +237,9 @@ public class ImageApiExpectTest extends BaseGlanceExpectTest {
             responseWithKeystoneAccess, versionNegotiationRequest, versionNegotiationResponse,
             get, createResponse);
 
-      assertEquals(apiWhenExist.getConfiguredZones(), ImmutableSet.of("az-1.region-a.geo-1"));
+      assertEquals(apiWhenExist.getConfiguredRegions(), ImmutableSet.of("az-1.region-a.geo-1"));
 
-      assertEquals(apiWhenExist.getImageApiForZone("az-1.region-a.geo-1").reserve("test"), new ParseImageDetailsTest().expected());
+      assertEquals(apiWhenExist.getImageApi("az-1.region-a.geo-1").reserve("test"), new ParseImageDetailsTest().expected());
    }
 
    @Test(expectedExceptions = AuthorizationException.class)
@@ -257,9 +257,9 @@ public class ImageApiExpectTest extends BaseGlanceExpectTest {
             responseWithKeystoneAccess, versionNegotiationRequest, versionNegotiationResponse,
             get, createResponse);
 
-      assertEquals(apiWhenExist.getConfiguredZones(), ImmutableSet.of("az-1.region-a.geo-1"));
+      assertEquals(apiWhenExist.getConfiguredRegions(), ImmutableSet.of("az-1.region-a.geo-1"));
 
-      apiWhenExist.getImageApiForZone("az-1.region-a.geo-1").reserve("test");
+      apiWhenExist.getImageApi("az-1.region-a.geo-1").reserve("test");
    }
 
    public void testUpdateMetadataWhenResponseIs2xx() throws Exception {
@@ -285,9 +285,9 @@ public class ImageApiExpectTest extends BaseGlanceExpectTest {
             responseWithKeystoneAccess, versionNegotiationRequest, versionNegotiationResponse,
             get, updateResponse);
 
-      assertEquals(apiWhenExist.getConfiguredZones(), ImmutableSet.of("az-1.region-a.geo-1"));
+      assertEquals(apiWhenExist.getConfiguredRegions(), ImmutableSet.of("az-1.region-a.geo-1"));
 
-      assertEquals(apiWhenExist.getImageApiForZone("az-1.region-a.geo-1")
+      assertEquals(apiWhenExist.getImageApi("az-1.region-a.geo-1")
             .update("fcc451d0-f6e4-4824-ad8f-70ec12326d07",
                   UpdateImageOptions.Builder.name("newname"),
                   UpdateImageOptions.Builder.isPublic(true),
@@ -317,9 +317,9 @@ public class ImageApiExpectTest extends BaseGlanceExpectTest {
             responseWithKeystoneAccess, versionNegotiationRequest, versionNegotiationResponse,
             get, updateResponse);
 
-      assertEquals(apiWhenExist.getConfiguredZones(), ImmutableSet.of("az-1.region-a.geo-1"));
+      assertEquals(apiWhenExist.getConfiguredRegions(), ImmutableSet.of("az-1.region-a.geo-1"));
 
-      apiWhenExist.getImageApiForZone("az-1.region-a.geo-1")
+      apiWhenExist.getImageApi("az-1.region-a.geo-1")
             .update("fcc451d0-f6e4-4824-ad8f-70ec12326d07",
                   UpdateImageOptions.Builder.name("newname"),
                   UpdateImageOptions.Builder.isPublic(true));
@@ -341,9 +341,9 @@ public class ImageApiExpectTest extends BaseGlanceExpectTest {
             responseWithKeystoneAccess, versionNegotiationRequest, versionNegotiationResponse,
             get, updateResponse);
 
-      assertEquals(apiWhenExist.getConfiguredZones(), ImmutableSet.of("az-1.region-a.geo-1"));
+      assertEquals(apiWhenExist.getConfiguredRegions(), ImmutableSet.of("az-1.region-a.geo-1"));
 
-      assertEquals(apiWhenExist.getImageApiForZone("az-1.region-a.geo-1").upload("fcc451d0-f6e4-4824-ad8f-70ec12326d07",
+      assertEquals(apiWhenExist.getImageApi("az-1.region-a.geo-1").upload("fcc451d0-f6e4-4824-ad8f-70ec12326d07",
             new StringPayload("somenewdata")), new ParseImageDetailsTest().expected());
    }
 
@@ -366,9 +366,9 @@ public class ImageApiExpectTest extends BaseGlanceExpectTest {
             responseWithKeystoneAccess, versionNegotiationRequest, versionNegotiationResponse,
             get, updateResponse);
 
-      assertEquals(apiWhenExist.getConfiguredZones(), ImmutableSet.of("az-1.region-a.geo-1"));
+      assertEquals(apiWhenExist.getConfiguredRegions(), ImmutableSet.of("az-1.region-a.geo-1"));
 
-      assertEquals(apiWhenExist.getImageApiForZone("az-1.region-a.geo-1").upload("fcc451d0-f6e4-4824-ad8f-70ec12326d07",
+      assertEquals(apiWhenExist.getImageApi("az-1.region-a.geo-1").upload("fcc451d0-f6e4-4824-ad8f-70ec12326d07",
             new StringPayload("somenewdata"), UpdateImageOptions.Builder.name("anothernewname")), new ParseImageDetailsTest().expected());
    }
 
@@ -390,9 +390,9 @@ public class ImageApiExpectTest extends BaseGlanceExpectTest {
             responseWithKeystoneAccess, versionNegotiationRequest, versionNegotiationResponse,
             get, updateResponse);
 
-      assertEquals(apiWhenExist.getConfiguredZones(), ImmutableSet.of("az-1.region-a.geo-1"));
+      assertEquals(apiWhenExist.getConfiguredRegions(), ImmutableSet.of("az-1.region-a.geo-1"));
 
-      apiWhenExist.getImageApiForZone("az-1.region-a.geo-1").upload("fcc451d0-f6e4-4824-ad8f-70ec12326d07",
+      apiWhenExist.getImageApi("az-1.region-a.geo-1").upload("fcc451d0-f6e4-4824-ad8f-70ec12326d07",
             new StringPayload("somenewdata"), UpdateImageOptions.Builder.name("anothernewname"));
    }
 
@@ -408,9 +408,9 @@ public class ImageApiExpectTest extends BaseGlanceExpectTest {
             responseWithKeystoneAccess, versionNegotiationRequest, versionNegotiationResponse,
             get, getResponse);
 
-      assertEquals(apiWhenExist.getConfiguredZones(), ImmutableSet.of("az-1.region-a.geo-1"));
+      assertEquals(apiWhenExist.getConfiguredRegions(), ImmutableSet.of("az-1.region-a.geo-1"));
 
-      assertTrue(apiWhenExist.getImageApiForZone("az-1.region-a.geo-1").delete("fcc451d0-f6e4-4824-ad8f-70ec12326d07"));
+      assertTrue(apiWhenExist.getImageApi("az-1.region-a.geo-1").delete("fcc451d0-f6e4-4824-ad8f-70ec12326d07"));
    }
 
    public void testDeleteWhenResponseIs4xx() throws Exception {
@@ -426,8 +426,8 @@ public class ImageApiExpectTest extends BaseGlanceExpectTest {
             responseWithKeystoneAccess, versionNegotiationRequest, versionNegotiationResponse,
             get, getResponse);
 
-      assertEquals(apiWhenExist.getConfiguredZones(), ImmutableSet.of("az-1.region-a.geo-1"));
+      assertEquals(apiWhenExist.getConfiguredRegions(), ImmutableSet.of("az-1.region-a.geo-1"));
 
-      assertFalse(apiWhenExist.getImageApiForZone("az-1.region-a.geo-1").delete("fcc451d0-f6e4-4824-ad8f-70ec12326d07"));
+      assertFalse(apiWhenExist.getImageApi("az-1.region-a.geo-1").delete("fcc451d0-f6e4-4824-ad8f-70ec12326d07"));
    }
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/1c3ea466/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/features/ImageApiLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/features/ImageApiLiveTest.java b/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/features/ImageApiLiveTest.java
index c624224..1be12f5 100644
--- a/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/features/ImageApiLiveTest.java
+++ b/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/features/ImageApiLiveTest.java
@@ -41,8 +41,8 @@ public class ImageApiLiveTest extends BaseGlanceApiLiveTest {
 
    @Test
    public void testList() throws Exception {
-      for (String zoneId : api.getConfiguredZones()) {
-         ImageApi imageApi = api.getImageApiForZone(zoneId);
+      for (String region : api.getConfiguredRegions()) {
+         ImageApi imageApi = api.getImageApi(region);
          Set<? extends Image> response = imageApi.list().concat().toSet();
          assert null != response;
          for (Image image : response) {
@@ -59,8 +59,8 @@ public class ImageApiLiveTest extends BaseGlanceApiLiveTest {
 
    @Test
    public void testListInDetail() throws Exception {
-      for (String zoneId : api.getConfiguredZones()) {
-         ImageApi imageApi = api.getImageApiForZone(zoneId);
+      for (String region : api.getConfiguredRegions()) {
+         ImageApi imageApi = api.getImageApi(region);
          Set<? extends ImageDetails> response = imageApi.listInDetail().concat().toSet();
          assert null != response;
          for (ImageDetails image : response) {
@@ -87,16 +87,16 @@ public class ImageApiLiveTest extends BaseGlanceApiLiveTest {
    @Test
    public void testCreateUpdateAndDeleteImage() {
       StringPayload imageData = new StringPayload("This isn't really an image!");
-      for (String zoneId : api.getConfiguredZones()) {
-         ImageApi imageApi = api.getImageApiForZone(zoneId);
+      for (String region : api.getConfiguredRegions()) {
+         ImageApi imageApi = api.getImageApi(region);
          ImageDetails details = imageApi.create("jclouds-live-test", imageData, diskFormat(DiskFormat.RAW), containerFormat(ContainerFormat.BARE));
          assertEquals(details.getName(), "jclouds-live-test");
          assertEquals(details.getSize().get().longValue(), imageData.getRawContent().length());
-         
+
          details = imageApi.update(details.getId(), UpdateImageOptions.Builder.name("jclouds-live-test2"), UpdateImageOptions.Builder.minDisk(10));
          assertEquals(details.getName(), "jclouds-live-test2");
          assertEquals(details.getMinDisk(), 10);
-         
+
          Image fromListing = imageApi.list(
                   ListImageOptions.Builder.containerFormat(ContainerFormat.BARE).name("jclouds-live-test2").limit(2))
                   .get(0);
@@ -106,7 +106,7 @@ public class ImageApiLiveTest extends BaseGlanceApiLiveTest {
          assertEquals(Iterables.getOnlyElement(imageApi.listInDetail(ListImageOptions.Builder.name("jclouds-live-test2"))), details);
 
          assertTrue(imageApi.delete(details.getId()));
-         
+
          assertTrue(imageApi.list(ListImageOptions.Builder.name("jclouds-live-test2")).isEmpty());
       }
    }
@@ -114,11 +114,11 @@ public class ImageApiLiveTest extends BaseGlanceApiLiveTest {
    @Test
    public void testReserveUploadAndDeleteImage() {
       StringPayload imageData = new StringPayload("This isn't an image!");
-      for (String zoneId : api.getConfiguredZones()) {
-         ImageApi imageApi = api.getImageApiForZone(zoneId);
+      for (String region : api.getConfiguredRegions()) {
+         ImageApi imageApi = api.getImageApi(region);
          ImageDetails details = imageApi.reserve("jclouds-live-res-test", diskFormat(DiskFormat.RAW), containerFormat(ContainerFormat.BARE));
          assertEquals(details.getName(), "jclouds-live-res-test");
- 
+
          details = imageApi.upload(details.getId(), imageData, UpdateImageOptions.Builder.name("jclouds-live-res-test2"), UpdateImageOptions.Builder.minDisk(10));
          assertEquals(details.getName(), "jclouds-live-res-test2");
          assertEquals(details.getSize().get().longValue(), imageData.getRawContent().length());

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/1c3ea466/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/internal/BaseGlanceExpectTest.java
----------------------------------------------------------------------
diff --git a/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/internal/BaseGlanceExpectTest.java b/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/internal/BaseGlanceExpectTest.java
index adcb8b4..0bfaf37 100644
--- a/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/internal/BaseGlanceExpectTest.java
+++ b/openstack-glance/src/test/java/org/jclouds/openstack/glance/v1_0/internal/BaseGlanceExpectTest.java
@@ -18,7 +18,7 @@ package org.jclouds.openstack.glance.v1_0.internal;
 
 import org.jclouds.http.HttpRequest;
 import org.jclouds.http.HttpResponse;
-import org.jclouds.openstack.glance.functions.ZoneToEndpointNegotiateVersion;
+import org.jclouds.openstack.glance.functions.RegionToEndpointNegotiateVersion;
 import org.jclouds.openstack.glance.v1_0.GlanceApi;
 import org.jclouds.openstack.keystone.v2_0.internal.KeystoneFixture;
 import org.jclouds.rest.internal.BaseRestApiExpectTest;
@@ -50,7 +50,7 @@ public abstract class BaseGlanceExpectTest extends BaseRestApiExpectTest<GlanceA
       // version negotiation
       versionNegotiationRequest = HttpRequest.builder().method("GET")
             .endpoint("https://glance.jclouds.org:9292/")
-            .addHeader(ZoneToEndpointNegotiateVersion.VERSION_NEGOTIATION_HEADER, "true").build();
+            .addHeader(RegionToEndpointNegotiateVersion.VERSION_NEGOTIATION_HEADER, "true").build();
       versionNegotiationResponse = HttpResponse.builder().statusCode(300).message("HTTP/1.1 300 Multiple Choices").payload(
             payloadFromResourceWithContentType("/glanceVersionResponse.json", "application/json")).build();
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/1c3ea466/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/MarconiApi.java
----------------------------------------------------------------------
diff --git a/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/MarconiApi.java b/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/MarconiApi.java
index 8fc2eea..c69e0d4 100644
--- a/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/MarconiApi.java
+++ b/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/MarconiApi.java
@@ -16,32 +16,91 @@
  */
 package org.jclouds.openstack.marconi.v1;
 
-import com.google.inject.Provides;
+import java.io.Closeable;
+import java.util.Set;
+import java.util.UUID;
+
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+
 import org.jclouds.javax.annotation.Nullable;
-import org.jclouds.location.Zone;
-import org.jclouds.location.functions.ZoneToEndpoint;
+import org.jclouds.location.Region;
+import org.jclouds.location.functions.RegionToEndpoint;
 import org.jclouds.openstack.marconi.v1.features.ClaimApi;
 import org.jclouds.openstack.marconi.v1.features.MessageApi;
 import org.jclouds.openstack.marconi.v1.features.QueueApi;
 import org.jclouds.rest.annotations.Delegate;
 import org.jclouds.rest.annotations.EndpointParam;
 
-import javax.ws.rs.HeaderParam;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import java.io.Closeable;
-import java.util.Set;
-import java.util.UUID;
+import com.google.inject.Provides;
 
 /**
  * Marconi is a robust, web-scale message queuing service to support the distributed nature of large web applications.
  */
 public interface MarconiApi extends Closeable {
    /**
-    * @return The Zone codes configured
+    * @return the Region codes configured
+    */
+   @Provides
+   @Region
+   Set<String> getConfiguredRegions();
+
+   /**
+    * Provides access to Queue features.
+    *
+    * @param region   The region where this queue will live.
+    * @param clientId A UUID for each client instance. The UUID must be submitted in its canonical form (for example,
+    *                 3381af92-2b9e-11e3-b191-71861300734c). The client generates the Client-ID once. Client-ID
+    *                 persists between restarts of the client so the client should reuse that same Client-ID. All
+    *                 message-related operations require the use of Client-ID in the headers to ensure that messages
+    *                 are not echoed back to the client that posted them, unless the client explicitly requests this.
+    */
+   @Delegate
+   QueueApi getQueueApi(@EndpointParam(parser = RegionToEndpoint.class) @Nullable String region,
+         @HeaderParam("Client-ID") UUID clientId);
+
+   /**
+    * Provides access to Message features.
+    *
+    * @param region   The region where this queue lives.
+    * @param clientId A UUID for each client instance. The UUID must be submitted in its canonical form (for example,
+    *                 3381af92-2b9e-11e3-b191-71861300734c). The client generates the Client-ID once. Client-ID
+    *                 persists between restarts of the client so the client should reuse that same Client-ID. All
+    *                 message-related operations require the use of Client-ID in the headers to ensure that messages
+    *                 are not echoed back to the client that posted them, unless the client explicitly requests this.
+    * @param name     Name of the queue.
+    */
+   @Delegate
+   @Path("/queues/{name}")
+   MessageApi getMessageApi(@EndpointParam(parser = RegionToEndpoint.class) @Nullable String region,
+         @HeaderParam("Client-ID") UUID clientId,
+         @PathParam("name") String name);
+
+   /**
+    * Provides access to Claim features.
+    *
+    * @param region   The region where this queue lives.
+    * @param clientId A UUID for each client instance. The UUID must be submitted in its canonical form (for example,
+    *                 3381af92-2b9e-11e3-b191-71861300734c). The client generates the Client-ID once. Client-ID
+    *                 persists between restarts of the client so the client should reuse that same Client-ID. All
+    *                 message-related operations require the use of Client-ID in the headers to ensure that messages
+    *                 are not echoed back to the client that posted them, unless the client explicitly requests this.
+    * @param name     Name of the queue.
+    */
+   @Delegate
+   @Path("/queues/{name}")
+   ClaimApi getClaimApi(@EndpointParam(parser = RegionToEndpoint.class) @Nullable String region,
+         @HeaderParam("Client-ID") UUID clientId,
+         @PathParam("name") String name);
+
+   /**
+    * @return the Zone codes configured
+    * @deprecated Please use {@link #getConfiguredRegions()} as this method will be removed in jclouds 3.0.
     */
+   @Deprecated
    @Provides
-   @Zone
+   @Region
    Set<String> getConfiguredZones();
 
    /**
@@ -53,10 +112,13 @@ public interface MarconiApi extends Closeable {
     *                 persists between restarts of the client so the client should reuse that same Client-ID. All
     *                 message-related operations require the use of Client-ID in the headers to ensure that messages
     *                 are not echoed back to the client that posted them, unless the client explicitly requests this.
+    * @deprecated Please use {@link #getQueueApi(String, UUID)} as this method will be removed
+    *             in jclouds 3.0.
     */
+   @Deprecated
    @Delegate
    QueueApi getQueueApiForZoneAndClient(
-         @EndpointParam(parser = ZoneToEndpoint.class) @Nullable String zone,
+         @EndpointParam(parser = RegionToEndpoint.class) @Nullable String zone,
          @HeaderParam("Client-ID") UUID clientId);
 
    /**
@@ -69,11 +131,14 @@ public interface MarconiApi extends Closeable {
     *                 message-related operations require the use of Client-ID in the headers to ensure that messages
     *                 are not echoed back to the client that posted them, unless the client explicitly requests this.
     * @param name     Name of the queue.
+    * @deprecated Please use {@link #getMessageApi(String, UUID, String)} as this method will be removed
+    *             in jclouds 3.0.
     */
+   @Deprecated
    @Delegate
    @Path("/queues/{name}")
    MessageApi getMessageApiForZoneAndClientAndQueue(
-         @EndpointParam(parser = ZoneToEndpoint.class) @Nullable String zone,
+         @EndpointParam(parser = RegionToEndpoint.class) @Nullable String zone,
          @HeaderParam("Client-ID") UUID clientId,
          @PathParam("name") String name);
 
@@ -87,11 +152,14 @@ public interface MarconiApi extends Closeable {
     *                 message-related operations require the use of Client-ID in the headers to ensure that messages
     *                 are not echoed back to the client that posted them, unless the client explicitly requests this.
     * @param name     Name of the queue.
+    * @deprecated Please use {@link #getClaimApi(String, UUID, String)} as this method will be removed
+    *             in jclouds 3.0.
     */
+   @Deprecated
    @Delegate
    @Path("/queues/{name}")
    ClaimApi getClaimApiForZoneAndClientAndQueue(
-         @EndpointParam(parser = ZoneToEndpoint.class) @Nullable String zone,
+         @EndpointParam(parser = RegionToEndpoint.class) @Nullable String zone,
          @HeaderParam("Client-ID") UUID clientId,
          @PathParam("name") String name);
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/1c3ea466/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/MarconiApiMetadata.java
----------------------------------------------------------------------
diff --git a/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/MarconiApiMetadata.java b/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/MarconiApiMetadata.java
index 093b267..d44f926 100644
--- a/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/MarconiApiMetadata.java
+++ b/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/MarconiApiMetadata.java
@@ -16,24 +16,24 @@
  */
 package org.jclouds.openstack.marconi.v1;
 
-import com.google.common.collect.ImmutableSet;
-import com.google.inject.Module;
+import static org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties.CREDENTIAL_TYPE;
+import static org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties.SERVICE_TYPE;
+
+import java.net.URI;
+import java.util.Properties;
 
 import org.jclouds.http.okhttp.config.OkHttpCommandExecutorServiceModule;
 import org.jclouds.openstack.keystone.v2_0.config.AuthenticationApiModule;
 import org.jclouds.openstack.keystone.v2_0.config.CredentialTypes;
 import org.jclouds.openstack.keystone.v2_0.config.KeystoneAuthenticationModule;
-import org.jclouds.openstack.keystone.v2_0.config.KeystoneAuthenticationModule.ZoneModule;
+import org.jclouds.openstack.keystone.v2_0.config.KeystoneAuthenticationModule.RegionModule;
 import org.jclouds.openstack.marconi.v1.config.MarconiHttpApiModule;
 import org.jclouds.openstack.marconi.v1.config.MarconiTypeAdapters;
 import org.jclouds.openstack.v2_0.ServiceType;
 import org.jclouds.rest.internal.BaseHttpApiMetadata;
 
-import java.net.URI;
-import java.util.Properties;
-
-import static org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties.CREDENTIAL_TYPE;
-import static org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties.SERVICE_TYPE;
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Module;
 
 /**
  * Implementation of {@link org.jclouds.apis.ApiMetadata} for Marconi 1.0 API
@@ -77,11 +77,11 @@ public class MarconiApiMetadata extends BaseHttpApiMetadata<MarconiApi> {
                                      .add(AuthenticationApiModule.class)
                                      .add(KeystoneAuthenticationModule.class)
                                      .add(OkHttpCommandExecutorServiceModule.class)
-                                     .add(ZoneModule.class)
+                                     .add(RegionModule.class)
                                      .add(MarconiTypeAdapters.class)
                                      .add(MarconiHttpApiModule.class).build());
       }
-      
+
       @Override
       public MarconiApiMetadata build() {
          return new MarconiApiMetadata(this);

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/1c3ea466/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/ClaimApi.java
----------------------------------------------------------------------
diff --git a/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/ClaimApi.java b/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/ClaimApi.java
index 4bc21a7..1afe47f 100644
--- a/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/ClaimApi.java
+++ b/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/ClaimApi.java
@@ -16,18 +16,7 @@
  */
 package org.jclouds.openstack.marconi.v1.features;
 
-import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
-import org.jclouds.openstack.marconi.v1.domain.Claim;
-import org.jclouds.openstack.marconi.v1.domain.Message;
-import org.jclouds.openstack.marconi.v1.functions.ParseClaim;
-import org.jclouds.openstack.marconi.v1.functions.ParseMessagesToList;
-import org.jclouds.rest.annotations.Fallback;
-import org.jclouds.rest.annotations.PATCH;
-import org.jclouds.rest.annotations.Payload;
-import org.jclouds.rest.annotations.PayloadParam;
-import org.jclouds.rest.annotations.RequestFilters;
-import org.jclouds.rest.annotations.ResponseParser;
-import org.jclouds.rest.annotations.SkipEncoding;
+import java.util.List;
 
 import javax.inject.Named;
 import javax.ws.rs.Consumes;
@@ -39,17 +28,31 @@ import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
-import java.util.List;
 
-import static org.jclouds.Fallbacks.EmptyListOnNotFoundOr404;
-import static org.jclouds.Fallbacks.FalseOnNotFoundOr404;
-import static org.jclouds.Fallbacks.NullOnNotFoundOr404;
+import org.jclouds.Fallbacks.EmptyListOnNotFoundOr404;
+import org.jclouds.Fallbacks.FalseOnNotFoundOr404;
+import org.jclouds.Fallbacks.NullOnNotFoundOr404;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
+import org.jclouds.openstack.marconi.v1.domain.Claim;
+import org.jclouds.openstack.marconi.v1.domain.Message;
+import org.jclouds.openstack.marconi.v1.functions.ParseClaim;
+import org.jclouds.openstack.marconi.v1.functions.ParseMessagesToList;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.PATCH;
+import org.jclouds.rest.annotations.Payload;
+import org.jclouds.rest.annotations.PayloadParam;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.ResponseParser;
+import org.jclouds.rest.annotations.SkipEncoding;
 
 /**
  * Provides access to Messages via their REST API.
  */
 @SkipEncoding({'/', '='})
 @RequestFilters(AuthenticateRequest.class)
+@Consumes(MediaType.APPLICATION_JSON)
+@Path("/claims")
 public interface ClaimApi {
    /**
     * This operation claims a set of messages (up to the value of the limit parameter) from oldest to newest and skips
@@ -85,13 +88,10 @@ public interface ClaimApi {
     */
    @Named("claim:claim")
    @POST
-   @Path("/claims")
+   @Payload("%7B\"ttl\":{ttl},\"grace\":{grace}%7D")
    @ResponseParser(ParseMessagesToList.class)
    @Fallback(EmptyListOnNotFoundOr404.class)
-   @Payload("%7B\"ttl\":{ttl},\"grace\":{grace}%7D")
-   List<Message> claim(@PayloadParam("ttl") int ttl,
-                       @PayloadParam("grace") int grace,
-                       @QueryParam("limit") int limit);
+   List<Message> claim(@PayloadParam("ttl") int ttl, @PayloadParam("grace") int grace, @QueryParam("limit") int limit);
 
    /**
     * Gets a specific claim and the associated messages.
@@ -100,10 +100,10 @@ public interface ClaimApi {
     */
    @Named("claim:get")
    @GET
+   @Path("/{claim_id}")
    @ResponseParser(ParseClaim.class)
-   @Consumes(MediaType.APPLICATION_JSON)
-   @Path("/claims/{claim_id}")
    @Fallback(NullOnNotFoundOr404.class)
+   @Nullable
    Claim get(@PathParam("claim_id") String claimId);
 
    /**
@@ -118,12 +118,11 @@ public interface ClaimApi {
     */
    @Named("claim:update")
    @PATCH
-   @Path("/claims/{claim_id}")
-   @Fallback(FalseOnNotFoundOr404.class)
-   @Payload("%7B\"ttl\":{ttl}%7D")
+   @Path("/{claim_id}")
    @Produces(MediaType.APPLICATION_JSON)
-   boolean update(@PathParam("claim_id") String claimId,
-                  @PayloadParam("ttl") int ttl);
+   @Payload("%7B\"ttl\":{ttl}%7D")
+   @Fallback(FalseOnNotFoundOr404.class)
+   boolean update(@PathParam("claim_id") String claimId, @PayloadParam("ttl") int ttl);
 
    /**
     * This operation immediately releases a claim, making any remaining, undeleted messages that are associated with
@@ -135,7 +134,7 @@ public interface ClaimApi {
     */
    @Named("claim:delete")
    @DELETE
-   @Path("/claims/{claim_id}")
+   @Path("/{claim_id}")
    @Fallback(FalseOnNotFoundOr404.class)
    boolean release(@PathParam("claim_id") String claimId);
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/1c3ea466/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/MessageApi.java
----------------------------------------------------------------------
diff --git a/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/MessageApi.java b/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/MessageApi.java
index 51c717e..1e648a7 100644
--- a/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/MessageApi.java
+++ b/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/MessageApi.java
@@ -16,6 +16,23 @@
  */
 package org.jclouds.openstack.marconi.v1.features;
 
+import java.util.List;
+
+import javax.inject.Named;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.Fallbacks.EmptyListOnNotFoundOr404;
+import org.jclouds.Fallbacks.FalseOnNotFoundOr404;
+import org.jclouds.Fallbacks.NullOnNotFoundOr404;
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.openstack.keystone.v2_0.KeystoneFallbacks.EmptyPaginatedCollectionOnNotFoundOr404;
 import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
 import org.jclouds.openstack.marconi.v1.binders.BindIdsToQueryParam;
 import org.jclouds.openstack.marconi.v1.domain.CreateMessage;
@@ -34,27 +51,13 @@ import org.jclouds.rest.annotations.ResponseParser;
 import org.jclouds.rest.annotations.SkipEncoding;
 import org.jclouds.rest.binders.BindToJsonPayload;
 
-import javax.inject.Named;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-import java.util.List;
-
-import static org.jclouds.Fallbacks.EmptyListOnNotFoundOr404;
-import static org.jclouds.Fallbacks.FalseOnNotFoundOr404;
-import static org.jclouds.Fallbacks.NullOnNotFoundOr404;
-import static org.jclouds.openstack.keystone.v2_0.KeystoneFallbacks.EmptyPaginatedCollectionOnNotFoundOr404;
-
 /**
  * Provides access to Messages via their REST API.
  */
 @SkipEncoding({'/', '='})
 @RequestFilters(AuthenticateRequest.class)
+@Consumes(MediaType.APPLICATION_JSON)
+@Path("/messages")
 public interface MessageApi {
    /**
     * Create message(s) on a queue.
@@ -64,9 +67,9 @@ public interface MessageApi {
     */
    @Named("message:create")
    @POST
-   @Path("/messages")
    @ResponseParser(ParseMessagesCreated.class)
    @Fallback(NullOnNotFoundOr404.class)
+   @Nullable
    MessagesCreated create(@BinderParam(BindToJsonPayload.class) List<CreateMessage> messages);
 
    /**
@@ -78,9 +81,7 @@ public interface MessageApi {
    @Named("message:stream")
    @GET
    @ResponseParser(ParseMessagesToStream.class)
-   @Consumes(MediaType.APPLICATION_JSON)
    @Fallback(EmptyPaginatedCollectionOnNotFoundOr404.class)
-   @Path("/messages")
    MessageStream stream(StreamMessagesOptions... options);
 
    /**
@@ -91,8 +92,6 @@ public interface MessageApi {
    @Named("message:list")
    @GET
    @ResponseParser(ParseMessagesToList.class)
-   @Consumes(MediaType.APPLICATION_JSON)
-   @Path("/messages")
    @Fallback(EmptyListOnNotFoundOr404.class)
    List<Message> list(@BinderParam(BindIdsToQueryParam.class) Iterable<String> ids);
 
@@ -103,10 +102,10 @@ public interface MessageApi {
     */
    @Named("message:get")
    @GET
+   @Path("/{message_id}")
    @ResponseParser(ParseMessage.class)
-   @Consumes(MediaType.APPLICATION_JSON)
-   @Path("/messages/{message_id}")
    @Fallback(NullOnNotFoundOr404.class)
+   @Nullable
    Message get(@PathParam("message_id") String id);
 
    /**
@@ -117,8 +116,6 @@ public interface MessageApi {
     */
    @Named("message:delete")
    @DELETE
-   @Consumes(MediaType.APPLICATION_JSON)
-   @Path("/messages")
    @Fallback(FalseOnNotFoundOr404.class)
    boolean delete(@BinderParam(BindIdsToQueryParam.class) Iterable<String> ids);
 
@@ -133,8 +130,7 @@ public interface MessageApi {
     */
    @Named("message:delete")
    @DELETE
-   @Consumes(MediaType.APPLICATION_JSON)
-   @Path("/messages/{message_id}")
+   @Path("/{message_id}")
    @Fallback(FalseOnNotFoundOr404.class)
    boolean deleteByClaim(@PathParam("message_id") String id,
                          @QueryParam("claim_id") String claimId);

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/1c3ea466/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/QueueApi.java
----------------------------------------------------------------------
diff --git a/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/QueueApi.java b/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/QueueApi.java
index 8953683..ec59bbe 100644
--- a/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/QueueApi.java
+++ b/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/features/QueueApi.java
@@ -16,6 +16,21 @@
  */
 package org.jclouds.openstack.marconi.v1.features;
 
+import java.util.Map;
+
+import javax.inject.Named;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.MediaType;
+
+import org.jclouds.Fallbacks.EmptyPagedIterableOnNotFoundOr404;
+import org.jclouds.Fallbacks.FalseOnNotFoundOr404;
 import org.jclouds.collect.PagedIterable;
 import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
 import org.jclouds.openstack.marconi.v1.domain.Queue;
@@ -34,26 +49,13 @@ import org.jclouds.rest.annotations.SkipEncoding;
 import org.jclouds.rest.annotations.Transform;
 import org.jclouds.rest.binders.BindToJsonPayload;
 
-import javax.inject.Named;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.MediaType;
-import java.util.Map;
-
-import static org.jclouds.Fallbacks.EmptyPagedIterableOnNotFoundOr404;
-import static org.jclouds.Fallbacks.FalseOnNotFoundOr404;
-
 /**
  * Provides access to Queues via their REST API.
  */
 @SkipEncoding({'/', '='})
 @RequestFilters(AuthenticateRequest.class)
+@Consumes(MediaType.APPLICATION_JSON)
+@Path("/queues")
 public interface QueueApi {
    /**
     * Create a queue.
@@ -63,7 +65,7 @@ public interface QueueApi {
     */
    @Named("queue:create")
    @PUT
-   @Path("queues/{name}")
+   @Path("/{name}")
    @Fallback(FalseOnNotFoundOr404.class)
    boolean create(@PathParam("name") String name);
 
@@ -75,7 +77,7 @@ public interface QueueApi {
     */
    @Named("queue:delete")
    @DELETE
-   @Path("queues/{name}")
+   @Path("/{name}")
    @Fallback(FalseOnNotFoundOr404.class)
    boolean delete(@PathParam("name") String name);
 
@@ -87,7 +89,7 @@ public interface QueueApi {
     */
    @Named("queue:get")
    @GET
-   @Path("queues/{name}")
+   @Path("/{name}")
    @Fallback(FalseOnNotFoundOr404.class)
    boolean exists(@PathParam("name") String name);
 
@@ -98,10 +100,8 @@ public interface QueueApi {
     */
    @Named("queue:list")
    @GET
-   @Consumes(MediaType.APPLICATION_JSON)
    @ResponseParser(ParseQueues.class)
    @Transform(QueuesToPagedIterable.class)
-   @Path("queues")
    @Fallback(EmptyPagedIterableOnNotFoundOr404.class)
    PagedIterable<Queue> list(@QueryParam("detailed") boolean detailed);
 
@@ -111,9 +111,7 @@ public interface QueueApi {
    @Named("queue:list")
    @GET
    @ResponseParser(ParseQueues.class)
-   @Consumes(MediaType.APPLICATION_JSON)
    @Fallback(EmptyQueuesFallback.class)
-   @Path("queues")
    Queues list(ListQueuesOptions options);
 
    /**
@@ -130,7 +128,7 @@ public interface QueueApi {
     */
    @Named("queue:setMetadata")
    @PUT
-   @Path("queues/{name}/metadata")
+   @Path("/{name}/metadata")
    @Produces(MediaType.APPLICATION_JSON)
    @Fallback(FalseOnNotFoundOr404.class)
    boolean setMetadata(@PathParam("name") String name,
@@ -144,8 +142,7 @@ public interface QueueApi {
     */
    @Named("queue:getMetadata")
    @GET
-   @Path("queues/{name}/metadata")
-   @Consumes(MediaType.APPLICATION_JSON)
+   @Path("/{name}/metadata")
    @Fallback(FalseOnNotFoundOr404.class)
    Map<String, String> getMetadata(@PathParam("name") String name);
 
@@ -158,8 +155,7 @@ public interface QueueApi {
     */
    @Named("queue:getStats")
    @GET
-   @Path("queues/{name}/stats")
-   @Consumes(MediaType.APPLICATION_JSON)
+   @Path("/{name}/stats")
    @ResponseParser(ParseQueueStats.class)
    @Fallback(FalseOnNotFoundOr404.class)
    QueueStats getStats(@PathParam("name") String name);

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/1c3ea466/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/functions/QueuesToPagedIterable.java
----------------------------------------------------------------------
diff --git a/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/functions/QueuesToPagedIterable.java b/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/functions/QueuesToPagedIterable.java
index 53f5dfd..bde8f5f 100644
--- a/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/functions/QueuesToPagedIterable.java
+++ b/openstack-marconi/src/main/java/org/jclouds/openstack/marconi/v1/functions/QueuesToPagedIterable.java
@@ -46,10 +46,10 @@ public class QueuesToPagedIterable extends ArgsToPagedIterable.FromCaller<Queue,
 
    @Override
    protected Function<Object, IterableWithMarker<Queue>> markerToNextForArgs(List<Object> args) {
-      String zone = String.class.cast(args.get(0));
+      String region = String.class.cast(args.get(0));
       UUID clientId = UUID.class.cast(args.get(1));
 
-      return new ListQueuesAtMarker(api.getQueueApiForZoneAndClient(zone, clientId));
+      return new ListQueuesAtMarker(api.getQueueApi(region, clientId));
    }
 
    private static class ListQueuesAtMarker implements Function<Object, IterableWithMarker<Queue>> {

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/1c3ea466/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/ClaimApiLiveTest.java
----------------------------------------------------------------------
diff --git a/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/ClaimApiLiveTest.java b/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/ClaimApiLiveTest.java
index c562421..a7fd8e9 100644
--- a/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/ClaimApiLiveTest.java
+++ b/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/ClaimApiLiveTest.java
@@ -41,8 +41,8 @@ public class ClaimApiLiveTest extends BaseMarconiApiLiveTest {
    private final Map<String, List<String>> claimIds = Maps.newHashMap();
 
    public void createQueues() throws Exception {
-      for (String zoneId : zones) {
-         QueueApi queueApi = api.getQueueApiForZoneAndClient(zoneId, CLIENT_ID);
+      for (String regionId : regions) {
+         QueueApi queueApi = api.getQueueApi(regionId, CLIENT_ID);
          boolean success = queueApi.create("jclouds-test");
 
          assertTrue(success);
@@ -51,8 +51,8 @@ public class ClaimApiLiveTest extends BaseMarconiApiLiveTest {
 
    @Test(dependsOnMethods = { "createQueues" })
    public void createMessages() throws Exception {
-      for (String zoneId : zones) {
-         MessageApi messageApi = api.getMessageApiForZoneAndClientAndQueue(zoneId, CLIENT_ID, "jclouds-test");
+      for (String regionId : regions) {
+         MessageApi messageApi = api.getMessageApi(regionId, CLIENT_ID, "jclouds-test");
 
          String json1 = "{\"event\":{\"name\":\"Austin Java User Group\",\"attendees\":[\"bob\",\"jim\",\"sally\"]}}";
          CreateMessage message1 = CreateMessage.builder().ttl(86400).body(json1).build();
@@ -71,16 +71,16 @@ public class ClaimApiLiveTest extends BaseMarconiApiLiveTest {
 
    @Test(dependsOnMethods = { "createMessages" })
    public void claimMessages() throws Exception {
-      for (String zoneId : zones) {
-         ClaimApi claimApi = api.getClaimApiForZoneAndClientAndQueue(zoneId, CLIENT_ID, "jclouds-test");
+      for (String regionId : regions) {
+         ClaimApi claimApi = api.getClaimApi(regionId, CLIENT_ID, "jclouds-test");
 
          List<Message> messages = claimApi.claim(300, 200, 2);
          assertEquals(messages.size(), 2);
 
-         claimIds.put(zoneId, new ArrayList<String>());
+         claimIds.put(regionId, new ArrayList<String>());
 
          for (Message message : messages) {
-            claimIds.get(zoneId).add(message.getClaimId().get());
+            claimIds.get(regionId).add(message.getClaimId().get());
 
             assertNotNull(message.getId());
             assertTrue(message.getClaimId().isPresent());
@@ -91,10 +91,10 @@ public class ClaimApiLiveTest extends BaseMarconiApiLiveTest {
 
    @Test(dependsOnMethods = { "claimMessages" })
    public void getClaim() throws Exception {
-      for (String zoneId : zones) {
-         ClaimApi claimApi = api.getClaimApiForZoneAndClientAndQueue(zoneId, CLIENT_ID, "jclouds-test");
+      for (String regionId : regions) {
+         ClaimApi claimApi = api.getClaimApi(regionId, CLIENT_ID, "jclouds-test");
 
-         Claim claim = claimApi.get(claimIds.get(zoneId).get(0));
+         Claim claim = claimApi.get(claimIds.get(regionId).get(0));
 
          assertNotNull(claim.getId());
          assertEquals(claim.getMessages().size(), 2);
@@ -110,10 +110,10 @@ public class ClaimApiLiveTest extends BaseMarconiApiLiveTest {
 
    @Test(dependsOnMethods = { "getClaim" })
    public void updateClaim() throws Exception {
-      for (String zoneId : zones) {
-         ClaimApi claimApi = api.getClaimApiForZoneAndClientAndQueue(zoneId, CLIENT_ID, "jclouds-test");
+      for (String regionId : regions) {
+         ClaimApi claimApi = api.getClaimApi(regionId, CLIENT_ID, "jclouds-test");
 
-         boolean success = claimApi.update(claimIds.get(zoneId).get(0), 400);
+         boolean success = claimApi.update(claimIds.get(regionId).get(0), 400);
 
          assertTrue(success);
       }
@@ -121,10 +121,10 @@ public class ClaimApiLiveTest extends BaseMarconiApiLiveTest {
 
    @Test(dependsOnMethods = { "updateClaim" })
    public void releaseClaim() throws Exception {
-      for (String zoneId : zones) {
-         ClaimApi claimApi = api.getClaimApiForZoneAndClientAndQueue(zoneId, CLIENT_ID, "jclouds-test");
+      for (String regionId : regions) {
+         ClaimApi claimApi = api.getClaimApi(regionId, CLIENT_ID, "jclouds-test");
 
-         boolean success = claimApi.release(claimIds.get(zoneId).get(0));
+         boolean success = claimApi.release(claimIds.get(regionId).get(0));
 
          assertTrue(success);
       }
@@ -132,8 +132,8 @@ public class ClaimApiLiveTest extends BaseMarconiApiLiveTest {
 
    @Test(dependsOnMethods = { "releaseClaim" })
    public void delete() throws Exception {
-      for (String zoneId : zones) {
-         QueueApi queueApi = api.getQueueApiForZoneAndClient(zoneId, CLIENT_ID);
+      for (String regionId : regions) {
+         QueueApi queueApi = api.getQueueApi(regionId, CLIENT_ID);
          boolean success = queueApi.delete("jclouds-test");
 
          assertTrue(success);

http://git-wip-us.apache.org/repos/asf/jclouds-labs-openstack/blob/1c3ea466/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/ClaimApiMockTest.java
----------------------------------------------------------------------
diff --git a/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/ClaimApiMockTest.java b/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/ClaimApiMockTest.java
index 5d5083f..b4f6200 100644
--- a/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/ClaimApiMockTest.java
+++ b/openstack-marconi/src/test/java/org/jclouds/openstack/marconi/v1/features/ClaimApiMockTest.java
@@ -41,7 +41,7 @@ public class ClaimApiMockTest extends BaseOpenStackMockTest<MarconiApi> {
 
       try {
          MarconiApi api = api(server.getUrl("/").toString(), "openstack-marconi");
-         ClaimApi claimApi = api.getClaimApiForZoneAndClientAndQueue("DFW", CLIENT_ID, "jclouds-test");
+         ClaimApi claimApi = api.getClaimApi("DFW", CLIENT_ID, "jclouds-test");
 
          List<Message> messages = claimApi.claim(300, 200, 2);
 
@@ -69,7 +69,7 @@ public class ClaimApiMockTest extends BaseOpenStackMockTest<MarconiApi> {
 
       try {
          MarconiApi api = api(server.getUrl("/").toString(), "openstack-marconi");
-         ClaimApi claimApi = api.getClaimApiForZoneAndClientAndQueue("DFW", CLIENT_ID, "jclouds-test");
+         ClaimApi claimApi = api.getClaimApi("DFW", CLIENT_ID, "jclouds-test");
 
          Claim claim = claimApi.get("52a8d23eb04a584f1bbd4f47");
 
@@ -110,7 +110,7 @@ public class ClaimApiMockTest extends BaseOpenStackMockTest<MarconiApi> {
 
       try {
          MarconiApi api = api(server.getUrl("/").toString(), "openstack-marconi");
-         ClaimApi claimApi = api.getClaimApiForZoneAndClientAndQueue("DFW", CLIENT_ID, "jclouds-test");
+         ClaimApi claimApi = api.getClaimApi("DFW", CLIENT_ID, "jclouds-test");
 
          boolean success = claimApi.update("52a8d23eb04a584f1bbd4f47", 400);
 
@@ -132,7 +132,7 @@ public class ClaimApiMockTest extends BaseOpenStackMockTest<MarconiApi> {
 
       try {
          MarconiApi api = api(server.getUrl("/").toString(), "openstack-marconi");
-         ClaimApi claimApi = api.getClaimApiForZoneAndClientAndQueue("DFW", CLIENT_ID, "jclouds-test");
+         ClaimApi claimApi = api.getClaimApi("DFW", CLIENT_ID, "jclouds-test");
 
          boolean success = claimApi.release("52a8d23eb04a584f1bbd4f47");