You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by na...@apache.org on 2018/01/16 08:12:41 UTC

[3/9] jclouds git commit: Add support for OpenStack Keystone V3

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/internal/BaseV3KeystoneApiMockTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/internal/BaseV3KeystoneApiMockTest.java b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/internal/BaseV3KeystoneApiMockTest.java
new file mode 100644
index 0000000..ec3f7ba
--- /dev/null
+++ b/apis/openstack-keystone/src/test/java/org/jclouds/openstack/keystone/v3/internal/BaseV3KeystoneApiMockTest.java
@@ -0,0 +1,189 @@
+/*
+ * 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.keystone.v3.internal;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.collect.Iterables.getOnlyElement;
+import static com.google.common.util.concurrent.MoreExecutors.newDirectExecutorService;
+import static org.testng.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.UUID;
+
+import org.jclouds.ContextBuilder;
+import org.jclouds.concurrent.config.ExecutorServiceModule;
+import org.jclouds.http.okhttp.config.OkHttpCommandExecutorServiceModule;
+import org.jclouds.json.Json;
+import org.jclouds.logging.slf4j.config.SLF4JLoggingModule;
+import org.jclouds.openstack.keystone.auth.AuthenticationApi;
+import org.jclouds.openstack.keystone.config.KeystoneProperties;
+import org.jclouds.openstack.keystone.v3.KeystoneApi;
+import org.jclouds.openstack.keystone.v3.KeystoneApiMetadata;
+import org.jclouds.openstack.keystone.v3.domain.Token;
+import org.jclouds.rest.ApiContext;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
+
+import com.google.common.base.Charsets;
+import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.io.Resources;
+import com.google.common.reflect.TypeToken;
+import com.google.gson.JsonParser;
+import com.google.inject.Module;
+import com.squareup.okhttp.mockwebserver.MockResponse;
+import com.squareup.okhttp.mockwebserver.MockWebServer;
+import com.squareup.okhttp.mockwebserver.RecordedRequest;
+
+public class BaseV3KeystoneApiMockTest {
+   
+   private static final String DEFAULT_ENDPOINT = new KeystoneApiMetadata().getDefaultEndpoint().orNull();
+   
+   protected MockWebServer server;
+   protected KeystoneApi api;
+   protected AuthenticationApi authenticationApi;
+   protected String authToken;
+   private Json json;
+   
+   // So that we can ignore formatting.
+   private final JsonParser parser = new JsonParser();
+   
+   @BeforeMethod
+   public void start() throws IOException {
+      server = new MockWebServer();
+      server.play();
+      
+      ApiContext<KeystoneApi> ctx = ContextBuilder.newBuilder("openstack-keystone-3")
+              .credentials("domain:identity", "credential")
+              .endpoint(url(""))
+              .modules(modules())
+              .overrides(overrides())
+              .build();
+      json = ctx.utils().injector().getInstance(Json.class);
+      authenticationApi = ctx.utils().injector().getInstance(AuthenticationApi.class);
+      api = ctx.getApi();
+   }
+
+   @AfterMethod(alwaysRun = true)
+   public void stop() throws IOException {
+      server.shutdown();
+      api.close();
+   }
+   
+   protected Properties overrides() {
+      Properties overrides = new Properties();
+      overrides.setProperty(KeystoneProperties.SCOPE, "projectId:1234567890");
+      overrides.setProperty(KeystoneProperties.SERVICE_TYPE, "identityv3");
+      return overrides;
+   }
+   
+   protected Set<Module> modules() {
+      ImmutableSet.Builder<Module> modules = ImmutableSet.builder();
+      modules.add(new ExecutorServiceModule(newDirectExecutorService()));
+      modules.add(new OkHttpCommandExecutorServiceModule());
+      modules.add(new SLF4JLoggingModule());
+      return modules.build();
+   }
+
+   protected String url(String path) {
+      return server.getUrl(path).toString();
+   }
+   
+   protected void enqueueAuthentication(MockWebServer server) {
+      authToken = UUID.randomUUID().toString();
+      server.enqueue(jsonResponse("/v3/token.json").addHeader("X-Subject-Token", authToken));
+   }
+
+   protected MockResponse jsonResponse(String resource) {
+      return new MockResponse().addHeader("Content-Type", "application/json").setBody(stringFromResource(resource));
+   }
+
+   protected MockResponse response404() {
+      return new MockResponse().setStatus("HTTP/1.1 404 Not Found");
+   }
+   
+   protected MockResponse response201() {
+      return new MockResponse().setStatus("HTTP/1.1 201 Created");
+   }
+   
+   protected MockResponse response204() {
+      return new MockResponse().setStatus("HTTP/1.1 204 No Content");
+   }
+
+   protected String stringFromResource(String resourceName) {
+      try {
+         return Resources.toString(getClass().getResource(resourceName), Charsets.UTF_8)
+               .replace(DEFAULT_ENDPOINT, url(""));
+      } catch (IOException e) {
+         throw Throwables.propagate(e);
+      }
+   }
+   
+   protected <T> T onlyObjectFromResource(String resourceName, TypeToken<Map<String, T>> type) {
+      // Assume JSON objects passed here will be in the form: { "entity": { ... } }
+      String text = stringFromResource(resourceName);
+      Map<String, T> object = json.fromJson(text, type.getType());
+      checkArgument(!object.isEmpty(), "The given json does not contain any object: %s", text);
+      checkArgument(object.keySet().size() == 1, "The given json does not contain more than one object: %s", text);
+      return object.get(getOnlyElement(object.keySet()));
+   }
+
+   protected <T> T objectFromResource(String resourceName, Class<T> type) {
+      String text = stringFromResource(resourceName);
+      return json.fromJson(text, type);
+   }
+   
+   protected void assertAuthentication(MockWebServer server) throws InterruptedException {
+      RecordedRequest request = assertSentNoAuth(server, "POST", "/auth/tokens");
+      assertBody(request, stringFromResource("/v3/auth-password-scoped.json"));
+   }
+   
+   private RecordedRequest assertSentNoAuth(MockWebServer server, String method, String path) throws InterruptedException {
+      RecordedRequest request = server.takeRequest();
+      assertEquals(request.getMethod(), method);
+      assertEquals(request.getPath(), path);
+      assertEquals(request.getHeader("Accept"), "application/json");
+      return request;
+   }
+
+   protected RecordedRequest assertSent(MockWebServer server, String method, String path) throws InterruptedException {
+      RecordedRequest request = assertSentNoAuth(server, method, path);
+      assertEquals(request.getHeader("X-Auth-Token"), authToken);
+      return request;
+   }
+
+   protected RecordedRequest assertSent(MockWebServer server, String method, String path, String json)
+         throws InterruptedException {
+      RecordedRequest request = assertSent(server, method, path);
+      assertBody(request, json);
+      return request;
+   }
+   
+   private void assertBody(RecordedRequest request, String body) {
+      assertEquals(request.getHeader("Content-Type"), "application/json");
+      assertEquals(parser.parse(new String(request.getBody(), Charsets.UTF_8)), parser.parse(body));
+   }
+
+   protected Token tokenFromResource(String resource) {
+      return onlyObjectFromResource(resource, new TypeToken<Map<String, Token>>() {
+         private static final long serialVersionUID = 1L;
+      });
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-keystone/src/test/resources/logback.xml
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/resources/logback.xml b/apis/openstack-keystone/src/test/resources/logback.xml
index 98b1ea9..5c37355 100644
--- a/apis/openstack-keystone/src/test/resources/logback.xml
+++ b/apis/openstack-keystone/src/test/resources/logback.xml
@@ -2,63 +2,41 @@
 <configuration scan="false">
     <appender name="FILE" class="ch.qos.logback.core.FileAppender">
         <file>target/test-data/jclouds.log</file>
-
         <encoder>
             <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
         </encoder>
     </appender>
-
     <appender name="WIREFILE" class="ch.qos.logback.core.FileAppender">
         <file>target/test-data/jclouds-wire.log</file>
-
         <encoder>
             <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
         </encoder>
     </appender>
-
     <appender name="COMPUTEFILE" class="ch.qos.logback.core.FileAppender">
         <file>target/test-data/jclouds-compute.log</file>
-
-        <encoder>
-            <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
-        </encoder>
-    </appender>
-    
-    <appender name="SSHFILE" class="ch.qos.logback.core.FileAppender">
-        <file>target/test-data/jclouds-ssh.log</file>
-
         <encoder>
             <Pattern>%d %-5p [%c] [%thread] %m%n</Pattern>
         </encoder>
     </appender>
 
-    <root>
-        <level value="warn" />
-    </root>
-
     <logger name="org.jclouds">
         <level value="DEBUG" />
         <appender-ref ref="FILE" />
     </logger>
-
+    <logger name="jclouds.compute">
+        <level value="DEBUG" />
+        <appender-ref ref="COMPUTEFILE" />
+    </logger>
     <logger name="jclouds.wire">
         <level value="DEBUG" />
         <appender-ref ref="WIREFILE" />
     </logger>
-
     <logger name="jclouds.headers">
         <level value="DEBUG" />
         <appender-ref ref="WIREFILE" />
     </logger>
 
-    <logger name="jclouds.compute">
-        <level value="DEBUG" />
-        <appender-ref ref="COMPUTEFILE" />
-    </logger>
-    
-    <logger name="jclouds.ssh">
-        <level value="DEBUG" />
-        <appender-ref ref="SSHFILE" />
-    </logger>
-
-</configuration>
+    <root>
+        <level value="INFO" />
+    </root>
+</configuration>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-keystone/src/test/resources/v3/auth-password-scoped.json
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/resources/v3/auth-password-scoped.json b/apis/openstack-keystone/src/test/resources/v3/auth-password-scoped.json
new file mode 100644
index 0000000..993e036
--- /dev/null
+++ b/apis/openstack-keystone/src/test/resources/v3/auth-password-scoped.json
@@ -0,0 +1,23 @@
+{
+    "auth": {
+        "identity": {
+            "methods": [
+                "password"
+            ],
+            "password": {
+                "user": {
+                    "name": "identity",
+                    "domain": {
+                        "name": "domain"
+                    },
+                    "password": "credential"
+                }
+            }
+        },
+        "scope": {
+            "project": {
+                "id": "1234567890"
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-keystone/src/test/resources/v3/auth-password.json
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/resources/v3/auth-password.json b/apis/openstack-keystone/src/test/resources/v3/auth-password.json
new file mode 100644
index 0000000..2c2e8bd
--- /dev/null
+++ b/apis/openstack-keystone/src/test/resources/v3/auth-password.json
@@ -0,0 +1,19 @@
+{
+    "auth": {
+        "identity": {
+            "methods": [
+                "password"
+            ],
+            "password": {
+                "user": {
+                    "name": "identity",
+                    "domain": {
+                        "name": "domain"
+                    },
+                    "password": "credential"
+                }
+            }
+        },
+        "scope": "unscoped"
+    }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-keystone/src/test/resources/v3/auth-token-scoped.json
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/resources/v3/auth-token-scoped.json b/apis/openstack-keystone/src/test/resources/v3/auth-token-scoped.json
new file mode 100644
index 0000000..a1938a7
--- /dev/null
+++ b/apis/openstack-keystone/src/test/resources/v3/auth-token-scoped.json
@@ -0,0 +1,17 @@
+{
+    "auth": {
+        "identity": {
+            "methods": [
+                "token"
+            ],
+            "token": {
+                "id": "token"
+            }
+        },
+        "scope": {
+            "domain": {
+                "name": "mydomain"
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-keystone/src/test/resources/v3/auth-token.json
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/resources/v3/auth-token.json b/apis/openstack-keystone/src/test/resources/v3/auth-token.json
new file mode 100644
index 0000000..9ddd70f
--- /dev/null
+++ b/apis/openstack-keystone/src/test/resources/v3/auth-token.json
@@ -0,0 +1,13 @@
+{
+    "auth": {
+        "identity": {
+            "methods": [
+                "token"
+            ],
+            "token": {
+                "id": "token"
+            }
+        },
+        "scope": "unscoped"
+    }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-keystone/src/test/resources/v3/endpoints.json
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/resources/v3/endpoints.json b/apis/openstack-keystone/src/test/resources/v3/endpoints.json
new file mode 100644
index 0000000..0a097e0
--- /dev/null
+++ b/apis/openstack-keystone/src/test/resources/v3/endpoints.json
@@ -0,0 +1,153 @@
+{
+  "endpoints": [
+    {
+      "region_id": "RegionOne",
+      "links": {
+        "self": "http://localhost/identity/v3/endpoints/151d1dd2c86b4af783143ab1aa9d9a39"
+      },
+      "url": "http://localhost/compute/v2/$(project_id)s",
+      "region": "RegionOne",
+      "enabled": true,
+      "interface": "public",
+      "service_id": "a14c47dc13194bf2a2195e861db9f906",
+      "id": "151d1dd2c86b4af783143ab1aa9d9a39"
+    },
+    {
+      "region_id": "RegionOne",
+      "links": {
+        "self": "http://localhost/identity/v3/endpoints/1a9f6c6bea0e4ff5bb8b17e3647a706e"
+      },
+      "url": "http://localhost/volume/v2/$(project_id)s",
+      "region": "RegionOne",
+      "enabled": true,
+      "interface": "public",
+      "service_id": "238841bcff5f4f2b9ee2f7973c19e22a",
+      "id": "1a9f6c6bea0e4ff5bb8b17e3647a706e"
+    },
+    {
+      "region_id": "RegionOne",
+      "links": {
+        "self": "http://localhost/identity/v3/endpoints/206d6d831dbf44ccad854ffb419b4f02"
+      },
+      "url": "http://localhost/volume/v1/$(project_id)s",
+      "region": "RegionOne",
+      "enabled": true,
+      "interface": "public",
+      "service_id": "a222e99e3d24476baa7762858dc34006",
+      "id": "206d6d831dbf44ccad854ffb419b4f02"
+    },
+    {
+      "region_id": "RegionOne",
+      "links": {
+        "self": "http://localhost/identity/v3/endpoints/23f60684390f4376aca5d828f2381e6e"
+      },
+      "url": "http://localhost:8080",
+      "region": "RegionOne",
+      "enabled": true,
+      "interface": "admin",
+      "service_id": "2774503aa5354d70a801df09a813db46",
+      "id": "23f60684390f4376aca5d828f2381e6e"
+    },
+    {
+      "region_id": "RegionOne",
+      "links": {
+        "self": "http://localhost/identity/v3/endpoints/572671cba1d34bd29fdd160eac891971"
+      },
+      "url": "http://localhost/volume/v3/$(project_id)s",
+      "region": "RegionOne",
+      "enabled": true,
+      "interface": "public",
+      "service_id": "be984bfb8b5f447d8a0ea3fa075054fc",
+      "id": "572671cba1d34bd29fdd160eac891971"
+    },
+    {
+      "region_id": "RegionOne",
+      "links": {
+        "self": "http://localhost/identity/v3/endpoints/882c0c04727744ee8d20839f5f9eec9a"
+      },
+      "url": "http://localhost/compute/v2.1",
+      "region": "RegionOne",
+      "enabled": true,
+      "interface": "public",
+      "service_id": "fcc6a934957545bbb5fee29a217530ef",
+      "id": "882c0c04727744ee8d20839f5f9eec9a"
+    },
+    {
+      "region_id": "RegionOne",
+      "links": {
+        "self": "http://localhost/identity/v3/endpoints/9f1b314e3bc5403a8dcdef14c9eb044c"
+      },
+      "url": "http://localhost/identity/v3",
+      "region": "RegionOne",
+      "enabled": true,
+      "interface": "public",
+      "service_id": "6b73ec12f7754a8696d758561a1cf5f1",
+      "id": "9f1b314e3bc5403a8dcdef14c9eb044c"
+    },
+    {
+      "region_id": "RegionOne",
+      "links": {
+        "self": "http://localhost/identity/v3/endpoints/bb2aa713d1154809aeb414e6fd71ba95"
+      },
+      "url": "http://localhost/image",
+      "region": "RegionOne",
+      "enabled": true,
+      "interface": "public",
+      "service_id": "5dbcb1098b2e41e083c05c9006bd9830",
+      "id": "bb2aa713d1154809aeb414e6fd71ba95"
+    },
+    {
+      "region_id": "RegionOne",
+      "links": {
+        "self": "http://localhost/identity/v3/endpoints/dcf25870430f468d8f8dfd9d3acb95cc"
+      },
+      "url": "http://localhost:9696/",
+      "region": "RegionOne",
+      "enabled": true,
+      "interface": "public",
+      "service_id": "d12688144a6e4d9db17ead14f4670d5b",
+      "id": "dcf25870430f468d8f8dfd9d3acb95cc"
+    },
+    {
+      "region_id": "RegionOne",
+      "links": {
+        "self": "http://localhost/identity/v3/endpoints/eb1517fb194a4df09109aa4606c245b9"
+      },
+      "url": "http://localhost/identity/v3",
+      "region": "RegionOne",
+      "enabled": true,
+      "interface": "admin",
+      "service_id": "6b73ec12f7754a8696d758561a1cf5f1",
+      "id": "eb1517fb194a4df09109aa4606c245b9"
+    },
+    {
+      "region_id": "RegionOne",
+      "links": {
+        "self": "http://localhost/identity/v3/endpoints/edd066392b3549508739e18d5e69dbb7"
+      },
+      "url": "http://localhost/placement",
+      "region": "RegionOne",
+      "enabled": true,
+      "interface": "public",
+      "service_id": "74efa863cb264dcbba922ff254a19876",
+      "id": "edd066392b3549508739e18d5e69dbb7"
+    },
+    {
+      "region_id": "RegionOne",
+      "links": {
+        "self": "http://localhost/identity/v3/endpoints/ef84daa849894b8ebda274615a083139"
+      },
+      "url": "http://localhost:8080/v1/AUTH_$(project_id)s",
+      "region": "RegionOne",
+      "enabled": true,
+      "interface": "public",
+      "service_id": "2774503aa5354d70a801df09a813db46",
+      "id": "ef84daa849894b8ebda274615a083139"
+    }
+  ],
+  "links": {
+    "self": "http://localhost/identity/v3/endpoints",
+    "previous": null,
+    "next": null
+  }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-keystone/src/test/resources/v3/groups.json
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/resources/v3/groups.json b/apis/openstack-keystone/src/test/resources/v3/groups.json
new file mode 100644
index 0000000..17f061c
--- /dev/null
+++ b/apis/openstack-keystone/src/test/resources/v3/groups.json
@@ -0,0 +1,27 @@
+{
+    "groups": [
+        {
+            "description": "Developers cleared for work on all general projects",
+            "domain_id": "1789d1",
+            "id": "ea167b",
+            "links": {
+                "self": "https://example.com/identity/v3/groups/ea167b"
+            },
+            "name": "Developers"
+        },
+        {
+            "description": "Developers cleared for work on secret projects",
+            "domain_id": "1789d1",
+            "id": "a62db1",
+            "links": {
+                "self": "https://example.com/identity/v3/groups/a62db1"
+            },
+            "name": "Secure Developers"
+        }
+    ],
+    "links": {
+        "self": "http://example.com/identity/v3/users/9fe1d3/groups",
+        "previous": null,
+        "next": null
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-keystone/src/test/resources/v3/project.json
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/resources/v3/project.json b/apis/openstack-keystone/src/test/resources/v3/project.json
new file mode 100644
index 0000000..0a47ffa
--- /dev/null
+++ b/apis/openstack-keystone/src/test/resources/v3/project.json
@@ -0,0 +1,15 @@
+{
+  "project": {
+    "is_domain": false,
+    "description": "Updated",
+    "links": {
+      "self": "http://localhost/identity/v3/projects/2f9b30f706bc45d7923e055567be2e98"
+    },
+    "tags": [],
+    "enabled": true,
+    "id": "2f9b30f706bc45d7923e055567be2e98",
+    "parent_id": "default",
+    "domain_id": "default",
+    "name": "ProjectApiLiveTest"
+  }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-keystone/src/test/resources/v3/projects.json
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/resources/v3/projects.json b/apis/openstack-keystone/src/test/resources/v3/projects.json
new file mode 100644
index 0000000..2f9faa0
--- /dev/null
+++ b/apis/openstack-keystone/src/test/resources/v3/projects.json
@@ -0,0 +1,74 @@
+{
+  "links": {
+    "self": "http://localhost/identity/v3/projects",
+    "previous": null,
+    "next": null
+  },
+  "projects": [
+    {
+      "is_domain": false,
+      "description": "Updated",
+      "links": {
+        "self": "http://localhost/identity/v3/projects/2f9b30f706bc45d7923e055567be2e98"
+      },
+      "tags": [],
+      "enabled": true,
+      "id": "2f9b30f706bc45d7923e055567be2e98",
+      "parent_id": "default",
+      "domain_id": "default",
+      "name": "ProjectApiLiveTest"
+    },
+    {
+      "is_domain": false,
+      "description": "",
+      "links": {
+        "self": "http://localhost/identity/v3/projects/2fa489f9b84541b8a614c8c9df0d7596"
+      },
+      "tags": [],
+      "enabled": true,
+      "id": "2fa489f9b84541b8a614c8c9df0d7596",
+      "parent_id": "default",
+      "domain_id": "default",
+      "name": "service"
+    },
+    {
+      "is_domain": false,
+      "description": "",
+      "links": {
+        "self": "http://localhost/identity/v3/projects/43de288ea0ce4d2b8b811055b10f156b"
+      },
+      "tags": [],
+      "enabled": true,
+      "id": "43de288ea0ce4d2b8b811055b10f156b",
+      "parent_id": "default",
+      "domain_id": "default",
+      "name": "jclouds"
+    },
+    {
+      "is_domain": false,
+      "description": "Bootstrap project for initializing the cloud.",
+      "links": {
+        "self": "http://localhost/identity/v3/projects/90131053e7384f8a9e970544e0845913"
+      },
+      "tags": [],
+      "enabled": true,
+      "id": "90131053e7384f8a9e970544e0845913",
+      "parent_id": "default",
+      "domain_id": "default",
+      "name": "admin"
+    },
+    {
+      "is_domain": false,
+      "description": "",
+      "links": {
+        "self": "http://localhost/identity/v3/projects/d91b807dc87d477381500e8c920b10c7"
+      },
+      "tags": [],
+      "enabled": true,
+      "id": "d91b807dc87d477381500e8c920b10c7",
+      "parent_id": "default",
+      "domain_id": "default",
+      "name": "demo"
+    }
+  ]
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-keystone/src/test/resources/v3/region.json
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/resources/v3/region.json b/apis/openstack-keystone/src/test/resources/v3/region.json
new file mode 100644
index 0000000..ee5eee8
--- /dev/null
+++ b/apis/openstack-keystone/src/test/resources/v3/region.json
@@ -0,0 +1,10 @@
+{
+  "region": {
+    "parent_region_id": null,
+    "id": "RegionOne",
+    "links": {
+      "self": "http://localhost/identity/v3/regions/RegionApiLiveTest"
+    },
+    "description": "Updated"
+  }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-keystone/src/test/resources/v3/regions.json
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/resources/v3/regions.json b/apis/openstack-keystone/src/test/resources/v3/regions.json
new file mode 100644
index 0000000..326a6fe
--- /dev/null
+++ b/apis/openstack-keystone/src/test/resources/v3/regions.json
@@ -0,0 +1,18 @@
+{
+  "regions": [
+    {
+      "parent_region_id": null,
+      "id": "RegionOne",
+      "links": {
+        "self": "http://localhost/identity/v3/regions/RegionOne"
+      },
+      "description": ""
+    }
+  ],
+  "links": {
+    "self": "http://localhost/identity/v3/regions",
+    "previous": null,
+    "next": null
+  }
+}
+

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-keystone/src/test/resources/v3/token.json
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/resources/v3/token.json b/apis/openstack-keystone/src/test/resources/v3/token.json
new file mode 100644
index 0000000..b7fa677
--- /dev/null
+++ b/apis/openstack-keystone/src/test/resources/v3/token.json
@@ -0,0 +1,518 @@
+{
+  "token": {
+    "methods": [
+      "password"
+    ],
+    "roles": [
+      {
+        "id": "9fe2ff9ee4384b1894a90878d3e92bab",
+        "name": "_member_"
+      },
+      {
+        "id": "df7d043a09d34a7c9e2bad15926ee097",
+        "name": "cpf_org_manager"
+      },
+      {
+        "id": "3af119c426a742999e7890f6d1f70b36",
+        "name": "cpf_admin"
+      }
+    ],
+    "expires_at": "2017-12-10T11:48:46.546830Z",
+    "project": {
+      "domain": {
+        "id": "2347b158dcaf488496b44cc4edfd2bd8",
+        "name": "0kjFQF29"
+      },
+      "id": "2233c4d7d5c044b1b48e1bef25c1f305",
+      "name": "0kjFQF29-prj"
+    },
+    "catalog": [
+      {
+        "endpoints": [
+          {
+            "region_id": "uk-1",
+            "url": "https://objectstorage.myprovider.com/v1/AUTH_2233c4d7d5c044b1b48e1bef25c1f305",
+            "region": "uk-1",
+            "interface": "public",
+            "id": "b506af0e016a4b5fb592f196da569a41",
+            "name": "objectstorage"
+          }
+        ],
+        "type": "object-store",
+        "id": "024329e4fde148e58ecd90b7d9872438",
+        "name": "objectstorage"
+      },
+      {
+        "endpoints": [
+          {
+            "region_id": "uk-1",
+            "url": "https://keymanagement.myprovider.com/v1",
+            "region": "uk-1",
+            "interface": "public",
+            "id": "0419c448001845af8f6828cf49745e72",
+            "name": "keymanagement"
+          }
+        ],
+        "type": "keystore",
+        "id": "07f309b0ef9d42758ea4de47bdca9c32",
+        "name": "keymanagement"
+      },
+      {
+        "endpoints": [
+          {
+            "region_id": "uk-1",
+            "url": "https://certificate.myprovider.com/v1",
+            "region": "uk-1",
+            "interface": "public",
+            "id": "e1cc93936fb94cdbadc20f17c4ad3140",
+            "name": "certificate"
+          }
+        ],
+        "type": "certificate",
+        "id": "0bd9a971e97d4c15af6b94311e4e9c15",
+        "name": "certificate"
+      },
+      {
+        "endpoints": [
+          {
+            "region_id": "uk-1",
+            "url": "https://orchestration.myprovider.com/v1/2233c4d7d5c044b1b48e1bef25c1f305",
+            "region": "uk-1",
+            "interface": "public",
+            "id": "c3ee708a6ae24ddf92c078526c36a446",
+            "name": "orchestration"
+          }
+        ],
+        "type": "orchestration",
+        "id": "0dafa2a9240c41268c37818979769c88",
+        "name": "orchestration"
+      },
+      {
+        "endpoints": [
+          {
+            "region_id": "uk-1",
+            "url": "https://blockstorage.myprovider.com/v1/2233c4d7d5c044b1b48e1bef25c1f305",
+            "region": "uk-1",
+            "interface": "public",
+            "id": "ba9061d324954b1a9f6b1c1f5d4a5c5e",
+            "name": "blockstorage"
+          }
+        ],
+        "type": "volume",
+        "id": "0ec640e57e4d4374841d2ab7b292f2c2",
+        "name": "blockstorage"
+      },
+      {
+        "endpoints": [
+          {
+            "region_id": "uk-1",
+            "url": "https://loadbalancing.myprovider.com",
+            "region": "uk-1",
+            "interface": "public",
+            "id": "169bcb3f92384f709232864f4d5304eb",
+            "name": "loadbalancing"
+          }
+        ],
+        "type": "loadbalancing",
+        "id": "15ef761fa00a438985213aec7b6fb18a",
+        "name": "loadbalancing"
+      },
+      {
+        "endpoints": [],
+        "type": "dwh",
+        "id": "1a53a2e82370422d90174c4acf585ea9",
+        "name": "dwh"
+      },
+      {
+        "endpoints": [],
+        "type": "contract",
+        "id": "1b35fa74ae0e46ebbc2014f976fec0e1",
+        "name": "contract"
+      },
+      {
+        "endpoints": [],
+        "type": "appplatform",
+        "id": "253096ed430c49c48c9f3549e867b538",
+        "name": "appplatform"
+      },
+      {
+        "endpoints": [
+          {
+            "region_id": "uk-1",
+            "url": "https://compute-w.myprovider.com",
+            "region": "uk-1",
+            "interface": "public",
+            "id": "e26ad89a682d4c8f8a71c9e76cd785b4",
+            "name": "compute-w"
+          }
+        ],
+        "type": "compute-w",
+        "id": "327c11710f184555b43bc6fdfc47626b",
+        "name": "compute-w"
+      },
+      {
+        "endpoints": [],
+        "type": "notification",
+        "id": "3435ad7a1da04b1cb2e249665529eb51",
+        "name": "notification"
+      },
+      {
+        "endpoints": [
+          {
+            "region_id": "uk-1",
+            "url": "https://compute.myprovider.com/v2/2233c4d7d5c044b1b48e1bef25c1f305",
+            "region": "uk-1",
+            "interface": "public",
+            "id": "f70e51b9a6a74a87a4c7055b8df8bedf",
+            "name": "compute"
+          }
+        ],
+        "type": "compute",
+        "id": "3e19093f50cc4590973c8953e2c327f9",
+        "name": "compute"
+      },
+      {
+        "endpoints": [
+          {
+            "region_id": "uk-1",
+            "url": "https://queue.myprovider.com",
+            "region": "uk-1",
+            "interface": "public",
+            "id": "c46b5ec51ab04402a9ffd8177743ba6f",
+            "name": "queue"
+          }
+        ],
+        "type": "queue",
+        "id": "4a9ab69b74ec4948a0a6958177d30387",
+        "name": "queue"
+      },
+      {
+        "endpoints": [
+          {
+            "region_id": "uk-1",
+            "url": "https://autoscale.myprovider.com/autoscale_schedulers",
+            "region": "uk-1",
+            "interface": "public",
+            "id": "071ee50be4b341558e37f84abac47d02",
+            "name": "autoscale"
+          }
+        ],
+        "type": "autoscale",
+        "id": "4f158b2836434c7ca6ee47e40a3ee56c",
+        "name": "autoscale"
+      },
+      {
+        "endpoints": [
+          {
+            "region_id": "uk-1",
+            "url": "https://telemetry.myprovider.com",
+            "region": "uk-1",
+            "interface": "public",
+            "id": "6ac15657fbc548d7ab2ed986b8d94192",
+            "name": "telemetry"
+          }
+        ],
+        "type": "metering",
+        "id": "54ee7596f0e1433cb8db6201be2cf772",
+        "name": "telemetry"
+      },
+      {
+        "endpoints": [],
+        "type": "cdn",
+        "id": "5954129d136e4a76b7cd6f3d1f3808b5",
+        "name": "cdn"
+      },
+      {
+        "endpoints": [],
+        "type": "oss",
+        "id": "5a252878ffd7402498b6b74b575a899a",
+        "name": "oss"
+      },
+      {
+        "endpoints": [
+          {
+            "region_id": "uk-1",
+            "url": "https://rolemanagement.myprovider.com/v1",
+            "region": "uk-1",
+            "interface": "public",
+            "id": "2d600a5de6ec42c6a5eab7b519832d87",
+            "name": "rolemanagement"
+          }
+        ],
+        "type": "rolemanagement",
+        "id": "5bc90099f0ad490c811239a6a3a8f853",
+        "name": "rolemanagement"
+      },
+      {
+        "endpoints": [
+          {
+            "region_id": "uk-1",
+            "url": "https://compute-b.myprovider.com",
+            "region": "uk-1",
+            "interface": "public",
+            "id": "768450282d5546409395d2cb35502dad",
+            "name": "compute-b"
+          }
+        ],
+        "type": "compute-b",
+        "id": "65f754202b6049578e9a292a801e28f7",
+        "name": "compute-b"
+      },
+      {
+        "endpoints": [
+          {
+            "region_id": "uk-1",
+            "url": "https://networking.myprovider.com",
+            "region": "uk-1",
+            "interface": "public",
+            "id": "675910513a7e466c84c39c5ca9445b81",
+            "name": "networking"
+          }
+        ],
+        "type": "network",
+        "id": "6cf37e33dc7140b9b032faabfa53a53e",
+        "name": "networking"
+      },
+      {
+        "endpoints": [],
+        "type": "dns",
+        "id": "7426c97af5174c1abdb8b84ba02227ce",
+        "name": "dns"
+      },
+      {
+        "endpoints": [
+          {
+            "region_id": "uk-1",
+            "url": "https://database.myprovider.com/v1.0/2233c4d7d5c044b1b48e1bef25c1f305",
+            "region": "uk-1",
+            "interface": "public",
+            "id": "6976cbeed14c464da15c13e949b41607",
+            "name": "database"
+          }
+        ],
+        "type": "database",
+        "id": "75c0280f15844d7a9eb22b1ad5a978e8",
+        "name": "database"
+      },
+      {
+        "endpoints": [
+          {
+            "region_id": "uk-1",
+            "url": "http://localhost/identity/v3",
+            "region": "uk-1",
+            "interface": "admin",
+            "id": "db15a7126d4a4f1f81903bb4d56be32b",
+            "name": "identity"
+          }
+        ],
+        "type": "identity",
+        "id": "79066fe949064550930a61b33a49eb53",
+        "name": "identity"
+      },
+      {
+        "endpoints": [],
+        "type": "intdns",
+        "id": "804190a423804019aab8fd934db0086e",
+        "name": "intdns"
+      },
+      {
+        "endpoints": [],
+        "type": "invoicing",
+        "id": "8d364df08cbc4d7188f0cf83744b0336",
+        "name": "invoicing"
+      },
+      {
+        "endpoints": [],
+        "type": "catalog",
+        "id": "9674ae5917af401397071c028ff33b68",
+        "name": "catalog"
+      },
+      {
+        "endpoints": [
+          {
+            "region_id": "uk-1",
+            "url": "https://software.myprovider.com/v1.0",
+            "region": "uk-1",
+            "interface": "public",
+            "id": "fd6g35fgknrzumut7bx6p6bwzehkfhrz",
+            "name": "software"
+          }
+        ],
+        "type": "software",
+        "id": "9760973e49b04b00b41e60c180a80562",
+        "name": "software"
+      },
+      {
+        "endpoints": [
+          {
+            "region_id": "uk-1",
+            "url": "https://blockstorage.myprovider.com/v2/2233c4d7d5c044b1b48e1bef25c1f305",
+            "region": "uk-1",
+            "interface": "public",
+            "id": "8c4ace3bbbd44883b5762a9ad8432a46",
+            "name": "blockstoragev2"
+          }
+        ],
+        "type": "volumev2",
+        "id": "9bf82d0466714eee86e304ab3301aec9",
+        "name": "blockstorage"
+      },
+      {
+        "endpoints": [],
+        "type": "dnsadmin",
+        "id": "a2b90094346c48deabb9ca645bacf588",
+        "name": "dnsadmin"
+      },
+      {
+        "endpoints": [
+          {
+            "region_id": "uk-1",
+            "url": "https://vmimport.myprovider.com",
+            "region": "uk-1",
+            "interface": "public",
+            "id": "225257ec50ef47668185587cc6edb95d",
+            "name": "vmimport"
+          }
+        ],
+        "type": "vmimport",
+        "id": "c73fa07c3b604b4f89d5a2b9c4621cf2",
+        "name": "vmimport"
+      },
+      {
+        "endpoints": [
+          {
+            "region_id": "uk-1",
+            "url": "http://localhost/identity/v3",
+            "region": "uk-1",
+            "interface": "public",
+            "id": "27dc2bba1c5d4a14b68657fc8fdd4e3e",
+            "name": "identityv3"
+          },
+          {
+            "region_id": "uk-1",
+            "url": "http://localhost/identity/v3",
+            "region": "uk-1",
+            "interface": "admin",
+            "id": "27dc2bba1c5d4a14b68657fc8fdd4e3e",
+            "name": "identityv3"
+          }
+        ],
+        "type": "identityv3",
+        "id": "cc6f50d496884ef0a751acb2e1eceedd",
+        "name": "identityv3"
+      },
+      {
+        "endpoints": [
+          {
+            "region_id": "uk-1",
+            "url": "https://applicationmanagement.myprovider.com",
+            "region": "uk-1",
+            "interface": "public",
+            "id": "06fbcf8235434f23a08faed03b4af9ac",
+            "name": "appmanagement"
+          }
+        ],
+        "type": "appmanagement",
+        "id": "ce2f6bbe7a9f446b82d63725bd7bb484",
+        "name": "appmanagement"
+      },
+      {
+        "endpoints": [],
+        "type": "nosql",
+        "id": "d07aa581c0734b6bb85cd496115b5110",
+        "name": "nosql"
+      },
+      {
+        "endpoints": [],
+        "type": "baremetal",
+        "id": "d2f57dcae4c84466ac357220ff3d8900",
+        "name": "baremetal"
+      },
+      {
+        "endpoints": [],
+        "type": "mail",
+        "id": "d4601f51af8f43f3b0e3409e4cbac690",
+        "name": "mail"
+      },
+      {
+        "endpoints": [
+          {
+            "region_id": "uk-1",
+            "url": "https://networking-ex.myprovider.com",
+            "region": "uk-1",
+            "interface": "public",
+            "id": "bf356065e45349a5bde5e043c95a1923",
+            "name": "networking-ex"
+          }
+        ],
+        "type": "networking-ex",
+        "id": "d4937aa1275c41378bf2ae1dbe829c68",
+        "name": "networking-ex"
+      },
+      {
+        "endpoints": [
+          {
+            "region_id": "jp-east-1",
+            "url": "https://identity.gls.cloud.global.fujitsu.com/v3",
+            "region": "jp-east-1",
+            "interface": "public",
+            "id": "dc2ebf9d6fc04f1facc263a733cf754d",
+            "name": "global-identity"
+          }
+        ],
+        "type": "global-identity",
+        "id": "e74b9c29d6504f10a8fb8e1495f3f5c6",
+        "name": "global-identity"
+      },
+      {
+        "endpoints": [
+          {
+            "region_id": "uk-1",
+            "url": "https://image.myprovider.com",
+            "region": "uk-1",
+            "interface": "public",
+            "id": "a832d640886b4ef89027339a2edf8fcd",
+            "name": "image"
+          }
+        ],
+        "type": "image",
+        "id": "ea850dab0e964e12a9f66787ee8623ae",
+        "name": "image"
+      },
+      {
+        "endpoints": [],
+        "type": "billing",
+        "id": "f1302a2477bf492bb3e867952175974a",
+        "name": "billing"
+      },
+      {
+        "endpoints": [
+          {
+            "region_id": "uk-1",
+            "url": "https://import-export.myprovider.com",
+            "region": "uk-1",
+            "interface": "public",
+            "id": "e8bde8fe61a14a88b414e5568fc17201",
+            "name": "import-export"
+          }
+        ],
+        "type": "import-export",
+        "id": "fc302725919645199373077fa299fc6e",
+        "name": "import-export"
+      }
+    ],
+    "extras": {},
+    "user": {
+      "domain": {
+        "id": "2347b158dcaf488496b44cc4edfd2bd8",
+        "name": "0kjFQF29"
+      },
+      "id": "f1f24aea666542eeb58dc129c29734f0",
+      "name": "cloudsoft"
+    },
+    "audit_ids": [
+      "kr9Qqe-1QFOOlrt2XP6AqA"
+    ],
+    "issued_at": "2017-12-10T08:48:46.546877Z"
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-keystone/src/test/resources/v3/user.json
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/resources/v3/user.json b/apis/openstack-keystone/src/test/resources/v3/user.json
new file mode 100644
index 0000000..1c64db9
--- /dev/null
+++ b/apis/openstack-keystone/src/test/resources/v3/user.json
@@ -0,0 +1,13 @@
+{
+  "user": {
+    "password_expires_at": null,
+    "links": {
+      "self": "http://localhost/identity/v3/users/0bedc61110fd4e94a251260a47f18f29"
+    },
+    "enabled": true,
+    "id": "0bedc61110fd4e94a251260a47f18f29",
+    "options": {},
+    "domain_id": "default",
+    "name": "User"
+  }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-keystone/src/test/resources/v3/users.json
----------------------------------------------------------------------
diff --git a/apis/openstack-keystone/src/test/resources/v3/users.json b/apis/openstack-keystone/src/test/resources/v3/users.json
new file mode 100644
index 0000000..4830220
--- /dev/null
+++ b/apis/openstack-keystone/src/test/resources/v3/users.json
@@ -0,0 +1,132 @@
+{
+  "users": [
+    {
+      "password_expires_at": null,
+      "name": "UserApiLiveTest",
+      "links": {
+        "self": "http://localhost/identity/v3/users/0bedc61110fd4e94a251260a47f18f29"
+      },
+      "domain_id": "default",
+      "enabled": true,
+      "id": "0bedc61110fd4e94a251260a47f18f29",
+      "options": {}
+    },
+    {
+      "password_expires_at": null,
+      "name": "glance-swift",
+      "links": {
+        "self": "http://localhost/identity/v3/users/1194933d3f1147a3b0824848bb7ec5e2"
+      },
+      "domain_id": "default",
+      "enabled": true,
+      "id": "1194933d3f1147a3b0824848bb7ec5e2",
+      "options": {}
+    },
+    {
+      "password_expires_at": null,
+      "name": "nova",
+      "links": {
+        "self": "http://localhost/identity/v3/users/290999fc41fb48e397feef465d014fb6"
+      },
+      "domain_id": "default",
+      "enabled": true,
+      "id": "290999fc41fb48e397feef465d014fb6",
+      "options": {}
+    },
+    {
+      "password_expires_at": null,
+      "name": "placement",
+      "links": {
+        "self": "http://localhost/identity/v3/users/34e6ac0dd9bb4601bac4971785abd7f5"
+      },
+      "domain_id": "default",
+      "enabled": true,
+      "id": "34e6ac0dd9bb4601bac4971785abd7f5",
+      "options": {}
+    },
+    {
+      "name": "jclouds",
+      "links": {
+        "self": "http://localhost/identity/v3/users/6c3b325a28264f00865b38442429fd77"
+      },
+      "domain_id": "default",
+      "enabled": true,
+      "options": {},
+      "default_project_id": "43de288ea0ce4d2b8b811055b10f156b",
+      "id": "6c3b325a28264f00865b38442429fd77",
+      "password_expires_at": null
+    },
+    {
+      "password_expires_at": null,
+      "name": "cinder",
+      "links": {
+        "self": "http://localhost/identity/v3/users/6e705bff20794de5955acf0936f02b3f"
+      },
+      "domain_id": "default",
+      "enabled": true,
+      "id": "6e705bff20794de5955acf0936f02b3f",
+      "options": {}
+    },
+    {
+      "name": "demo",
+      "links": {
+        "self": "http://localhost/identity/v3/users/84910c7070144530a6b9627fe0e1743f"
+      },
+      "domain_id": "default",
+      "enabled": true,
+      "options": {},
+      "id": "84910c7070144530a6b9627fe0e1743f",
+      "email": "demo@example.com",
+      "password_expires_at": null
+    },
+    {
+      "password_expires_at": null,
+      "name": "swift",
+      "links": {
+        "self": "http://localhost/identity/v3/users/87306cb2f0954ca8919f0fbaf29a780f"
+      },
+      "domain_id": "default",
+      "enabled": true,
+      "id": "87306cb2f0954ca8919f0fbaf29a780f",
+      "options": {}
+    },
+    {
+      "password_expires_at": null,
+      "name": "glance",
+      "links": {
+        "self": "http://localhost/identity/v3/users/94c9f0f5e056489ebfef25870e8944fe"
+      },
+      "domain_id": "default",
+      "enabled": true,
+      "id": "94c9f0f5e056489ebfef25870e8944fe",
+      "options": {}
+    },
+    {
+      "password_expires_at": null,
+      "name": "admin",
+      "links": {
+        "self": "http://localhost/identity/v3/users/ab7bd6c2dd394fce8318e7562115d3f8"
+      },
+      "domain_id": "default",
+      "enabled": true,
+      "id": "ab7bd6c2dd394fce8318e7562115d3f8",
+      "options": {}
+    },
+    {
+      "password_expires_at": null,
+      "name": "neutron",
+      "links": {
+        "self": "http://localhost/identity/v3/users/d3607e141e334823978eec2e1ccca8de"
+      },
+      "domain_id": "default",
+      "enabled": true,
+      "id": "d3607e141e334823978eec2e1ccca8de",
+      "options": {}
+    }
+  ],
+  "links": {
+    "self": "http://localhost/identity/v3/users",
+    "previous": null,
+    "next": null
+  }
+}

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/NovaApiMetadata.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/NovaApiMetadata.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/NovaApiMetadata.java
index d73a1da..a330afa 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/NovaApiMetadata.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/NovaApiMetadata.java
@@ -17,8 +17,9 @@
 package org.jclouds.openstack.nova.v2_0;
 
 import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL;
-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 static org.jclouds.openstack.keystone.config.KeystoneProperties.CREDENTIAL_TYPE;
+import static org.jclouds.openstack.keystone.config.KeystoneProperties.KEYSTONE_VERSION;
+import static org.jclouds.openstack.keystone.config.KeystoneProperties.SERVICE_TYPE;
 import static org.jclouds.openstack.nova.v2_0.config.NovaProperties.AUTO_ALLOCATE_FLOATING_IPS;
 import static org.jclouds.openstack.nova.v2_0.config.NovaProperties.AUTO_GENERATE_KEYPAIRS;
 import static org.jclouds.openstack.nova.v2_0.config.NovaProperties.TIMEOUT_SECURITYGROUP_PRESENT;
@@ -29,10 +30,10 @@ import java.util.Properties;
 
 import org.jclouds.apis.ApiMetadata;
 import org.jclouds.compute.ComputeServiceContext;
-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.RegionModule;
+import org.jclouds.openstack.keystone.auth.config.AuthenticationModule;
+import org.jclouds.openstack.keystone.auth.config.CredentialTypes;
+import org.jclouds.openstack.keystone.catalog.config.ServiceCatalogModule;
+import org.jclouds.openstack.keystone.catalog.config.ServiceCatalogModule.RegionModule;
 import org.jclouds.openstack.nova.v2_0.compute.config.NovaComputeServiceContextModule;
 import org.jclouds.openstack.nova.v2_0.config.NovaHttpApiModule;
 import org.jclouds.openstack.nova.v2_0.config.NovaParserModule;
@@ -69,6 +70,7 @@ public class NovaApiMetadata extends BaseHttpApiMetadata<NovaApi>  {
       properties.setProperty("jclouds.ssh.retry-auth", "true");
       properties.setProperty(SERVICE_TYPE, ServiceType.COMPUTE);
       properties.setProperty(CREDENTIAL_TYPE, CredentialTypes.PASSWORD_CREDENTIALS);
+      properties.setProperty(KEYSTONE_VERSION, "2");
       properties.setProperty(AUTO_ALLOCATE_FLOATING_IPS, "false");
       properties.setProperty(AUTO_GENERATE_KEYPAIRS, "false");
       properties.setProperty(TIMEOUT_SECURITYGROUP_PRESENT, "500");
@@ -93,8 +95,8 @@ public class NovaApiMetadata extends BaseHttpApiMetadata<NovaApi>  {
          .defaultProperties(NovaApiMetadata.defaultProperties())
          .view(typeToken(ComputeServiceContext.class))
          .defaultModules(ImmutableSet.<Class<? extends Module>>builder()
-                                     .add(AuthenticationApiModule.class)
-                                     .add(KeystoneAuthenticationModule.class)
+                                     .add(AuthenticationModule.class)
+                                     .add(ServiceCatalogModule.class)
                                      .add(RegionModule.class)
                                      .add(NovaParserModule.class)
                                      .add(NovaHttpApiModule.class)

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/AttachInterfaceApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/AttachInterfaceApi.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/AttachInterfaceApi.java
index 65bd198..119b08a 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/AttachInterfaceApi.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/AttachInterfaceApi.java
@@ -29,7 +29,7 @@ import javax.ws.rs.core.MediaType;
 
 import org.jclouds.Fallbacks;
 import org.jclouds.javax.annotation.Nullable;
-import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
+import org.jclouds.openstack.keystone.auth.filters.AuthenticateRequest;
 import org.jclouds.openstack.nova.v2_0.domain.InterfaceAttachment;
 import org.jclouds.openstack.v2_0.ServiceType;
 import org.jclouds.openstack.v2_0.services.Extension;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/AvailabilityZoneApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/AvailabilityZoneApi.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/AvailabilityZoneApi.java
index 9aa9b21..e3abe74 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/AvailabilityZoneApi.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/AvailabilityZoneApi.java
@@ -23,7 +23,7 @@ import javax.ws.rs.Path;
 import javax.ws.rs.core.MediaType;
 
 import org.jclouds.Fallbacks.EmptyFluentIterableOnNotFoundOr404;
-import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
+import org.jclouds.openstack.keystone.auth.filters.AuthenticateRequest;
 import org.jclouds.openstack.nova.v2_0.domain.regionscoped.AvailabilityZone;
 import org.jclouds.openstack.nova.v2_0.domain.regionscoped.AvailabilityZoneDetails;
 import org.jclouds.openstack.v2_0.ServiceType;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/ConsolesApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/ConsolesApi.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/ConsolesApi.java
index 7aa1f60..a4d4127 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/ConsolesApi.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/ConsolesApi.java
@@ -25,7 +25,7 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 
 import org.jclouds.fallbacks.MapHttp4xxCodesToExceptions;
-import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
+import org.jclouds.openstack.keystone.auth.filters.AuthenticateRequest;
 import org.jclouds.openstack.nova.v2_0.binders.BindConsoleToJsonPayload;
 import org.jclouds.openstack.nova.v2_0.domain.Console;
 import org.jclouds.openstack.v2_0.ServiceType;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/FlavorExtraSpecsApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/FlavorExtraSpecsApi.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/FlavorExtraSpecsApi.java
index 0db8cee..d935763 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/FlavorExtraSpecsApi.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/FlavorExtraSpecsApi.java
@@ -33,7 +33,7 @@ import org.jclouds.Fallbacks.EmptyMapOnNotFoundOr404;
 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.keystone.auth.filters.AuthenticateRequest;
 import org.jclouds.openstack.v2_0.ServiceType;
 import org.jclouds.openstack.v2_0.services.Extension;
 import org.jclouds.rest.annotations.Fallback;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/FloatingIPApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/FloatingIPApi.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/FloatingIPApi.java
index 626ee2d..003e66b 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/FloatingIPApi.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/FloatingIPApi.java
@@ -29,7 +29,7 @@ import javax.ws.rs.core.MediaType;
 import org.jclouds.Fallbacks.EmptyFluentIterableOnNotFoundOr404;
 import org.jclouds.Fallbacks.NullOnNotFoundOr404;
 import org.jclouds.javax.annotation.Nullable;
-import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
+import org.jclouds.openstack.keystone.auth.filters.AuthenticateRequest;
 import org.jclouds.openstack.nova.v2_0.domain.FloatingIP;
 import org.jclouds.openstack.v2_0.ServiceType;
 import org.jclouds.openstack.v2_0.services.Extension;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/FloatingIPPoolApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/FloatingIPPoolApi.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/FloatingIPPoolApi.java
index ead37ab..5bf5625 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/FloatingIPPoolApi.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/FloatingIPPoolApi.java
@@ -22,7 +22,7 @@ import javax.ws.rs.Path;
 import javax.ws.rs.core.MediaType;
 
 import org.jclouds.Fallbacks;
-import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
+import org.jclouds.openstack.keystone.auth.filters.AuthenticateRequest;
 import org.jclouds.openstack.nova.v2_0.domain.FloatingIPPool;
 import org.jclouds.openstack.v2_0.ServiceType;
 import org.jclouds.openstack.v2_0.services.Extension;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/HostAdministrationApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/HostAdministrationApi.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/HostAdministrationApi.java
index 8a07d3f..5eadc48 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/HostAdministrationApi.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/HostAdministrationApi.java
@@ -26,7 +26,7 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 
 import org.jclouds.Fallbacks.EmptyFluentIterableOnNotFoundOr404;
-import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
+import org.jclouds.openstack.keystone.auth.filters.AuthenticateRequest;
 import org.jclouds.openstack.nova.v2_0.domain.Host;
 import org.jclouds.openstack.nova.v2_0.domain.HostResourceUsage;
 import org.jclouds.openstack.nova.v2_0.functions.FieldValueResponseParsers.MaintenanceModeDisabledResponseParser;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/HostAggregateApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/HostAggregateApi.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/HostAggregateApi.java
index 889bb4f..18ad082 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/HostAggregateApi.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/HostAggregateApi.java
@@ -32,7 +32,7 @@ import org.jclouds.Fallbacks.EmptyFluentIterableOnNotFoundOr404;
 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.keystone.auth.filters.AuthenticateRequest;
 import org.jclouds.openstack.nova.v2_0.domain.HostAggregate;
 import org.jclouds.openstack.v2_0.ServiceType;
 import org.jclouds.openstack.v2_0.services.Extension;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/HypervisorApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/HypervisorApi.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/HypervisorApi.java
index 8da914c..9e443f6 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/HypervisorApi.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/HypervisorApi.java
@@ -23,7 +23,7 @@ import javax.ws.rs.Path;
 import javax.ws.rs.core.MediaType;
 
 import org.jclouds.Fallbacks.EmptyFluentIterableOnNotFoundOr404;
-import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
+import org.jclouds.openstack.keystone.auth.filters.AuthenticateRequest;
 import org.jclouds.openstack.nova.v2_0.domain.regionscoped.Hypervisor;
 import org.jclouds.openstack.nova.v2_0.domain.regionscoped.HypervisorDetails;
 import org.jclouds.openstack.v2_0.ServiceType;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/KeyPairApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/KeyPairApi.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/KeyPairApi.java
index d9f87d3..34074d1 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/KeyPairApi.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/KeyPairApi.java
@@ -30,7 +30,7 @@ import org.jclouds.Fallbacks.EmptyFluentIterableOnNotFoundOr404;
 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.keystone.auth.filters.AuthenticateRequest;
 import org.jclouds.openstack.nova.v2_0.binders.BindKeyPairToJsonPayload;
 import org.jclouds.openstack.nova.v2_0.domain.KeyPair;
 import org.jclouds.openstack.nova.v2_0.functions.internal.ParseKeyPairs;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/QuotaApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/QuotaApi.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/QuotaApi.java
index 5790620..59a5dd5 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/QuotaApi.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/QuotaApi.java
@@ -27,7 +27,7 @@ import javax.ws.rs.core.MediaType;
 
 import org.jclouds.Fallbacks.NullOnNotFoundOr404;
 import org.jclouds.javax.annotation.Nullable;
-import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
+import org.jclouds.openstack.keystone.auth.filters.AuthenticateRequest;
 import org.jclouds.openstack.nova.v2_0.domain.Quota;
 import org.jclouds.openstack.v2_0.ServiceType;
 import org.jclouds.openstack.v2_0.services.Extension;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/SecurityGroupApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/SecurityGroupApi.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/SecurityGroupApi.java
index 7e2b503..9d3ed0f 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/SecurityGroupApi.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/SecurityGroupApi.java
@@ -30,7 +30,7 @@ import org.jclouds.Fallbacks.EmptyFluentIterableOnNotFoundOr404;
 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.keystone.auth.filters.AuthenticateRequest;
 import org.jclouds.openstack.nova.v2_0.binders.BindSecurityGroupRuleToJsonPayload;
 import org.jclouds.openstack.nova.v2_0.domain.Ingress;
 import org.jclouds.openstack.nova.v2_0.domain.SecurityGroup;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/ServerAdminApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/ServerAdminApi.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/ServerAdminApi.java
index e054bd9..b489b2a 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/ServerAdminApi.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/ServerAdminApi.java
@@ -25,7 +25,7 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 
 import org.jclouds.fallbacks.MapHttp4xxCodesToExceptions;
-import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
+import org.jclouds.openstack.keystone.auth.filters.AuthenticateRequest;
 import org.jclouds.openstack.nova.v2_0.domain.BackupType;
 import org.jclouds.openstack.nova.v2_0.functions.ParseImageIdFromLocationHeader;
 import org.jclouds.openstack.nova.v2_0.options.CreateBackupOfServerOptions;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/ServerWithSecurityGroupsApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/ServerWithSecurityGroupsApi.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/ServerWithSecurityGroupsApi.java
index 3d1ecba..e17ca69 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/ServerWithSecurityGroupsApi.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/ServerWithSecurityGroupsApi.java
@@ -25,7 +25,7 @@ import javax.ws.rs.core.MediaType;
 
 import org.jclouds.Fallbacks.NullOnNotFoundOr404;
 import org.jclouds.javax.annotation.Nullable;
-import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
+import org.jclouds.openstack.keystone.auth.filters.AuthenticateRequest;
 import org.jclouds.openstack.nova.v2_0.domain.ServerWithSecurityGroups;
 import org.jclouds.openstack.v2_0.ServiceType;
 import org.jclouds.openstack.v2_0.services.Extension;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/SimpleTenantUsageApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/SimpleTenantUsageApi.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/SimpleTenantUsageApi.java
index 269059b..f88b480 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/SimpleTenantUsageApi.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/SimpleTenantUsageApi.java
@@ -26,7 +26,7 @@ import javax.ws.rs.core.MediaType;
 import org.jclouds.Fallbacks.EmptyFluentIterableOnNotFoundOr404;
 import org.jclouds.Fallbacks.NullOnNotFoundOr404;
 import org.jclouds.javax.annotation.Nullable;
-import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
+import org.jclouds.openstack.keystone.auth.filters.AuthenticateRequest;
 import org.jclouds.openstack.nova.v2_0.domain.SimpleTenantUsage;
 import org.jclouds.openstack.v2_0.ServiceType;
 import org.jclouds.openstack.v2_0.services.Extension;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VirtualInterfaceApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VirtualInterfaceApi.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VirtualInterfaceApi.java
index eff19a0..f484cff 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VirtualInterfaceApi.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VirtualInterfaceApi.java
@@ -24,7 +24,7 @@ import javax.ws.rs.PathParam;
 import javax.ws.rs.core.MediaType;
 
 import org.jclouds.Fallbacks.EmptyFluentIterableOnNotFoundOr404;
-import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
+import org.jclouds.openstack.keystone.auth.filters.AuthenticateRequest;
 import org.jclouds.openstack.nova.v2_0.domain.VirtualInterface;
 import org.jclouds.openstack.v2_0.ServiceType;
 import org.jclouds.openstack.v2_0.services.Extension;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeApi.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeApi.java
index eeaa992..185c807 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeApi.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeApi.java
@@ -30,7 +30,7 @@ import org.jclouds.Fallbacks.EmptyFluentIterableOnNotFoundOr404;
 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.keystone.auth.filters.AuthenticateRequest;
 import org.jclouds.openstack.nova.v2_0.domain.Volume;
 import org.jclouds.openstack.nova.v2_0.domain.VolumeSnapshot;
 import org.jclouds.openstack.nova.v2_0.options.CreateVolumeOptions;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeAttachmentApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeAttachmentApi.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeAttachmentApi.java
index 4445b3e..8d329f1 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeAttachmentApi.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeAttachmentApi.java
@@ -30,7 +30,7 @@ import org.jclouds.Fallbacks.EmptyFluentIterableOnNotFoundOr404;
 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.keystone.auth.filters.AuthenticateRequest;
 import org.jclouds.openstack.nova.v2_0.domain.VolumeAttachment;
 import org.jclouds.openstack.v2_0.ServiceType;
 import org.jclouds.openstack.v2_0.services.Extension;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeTypeApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeTypeApi.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeTypeApi.java
index 1204066..05dafac 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeTypeApi.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/extensions/VolumeTypeApi.java
@@ -34,7 +34,7 @@ import org.jclouds.Fallbacks.EmptyMapOnNotFoundOr404;
 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.keystone.auth.filters.AuthenticateRequest;
 import org.jclouds.openstack.nova.v2_0.domain.VolumeType;
 import org.jclouds.openstack.nova.v2_0.options.CreateVolumeTypeOptions;
 import org.jclouds.openstack.v2_0.ServiceType;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/features/FlavorApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/features/FlavorApi.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/features/FlavorApi.java
index d9e1498..98d1d9f 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/features/FlavorApi.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/features/FlavorApi.java
@@ -31,8 +31,8 @@ import org.jclouds.Fallbacks.NullOnNotFoundOr404;
 import org.jclouds.Fallbacks.VoidOnNotFoundOr404;
 import org.jclouds.collect.PagedIterable;
 import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.openstack.keystone.auth.filters.AuthenticateRequest;
 import org.jclouds.openstack.keystone.v2_0.KeystoneFallbacks.EmptyPaginatedCollectionOnNotFoundOr404;
-import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
 import org.jclouds.openstack.nova.v2_0.domain.Flavor;
 import org.jclouds.openstack.nova.v2_0.functions.internal.ParseFlavorDetails;
 import org.jclouds.openstack.nova.v2_0.functions.internal.ParseFlavors;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/features/ImageApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/features/ImageApi.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/features/ImageApi.java
index 1258c79..3dc9907 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/features/ImageApi.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/features/ImageApi.java
@@ -36,8 +36,8 @@ import org.jclouds.Fallbacks.VoidOnNotFoundOr404;
 import org.jclouds.collect.PagedIterable;
 import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
+import org.jclouds.openstack.keystone.auth.filters.AuthenticateRequest;
 import org.jclouds.openstack.keystone.v2_0.KeystoneFallbacks.EmptyPaginatedCollectionOnNotFoundOr404;
-import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
 import org.jclouds.openstack.nova.v2_0.binders.BindMetadataToJsonPayload;
 import org.jclouds.openstack.nova.v2_0.domain.Image;
 import org.jclouds.openstack.nova.v2_0.functions.internal.OnlyMetadataValueOrNull;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/features/ServerApi.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/features/ServerApi.java b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/features/ServerApi.java
index 42ab1c7..33bf09a 100644
--- a/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/features/ServerApi.java
+++ b/apis/openstack-nova/src/main/java/org/jclouds/openstack/nova/v2_0/features/ServerApi.java
@@ -41,8 +41,8 @@ import org.jclouds.collect.PagedIterable;
 import org.jclouds.fallbacks.MapHttp4xxCodesToExceptions;
 import org.jclouds.javax.annotation.Nullable;
 import org.jclouds.openstack.v2_0.domain.PaginatedCollection;
+import org.jclouds.openstack.keystone.auth.filters.AuthenticateRequest;
 import org.jclouds.openstack.keystone.v2_0.KeystoneFallbacks.EmptyPaginatedCollectionOnNotFoundOr404;
-import org.jclouds.openstack.keystone.v2_0.filters.AuthenticateRequest;
 import org.jclouds.openstack.nova.v2_0.binders.BindMetadataToJsonPayload;
 import org.jclouds.openstack.nova.v2_0.domain.RebootType;
 import org.jclouds.openstack.nova.v2_0.domain.Server;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/AccessKeyAndSecretKeyAndTenantIdAuthenticationExpectTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/AccessKeyAndSecretKeyAndTenantIdAuthenticationExpectTest.java b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/AccessKeyAndSecretKeyAndTenantIdAuthenticationExpectTest.java
index a19dc75..8c18292 100644
--- a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/AccessKeyAndSecretKeyAndTenantIdAuthenticationExpectTest.java
+++ b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/AccessKeyAndSecretKeyAndTenantIdAuthenticationExpectTest.java
@@ -31,7 +31,7 @@ import com.google.common.collect.ImmutableSet;
 
 /**
  *
- * @see org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties#CREDENTIAL_TYPE
+ * @see org.jclouds.openstack.keystone.config.KeystoneProperties#CREDENTIAL_TYPE
  */
 @Test(groups = "unit", testName = "AccessKeyAndSecretKeyAndTenantIdAuthenticationExpectTest")
 public class AccessKeyAndSecretKeyAndTenantIdAuthenticationExpectTest extends BaseNovaApiExpectTest {

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/AccessKeyAndSecretKeyAuthenticationExpectTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/AccessKeyAndSecretKeyAuthenticationExpectTest.java b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/AccessKeyAndSecretKeyAuthenticationExpectTest.java
index bd3f714..54aba76 100644
--- a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/AccessKeyAndSecretKeyAuthenticationExpectTest.java
+++ b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/AccessKeyAndSecretKeyAuthenticationExpectTest.java
@@ -30,7 +30,7 @@ import com.google.common.collect.ImmutableSet;
 
 /**
  *
- * @see org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties#CREDENTIAL_TYPE
+ * @see org.jclouds.openstack.keystone.config.KeystoneProperties#CREDENTIAL_TYPE
  */
 @Test(groups = "unit", testName = "AccessKeyAndSecretKeyAuthenticationExpectTest")
 public class AccessKeyAndSecretKeyAuthenticationExpectTest extends BaseNovaApiExpectTest {

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/PasswordAuthenticationExpectTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/PasswordAuthenticationExpectTest.java b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/PasswordAuthenticationExpectTest.java
index 55f1a21..dac895e 100644
--- a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/PasswordAuthenticationExpectTest.java
+++ b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/PasswordAuthenticationExpectTest.java
@@ -28,7 +28,7 @@ import com.google.common.collect.ImmutableSet;
 
 /**
  *
- * @see org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties#CREDENTIAL_TYPE
+ * @see org.jclouds.openstack.keystone.config.KeystoneProperties#CREDENTIAL_TYPE
  */
 @Test(groups = "unit", testName = "PasswordAuthenticationExpectTest")
 public class PasswordAuthenticationExpectTest extends BaseNovaApiExpectTest {

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/PasswordAuthenticationWithTenantNameExpectTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/PasswordAuthenticationWithTenantNameExpectTest.java b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/PasswordAuthenticationWithTenantNameExpectTest.java
index 87d3f37..4761a6e 100644
--- a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/PasswordAuthenticationWithTenantNameExpectTest.java
+++ b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/PasswordAuthenticationWithTenantNameExpectTest.java
@@ -30,7 +30,7 @@ import com.google.common.collect.ImmutableSet;
 
 /**
  *
- * @see org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties#CREDENTIAL_TYPE
+ * @see org.jclouds.openstack.keystone.config.KeystoneProperties#CREDENTIAL_TYPE
  */
 @Test(groups = "unit", testName = "PasswordAuthenticationWithTenantNameExpectTest")
 public class PasswordAuthenticationWithTenantNameExpectTest extends BaseNovaApiExpectTest {

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/NovaComputeServiceLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/NovaComputeServiceLiveTest.java b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/NovaComputeServiceLiveTest.java
index f5e33dd..d4aac07 100644
--- a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/NovaComputeServiceLiveTest.java
+++ b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/compute/NovaComputeServiceLiveTest.java
@@ -21,7 +21,7 @@ import static java.util.logging.Logger.getAnonymousLogger;
 import java.util.Properties;
 
 import org.jclouds.compute.internal.BaseComputeServiceLiveTest;
-import org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties;
+import org.jclouds.openstack.keystone.config.KeystoneProperties;
 import org.jclouds.openstack.nova.v2_0.config.NovaProperties;
 import org.jclouds.rest.AuthorizationException;
 import org.jclouds.sshj.config.SshjSshClientModule;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/functions/InternalURLLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/functions/InternalURLLiveTest.java b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/functions/InternalURLLiveTest.java
index 602831c..713c1b9 100644
--- a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/functions/InternalURLLiveTest.java
+++ b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/functions/InternalURLLiveTest.java
@@ -21,8 +21,8 @@ import static org.testng.Assert.assertNotNull;
 
 import java.util.Properties;
 
+import org.jclouds.openstack.keystone.catalog.config.InternalUrlModule;
 import org.jclouds.openstack.nova.v2_0.internal.BaseNovaApiLiveTest;
-import org.jclouds.openstack.v2_0.config.InternalUrlModule;
 import org.testng.Assert;
 import org.testng.annotations.Test;
 

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/internal/BaseNovaApiLiveTest.java
----------------------------------------------------------------------
diff --git a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/internal/BaseNovaApiLiveTest.java b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/internal/BaseNovaApiLiveTest.java
index 614fad2..13b34d1 100644
--- a/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/internal/BaseNovaApiLiveTest.java
+++ b/apis/openstack-nova/src/test/java/org/jclouds/openstack/nova/v2_0/internal/BaseNovaApiLiveTest.java
@@ -20,7 +20,7 @@ import java.util.Properties;
 import java.util.Set;
 
 import org.jclouds.apis.BaseApiLiveTest;
-import org.jclouds.openstack.keystone.v2_0.config.KeystoneProperties;
+import org.jclouds.openstack.keystone.config.KeystoneProperties;
 import org.jclouds.openstack.nova.v2_0.NovaApi;
 import org.jclouds.openstack.nova.v2_0.config.NovaProperties;
 import org.jclouds.openstack.nova.v2_0.domain.Flavor;

http://git-wip-us.apache.org/repos/asf/jclouds/blob/dd73410d/apis/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/SwiftApiMetadata.java
----------------------------------------------------------------------
diff --git a/apis/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/SwiftApiMetadata.java b/apis/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/SwiftApiMetadata.java
index 7351f68..3de0853 100644
--- a/apis/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/SwiftApiMetadata.java
+++ b/apis/openstack-swift/src/main/java/org/jclouds/openstack/swift/v1/SwiftApiMetadata.java
@@ -17,21 +17,22 @@
 package org.jclouds.openstack.swift.v1;
 
 import static org.jclouds.Constants.PROPERTY_IDEMPOTENT_METHODS;
-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 static org.jclouds.openstack.swift.v1.reference.TempAuthHeaders.TEMP_AUTH_HEADER_USER;
-import static org.jclouds.openstack.swift.v1.reference.TempAuthHeaders.TEMP_AUTH_HEADER_PASS;
-import static org.jclouds.openstack.swift.v1.reference.TempAuthHeaders.DEFAULT_HEADER_USER;
+import static org.jclouds.openstack.keystone.config.KeystoneProperties.CREDENTIAL_TYPE;
+import static org.jclouds.openstack.keystone.config.KeystoneProperties.KEYSTONE_VERSION;
+import static org.jclouds.openstack.keystone.config.KeystoneProperties.SERVICE_TYPE;
 import static org.jclouds.openstack.swift.v1.reference.TempAuthHeaders.DEFAULT_HEADER_PASS;
+import static org.jclouds.openstack.swift.v1.reference.TempAuthHeaders.DEFAULT_HEADER_USER;
+import static org.jclouds.openstack.swift.v1.reference.TempAuthHeaders.TEMP_AUTH_HEADER_PASS;
+import static org.jclouds.openstack.swift.v1.reference.TempAuthHeaders.TEMP_AUTH_HEADER_USER;
 import static org.jclouds.reflect.Reflection2.typeToken;
 
-
 import java.net.URI;
 import java.util.Properties;
 
 import org.jclouds.apis.ApiMetadata;
-import org.jclouds.openstack.keystone.v2_0.config.CredentialTypes;
-import org.jclouds.openstack.keystone.v2_0.config.KeystoneAuthenticationModule.RegionModule;
+import org.jclouds.openstack.keystone.auth.config.CredentialTypes;
+import org.jclouds.openstack.keystone.catalog.config.ServiceCatalogModule;
+import org.jclouds.openstack.keystone.catalog.config.ServiceCatalogModule.RegionModule;
 import org.jclouds.openstack.swift.v1.blobstore.RegionScopedBlobStoreContext;
 import org.jclouds.openstack.swift.v1.blobstore.config.SignUsingTemporaryUrls;
 import org.jclouds.openstack.swift.v1.blobstore.config.SwiftBlobStoreContextModule;
@@ -64,6 +65,7 @@ public class SwiftApiMetadata extends BaseHttpApiMetadata<SwiftApi> {
    public static Properties defaultProperties() {
       Properties properties = BaseHttpApiMetadata.defaultProperties();
       properties.setProperty(SERVICE_TYPE, ServiceType.OBJECT_STORE);
+      properties.setProperty(KEYSTONE_VERSION, "2");
       properties.setProperty(PROPERTY_IDEMPOTENT_METHODS, "DELETE,GET,HEAD,OPTIONS,POST,PUT");
       // Can alternatively be set to "tempAuthCredentials"
       properties.setProperty(CREDENTIAL_TYPE, CredentialTypes.PASSWORD_CREDENTIALS);
@@ -87,6 +89,7 @@ public class SwiftApiMetadata extends BaseHttpApiMetadata<SwiftApi> {
          .view(typeToken(RegionScopedBlobStoreContext.class))
          .defaultModules(ImmutableSet.<Class<? extends Module>>builder()
                                      .add(SwiftAuthenticationModule.class)
+                                     .add(ServiceCatalogModule.class)
                                      .add(RegionModule.class)
                                      .add(SwiftTypeAdapters.class)
                                      .add(SwiftHttpApiModule.class)