You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jclouds.apache.org by ad...@apache.org on 2014/10/05 22:15:25 UTC

[5/5] git commit: JCLOUDS-40 unasync vcloud-director

JCLOUDS-40 unasync vcloud-director


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

Branch: refs/heads/master
Commit: d7bc430c6d8d66f0c91818f074bef6bba8846b8d
Parents: 0cbcf18
Author: Adrian Cole <ac...@twitter.com>
Authored: Sun Oct 5 12:53:06 2014 -0700
Committer: Adrian Cole <ad...@apache.org>
Committed: Sun Oct 5 13:15:09 2014 -0700

----------------------------------------------------------------------
 .../v1_5/VCloudDirectorApiMetadata.java         |  22 +-
 .../director/v1_5/VCloudDirectorConstants.java  |  34 -
 .../director/v1_5/VCloudDirectorContext.java    |  10 +-
 .../v1_5/admin/VCloudDirectorAdminApi.java      |   8 +-
 .../v1_5/admin/VCloudDirectorAdminAsyncApi.java | 101 --
 .../config/VCloudDirectorHttpApiModule.java     | 158 +++
 .../config/VCloudDirectorRestClientModule.java  | 232 -----
 .../director/v1_5/features/CatalogApi.java      | 102 +-
 .../director/v1_5/features/CatalogAsyncApi.java | 143 ---
 .../vcloud/director/v1_5/features/MediaApi.java |  99 +-
 .../director/v1_5/features/MediaAsyncApi.java   | 155 ---
 .../director/v1_5/features/MetadataApi.java     |  63 +-
 .../v1_5/features/MetadataAsyncApi.java         | 102 --
 .../director/v1_5/features/NetworkApi.java      |  29 +-
 .../director/v1_5/features/NetworkAsyncApi.java |  58 --
 .../vcloud/director/v1_5/features/OrgApi.java   |  34 +-
 .../director/v1_5/features/OrgAsyncApi.java     |  69 --
 .../vcloud/director/v1_5/features/QueryApi.java | 143 +--
 .../director/v1_5/features/QueryAsyncApi.java   | 192 ----
 .../vcloud/director/v1_5/features/TaskApi.java  |  53 +-
 .../director/v1_5/features/TaskAsyncApi.java    |  88 --
 .../director/v1_5/features/UploadApi.java       |  18 +-
 .../director/v1_5/features/UploadAsyncApi.java  |  41 -
 .../vcloud/director/v1_5/features/VAppApi.java  | 778 +++++++++++----
 .../director/v1_5/features/VAppAsyncApi.java    | 624 ------------
 .../director/v1_5/features/VAppTemplateApi.java | 268 ++++-
 .../v1_5/features/VAppTemplateAsyncApi.java     | 363 -------
 .../vcloud/director/v1_5/features/VdcApi.java   | 187 +++-
 .../director/v1_5/features/VdcAsyncApi.java     | 252 -----
 .../vcloud/director/v1_5/features/VmApi.java    | 747 +++++++++++---
 .../director/v1_5/features/VmAsyncApi.java      | 974 -------------------
 .../v1_5/features/admin/AdminCatalogApi.java    | 162 ++-
 .../features/admin/AdminCatalogAsyncApi.java    | 238 -----
 .../v1_5/features/admin/AdminNetworkApi.java    |  65 +-
 .../features/admin/AdminNetworkAsyncApi.java    | 108 --
 .../v1_5/features/admin/AdminOrgApi.java        | 247 ++++-
 .../v1_5/features/admin/AdminOrgAsyncApi.java   | 355 -------
 .../v1_5/features/admin/AdminQueryApi.java      |  89 +-
 .../v1_5/features/admin/AdminQueryAsyncApi.java | 132 ---
 .../v1_5/features/admin/AdminVdcApi.java        |  85 +-
 .../v1_5/features/admin/AdminVdcAsyncApi.java   | 137 ---
 .../director/v1_5/features/admin/GroupApi.java  |  86 +-
 .../v1_5/features/admin/GroupAsyncApi.java      | 123 ---
 .../director/v1_5/features/admin/UserApi.java   |  91 +-
 .../v1_5/features/admin/UserAsyncApi.java       | 142 ---
 .../internal/VCloudDirectorContextImpl.java     |  18 +-
 .../vcloud/director/v1_5/login/SessionApi.java  |  49 +-
 .../director/v1_5/login/SessionAsyncApi.java    |  75 --
 .../director/v1_5/user/VCloudDirectorApi.java   |  29 +-
 .../v1_5/user/VCloudDirectorAsyncApi.java       | 150 ---
 .../v1_5/VCloudDirectorApiMetadataTest.java     |   4 +-
 .../internal/BaseVCloudDirectorApiLiveTest.java |  11 +-
 .../BaseVCloudDirectorRestApiExpectTest.java    |  23 -
 .../v1_5/login/SessionApiExpectTest.java        |   9 +-
 .../director/v1_5/login/SessionApiLiveTest.java |  12 +-
 55 files changed, 2834 insertions(+), 5753 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d7bc430c/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorApiMetadata.java
----------------------------------------------------------------------
diff --git a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorApiMetadata.java b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorApiMetadata.java
index bf8ce70..d1759a5 100644
--- a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorApiMetadata.java
+++ b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorApiMetadata.java
@@ -26,20 +26,12 @@ import static org.jclouds.vcloud.director.v1_5.VCloudDirectorConstants.PROPERTY_
 import java.net.URI;
 import java.util.Properties;
 
-import org.jclouds.rest.internal.BaseRestApiMetadata;
-import org.jclouds.vcloud.director.v1_5.config.VCloudDirectorRestClientModule;
+import org.jclouds.rest.internal.BaseHttpApiMetadata;
+import org.jclouds.vcloud.director.v1_5.config.VCloudDirectorHttpApiModule;
 import org.jclouds.vcloud.director.v1_5.user.VCloudDirectorApi;
-import org.jclouds.vcloud.director.v1_5.user.VCloudDirectorAsyncApi;
 
-import com.google.common.reflect.TypeToken;
+public class VCloudDirectorApiMetadata extends BaseHttpApiMetadata {
 
-/**
- * Implementation of {@link ApiMetadata} for VCloudDirector 1.5 API
- */
-public class VCloudDirectorApiMetadata extends BaseRestApiMetadata {
-
-   public static final TypeToken<VCloudDirectorContext> CONTEXT_TOKEN = typeToken(VCloudDirectorContext.class);
-   
    @Override
    public Builder toBuilder() {
       return new Builder().fromApiMetadata(this);
@@ -54,7 +46,7 @@ public class VCloudDirectorApiMetadata extends BaseRestApiMetadata {
    }
 
    public static Properties defaultProperties() {
-      Properties properties = BaseRestApiMetadata.defaultProperties();
+      Properties properties = BaseHttpApiMetadata.defaultProperties();
       /** FIXME this should not be the default */
       properties.setProperty(PROPERTY_SESSION_INTERVAL, Integer.toString(30 * 60));
 
@@ -70,10 +62,10 @@ public class VCloudDirectorApiMetadata extends BaseRestApiMetadata {
       return properties;
    }
 
-   public static class Builder extends BaseRestApiMetadata.Builder<Builder> {
+   public static class Builder extends BaseHttpApiMetadata.Builder<VCloudDirectorApi, Builder> {
 
       protected Builder() {
-         super(VCloudDirectorApi.class, VCloudDirectorAsyncApi.class);
+         super(VCloudDirectorApi.class);
           id("vcloud-director")
          .name("vCloud Director 1.5 API")
          .identityName("User at Organization (user@org)")
@@ -82,7 +74,7 @@ public class VCloudDirectorApiMetadata extends BaseRestApiMetadata {
          .version("1.5")
          .defaultProperties(VCloudDirectorApiMetadata.defaultProperties())
          .context(typeToken(VCloudDirectorContext.class))
-         .defaultModule(VCloudDirectorRestClientModule.class);
+         .defaultModule(VCloudDirectorHttpApiModule.class);
       }
 
       @Override

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d7bc430c/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorConstants.java
----------------------------------------------------------------------
diff --git a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorConstants.java b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorConstants.java
index df72510..a8bb741 100644
--- a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorConstants.java
+++ b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorConstants.java
@@ -16,12 +16,6 @@
  */
 package org.jclouds.vcloud.director.v1_5;
 
-import org.jclouds.rest.RestContext;
-import org.jclouds.vcloud.director.v1_5.login.SessionAsyncApi;
-import org.jclouds.vcloud.director.v1_5.login.SessionApi;
-
-import com.google.common.reflect.TypeToken;
-
 /**
  * Constants used by VCloudDirector apis
  */
@@ -37,40 +31,12 @@ public final class VCloudDirectorConstants {
 
    public static final String PROPERTY_VCLOUD_DIRECTOR_VERSION_SCHEMA = "jclouds.vcloud-director.version.schema";
 
-   /** Name of the default org that your vApp will join, if an org isn't explicitly specified. */
-   public static final String PROPERTY_VCLOUD_DIRECTOR_DEFAULT_ORG = "jclouds.vcloud-director.defaults.org";
-
-   /** Name of the default catalog to query, if it isn't explicitly specified. */
-   public static final String PROPERTY_VCLOUD_DIRECTOR_DEFAULT_CATALOG = "jclouds.vcloud-director.defaults.catalog";
-
-   /** Name of the VDC that your vApp will join, if a vDC isn't explicitly specified. */
-   public static final String PROPERTY_VCLOUD_DIRECTOR_DEFAULT_VDC = "jclouds.vcloud-director.defaults.vdc";
-
-   /** Name of the default network, in the default VDC that your vApp will join. */
-   public static final String PROPERTY_VCLOUD_DIRECTOR_DEFAULT_NETWORK = "jclouds.vcloud-director.defaults.network";
-
-   /** TODO javadoc */
-   // public static final String PROPERTY_VCLOUD_DEFAULT_FENCEMODE = "jclouds.vcloud-director.defaults.fencemode";
-
    /** TODO javadoc */
    public static final String PROPERTY_VCLOUD_DIRECTOR_XML_NAMESPACE = "jclouds.vcloud-director.xml.ns";
    
    /** TODO javadoc */
    public static final String PROPERTY_VCLOUD_DIRECTOR_XML_SCHEMA = "jclouds.vcloud-director.xml.schema";
 
-   // TODO put these somewhere else, maybe core?
-
-   /** TODO javadoc */
-   public static final String PROPERTY_DNS_NAME_LEN_MIN = "jclouds.dns_name_length_min";
-
-   /** TODO javadoc */
-   public static final String PROPERTY_NS_NAME_LEN_MAX = "jclouds.dns_name_length_max";
-
-   /** TODO javadoc */
-   public static final TypeToken<RestContext<SessionApi, SessionAsyncApi>> SESSION_CONTEXT_TYPE =
-         new TypeToken<RestContext<SessionApi, SessionAsyncApi>>() {
-		   };
-
    private VCloudDirectorConstants() {
       throw new AssertionError("intentionally unimplemented");
    }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d7bc430c/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorContext.java
----------------------------------------------------------------------
diff --git a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorContext.java b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorContext.java
index ea81039..8718bd2 100644
--- a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorContext.java
+++ b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorContext.java
@@ -16,17 +16,15 @@
  */
 package org.jclouds.vcloud.director.v1_5;
 
-import org.jclouds.rest.RestContext;
-import org.jclouds.vcloud.director.v1_5.admin.VCloudDirectorAdminAsyncApi;
+import org.jclouds.rest.ApiContext;
 import org.jclouds.vcloud.director.v1_5.admin.VCloudDirectorAdminApi;
 import org.jclouds.vcloud.director.v1_5.internal.VCloudDirectorContextImpl;
-import org.jclouds.vcloud.director.v1_5.user.VCloudDirectorAsyncApi;
 import org.jclouds.vcloud.director.v1_5.user.VCloudDirectorApi;
 
 import com.google.inject.ImplementedBy;
 
 @ImplementedBy(VCloudDirectorContextImpl.class)
-public interface VCloudDirectorContext extends RestContext<VCloudDirectorApi, VCloudDirectorAsyncApi> {
-   
-   RestContext<VCloudDirectorAdminApi, VCloudDirectorAdminAsyncApi> getAdminContext();
+public interface VCloudDirectorContext extends ApiContext<VCloudDirectorApi> {
+
+   ApiContext<VCloudDirectorAdminApi> getAdminContext();
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d7bc430c/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/admin/VCloudDirectorAdminApi.java
----------------------------------------------------------------------
diff --git a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/admin/VCloudDirectorAdminApi.java b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/admin/VCloudDirectorAdminApi.java
index bd3e308..96641cc 100644
--- a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/admin/VCloudDirectorAdminApi.java
+++ b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/admin/VCloudDirectorAdminApi.java
@@ -20,6 +20,7 @@ import java.net.URI;
 
 import org.jclouds.rest.annotations.Delegate;
 import org.jclouds.rest.annotations.EndpointParam;
+import org.jclouds.rest.annotations.RequestFilters;
 import org.jclouds.vcloud.director.v1_5.features.MetadataApi;
 import org.jclouds.vcloud.director.v1_5.features.admin.AdminCatalogApi;
 import org.jclouds.vcloud.director.v1_5.features.admin.AdminNetworkApi;
@@ -28,14 +29,11 @@ import org.jclouds.vcloud.director.v1_5.features.admin.AdminQueryApi;
 import org.jclouds.vcloud.director.v1_5.features.admin.AdminVdcApi;
 import org.jclouds.vcloud.director.v1_5.features.admin.GroupApi;
 import org.jclouds.vcloud.director.v1_5.features.admin.UserApi;
+import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
 import org.jclouds.vcloud.director.v1_5.functions.URNToAdminHref;
 import org.jclouds.vcloud.director.v1_5.user.VCloudDirectorApi;
 
-/**
- * Provides synchronous access to VCloudDirector Admin.
- * 
- * @see VCloudDirectorAsyncApi
- */
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface VCloudDirectorAdminApi extends VCloudDirectorApi {
    /**
     * @return asynchronous access to admin query features

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d7bc430c/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/admin/VCloudDirectorAdminAsyncApi.java
----------------------------------------------------------------------
diff --git a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/admin/VCloudDirectorAdminAsyncApi.java b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/admin/VCloudDirectorAdminAsyncApi.java
deleted file mode 100644
index c55c851..0000000
--- a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/admin/VCloudDirectorAdminAsyncApi.java
+++ /dev/null
@@ -1,101 +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.vcloud.director.v1_5.admin;
-
-import java.net.URI;
-
-import org.jclouds.rest.annotations.Delegate;
-import org.jclouds.rest.annotations.EndpointParam;
-import org.jclouds.rest.annotations.RequestFilters;
-import org.jclouds.vcloud.director.v1_5.features.MetadataAsyncApi;
-import org.jclouds.vcloud.director.v1_5.features.admin.AdminCatalogAsyncApi;
-import org.jclouds.vcloud.director.v1_5.features.admin.AdminNetworkAsyncApi;
-import org.jclouds.vcloud.director.v1_5.features.admin.AdminOrgAsyncApi;
-import org.jclouds.vcloud.director.v1_5.features.admin.AdminQueryAsyncApi;
-import org.jclouds.vcloud.director.v1_5.features.admin.AdminVdcAsyncApi;
-import org.jclouds.vcloud.director.v1_5.features.admin.GroupAsyncApi;
-import org.jclouds.vcloud.director.v1_5.features.admin.UserAsyncApi;
-import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
-import org.jclouds.vcloud.director.v1_5.functions.URNToAdminHref;
-import org.jclouds.vcloud.director.v1_5.user.VCloudDirectorAsyncApi;
-
-/**
- * Provides asynchronous access to VCloudDirector Admin via their REST API.
- * 
- * @see VCloudDirectorAdminApi
- */
-@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
-public interface VCloudDirectorAdminAsyncApi extends VCloudDirectorAsyncApi {
-   /**
-    * @return asynchronous access to admin query features
-    */
-   @Override
-   @Delegate
-   AdminQueryAsyncApi getQueryApi();
-
-   
-   /**
-    * @return asynchronous access to {@link Catalog} admin features
-    */
-   @Override
-   @Delegate
-   AdminCatalogAsyncApi getCatalogApi();
-   
-   /**
-    * @return asynchronous access to admin {@link Group} features
-    */
-   @Delegate
-   GroupAsyncApi getGroupApi();
-   
-   /**
-    * @return asynchronous access to {@link AdminOrg} features
-    */
-   @Override
-   @Delegate
-   AdminOrgAsyncApi getOrgApi();
-   
-   /**
-    * @return asynchronous access to {@link User} features
-    */
-   @Delegate
-   UserAsyncApi getUserApi();
-   
-   /**
-    * @return asynchronous access to {@link AdminVdc} features
-    */
-   @Override
-   @Delegate
-   AdminVdcAsyncApi getVdcApi();
-   
-   /**
-    * @return asynchronous access to admin {@link Network} features
-    */
-   @Override
-   @Delegate
-   AdminNetworkAsyncApi getNetworkApi();
-   
-   /**
-    * @return asynchronous access to {@link Metadata} features
-    */
-   @Override
-   @Delegate
-   MetadataAsyncApi getMetadataApi(@EndpointParam(parser = URNToAdminHref.class) String urn);
-
-   @Override
-   @Delegate
-   MetadataAsyncApi getMetadataApi(@EndpointParam URI href);
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d7bc430c/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/config/VCloudDirectorHttpApiModule.java
----------------------------------------------------------------------
diff --git a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/config/VCloudDirectorHttpApiModule.java b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/config/VCloudDirectorHttpApiModule.java
new file mode 100644
index 0000000..c78d68e
--- /dev/null
+++ b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/config/VCloudDirectorHttpApiModule.java
@@ -0,0 +1,158 @@
+/*
+ * 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.vcloud.director.v1_5.config;
+
+import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL;
+import static org.jclouds.rest.config.BinderUtils.bindHttpApi;
+
+import java.net.URI;
+import java.util.concurrent.TimeUnit;
+
+import org.jclouds.domain.Credentials;
+import org.jclouds.http.HttpErrorHandler;
+import org.jclouds.http.HttpRetryHandler;
+import org.jclouds.http.annotation.ClientError;
+import org.jclouds.http.annotation.Redirection;
+import org.jclouds.http.annotation.ServerError;
+import org.jclouds.location.Provider;
+import org.jclouds.rest.ApiContext;
+import org.jclouds.rest.ConfiguresHttpApi;
+import org.jclouds.rest.config.HttpApiModule;
+import org.jclouds.rest.internal.ApiContextImpl;
+import org.jclouds.vcloud.director.v1_5.admin.VCloudDirectorAdminApi;
+import org.jclouds.vcloud.director.v1_5.annotations.Login;
+import org.jclouds.vcloud.director.v1_5.domain.Entity;
+import org.jclouds.vcloud.director.v1_5.domain.Session;
+import org.jclouds.vcloud.director.v1_5.domain.SessionWithToken;
+import org.jclouds.vcloud.director.v1_5.features.OrgApi;
+import org.jclouds.vcloud.director.v1_5.features.TaskApi;
+import org.jclouds.vcloud.director.v1_5.features.VAppApi;
+import org.jclouds.vcloud.director.v1_5.features.VmApi;
+import org.jclouds.vcloud.director.v1_5.handlers.InvalidateSessionAndRetryOn401AndLogoutOnClose;
+import org.jclouds.vcloud.director.v1_5.handlers.VCloudDirectorErrorHandler;
+import org.jclouds.vcloud.director.v1_5.loaders.LoginUserInOrgWithPassword;
+import org.jclouds.vcloud.director.v1_5.loaders.ResolveEntity;
+import org.jclouds.vcloud.director.v1_5.login.SessionApi;
+import org.jclouds.vcloud.director.v1_5.user.VCloudDirectorApi;
+
+import com.google.common.base.Function;
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.LoadingCache;
+import com.google.inject.Provides;
+import com.google.inject.Singleton;
+import com.google.inject.TypeLiteral;
+import com.google.inject.name.Named;
+
+@ConfiguresHttpApi
+public class VCloudDirectorHttpApiModule extends HttpApiModule<VCloudDirectorApi> {
+   @Override
+   protected void configure() {
+      bind(new TypeLiteral<ApiContext<VCloudDirectorAdminApi>>() {
+      }).to(new TypeLiteral<ApiContextImpl<VCloudDirectorAdminApi>>() {
+      });
+      
+      // Bind apis that are used directly in Functions, Predicates and other circumstances
+      bindHttpApi(binder(), OrgApi.class);
+      bindHttpApi(binder(), SessionApi.class);
+      bindHttpApi(binder(), TaskApi.class);
+      bindHttpApi(binder(), VAppApi.class);
+      bindHttpApi(binder(), VmApi.class);
+      
+      bind(HttpRetryHandler.class).annotatedWith(ClientError.class).to(InvalidateSessionAndRetryOn401AndLogoutOnClose.class);
+      
+      super.configure();
+      bindHttpApi(binder(),  VCloudDirectorAdminApi.class);
+   }
+   
+   @Override
+   protected void bindErrorHandlers() {
+      bind(HttpErrorHandler.class).annotatedWith(Redirection.class).to(VCloudDirectorErrorHandler.class);
+      bind(HttpErrorHandler.class).annotatedWith(ClientError.class).to(VCloudDirectorErrorHandler.class);
+      bind(HttpErrorHandler.class).annotatedWith(ServerError.class).to(VCloudDirectorErrorHandler.class);
+   }
+   
+   @Provides
+   @Login
+   protected Supplier<URI> loginUrl(@Provider Supplier<URI> provider) {
+      // TODO: technically, we should implement version api, but this will work
+      return Suppliers.compose(new Function<URI, URI>() {
+         
+         @Override
+         public URI apply(URI arg0) {
+            return URI.create(arg0.toASCIIString() + "/sessions");
+         }
+         
+      }, provider);
+   }
+   
+   @Provides
+   protected Supplier<Session> currentSession(Supplier<SessionWithToken> in) {
+      return Suppliers.compose(new Function<SessionWithToken, Session>() {
+         
+         @Override
+         public Session apply(SessionWithToken arg0) {
+            return arg0.getSession();
+         }
+         
+      }, in);
+      
+   }
+   
+   @Provides
+   @Singleton
+   @org.jclouds.vcloud.director.v1_5.annotations.Session
+   protected Supplier<String> sessionToken(Supplier<SessionWithToken> in) {
+      return Suppliers.compose(new Function<SessionWithToken, String>() {
+         
+         @Override
+         public String apply(SessionWithToken arg0) {
+            return arg0.getToken();
+         }
+         
+      }, in);
+      
+   }
+
+   @Provides
+   @Singleton
+   LoadingCache<String, Entity> resolveEntityCache(ResolveEntity loader, @Named(PROPERTY_SESSION_INTERVAL) int seconds) {
+      return CacheBuilder.newBuilder().expireAfterWrite(seconds, TimeUnit.SECONDS).build(loader);
+   }
+
+   @Provides
+   @Singleton
+   LoadingCache<Credentials, SessionWithToken> provideSessionWithTokenCache(LoginUserInOrgWithPassword loader,
+         @Named(PROPERTY_SESSION_INTERVAL) int seconds) {
+      return CacheBuilder.newBuilder().expireAfterWrite(seconds, TimeUnit.SECONDS).build(loader);
+   }
+   
+   // Temporary conversion of a cache to a supplier until there is a single-element cache
+   // http://code.google.com/p/guava-libraries/issues/detail?id=872
+   @Provides
+   @Singleton
+   protected Supplier<SessionWithToken> provideSessionWithTokenSupplier(
+         final LoadingCache<Credentials, SessionWithToken> cache, @Provider final Supplier<Credentials> creds) {
+      return new Supplier<SessionWithToken>() {
+         @Override
+         public SessionWithToken get() {
+            return cache.getUnchecked(creds.get());
+         }
+      };
+   }
+}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d7bc430c/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/config/VCloudDirectorRestClientModule.java
----------------------------------------------------------------------
diff --git a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/config/VCloudDirectorRestClientModule.java b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/config/VCloudDirectorRestClientModule.java
deleted file mode 100644
index c2447a9..0000000
--- a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/config/VCloudDirectorRestClientModule.java
+++ /dev/null
@@ -1,232 +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.vcloud.director.v1_5.config;
-
-import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL;
-import static org.jclouds.rest.config.BinderUtils.bindSyncToAsyncHttpApi;
-
-import java.net.URI;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-import org.jclouds.domain.Credentials;
-import org.jclouds.http.HttpErrorHandler;
-import org.jclouds.http.HttpRetryHandler;
-import org.jclouds.http.annotation.ClientError;
-import org.jclouds.http.annotation.Redirection;
-import org.jclouds.http.annotation.ServerError;
-import org.jclouds.location.Provider;
-import org.jclouds.rest.ConfiguresRestClient;
-import org.jclouds.rest.RestContext;
-import org.jclouds.rest.config.RestClientModule;
-import org.jclouds.rest.internal.RestContextImpl;
-import org.jclouds.vcloud.director.v1_5.admin.VCloudDirectorAdminApi;
-import org.jclouds.vcloud.director.v1_5.admin.VCloudDirectorAdminAsyncApi;
-import org.jclouds.vcloud.director.v1_5.annotations.Login;
-import org.jclouds.vcloud.director.v1_5.domain.Entity;
-import org.jclouds.vcloud.director.v1_5.domain.Session;
-import org.jclouds.vcloud.director.v1_5.domain.SessionWithToken;
-import org.jclouds.vcloud.director.v1_5.features.CatalogApi;
-import org.jclouds.vcloud.director.v1_5.features.CatalogAsyncApi;
-import org.jclouds.vcloud.director.v1_5.features.MediaApi;
-import org.jclouds.vcloud.director.v1_5.features.MediaAsyncApi;
-import org.jclouds.vcloud.director.v1_5.features.MetadataApi;
-import org.jclouds.vcloud.director.v1_5.features.MetadataAsyncApi;
-import org.jclouds.vcloud.director.v1_5.features.NetworkApi;
-import org.jclouds.vcloud.director.v1_5.features.NetworkAsyncApi;
-import org.jclouds.vcloud.director.v1_5.features.OrgApi;
-import org.jclouds.vcloud.director.v1_5.features.OrgAsyncApi;
-import org.jclouds.vcloud.director.v1_5.features.QueryApi;
-import org.jclouds.vcloud.director.v1_5.features.QueryAsyncApi;
-import org.jclouds.vcloud.director.v1_5.features.TaskApi;
-import org.jclouds.vcloud.director.v1_5.features.TaskAsyncApi;
-import org.jclouds.vcloud.director.v1_5.features.UploadApi;
-import org.jclouds.vcloud.director.v1_5.features.UploadAsyncApi;
-import org.jclouds.vcloud.director.v1_5.features.VAppApi;
-import org.jclouds.vcloud.director.v1_5.features.VAppAsyncApi;
-import org.jclouds.vcloud.director.v1_5.features.VAppTemplateApi;
-import org.jclouds.vcloud.director.v1_5.features.VAppTemplateAsyncApi;
-import org.jclouds.vcloud.director.v1_5.features.VdcApi;
-import org.jclouds.vcloud.director.v1_5.features.VdcAsyncApi;
-import org.jclouds.vcloud.director.v1_5.features.VmApi;
-import org.jclouds.vcloud.director.v1_5.features.VmAsyncApi;
-import org.jclouds.vcloud.director.v1_5.features.admin.AdminCatalogApi;
-import org.jclouds.vcloud.director.v1_5.features.admin.AdminCatalogAsyncApi;
-import org.jclouds.vcloud.director.v1_5.features.admin.AdminNetworkApi;
-import org.jclouds.vcloud.director.v1_5.features.admin.AdminNetworkAsyncApi;
-import org.jclouds.vcloud.director.v1_5.features.admin.AdminOrgApi;
-import org.jclouds.vcloud.director.v1_5.features.admin.AdminOrgAsyncApi;
-import org.jclouds.vcloud.director.v1_5.features.admin.AdminQueryApi;
-import org.jclouds.vcloud.director.v1_5.features.admin.AdminQueryAsyncApi;
-import org.jclouds.vcloud.director.v1_5.features.admin.AdminVdcApi;
-import org.jclouds.vcloud.director.v1_5.features.admin.AdminVdcAsyncApi;
-import org.jclouds.vcloud.director.v1_5.features.admin.GroupApi;
-import org.jclouds.vcloud.director.v1_5.features.admin.GroupAsyncApi;
-import org.jclouds.vcloud.director.v1_5.features.admin.UserApi;
-import org.jclouds.vcloud.director.v1_5.features.admin.UserAsyncApi;
-import org.jclouds.vcloud.director.v1_5.handlers.InvalidateSessionAndRetryOn401AndLogoutOnClose;
-import org.jclouds.vcloud.director.v1_5.handlers.VCloudDirectorErrorHandler;
-import org.jclouds.vcloud.director.v1_5.loaders.LoginUserInOrgWithPassword;
-import org.jclouds.vcloud.director.v1_5.loaders.ResolveEntity;
-import org.jclouds.vcloud.director.v1_5.login.SessionApi;
-import org.jclouds.vcloud.director.v1_5.login.SessionAsyncApi;
-import org.jclouds.vcloud.director.v1_5.user.VCloudDirectorApi;
-import org.jclouds.vcloud.director.v1_5.user.VCloudDirectorAsyncApi;
-
-import com.google.common.base.Function;
-import com.google.common.base.Supplier;
-import com.google.common.base.Suppliers;
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.LoadingCache;
-import com.google.common.collect.ImmutableMap;
-import com.google.inject.Provides;
-import com.google.inject.Singleton;
-import com.google.inject.TypeLiteral;
-import com.google.inject.name.Named;
-
-/**
- * Configures the cloudstack connection.
- */
-@ConfiguresRestClient
-public class VCloudDirectorRestClientModule extends RestClientModule<VCloudDirectorApi, VCloudDirectorAsyncApi> {
-   
-   public static final Map<Class<?>, Class<?>> USER_DELEGATE_MAP = ImmutableMap.<Class<?>, Class<?>>builder()
-         .put(CatalogApi.class, CatalogAsyncApi.class)
-         .put(MediaApi.class, MediaAsyncApi.class)
-         .put(MetadataApi.class, MetadataAsyncApi.class)
-         .put(NetworkApi.class, NetworkAsyncApi.class)
-         .put(OrgApi.class, OrgAsyncApi.class)
-         .put(QueryApi.class, QueryAsyncApi.class)
-         .put(TaskApi.class, TaskAsyncApi.class)
-         .put(UploadApi.class, UploadAsyncApi.class)
-         .put(VAppApi.class, VAppAsyncApi.class)
-         .put(VAppTemplateApi.class, VAppTemplateAsyncApi.class)
-         .put(VdcApi.class, VdcAsyncApi.class)
-         .put(VmApi.class, VmAsyncApi.class)
-         .build();
-   
-   public static final Map<Class<?>, Class<?>> ADMIN_DELEGATE_MAP = ImmutableMap.<Class<?>, Class<?>>builder()
-         .putAll(USER_DELEGATE_MAP)
-         .put(AdminCatalogApi.class, AdminCatalogAsyncApi.class)
-         .put(AdminNetworkApi.class, AdminNetworkAsyncApi.class)
-         .put(AdminOrgApi.class, AdminOrgAsyncApi.class)
-         .put(AdminQueryApi.class, AdminQueryAsyncApi.class)
-         .put(AdminVdcApi.class, AdminVdcAsyncApi.class)
-         .put(GroupApi.class, GroupAsyncApi.class)
-         .put(UserApi.class, UserAsyncApi.class)
-         .build();
-   
-   public VCloudDirectorRestClientModule() {
-      super(ADMIN_DELEGATE_MAP);
-   }
-   
-   @Override
-   protected void configure() {
-      bind(new TypeLiteral<RestContext<VCloudDirectorAdminApi, VCloudDirectorAdminAsyncApi>>() {
-      }).to(new TypeLiteral<RestContextImpl<VCloudDirectorAdminApi, VCloudDirectorAdminAsyncApi>>() {
-      });
-      
-      // Bind apis that are used directly in Functions, Predicates and other circumstances
-      bindSyncToAsyncHttpApi(binder(), OrgApi.class, OrgAsyncApi.class);
-      bindSyncToAsyncHttpApi(binder(), SessionApi.class, SessionAsyncApi.class);
-      bindSyncToAsyncHttpApi(binder(), TaskApi.class, TaskAsyncApi.class);
-      bindSyncToAsyncHttpApi(binder(), VAppApi.class, VAppAsyncApi.class);
-      bindSyncToAsyncHttpApi(binder(), VmApi.class, VmAsyncApi.class);
-      
-      bind(HttpRetryHandler.class).annotatedWith(ClientError.class).to(InvalidateSessionAndRetryOn401AndLogoutOnClose.class);
-      
-      super.configure();
-      bindSyncToAsyncHttpApi(binder(),  VCloudDirectorAdminApi.class, VCloudDirectorAdminAsyncApi.class);
-
-   }
-   
-   @Override
-   protected void bindErrorHandlers() {
-      bind(HttpErrorHandler.class).annotatedWith(Redirection.class).to(VCloudDirectorErrorHandler.class);
-      bind(HttpErrorHandler.class).annotatedWith(ClientError.class).to(VCloudDirectorErrorHandler.class);
-      bind(HttpErrorHandler.class).annotatedWith(ServerError.class).to(VCloudDirectorErrorHandler.class);
-   }
-   
-   @Provides
-   @Login
-   protected Supplier<URI> loginUrl(@Provider Supplier<URI> provider) {
-      // TODO: technically, we should implement version api, but this will work
-      return Suppliers.compose(new Function<URI, URI>() {
-         
-         @Override
-         public URI apply(URI arg0) {
-            return URI.create(arg0.toASCIIString() + "/sessions");
-         }
-         
-      }, provider);
-   }
-   
-   @Provides
-   protected Supplier<Session> currentSession(Supplier<SessionWithToken> in) {
-      return Suppliers.compose(new Function<SessionWithToken, Session>() {
-         
-         @Override
-         public Session apply(SessionWithToken arg0) {
-            return arg0.getSession();
-         }
-         
-      }, in);
-      
-   }
-   
-   @Provides
-   @Singleton
-   @org.jclouds.vcloud.director.v1_5.annotations.Session
-   protected Supplier<String> sessionToken(Supplier<SessionWithToken> in) {
-      return Suppliers.compose(new Function<SessionWithToken, String>() {
-         
-         @Override
-         public String apply(SessionWithToken arg0) {
-            return arg0.getToken();
-         }
-         
-      }, in);
-      
-   }
-
-   @Provides
-   @Singleton
-   LoadingCache<String, Entity> resolveEntityCache(ResolveEntity loader, @Named(PROPERTY_SESSION_INTERVAL) int seconds) {
-      return CacheBuilder.newBuilder().expireAfterWrite(seconds, TimeUnit.SECONDS).build(loader);
-   }
-
-   @Provides
-   @Singleton
-   LoadingCache<Credentials, SessionWithToken> provideSessionWithTokenCache(LoginUserInOrgWithPassword loader,
-         @Named(PROPERTY_SESSION_INTERVAL) int seconds) {
-      return CacheBuilder.newBuilder().expireAfterWrite(seconds, TimeUnit.SECONDS).build(loader);
-   }
-   
-   // Temporary conversion of a cache to a supplier until there is a single-element cache
-   // http://code.google.com/p/guava-libraries/issues/detail?id=872
-   @Provides
-   @Singleton
-   protected Supplier<SessionWithToken> provideSessionWithTokenSupplier(
-         final LoadingCache<Credentials, SessionWithToken> cache, @Provider final Supplier<Credentials> creds) {
-      return new Supplier<SessionWithToken>() {
-         @Override
-         public SessionWithToken get() {
-            return cache.getUnchecked(creds.get());
-         }
-      };
-   }
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d7bc430c/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/CatalogApi.java
----------------------------------------------------------------------
diff --git a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/CatalogApi.java b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/CatalogApi.java
index 9dfe1d7..004193c 100644
--- a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/CatalogApi.java
+++ b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/CatalogApi.java
@@ -16,16 +16,31 @@
  */
 package org.jclouds.vcloud.director.v1_5.features;
 
+import static org.jclouds.Fallbacks.NullOnNotFoundOr404;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.CATALOG_ITEM;
+
 import java.net.URI;
 
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+
+import org.jclouds.rest.annotations.BinderParam;
+import org.jclouds.rest.annotations.EndpointParam;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.JAXBResponseParser;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.binders.BindToXMLPayload;
 import org.jclouds.vcloud.director.v1_5.domain.Catalog;
 import org.jclouds.vcloud.director.v1_5.domain.CatalogItem;
+import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
+import org.jclouds.vcloud.director.v1_5.functions.URNToHref;
 
-/**
- * Provides synchronous access to {@link Catalog} objects.
- * 
- * @see CatalogAsyncApi
- */
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface CatalogApi {
 
    /**
@@ -35,13 +50,21 @@ public interface CatalogApi {
     * GET /catalog/{id}
     * </pre>
     * 
-    * @param catalogUri
+    * @param catalogUrn
     *           the reference for the catalog
     * @return a catalog
     */
-   Catalog get(String catalogUrn);
+   @GET
+   @Consumes
+   @JAXBResponseParser
+   @Fallback(NullOnNotFoundOr404.class)
+   Catalog get(@EndpointParam(parser = URNToHref.class) String catalogUrn);
 
-   Catalog get(URI catalogHref);
+   @GET
+   @Consumes
+   @JAXBResponseParser
+   @Fallback(NullOnNotFoundOr404.class)
+   Catalog get(@EndpointParam URI catalogHref);
 
    /**
     * Creates a catalog item in a catalog.
@@ -50,15 +73,26 @@ public interface CatalogApi {
     * POST /catalog/{id}/catalogItems
     * </pre>
     * 
-    * @param catalogUri
+    * @param catalogUrn
     *           the URI of the catalog
-    * @param item
+    * @param catalogItem
     *           the catalog item to add
-    * @return the addd catalog item
+    * @return the added catalog item
     */
-   CatalogItem addItem(String catalogUrn, CatalogItem item);
+   @POST
+   @Path("/catalogItems")
+   @Consumes(CATALOG_ITEM)
+   @Produces(CATALOG_ITEM)
+   @JAXBResponseParser
+   CatalogItem addItem(@EndpointParam(parser = URNToHref.class) String catalogUrn,
+         @BinderParam(BindToXMLPayload.class) CatalogItem catalogItem);
 
-   CatalogItem addItem(URI catalogHref, CatalogItem item);
+   @POST
+   @Path("/catalogItems")
+   @Consumes(CATALOG_ITEM)
+   @Produces(CATALOG_ITEM)
+   @JAXBResponseParser
+   CatalogItem addItem(@EndpointParam URI catalogHref, @BinderParam(BindToXMLPayload.class) CatalogItem catalogItem);
 
    /**
     * Retrieves a catalog item.
@@ -67,13 +101,21 @@ public interface CatalogApi {
     * GET /catalogItem/{id}
     * </pre>
     * 
-    * @param catalogItemRef
+    * @param catalogItemUrn
     *           the reference for the catalog item
     * @return the catalog item
     */
-   CatalogItem getItem(String catalogItemUrn);
+   @GET
+   @Consumes
+   @JAXBResponseParser
+   @Fallback(NullOnNotFoundOr404.class)
+   CatalogItem getItem(@EndpointParam(parser = URNToHref.class) String catalogItemUrn);
 
-   CatalogItem getItem(URI catalogItemHref);
+   @GET
+   @Consumes
+   @JAXBResponseParser
+   @Fallback(NullOnNotFoundOr404.class)
+   CatalogItem getItem(@EndpointParam URI catalogItemHref);
 
    /**
     * Modifies a catalog item.
@@ -82,15 +124,25 @@ public interface CatalogApi {
     * PUT /catalogItem/{id}
     * </pre>
     * 
-    * @param catalogItemRef
+    * @param catalogItemUrn
     *           the reference for the catalog item
     * @param catalogItem
     *           the catalog item
     * @return the edited catalog item
     */
-   CatalogItem editItem(String catalogItemUrn, CatalogItem catalogItem);
+   @PUT
+   @Consumes(CATALOG_ITEM)
+   @Produces(CATALOG_ITEM)
+   @JAXBResponseParser
+   CatalogItem editItem(@EndpointParam(parser = URNToHref.class) String catalogItemUrn,
+         @BinderParam(BindToXMLPayload.class) CatalogItem catalogItem);
 
-   CatalogItem editItem(URI catalogItemHref, CatalogItem catalogItem);
+   @PUT
+   @Consumes(CATALOG_ITEM)
+   @Produces(CATALOG_ITEM)
+   @JAXBResponseParser
+   CatalogItem editItem(@EndpointParam URI catalogItemHref,
+         @BinderParam(BindToXMLPayload.class) CatalogItem catalogItem);
 
    /**
     * Deletes a catalog item.
@@ -99,10 +151,16 @@ public interface CatalogApi {
     * DELETE /catalogItem/{id}
     * </pre>
     * 
-    * @param catalogItemRef
+    * @param catalogItemUrn
     *           the reference for the catalog item
     */
-   void removeItem(String catalogItemUrn);
+   @DELETE
+   @Consumes
+   @JAXBResponseParser
+   void removeItem(@EndpointParam(parser = URNToHref.class) String catalogItemUrn);
 
-   void removeItem(URI catalogItemHref);
+   @DELETE
+   @Consumes
+   @JAXBResponseParser
+   void removeItem(@EndpointParam URI catalogItemHref);
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d7bc430c/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/CatalogAsyncApi.java
----------------------------------------------------------------------
diff --git a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/CatalogAsyncApi.java b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/CatalogAsyncApi.java
deleted file mode 100644
index 5f518a3..0000000
--- a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/CatalogAsyncApi.java
+++ /dev/null
@@ -1,143 +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.vcloud.director.v1_5.features;
-
-import java.net.URI;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-
-import org.jclouds.Fallbacks.NullOnNotFoundOr404;
-import org.jclouds.rest.annotations.BinderParam;
-import org.jclouds.rest.annotations.EndpointParam;
-import org.jclouds.rest.annotations.Fallback;
-import org.jclouds.rest.annotations.JAXBResponseParser;
-import org.jclouds.rest.annotations.RequestFilters;
-import org.jclouds.rest.binders.BindToXMLPayload;
-import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
-import org.jclouds.vcloud.director.v1_5.domain.Catalog;
-import org.jclouds.vcloud.director.v1_5.domain.CatalogItem;
-import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
-import org.jclouds.vcloud.director.v1_5.functions.URNToHref;
-
-import com.google.common.util.concurrent.ListenableFuture;
-
-/**
- * @see CatalogApi
- */
-@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
-public interface CatalogAsyncApi {
-
-   /**
-    * @see CatalogApi#get(String)
-    */
-   @GET
-   @Consumes
-   @JAXBResponseParser
-   @Fallback(NullOnNotFoundOr404.class)
-   ListenableFuture<? extends Catalog> get(@EndpointParam(parser = URNToHref.class) String catalogUrn);
-
-   /**
-    * @see CatalogApi#addItem(String, CatalogItem)
-    */
-   @POST
-   @Path("/catalogItems")
-   @Consumes(VCloudDirectorMediaType.CATALOG_ITEM)
-   @Produces(VCloudDirectorMediaType.CATALOG_ITEM)
-   @JAXBResponseParser
-   ListenableFuture<CatalogItem> addItem(@EndpointParam(parser = URNToHref.class) String catalogUrn,
-            @BinderParam(BindToXMLPayload.class) CatalogItem catalogItem);
-
-   /**
-    * @see CatalogApi#getItem(String)
-    */
-   @GET
-   @Consumes
-   @JAXBResponseParser
-   @Fallback(NullOnNotFoundOr404.class)
-   ListenableFuture<CatalogItem> getItem(@EndpointParam(parser = URNToHref.class) String catalogItemUrn);
-
-   /**
-    * @see CatalogApi#editItem(String, CatalogItem)
-    */
-   @PUT
-   @Consumes(VCloudDirectorMediaType.CATALOG_ITEM)
-   @Produces(VCloudDirectorMediaType.CATALOG_ITEM)
-   @JAXBResponseParser
-   ListenableFuture<CatalogItem> editItem(@EndpointParam(parser = URNToHref.class) String catalogItemUrn,
-            @BinderParam(BindToXMLPayload.class) CatalogItem catalogItem);
-
-   /**
-    * @see CatalogApi#removeItem(String)
-    */
-   @DELETE
-   @Consumes
-   @JAXBResponseParser
-   ListenableFuture<Void> removeItem(@EndpointParam(parser = URNToHref.class) String catalogItemUrn);
-
-   /**
-    * @see CatalogApi#get(URI)
-    */
-   @GET
-   @Consumes
-   @JAXBResponseParser
-   @Fallback(NullOnNotFoundOr404.class)
-   ListenableFuture<? extends Catalog> get(@EndpointParam URI catalogHref);
-
-   /**
-    * @see CatalogApi#addItem(URI, CatalogItem)
-    */
-   @POST
-   @Path("/catalogItems")
-   @Consumes(VCloudDirectorMediaType.CATALOG_ITEM)
-   @Produces(VCloudDirectorMediaType.CATALOG_ITEM)
-   @JAXBResponseParser
-   ListenableFuture<CatalogItem> addItem(@EndpointParam URI catalogHref,
-            @BinderParam(BindToXMLPayload.class) CatalogItem catalogItem);
-
-   /**
-    * @see CatalogApi#getItem(URI)
-    */
-   @GET
-   @Consumes
-   @JAXBResponseParser
-   @Fallback(NullOnNotFoundOr404.class)
-   ListenableFuture<CatalogItem> getItem(@EndpointParam URI catalogItemHref);
-
-   /**
-    * @see CatalogApi#editItem(URI, CatalogItem)
-    */
-   @PUT
-   @Consumes(VCloudDirectorMediaType.CATALOG_ITEM)
-   @Produces(VCloudDirectorMediaType.CATALOG_ITEM)
-   @JAXBResponseParser
-   ListenableFuture<CatalogItem> editItem(@EndpointParam URI catalogItemHref,
-            @BinderParam(BindToXMLPayload.class) CatalogItem catalogItem);
-
-   /**
-    * @see CatalogApi#removeItem(URI)
-    */
-   @DELETE
-   @Consumes
-   @JAXBResponseParser
-   ListenableFuture<Void> removeItem(@EndpointParam URI catalogItemHref);
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d7bc430c/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaApi.java
----------------------------------------------------------------------
diff --git a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaApi.java b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaApi.java
index 8d70c63..a8a3c0c 100644
--- a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaApi.java
+++ b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaApi.java
@@ -16,18 +16,35 @@
  */
 package org.jclouds.vcloud.director.v1_5.features;
 
+import static org.jclouds.Fallbacks.NullOnNotFoundOr404;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.CLONE_MEDIA_PARAMS;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.MEDIA;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.TASK;
+
 import java.net.URI;
 
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+
+import org.jclouds.rest.annotations.BinderParam;
+import org.jclouds.rest.annotations.EndpointParam;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.JAXBResponseParser;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.binders.BindToXMLPayload;
 import org.jclouds.vcloud.director.v1_5.domain.Media;
 import org.jclouds.vcloud.director.v1_5.domain.Owner;
 import org.jclouds.vcloud.director.v1_5.domain.Task;
 import org.jclouds.vcloud.director.v1_5.domain.params.CloneMediaParams;
+import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
+import org.jclouds.vcloud.director.v1_5.functions.URNToHref;
 
-/**
- * Provides synchronous access to {@link Media}.
- * 
- * @see MediaAsyncApi
- */
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface MediaApi {
 
    /**
@@ -35,9 +52,17 @@ public interface MediaApi {
     * 
     * @return the media or null if not found
     */
-   Media get(String mediaUrn);
+   @GET
+   @Consumes
+   @JAXBResponseParser
+   @Fallback(NullOnNotFoundOr404.class)
+   Media get(@EndpointParam(parser = URNToHref.class) String mediaUrn);
 
-   Media get(URI mediaHref);
+   @GET
+   @Consumes
+   @JAXBResponseParser
+   @Fallback(NullOnNotFoundOr404.class)
+   Media get(@EndpointParam URI mediaHref);
 
    /**
     * Creates a media (and present upload link for the floppy/iso file).
@@ -45,18 +70,19 @@ public interface MediaApi {
     * @return The response will return a link to transfer site to be able to continue with uploading
     *         the media.
     */
-   Media add(URI uploadHref, Media media);
-
-   /**
-    * Clones a media into new one. The status of the returned media is UNRESOLVED(0) until the task
-    * for cloning finish.
-    * 
-    * @return a Media resource which will contain a task. The user should monitor the contained task
-    *         status in order to check when it is completed.
-    */
-   Media clone(String mediaUrn, CloneMediaParams params);
+   @POST
+   @Consumes(MEDIA)
+   @Produces(MEDIA)
+   @JAXBResponseParser
+   Media add(@EndpointParam URI updateHref, @BinderParam(BindToXMLPayload.class) Media media);
 
-   Media clone(URI mediaHref, CloneMediaParams params);
+   @POST
+   @Path("/action/cloneMedia")
+   @Consumes(MEDIA)
+   @Produces(CLONE_MEDIA_PARAMS)
+   @JAXBResponseParser
+   Media clone(@EndpointParam URI mediaHref,
+         @BinderParam(BindToXMLPayload.class) CloneMediaParams params);
 
    /**
     * Updates the name/description of a media.
@@ -64,23 +90,48 @@ public interface MediaApi {
     * @return a task. This operation is asynchronous and the user should monitor the returned task
     *         status in order to check when it is completed.
     */
-   Task edit(String mediaUrn, Media media);
+   @PUT
+   @Consumes(TASK)
+   @Produces(MEDIA)
+   @JAXBResponseParser
+   Task edit(@EndpointParam(parser = URNToHref.class) String mediaUrn,
+         @BinderParam(BindToXMLPayload.class) Media media);
 
-   Task edit(URI mediaHref, Media media);
+   @PUT
+   @Consumes(TASK)
+   @Produces(MEDIA)
+   @JAXBResponseParser
+   Task edit(@EndpointParam URI mediaHref, @BinderParam(BindToXMLPayload.class) Media media);
 
    /**
     * Deletes a media.
     */
-   Task remove(String mediaUrn);
+   @DELETE
+   @Consumes(TASK)
+   @JAXBResponseParser
+   Task remove(@EndpointParam(parser = URNToHref.class) String mediaUrn);
 
-   Task remove(URI mediaHref);
+   @DELETE
+   @Consumes(TASK)
+   @JAXBResponseParser
+   Task remove(@EndpointParam URI mediaHref);
 
    /**
     * Retrieves an owner.
     * 
     * @return the owner or null if not found
     */
-   Owner getOwner(String mediaUrn);
+   @GET
+   @Path("/owner")
+   @Consumes
+   @JAXBResponseParser
+   @Fallback(NullOnNotFoundOr404.class)
+   Owner getOwner(@EndpointParam(parser = URNToHref.class) String mediaUrn);
 
-   Owner getOwner(URI mediaHref);
+   @GET
+   @Path("/owner")
+   @Consumes
+   @JAXBResponseParser
+   @Fallback(NullOnNotFoundOr404.class)
+   Owner getOwner(@EndpointParam URI mediaHref);
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d7bc430c/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaAsyncApi.java
----------------------------------------------------------------------
diff --git a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaAsyncApi.java b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaAsyncApi.java
deleted file mode 100644
index 987e3e9..0000000
--- a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaAsyncApi.java
+++ /dev/null
@@ -1,155 +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.vcloud.director.v1_5.features;
-
-import java.net.URI;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-
-import org.jclouds.Fallbacks.NullOnNotFoundOr404;
-import org.jclouds.rest.annotations.BinderParam;
-import org.jclouds.rest.annotations.EndpointParam;
-import org.jclouds.rest.annotations.Fallback;
-import org.jclouds.rest.annotations.JAXBResponseParser;
-import org.jclouds.rest.annotations.RequestFilters;
-import org.jclouds.rest.binders.BindToXMLPayload;
-import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
-import org.jclouds.vcloud.director.v1_5.domain.Media;
-import org.jclouds.vcloud.director.v1_5.domain.Owner;
-import org.jclouds.vcloud.director.v1_5.domain.Task;
-import org.jclouds.vcloud.director.v1_5.domain.params.CloneMediaParams;
-import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
-import org.jclouds.vcloud.director.v1_5.functions.URNToHref;
-
-import com.google.common.util.concurrent.ListenableFuture;
-
-/**
- * @see MediaApi
- */
-@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
-public interface MediaAsyncApi {
-
-   /**
-    * @see MediaApi#get(String)
-    */
-   @GET
-   @Consumes
-   @JAXBResponseParser
-   @Fallback(NullOnNotFoundOr404.class)
-   ListenableFuture<Media> get(@EndpointParam(parser = URNToHref.class) String mediaUrn);
-
-   /**
-    * @see MediaApi#add(URI, Media)
-    */
-   @POST
-   @Consumes(VCloudDirectorMediaType.MEDIA)
-   @Produces(VCloudDirectorMediaType.MEDIA)
-   @JAXBResponseParser
-   ListenableFuture<Media> add(@EndpointParam URI updateHref, @BinderParam(BindToXMLPayload.class) Media media);
-
-   /**
-    * @see MediaApi#clone(String, CloneMediaParams)
-    */
-   @POST
-   @Path("/action/cloneMedia")
-   @Consumes(VCloudDirectorMediaType.MEDIA)
-   @Produces(VCloudDirectorMediaType.CLONE_MEDIA_PARAMS)
-   @JAXBResponseParser
-   ListenableFuture<Media> clone(@EndpointParam(parser = URNToHref.class) String mediaUrn,
-            @BinderParam(BindToXMLPayload.class) CloneMediaParams params);
-
-   /**
-    * @see MediaApi#editMedia(String, Media)
-    */
-   @PUT
-   @Consumes(VCloudDirectorMediaType.TASK)
-   @Produces(VCloudDirectorMediaType.MEDIA)
-   @JAXBResponseParser
-   ListenableFuture<Task> edit(@EndpointParam(parser = URNToHref.class) String mediaUrn,
-            @BinderParam(BindToXMLPayload.class) Media media);
-
-   /**
-    * @see MediaApi#removeMedia(String)
-    */
-   @DELETE
-   @Consumes(VCloudDirectorMediaType.TASK)
-   @JAXBResponseParser
-   ListenableFuture<Task> remove(@EndpointParam(parser = URNToHref.class) String mediaUrn);
-
-   /**
-    * @see MediaApi#getOwner(String)
-    */
-   @GET
-   @Path("/owner")
-   @Consumes
-   @JAXBResponseParser
-   @Fallback(NullOnNotFoundOr404.class)
-   ListenableFuture<Owner> getOwner(@EndpointParam(parser = URNToHref.class) String mediaUrn);
-
-   /**
-    * @see MediaApi#get(URI)
-    */
-   @GET
-   @Consumes
-   @JAXBResponseParser
-   @Fallback(NullOnNotFoundOr404.class)
-   ListenableFuture<Media> get(@EndpointParam URI mediaHref);
-
-   /**
-    * @see MediaApi#clone(URI, CloneMediaParams)
-    */
-   @POST
-   @Path("/action/cloneMedia")
-   @Consumes(VCloudDirectorMediaType.MEDIA)
-   @Produces(VCloudDirectorMediaType.CLONE_MEDIA_PARAMS)
-   @JAXBResponseParser
-   ListenableFuture<Media> clone(@EndpointParam URI mediaHref,
-            @BinderParam(BindToXMLPayload.class) CloneMediaParams params);
-
-   /**
-    * @see MediaApi#editMedia(URI, Media)
-    */
-   @PUT
-   @Consumes(VCloudDirectorMediaType.TASK)
-   @Produces(VCloudDirectorMediaType.MEDIA)
-   @JAXBResponseParser
-   ListenableFuture<Task> edit(@EndpointParam URI mediaHref, @BinderParam(BindToXMLPayload.class) Media media);
-
-   /**
-    * @see MediaApi#removeMedia(URI)
-    */
-   @DELETE
-   @Consumes(VCloudDirectorMediaType.TASK)
-   @JAXBResponseParser
-   ListenableFuture<Task> remove(@EndpointParam URI mediaHref);
-
-   /**
-    * @see MediaApi#getOwner(URI)
-    */
-   @GET
-   @Path("/owner")
-   @Consumes
-   @JAXBResponseParser
-   @Fallback(NullOnNotFoundOr404.class)
-   ListenableFuture<Owner> getOwner(@EndpointParam URI mediaHref);
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d7bc430c/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MetadataApi.java
----------------------------------------------------------------------
diff --git a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MetadataApi.java b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MetadataApi.java
index 394d4c6..3a7896c 100644
--- a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MetadataApi.java
+++ b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MetadataApi.java
@@ -16,21 +16,46 @@
  */
 package org.jclouds.vcloud.director.v1_5.features;
 
+import static org.jclouds.Fallbacks.NullOnNotFoundOr404;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.METADATA;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.METADATA_VALUE;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.TASK;
+
 import java.util.Map;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.PUT;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+
+import org.jclouds.rest.annotations.BinderParam;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.JAXBResponseParser;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.ResponseParser;
+import org.jclouds.vcloud.director.v1_5.binders.BindMapAsMetadata;
+import org.jclouds.vcloud.director.v1_5.binders.BindStringAsMetadataValue;
 import org.jclouds.vcloud.director.v1_5.domain.Metadata;
 import org.jclouds.vcloud.director.v1_5.domain.Task;
+import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
+import org.jclouds.vcloud.director.v1_5.functions.RegexValueParser;
 
-/**
- * Provides synchronous access to {@link Metadata}.
- * 
- * @see MetadataAsyncApi
- */
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface MetadataApi {
    /**
     * Retrieves an list of metadata
     * 
     * @return a list of metadata
     */
+   @GET
+   @Path("/metadata")
+   @Consumes
+   @JAXBResponseParser
+   @Fallback(NullOnNotFoundOr404.class)
    Metadata get();
 
    /**
@@ -38,7 +63,12 @@ public interface MetadataApi {
     * 
     * @return the metadata value, or null if not found
     */
-   String get(String key);
+   @GET
+   @Path("/metadata/{key}")
+   @Consumes
+   @ResponseParser(RegexValueParser.class)
+   @Fallback(NullOnNotFoundOr404.class)
+   String get(@PathParam("key") String key);
 
    /**
     * Merges the metadata for a media with the information provided.
@@ -46,7 +76,12 @@ public interface MetadataApi {
     * @return a task. This operation is asynchronous and the user should monitor the returned task status in order to
     *         check when it is completed.
     */
-   Task putAll(Map<String, String> metadata);
+   @POST
+   @Path("/metadata")
+   @Consumes(TASK)
+   @Produces(METADATA)
+   @JAXBResponseParser
+   Task putAll(@BinderParam(BindMapAsMetadata.class) Map<String, String> metadata);
 
    /**
     * Sets the metadata for the particular key for the media to the value provided. Note: this will replace any existing
@@ -55,7 +90,12 @@ public interface MetadataApi {
     * @return a task. This operation is asynchronous and the user should monitor the returned task status in order to
     *         check when it is completed.
     */
-   Task put(String key, String value);
+   @PUT
+   @Path("/metadata/{key}")
+   @Consumes(TASK)
+   @Produces(METADATA_VALUE)
+   @JAXBResponseParser
+   Task put(@PathParam("key") String key, @BinderParam(BindStringAsMetadataValue.class) String metadataValue);
 
    /**
     * Deletes a metadata entry.
@@ -63,6 +103,9 @@ public interface MetadataApi {
     * @return a task. This operation is asynchronous and the user should monitor the returned task status in order to
     *         check when it is completed.
     */
-   Task remove(String key);
-
+   @DELETE
+   @Path("/metadata/{key}")
+   @Consumes(TASK)
+   @JAXBResponseParser
+   Task remove(@PathParam("key") String key);
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d7bc430c/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MetadataAsyncApi.java
----------------------------------------------------------------------
diff --git a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MetadataAsyncApi.java b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MetadataAsyncApi.java
deleted file mode 100644
index 4b5c7d9..0000000
--- a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MetadataAsyncApi.java
+++ /dev/null
@@ -1,102 +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.vcloud.director.v1_5.features;
-
-import java.util.Map;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-
-import org.jclouds.Fallbacks.NullOnNotFoundOr404;
-import org.jclouds.rest.annotations.BinderParam;
-import org.jclouds.rest.annotations.Fallback;
-import org.jclouds.rest.annotations.JAXBResponseParser;
-import org.jclouds.rest.annotations.RequestFilters;
-import org.jclouds.rest.annotations.ResponseParser;
-import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
-import org.jclouds.vcloud.director.v1_5.binders.BindMapAsMetadata;
-import org.jclouds.vcloud.director.v1_5.binders.BindStringAsMetadataValue;
-import org.jclouds.vcloud.director.v1_5.domain.Metadata;
-import org.jclouds.vcloud.director.v1_5.domain.Task;
-import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
-import org.jclouds.vcloud.director.v1_5.functions.RegexValueParser;
-
-import com.google.common.util.concurrent.ListenableFuture;
-
-/**
- * @see MetadataApi
- */
-@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
-public interface MetadataAsyncApi {
-
-   /**
-    * @see MetadataApi.Readable#get()
-    */
-   @GET
-   @Path("/metadata")
-   @Consumes
-   @JAXBResponseParser
-   @Fallback(NullOnNotFoundOr404.class)
-   ListenableFuture<Metadata> get();
-
-   /**
-    * @see MetadataApi.Readable#get(String)
-    */
-   @GET
-   @Path("/metadata/{key}")
-   @Consumes
-   @ResponseParser(RegexValueParser.class)
-   @Fallback(NullOnNotFoundOr404.class)
-   ListenableFuture<String> get(@PathParam("key") String key);
-
-   /**
-    * @see MetadataApi.Writable#putAll
-    */
-   @POST
-   @Path("/metadata")
-   @Consumes(VCloudDirectorMediaType.TASK)
-   @Produces(VCloudDirectorMediaType.METADATA)
-   @JAXBResponseParser
-   ListenableFuture<Task> putAll(@BinderParam(BindMapAsMetadata.class) Map<String, String> metadata);
-
-   /**
-    * @see MetadataApi#put
-    */
-   @PUT
-   @Path("/metadata/{key}")
-   @Consumes(VCloudDirectorMediaType.TASK)
-   @Produces(VCloudDirectorMediaType.METADATA_VALUE)
-   @JAXBResponseParser
-   ListenableFuture<Task> put(@PathParam("key") String key,
-         @BinderParam(BindStringAsMetadataValue.class) String metadataValue);
-
-   /**
-    * @see MetadataApi.Writable#remove
-    */
-   @DELETE
-   @Path("/metadata/{key}")
-   @Consumes(VCloudDirectorMediaType.TASK)
-   @JAXBResponseParser
-   ListenableFuture<Task> remove(@PathParam("key") String key);
-
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d7bc430c/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/NetworkApi.java
----------------------------------------------------------------------
diff --git a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/NetworkApi.java b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/NetworkApi.java
index 9a6c71d..116df53 100644
--- a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/NetworkApi.java
+++ b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/NetworkApi.java
@@ -16,15 +16,22 @@
  */
 package org.jclouds.vcloud.director.v1_5.features;
 
+import static org.jclouds.Fallbacks.NullOnNotFoundOr404;
+
 import java.net.URI;
 
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+
+import org.jclouds.rest.annotations.EndpointParam;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.JAXBResponseParser;
+import org.jclouds.rest.annotations.RequestFilters;
 import org.jclouds.vcloud.director.v1_5.domain.network.Network;
+import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
+import org.jclouds.vcloud.director.v1_5.functions.URNToHref;
 
-/**
- * Provides synchronous access to {@link Network}.
- * 
- * @see NetworkAsyncApi
- */
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface NetworkApi {
 
    /**
@@ -32,7 +39,15 @@ public interface NetworkApi {
     * 
     * @return the network or null if not found
     */
-   Network get(String networkUrn);
+   @GET
+   @Consumes
+   @JAXBResponseParser
+   @Fallback(NullOnNotFoundOr404.class)
+   Network get(@EndpointParam(parser = URNToHref.class) String networkUrn);
 
-   Network get(URI networkHref);
+   @GET
+   @Consumes
+   @JAXBResponseParser
+   @Fallback(NullOnNotFoundOr404.class)
+   Network get(@EndpointParam URI networkHref);
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d7bc430c/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/NetworkAsyncApi.java
----------------------------------------------------------------------
diff --git a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/NetworkAsyncApi.java b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/NetworkAsyncApi.java
deleted file mode 100644
index 997ff98..0000000
--- a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/NetworkAsyncApi.java
+++ /dev/null
@@ -1,58 +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.vcloud.director.v1_5.features;
-
-import java.net.URI;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-
-import org.jclouds.Fallbacks.NullOnNotFoundOr404;
-import org.jclouds.rest.annotations.EndpointParam;
-import org.jclouds.rest.annotations.Fallback;
-import org.jclouds.rest.annotations.JAXBResponseParser;
-import org.jclouds.rest.annotations.RequestFilters;
-import org.jclouds.vcloud.director.v1_5.domain.network.Network;
-import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
-import org.jclouds.vcloud.director.v1_5.functions.URNToHref;
-
-import com.google.common.util.concurrent.ListenableFuture;
-
-/**
- * @see NetworkApi
- */
-@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
-public interface NetworkAsyncApi {
-
-   /**
-    * @see NetworkApi#get(String)
-    */
-   @GET
-   @Consumes
-   @JAXBResponseParser
-   @Fallback(NullOnNotFoundOr404.class)
-   ListenableFuture<? extends Network> get(@EndpointParam(parser = URNToHref.class) String networkUrn);
-
-   /**
-    * @see NetworkApi#get(URI)
-    */
-   @GET
-   @Consumes
-   @JAXBResponseParser
-   @Fallback(NullOnNotFoundOr404.class)
-   ListenableFuture<? extends Network> get(@EndpointParam URI networkHref);
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d7bc430c/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgApi.java
----------------------------------------------------------------------
diff --git a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgApi.java b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgApi.java
index fc24805..54a7fab 100644
--- a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgApi.java
+++ b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgApi.java
@@ -16,16 +16,24 @@
  */
 package org.jclouds.vcloud.director.v1_5.features;
 
+import static org.jclouds.Fallbacks.NullOnNotFoundOr404;
+
 import java.net.URI;
 
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+
+import org.jclouds.rest.annotations.EndpointParam;
+import org.jclouds.rest.annotations.Fallback;
+import org.jclouds.rest.annotations.JAXBResponseParser;
+import org.jclouds.rest.annotations.RequestFilters;
 import org.jclouds.vcloud.director.v1_5.domain.org.Org;
 import org.jclouds.vcloud.director.v1_5.domain.org.OrgList;
+import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
+import org.jclouds.vcloud.director.v1_5.functions.URNToHref;
 
-/**
- * Provides synchronous access to {@link Org}.
- * 
- * @see OrgAsyncApi
- */
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface OrgApi {
 
    /**
@@ -37,6 +45,10 @@ public interface OrgApi {
     * 
     * @return a list of organizations
     */
+   @GET
+   @Path("/org/")
+   @Consumes
+   @JAXBResponseParser
    OrgList list();
 
    /**
@@ -48,7 +60,15 @@ public interface OrgApi {
     * 
     * @return the org or null if not found
     */
-   Org get(String orgUrn);
+   @GET
+   @Consumes
+   @JAXBResponseParser
+   @Fallback(NullOnNotFoundOr404.class)
+   Org get(@EndpointParam(parser = URNToHref.class) String orgUrn);
 
-   Org get(URI orgHref);
+   @GET
+   @Consumes
+   @JAXBResponseParser
+   @Fallback(NullOnNotFoundOr404.class)
+   Org get(@EndpointParam URI orgHref);
 }

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d7bc430c/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgAsyncApi.java
----------------------------------------------------------------------
diff --git a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgAsyncApi.java b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgAsyncApi.java
deleted file mode 100644
index 44d3ab9..0000000
--- a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgAsyncApi.java
+++ /dev/null
@@ -1,69 +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.vcloud.director.v1_5.features;
-
-import java.net.URI;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-
-import org.jclouds.Fallbacks.NullOnNotFoundOr404;
-import org.jclouds.rest.annotations.EndpointParam;
-import org.jclouds.rest.annotations.Fallback;
-import org.jclouds.rest.annotations.JAXBResponseParser;
-import org.jclouds.rest.annotations.RequestFilters;
-import org.jclouds.vcloud.director.v1_5.domain.org.Org;
-import org.jclouds.vcloud.director.v1_5.domain.org.OrgList;
-import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
-import org.jclouds.vcloud.director.v1_5.functions.URNToHref;
-
-import com.google.common.util.concurrent.ListenableFuture;
-
-/**
- * @see OrgApi
- */
-@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
-public interface OrgAsyncApi {
-
-   /**
-    * @see OrgApi#list()
-    */
-   @GET
-   @Path("/org/")
-   @Consumes
-   @JAXBResponseParser
-   ListenableFuture<OrgList> list();
-
-   /**
-    * @see OrgApi#get(String)
-    */
-   @GET
-   @Consumes
-   @JAXBResponseParser
-   @Fallback(NullOnNotFoundOr404.class)
-   ListenableFuture<? extends Org> get(@EndpointParam(parser = URNToHref.class) String orgUrn);
-
-   /**
-    * @see OrgApi#get(URI)
-    */
-   @GET
-   @Consumes
-   @JAXBResponseParser
-   @Fallback(NullOnNotFoundOr404.class)
-   ListenableFuture<? extends Org> get(@EndpointParam URI orgHref);
-}

http://git-wip-us.apache.org/repos/asf/jclouds-labs/blob/d7bc430c/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/QueryApi.java
----------------------------------------------------------------------
diff --git a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/QueryApi.java b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/QueryApi.java
index 0fb49c7..8c9ed91 100644
--- a/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/QueryApi.java
+++ b/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/QueryApi.java
@@ -16,28 +16,22 @@
  */
 package org.jclouds.vcloud.director.v1_5.features;
 
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.QueryParam;
+
+import org.jclouds.rest.annotations.JAXBResponseParser;
+import org.jclouds.rest.annotations.QueryParams;
+import org.jclouds.rest.annotations.RequestFilters;
 import org.jclouds.vcloud.director.v1_5.domain.query.CatalogReferences;
-import org.jclouds.vcloud.director.v1_5.domain.query.QueryList;
 import org.jclouds.vcloud.director.v1_5.domain.query.QueryResultRecords;
-import org.jclouds.vcloud.director.v1_5.domain.query.VAppReferences;
+import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
 
-/**
- * Provides synchronous access to the REST API query interface.
- * 
- * @see QueryAsyncApi
- */
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface QueryApi {
 
    // TODO Add a typed object for filter syntax, or at least a fluent builder
-   
-   /**
-    * REST API query {@link Link} list.
-    *
-    * <pre>
-    * GET /query
-    * </pre>
-    */
-   QueryList queryList();
 
    /**
     * Retrieves a list of entities by using REST API general QueryHandler.
@@ -49,18 +43,25 @@ public interface QueryApi {
     * <pre>
     * GET /query
     * </pre>
-    *
-    * @see #queryList()
-    * @see #query(String, String)
-    * @see #query(Integer, Integer, String, String, String)
     */
-   QueryResultRecords queryAll(String type);
-
-   /** @see #queryAll() */
-   QueryResultRecords query(String type, String filter);
-
-   /** @see #queryAll() */
-   QueryResultRecords query(Integer page, Integer pageSize, String format, String type, String filter);
+   @GET
+   @Path("/query")
+   @Consumes
+   @JAXBResponseParser
+   QueryResultRecords queryAll(@QueryParam("type") String type);
+
+   @GET
+   @Path("/query")
+   @Consumes
+   @JAXBResponseParser
+   QueryResultRecords query(@QueryParam("type") String type, @QueryParam("filter") String filter);
+
+   @GET
+   @Path("/query")
+   @Consumes
+   @JAXBResponseParser
+   QueryResultRecords query(@QueryParam("page") Integer page, @QueryParam("pageSize") Integer pageSize,
+         @QueryParam("format") String format, @QueryParam("type") String type, @QueryParam("filter") String filter);
 
    /**
     * Retrieves a list of {@link Catalog}s by using REST API general QueryHandler.
@@ -71,15 +72,12 @@ public interface QueryApi {
     *
     * @see #queryAll(String)
     */
+   @GET
+   @Path("/catalogs/query")
+   @Consumes
+   @JAXBResponseParser
    QueryResultRecords catalogsQueryAll();
 
-   /** @see #queryAll() */
-   QueryResultRecords catalogsQuery(String filter);
-
-   /** @see #queryAll() */
-   QueryResultRecords catalogsQuery(Integer page, Integer pageSize, String filter);
-
-
    /**
     * Retrieves a list of {@link CatalogReference}s by using REST API general QueryHandler.
     *
@@ -89,14 +87,13 @@ public interface QueryApi {
     *
     * @see #queryAll(String)
     */
+   @GET
+   @Path("/catalogs/query")
+   @Consumes
+   @QueryParams(keys = { "format" }, values = { "references" })
+   @JAXBResponseParser
    CatalogReferences catalogReferencesQueryAll();
 
-   /** @see #catalogReferencesQueryAll() */
-   CatalogReferences catalogReferencesQuery(String filter);
-
-   /** @see #catalogReferencesQueryAll() */
-   CatalogReferences catalogReferencesQuery(Integer page, Integer pageSize, String filter);
-
    /**
     * Retrieves a list of {@link VAppTemplate}s by using REST API general QueryHandler.
     *
@@ -106,10 +103,17 @@ public interface QueryApi {
     *
     * @see #queryAll(String)
     */
+   @GET
+   @Path("/vAppTemplates/query")
+   @Consumes
+   @JAXBResponseParser
    QueryResultRecords vAppTemplatesQueryAll();
 
-   /** @see #queryAll() */
-   QueryResultRecords vAppTemplatesQuery(String filter);
+   @GET
+   @Path("/vAppTemplates/query")
+   @Consumes
+   @JAXBResponseParser
+   QueryResultRecords vAppTemplatesQuery(@QueryParam("filter") String filter);
 
    /**
     * Retrieves a list of {@link VApp}s by using REST API general QueryHandler.
@@ -120,31 +124,17 @@ public interface QueryApi {
     *
     * @see #queryAll(String)
     */
+   @GET
+   @Path("/vApps/query")
+   @Consumes
+   @JAXBResponseParser
    QueryResultRecords vAppsQueryAll();
 
-   /** @see #queryAll() */
-   QueryResultRecords vAppsQuery(String filter);
-
-   /** @see #queryAll() */
-   QueryResultRecords vAppsQuery(Integer page, Integer pageSize, String filter);
-
-   /**
-    * Retrieves a list of {@link VAppReference}s by using REST API general QueryHandler.
-    *
-    * <pre>
-    * GET /vApps/query?format=references
-    * </pre>
-    *
-    * @see #queryAll(String)
-    */
-   /** @see #queryAll() */
-   VAppReferences vAppReferencesQueryAll();
-
-   /** @see #queryAll() */
-   VAppReferences vAppReferencesQuery(String filter);
-
-   /** @see #queryAll() */
-   VAppReferences vAppReferencesQuery(Integer page, Integer pageSize, String filter);
+   @GET
+   @Path("/vApps/query")
+   @Consumes
+   @JAXBResponseParser
+   QueryResultRecords vAppsQuery(@QueryParam("filter") String filter);
 
    /**
     * Retrieves a list of {@link Vm}s by using REST API general QueryHandler.
@@ -155,10 +145,17 @@ public interface QueryApi {
     *
     * @see #queryAll(String)
     */
+   @GET
+   @Path("/vms/query")
+   @Consumes
+   @JAXBResponseParser
    QueryResultRecords vmsQueryAll();
 
-   /** @see #queryAll() */
-   QueryResultRecords vmsQuery(String filter);
+   @GET
+   @Path("/vms/query")
+   @Consumes
+   @JAXBResponseParser
+   QueryResultRecords vmsQuery(@QueryParam("filter") String filter);
 
    /**
     * Retrieves a list of {@link Media}s by using REST API general QueryHandler.
@@ -169,9 +166,15 @@ public interface QueryApi {
     *
     * @see #queryAll(String)
     */
+   @GET
+   @Path("/mediaList/query")
+   @Consumes
+   @JAXBResponseParser
    QueryResultRecords mediaListQueryAll();
 
-   /** @see #queryAll() */
-   QueryResultRecords mediaListQuery(String filter);
-   
+   @GET
+   @Path("/mediaList/query")
+   @Consumes
+   @JAXBResponseParser
+   QueryResultRecords mediaListQuery(@QueryParam("filter") String filter);
 }