merged
diff --git a/.mailmap b/.mailmap
new file mode 100644
index 0000000..4f3840d
--- /dev/null
+++ b/.mailmap
@@ -0,0 +1,15 @@
+Adrian Cole <adrian.f.cole@3d8758e0-26b5-11de-8745-db77d3ebf521>
+Adrian Cole <acole@.eng.vmware.com>
+Alfredo Morresi <rainbowbreeze@gmx.com>
+Alfredo Morresi <rainbowbreeze@pc-alfredo.(none)>
+Andrea Turli <andrea@bigmac.local>
+Andrea Turli <andrea.turli@.dir.svc.accenture.com>
+Andrea Turli <Andrea_Turli@.dub.emea.dell.com>
+Andrea Turli <andrea.turli@gmail.com>
+Andrea Turli <toor@toor.(none)>
+Andrei Savu <asavu@apache.org>
+Antoni Batchelli <tbatchelli@acm.org>
+Ivan Meredith <ivan@ivan.net.nz@3d8758e0-26b5-11de-8745-db77d3ebf521>
+Seshu Pasam <github@pasam.com>
+Tibor Kiss <tibor.kiss@omixon.com>
+Vijay Kiran <mail@vijaykiran.com>
diff --git a/apis/atmos/src/main/java/org/jclouds/atmos/functions/ParseUserMetadataFromHeaders.java b/apis/atmos/src/main/java/org/jclouds/atmos/functions/ParseUserMetadataFromHeaders.java
index c726f2e..79d8886 100644
--- a/apis/atmos/src/main/java/org/jclouds/atmos/functions/ParseUserMetadataFromHeaders.java
+++ b/apis/atmos/src/main/java/org/jclouds/atmos/functions/ParseUserMetadataFromHeaders.java
@@ -30,7 +30,7 @@
 import org.jclouds.http.HttpResponse;
 
 import com.google.common.base.Function;
-import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
 import com.google.common.base.Splitter;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
@@ -42,23 +42,16 @@
  */
 @Singleton
 public class ParseUserMetadataFromHeaders implements Function<HttpResponse, UserMetadata> {
-   private static final Set<String> sysKeys = ImmutableSet.of("atime", "ctime", "gid", "itime", "mtime", "nlink",
+   private static final Set<String> SYS_KEYS = ImmutableSet.of(
+         "atime", "ctime", "gid", "itime", "mtime", "nlink",
          "policyname", "size", "uid", "content-md5", "objectid", "objname", "type");
-   private static final Predicate<String> filter = new Predicate<String>() {
-
-      @Override
-      public boolean apply(String arg0) {
-         return !sysKeys.contains(arg0);
-      }
-
-   };
 
    public UserMetadata apply(HttpResponse from) {
       checkNotNull(from, "http response");
 
       Map<String, String> meta = Maps.filterKeys(
             getMetaMap(checkNotNull(from.getFirstHeaderOrNull(AtmosHeaders.META), AtmosHeaders.META)),
-            filter);
+            Predicates.not(Predicates.in(SYS_KEYS)));
 
       Map<String, String> listableMeta = (from.getFirstHeaderOrNull(AtmosHeaders.LISTABLE_META) != null) ? getMetaMap(from
             .getFirstHeaderOrNull(AtmosHeaders.LISTABLE_META)) : ImmutableMap.<String, String> of();
diff --git a/apis/elasticstack/src/main/java/org/jclouds/elasticstack/compute/functions/ServerInfoToNodeMetadata.java b/apis/elasticstack/src/main/java/org/jclouds/elasticstack/compute/functions/ServerInfoToNodeMetadata.java
index 59d2658..887d0f3 100644
--- a/apis/elasticstack/src/main/java/org/jclouds/elasticstack/compute/functions/ServerInfoToNodeMetadata.java
+++ b/apis/elasticstack/src/main/java/org/jclouds/elasticstack/compute/functions/ServerInfoToNodeMetadata.java
@@ -20,7 +20,6 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -87,7 +86,6 @@
       this.getImageIdFromServer = checkNotNull(getImageIdFromServer, "getImageIdFromServer");
    }
 
-   @SuppressWarnings({ "unchecked", "rawtypes" })
    @Override
    public NodeMetadata apply(ServerInfo from) {
       NodeMetadataBuilder builder = new NodeMetadataBuilder();
@@ -105,7 +103,7 @@
       }
       builder.hardware(new HardwareBuilder().ids(from.getUuid()).hypervisor("kvm")
             .processors(ImmutableList.of(new Processor(1, from.getCpu()))).ram(from.getMem())
-            .volumes((List) ImmutableList.of(Iterables.transform(from.getDevices().values(), deviceToVolume))).build());
+            .volumes(Iterables.transform(from.getDevices().values(), deviceToVolume)).build());
       builder.status(serverStatusToNodeStatus.get(from.getStatus()));
       builder.publicAddresses(ImmutableSet.<String> of(from.getNics().get(0).getDhcp()));
       builder.privateAddresses(ImmutableSet.<String> of());
diff --git a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/KeystoneApi.java b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/KeystoneApi.java
index 0085f34..125b9ec 100644
--- a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/KeystoneApi.java
+++ b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/KeystoneApi.java
@@ -68,17 +68,17 @@
     * Provides synchronous access to Token features 
     */
    @Delegate
-   Optional<TokenApi> getTokenApi();
+   Optional<? extends TokenApi> getTokenApi();
 
    /** 
     * Provides synchronous access to User features 
     */
    @Delegate
-   Optional<UserApi> getUserApi();
+   Optional<? extends UserApi> getUserApi();
    
    /** 
     * Provides synchronous access to Tenant features 
     */
    @Delegate
-   Optional<TenantApi> getTenantApi();
+   Optional<? extends TenantApi> getTenantApi();
 }
diff --git a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/KeystoneAsyncApi.java b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/KeystoneAsyncApi.java
index 52ac90d..e751a40 100644
--- a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/KeystoneAsyncApi.java
+++ b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/KeystoneAsyncApi.java
@@ -71,17 +71,17 @@
     * @see KeystoneApi#getTokenApi()
     */
    @Delegate
-   Optional<TokenAsyncApi> getTokenApi();
+   Optional<? extends TokenAsyncApi> getTokenApi();
 
    /**
     * @see KeystoneApi#getUserApi()
     */
    @Delegate
-   Optional<UserAsyncApi> getUserApi();
+   Optional<? extends UserAsyncApi> getUserApi();
 
    /**
     * @see KeystoneApi#getTenantApi()
     */
    @Delegate
-   Optional<TenantAsyncApi> getTenantApi();
+   Optional<? extends TenantAsyncApi> getTenantApi();
 }
diff --git a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/KeystoneAuthenticationModule.java b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/KeystoneAuthenticationModule.java
index 9987e9b..e3861a5 100644
--- a/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/KeystoneAuthenticationModule.java
+++ b/apis/openstack-keystone/src/main/java/org/jclouds/openstack/keystone/v2_0/config/KeystoneAuthenticationModule.java
@@ -186,11 +186,11 @@
    }
 
    // TODO: what is the timeout of the session token? modify default accordingly
-   // PROPERTY_SESSION_INTERVAL is default to 60 seconds, but we have this here at 23 hours for now.
+   // PROPERTY_SESSION_INTERVAL is default to 60 seconds, but we have this here at 11 hours for now.
    @Provides
    @Singleton
    public LoadingCache<Credentials, Access> provideAccessCache(Function<Credentials, Access> getAccess) {
-      return CacheBuilder.newBuilder().expireAfterWrite(23, TimeUnit.HOURS).build(CacheLoader.from(getAccess));
+      return CacheBuilder.newBuilder().expireAfterWrite(11, TimeUnit.HOURS).build(CacheLoader.from(getAccess));
    }
 
    // Temporary conversion of a cache to a supplier until there is a single-element cache
diff --git a/compute/src/main/java/org/jclouds/compute/domain/internal/TemplateBuilderImpl.java b/compute/src/main/java/org/jclouds/compute/domain/internal/TemplateBuilderImpl.java
index bbf3fa8..886ce9d 100644
--- a/compute/src/main/java/org/jclouds/compute/domain/internal/TemplateBuilderImpl.java
+++ b/compute/src/main/java/org/jclouds/compute/domain/internal/TemplateBuilderImpl.java
@@ -1086,7 +1086,7 @@
 
    @Override
    public TemplateBuilder from(TemplateBuilderSpec spec) {
-      return spec.copyTo(this, options != null ? options : optionsProvider.get());
+      return spec.copyTo(this, options != null ? options : (options = optionsProvider.get()));
    }
 
    @Override
diff --git a/compute/src/test/java/org/jclouds/compute/domain/internal/TemplateBuilderImplTest.java b/compute/src/test/java/org/jclouds/compute/domain/internal/TemplateBuilderImplTest.java
index e7fa698..172a1f0 100644
--- a/compute/src/test/java/org/jclouds/compute/domain/internal/TemplateBuilderImplTest.java
+++ b/compute/src/test/java/org/jclouds/compute/domain/internal/TemplateBuilderImplTest.java
@@ -777,4 +777,60 @@
       assertEquals(template.getLocation().getId(), "us-east-2");
 
    }
+   
+
+
+   @Test
+   public void testFromSpecWithLoginUser() {
+
+      final Supplier<Set<? extends Location>> locations = Suppliers.<Set<? extends Location>> ofInstance(ImmutableSet
+            .<Location> of(region));
+      final Supplier<Set<? extends Image>> images = Suppliers.<Set<? extends Image>> ofInstance(ImmutableSet
+            .<Image> of(
+                  new ImageBuilder()
+                        .id("us-east-2/ami-ffff")
+                        .providerId("ami-ffff")
+                        .name("Ubuntu 11.04 x64")
+                        .description("Ubuntu 11.04 x64")
+                        .location(region2)
+                        .status(Status.AVAILABLE)
+                        .operatingSystem(
+                              OperatingSystem.builder().name("Ubuntu 11.04 x64").description("Ubuntu 11.04 x64")
+                                    .is64Bit(true).version("11.04").family(OsFamily.UBUNTU).build()).build()));
+
+      final Supplier<Set<? extends Hardware>> hardwares = Suppliers.<Set<? extends Hardware>> ofInstance(ImmutableSet
+            .<Hardware> of(
+                  new HardwareBuilder()
+                        .ids("m1.small").ram(512)
+                        .processors(ImmutableList.of(new Processor(1, 1.0)))
+                        .volumes(ImmutableList.<Volume> of(new VolumeImpl((float) 5, true, true))).build()));
+
+      final Provider<TemplateOptions> optionsProvider = new Provider<TemplateOptions>() {
+
+         @Override
+         public TemplateOptions get() {
+            return new TemplateOptions();
+         }
+
+      };
+      Provider<TemplateBuilder> templateBuilderProvider = new Provider<TemplateBuilder>() {
+
+         @Override
+         public TemplateBuilder get() {
+            return createTemplateBuilder(null, locations, images, hardwares, region, optionsProvider, this);
+         }
+
+      };
+
+      TemplateBuilder templateBuilder = templateBuilderProvider.get().from("hardwareId=m1.small,imageId=us-east-2/ami-ffff,loginUser=user:Password01,authenticateSudo=true");
+
+      assertEquals(templateBuilder.toString(), "{imageId=us-east-2/ami-ffff, hardwareId=m1.small}");
+
+      Template template = templateBuilder.build();
+      assertEquals(template.getLocation().getId(), "us-east-2");
+      assertEquals(template.getOptions().getLoginUser(), "user");
+      assertEquals(template.getOptions().getLoginPassword(), "Password01");
+      assertEquals(template.getOptions().getLoginPrivateKey(), null);
+      assertEquals(template.getOptions().shouldAuthenticateSudo(), Boolean.TRUE);
+   }
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java b/core/src/main/java/org/jclouds/functions/ToLowerCase.java
similarity index 73%
rename from labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java
rename to core/src/main/java/org/jclouds/functions/ToLowerCase.java
index 2575c00..4883769 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java
+++ b/core/src/main/java/org/jclouds/functions/ToLowerCase.java
@@ -1,4 +1,4 @@
-/*
+/**
  * Licensed to jclouds, Inc. (jclouds) under one or more
  * contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -16,24 +16,24 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jclouds.vcloud.director.v1_5.functions;
+package org.jclouds.functions;
 
-import java.net.URI;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 import javax.inject.Singleton;
 
-import org.jclouds.vcloud.director.v1_5.domain.Reference;
-
 import com.google.common.base.Function;
 
 /**
- * @author danikov
+ * @author Everett Toews
  */
 @Singleton
-public class ReferenceToEndpoint implements Function<Reference, URI> {
-   
-   @Override
-   public URI apply(Reference from) {
-      return from.getHref();
-   }
+public class ToLowerCase implements Function<String, String> {
+
+	@Override
+	public String apply(String input) {
+		checkNotNull(input, "input cannot be null");
+		return input.toLowerCase();
+	}
+
 }
diff --git a/core/src/main/java/org/jclouds/http/HttpMessage.java b/core/src/main/java/org/jclouds/http/HttpMessage.java
index b9cd845..5c1acb8 100644
--- a/core/src/main/java/org/jclouds/http/HttpMessage.java
+++ b/core/src/main/java/org/jclouds/http/HttpMessage.java
@@ -24,6 +24,7 @@
 import java.io.InputStream;
 import java.util.Collection;
 
+import org.jclouds.functions.ToLowerCase;
 import org.jclouds.http.internal.PayloadEnclosingImpl;
 import org.jclouds.io.Payload;
 import org.jclouds.io.Payloads;
@@ -190,8 +191,10 @@
     */
    public String getFirstHeaderOrNull(String string) {
       Collection<String> values = headers.get(string);
-      if (values.size() == 0)
-         values = headers.get(string.toLowerCase());
+      if (values.size() == 0) {
+         Multimap<String, String> lowerCaseHeaders = Multimaps2.transformKeys(getHeaders(), new ToLowerCase()); 
+         values = lowerCaseHeaders.get(string.toLowerCase());
+      }
       return (values.size() >= 1) ? values.iterator().next() : null;
    }
 
diff --git a/core/src/main/java/org/jclouds/rest/internal/RestAnnotationProcessor.java b/core/src/main/java/org/jclouds/rest/internal/RestAnnotationProcessor.java
index e8d4e9e..215821a 100644
--- a/core/src/main/java/org/jclouds/rest/internal/RestAnnotationProcessor.java
+++ b/core/src/main/java/org/jclouds/rest/internal/RestAnnotationProcessor.java
@@ -157,6 +157,7 @@
 import com.google.common.collect.LinkedListMultimap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Multimap;
+import com.google.common.collect.Multimaps;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
@@ -558,16 +559,12 @@
    }
 
    public static Multimap<String, String> filterOutContentHeaders(Multimap<String, String> headers) {
-      // TODO make a filter like {@link Maps.filterKeys} instead of this
-      ImmutableMultimap.Builder<String, String> headersBuilder = ImmutableMultimap.builder();
       // http message usually comes in as a null key header, let's filter it
       // out.
-      for (String header : Iterables.filter(headers.keySet(), Predicates.notNull())) {
-         if (!ContentMetadata.HTTP_HEADERS.contains(header)) {
-            headersBuilder.putAll(header, headers.get(header));
-         }
-      }
-      return headersBuilder.build();
+      return ImmutableMultimap.copyOf(Multimaps.filterKeys(headers,
+         Predicates.and(
+            Predicates.notNull(),
+            Predicates.not(Predicates.in(ContentMetadata.HTTP_HEADERS)))));
    }
 
    public static final String BOUNDARY = "--JCLOUDS--";
diff --git a/core/src/main/java/org/jclouds/util/Multimaps2.java b/core/src/main/java/org/jclouds/util/Multimaps2.java
index aaabbf8..5d82137 100644
--- a/core/src/main/java/org/jclouds/util/Multimaps2.java
+++ b/core/src/main/java/org/jclouds/util/Multimaps2.java
@@ -22,7 +22,9 @@
 
 import java.util.Map;
 import java.util.Set;
+import java.util.Map.Entry;
 
+import com.google.common.base.Function;
 import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableMultimap;
@@ -89,4 +91,28 @@
    public static <K, V> Multimap<K, V> withoutKeys(Multimap<K, V> fromMultimap, Set<K> keys) {
       return Multimaps.<K, V> filterKeys(fromMultimap, Predicates.not(Predicates.in(keys)));
    }
+   
+   /**
+    * change the keys but keep the values in-tact.
+    * 
+    * @param <K1>
+    *           input key type
+    * @param <K2>
+    *           output key type
+    * @param <V>
+    *           value type
+    * @param in
+    *           input map to transform
+    * @param fn
+    *           how to transform the values
+    * @return immutableMap with the new keys.
+    */
+   public static <K1, K2, V> Multimap<K2, V> transformKeys(Multimap<K1, V> in, Function<K1, K2> fn) {
+      checkNotNull(in, "input map");
+      checkNotNull(fn, "function");
+      Builder<K2, V> returnVal = ImmutableMultimap.builder();
+      for (Entry<K1, V> entry : in.entries())
+         returnVal.put(fn.apply(entry.getKey()), entry.getValue());
+      return returnVal.build();
+   }
 }
diff --git a/core/src/main/java/org/jclouds/xml/internal/JAXBParser.java b/core/src/main/java/org/jclouds/xml/internal/JAXBParser.java
index 341dc8c..2d89de9 100644
--- a/core/src/main/java/org/jclouds/xml/internal/JAXBParser.java
+++ b/core/src/main/java/org/jclouds/xml/internal/JAXBParser.java
@@ -43,14 +43,14 @@
  */
 @Singleton
 public class JAXBParser implements XMLParser {
-    
+
    /** Boolean indicating if the output must be pretty printed. */
    private Boolean prettyPrint;
-   
+
    @Inject
    public JAXBParser(@Named(Constants.PROPERTY_PRETTY_PRINT_PAYLOADS) String prettyPrint) {
-       super();
-       this.prettyPrint = Boolean.valueOf(prettyPrint);
+      super();
+      this.prettyPrint = Boolean.valueOf(prettyPrint);
    }
 
    @Override
@@ -81,7 +81,7 @@
          Unmarshaller unmarshaller = context.createUnmarshaller();
          return (T) unmarshaller.unmarshal(reader);
       } catch (Exception ex) {
-         throw new IOException("Could not unmarshall document", ex);
+         throw new IOException("Could not unmarshall document into type: " + type.getSimpleName() + "\n" + xml, ex);
       }
    }
 }
diff --git a/core/src/test/java/org/jclouds/util/Multimaps2Test.java b/core/src/test/java/org/jclouds/util/Multimaps2Test.java
new file mode 100644
index 0000000..101e360
--- /dev/null
+++ b/core/src/test/java/org/jclouds/util/Multimaps2Test.java
@@ -0,0 +1,41 @@
+/**
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  jclouds 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.util;
+
+import static org.testng.Assert.assertEquals;
+
+import org.jclouds.functions.ToLowerCase;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableMultimap;
+import com.google.common.collect.Multimap;
+
+/**
+ * @author Everett Toews
+ */
+@Test(groups = "unit")
+public class Multimaps2Test {
+	public void testTransformKeysToLowerCase() {
+		Multimap<String, String> map = ImmutableMultimap.of("oNe", "1", "TWO", "2", "three", "3", "Three", "3.0");
+		Multimap<String, String> expected = ImmutableMultimap.of("one", "1", "two", "2", "three", "3", "three", "3.0");
+		Multimap<String, String> transformed = Multimaps2.transformKeys(map, new ToLowerCase());
+		
+		assertEquals(transformed, expected);
+	}
+}
diff --git a/labs/openstack-quantum/src/main/java/org/jclouds/openstack/quantum/v1_0/domain/Network.java b/labs/openstack-quantum/src/main/java/org/jclouds/openstack/quantum/v1_0/domain/Network.java
index 7aaed3d..97da1eb 100644
--- a/labs/openstack-quantum/src/main/java/org/jclouds/openstack/quantum/v1_0/domain/Network.java
+++ b/labs/openstack-quantum/src/main/java/org/jclouds/openstack/quantum/v1_0/domain/Network.java
@@ -85,7 +85,7 @@
 
    @Override
    public int hashCode() {
-      return Objects.hashCode(name);
+      return Objects.hashCode(super.hashCode(), name);
    }
 
    @Override
diff --git a/labs/vcloud-director/pom.xml b/labs/vcloud-director/pom.xml
index 771379b..0971f57 100644
--- a/labs/vcloud-director/pom.xml
+++ b/labs/vcloud-director/pom.xml
@@ -39,13 +39,19 @@
     <test.vcloud-director.build-version>1.5.0.464915</test.vcloud-director.build-version>
     <test.vcloud-director.identity>FIXME_USERNAME_WHICH_MIGHT_BE_EMAIL@JClouds</test.vcloud-director.identity>
     <test.vcloud-director.credential>FIXME_PASSWORD</test.vcloud-director.credential>
-    <test.vcloud-director.template />
-    <test.vcloud-director.catalog-id />
-    <test.vcloud-director.media-id />
-    <test.vcloud-director.vapptemplate-id />
-    <test.vcloud-director.network-id />
-    <test.vcloud-director.vdc-id />
-    <test.vcloud-director.user-id />
+    <test.vcloud-director.template></test.vcloud-director.template>
+    <!-- URN format: ex. urn:vcloud:catalog:7212e451-76e1-4631-b2de-ba1dfd8080e4 -->
+    <test.vcloud-director.catalog-id></test.vcloud-director.catalog-id>
+    <!-- URN format: ex. urn:vcloud:media:7212e451-76e1-4631-b2de-ba1dfd8080e4 -->
+    <test.vcloud-director.media-id></test.vcloud-director.media-id>
+    <!-- URN format: ex. urn:vcloud:vapptemplate:7212e451-76e1-4631-b2de-ba1dfd8080e4 -->
+    <test.vcloud-director.vapptemplate-id></test.vcloud-director.vapptemplate-id>
+    <!-- URN format: ex. urn:vcloud:network:7212e451-76e1-4631-b2de-ba1dfd8080e4 -->
+    <test.vcloud-director.network-id></test.vcloud-director.network-id>
+    <!-- URN format: ex. urn:vcloud:vdc:7212e451-76e1-4631-b2de-ba1dfd8080e4 -->
+    <test.vcloud-director.vdc-id></test.vcloud-director.vdc-id>
+    <!-- URN format: ex. urn:vcloud:user:7212e451-76e1-4631-b2de-ba1dfd8080e4 -->
+    <test.vcloud-director.user-id></test.vcloud-director.user-id>
 
     <jclouds.osgi.export>org.jclouds.vcloud.director.v1_5*;version="${project.version}"</jclouds.osgi.export>
     <jclouds.osgi.import>
@@ -58,6 +64,11 @@
 
   <dependencies>
     <dependency>
+      <groupId>com.jamesmurty.utils</groupId>
+      <artifactId>java-xmlbuilder</artifactId>
+      <version>0.4</version>
+    </dependency>
+    <dependency>
       <groupId>org.jclouds</groupId>
       <artifactId>jclouds-compute</artifactId>
       <version>${project.version}</version>
@@ -89,7 +100,7 @@
     </dependency>
     <dependency>
       <groupId>org.jclouds.driver</groupId>
-      <artifactId>jclouds-log4j</artifactId>
+      <artifactId>jclouds-slf4j</artifactId>
       <version>${project.version}</version>
       <scope>test</scope>
     </dependency>
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorException.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorException.java
index cbb1120..b6aa1e1 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorException.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorException.java
@@ -40,6 +40,9 @@
    private final Error error;
    private final Task task;
 
+   // TODO: this type wipes out the http response, which often has the data needed to troubleshoot
+   // the issue
+   
    public VCloudDirectorException(Error error) {
       super(message(error, "Error"));
       this.error = error;
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorMediaType.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorMediaType.java
index d12ed4f..0047453 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorMediaType.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorMediaType.java
@@ -225,6 +225,6 @@
          TEXT_XML, ADMIN_VDC, NETWORK_POOL, ADMIN_ORG, ENTITY, ADMIN
       );
 
-   // NOTE These lists must be updated whenever a new media type constant is added.
+   // NOTE These lists must be edited whenever a new media type constant is added.
 
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/admin/VCloudDirectorAdminAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/admin/VCloudDirectorAdminAsyncApi.java
index fd56185..4df2d93 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/admin/VCloudDirectorAdminAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/admin/VCloudDirectorAdminAsyncApi.java
@@ -19,6 +19,8 @@
 package org.jclouds.vcloud.director.v1_5.admin;
 
 import org.jclouds.rest.annotations.Delegate;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.SkipEncoding;
 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;
@@ -26,6 +28,7 @@
 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.user.VCloudDirectorAsyncApi;
 
 /**
@@ -34,6 +37,8 @@
  * @see VCloudDirectorAdminApi
  * @author danikov
  */
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
+@SkipEncoding({ '-', ':' })
 public interface VCloudDirectorAdminAsyncApi extends VCloudDirectorAsyncApi {
    /**
     * @return asynchronous access to admin query features
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/config/VCloudDirectorRestClientModule.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/config/VCloudDirectorRestClientModule.java
index 7eae4e9..d57e0f2 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/config/VCloudDirectorRestClientModule.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/config/VCloudDirectorRestClientModule.java
@@ -41,56 +41,58 @@
 import org.jclouds.rest.config.RestClientModule;
 import org.jclouds.rest.internal.RestContextImpl;
 import org.jclouds.util.Suppliers2;
-import org.jclouds.vcloud.director.v1_5.admin.VCloudDirectorAdminAsyncApi;
 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.CatalogAsyncApi;
 import org.jclouds.vcloud.director.v1_5.features.CatalogApi;
-import org.jclouds.vcloud.director.v1_5.features.MediaAsyncApi;
+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.MetadataAsyncApi;
+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.NetworkAsyncApi;
+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.OrgAsyncApi;
+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.QueryAsyncApi;
+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.TaskAsyncApi;
+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.UploadAsyncApi;
+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.VAppAsyncApi;
+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.VAppTemplateAsyncApi;
+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.VdcAsyncApi;
+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.VmAsyncApi;
+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.admin.AdminCatalogAsyncApi;
+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.AdminNetworkAsyncApi;
+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.AdminOrgAsyncApi;
+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.AdminQueryAsyncApi;
+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.AdminVdcAsyncApi;
+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.GroupAsyncApi;
+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.UserAsyncApi;
+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.functions.LoginUserInOrgWithPassword;
+import org.jclouds.vcloud.director.v1_5.functions.href.ResolveEntity;
 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.login.SessionAsyncApi;
 import org.jclouds.vcloud.director.v1_5.login.SessionApi;
-import org.jclouds.vcloud.director.v1_5.user.VCloudDirectorAsyncApi;
+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;
@@ -227,6 +229,20 @@
    
    @Provides
    @Singleton
+   protected Function<String, Entity> makeSureResolveEntityRetriesOnTimeout(ResolveEntity resolveEntity) {
+      // we should retry on timeout exception logging in.
+      return new RetryOnTimeOutExceptionFunction<String, Entity>(resolveEntity);
+   }
+
+   @Provides
+   @Singleton
+   public LoadingCache<String, Entity> resolveEntityCache(Function<String, Entity> getEntity,
+            @Named(Constants.PROPERTY_SESSION_INTERVAL) int seconds) {
+      return CacheBuilder.newBuilder().expireAfterWrite(seconds, TimeUnit.SECONDS).build(CacheLoader.from(getEntity));
+   }
+
+   @Provides
+   @Singleton
    protected Function<Credentials, SessionWithToken> makeSureFilterRetriesOnTimeout(
          LoginUserInOrgWithPassword loginWithPasswordCredentials) {
       // we should retry on timeout exception logging in.
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CatalogReference.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CatalogReference.java
index 69b57d7..76904cc 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CatalogReference.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/CatalogReference.java
@@ -53,8 +53,8 @@
       super(builder);
    }
 
-   public CatalogReference(URI href, String id, String name, String type) {
-      super(href, id, name, type);
+   public CatalogReference(URI href, String name, String type) {
+      super(href, name, type);
    }
 
    protected CatalogReference() {
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Metadata.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Metadata.java
index bd020be..266cd2b 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Metadata.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Metadata.java
@@ -21,7 +21,8 @@
 import static com.google.common.base.Objects.equal;
 import static com.google.common.base.Preconditions.checkNotNull;
 
-import java.util.Collections;
+import java.util.Collection;
+import java.util.Map;
 import java.util.Set;
 
 import javax.xml.bind.annotation.XmlElement;
@@ -31,20 +32,22 @@
 
 import com.google.common.base.Objects;
 import com.google.common.base.Objects.ToStringHelper;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
 
 /**
  * Represents a set of metadata
  * <p/>
+ * 
  * <pre>
  * &lt;xs:complexType name="Metadata"&gt;
  * </pre>
- *
+ * 
  * @author danikov
  */
 @XmlRootElement(name = "Metadata")
-public class Metadata extends Resource {
+public class Metadata extends Resource implements Map<String, String> {
 
    public static final String MEDIA_TYPE = VCloudDirectorMediaType.METADATA;
 
@@ -59,7 +62,7 @@
 
    private static class ConcreteBuilder extends Builder<ConcreteBuilder> {
    }
-   
+
    public static abstract class Builder<B extends Builder<B>> extends Resource.Builder<B> {
 
       private Set<MetadataEntry> metadataEntries = Sets.newLinkedHashSet();
@@ -99,12 +102,19 @@
       this.metadataEntries = ImmutableSet.copyOf(builder.metadataEntries);
    }
 
-
    @XmlElement(name = "MetadataEntry")
    private Set<MetadataEntry> metadataEntries = Sets.newLinkedHashSet();
 
    public Set<MetadataEntry> getMetadataEntries() {
-      return Collections.unmodifiableSet(metadataEntries);
+      return ImmutableSet.copyOf(metadataEntries);
+   }
+
+   protected Map<String, String> toMap() {
+      ImmutableMap.Builder<String, String> builder = ImmutableMap.<String, String> builder();
+      for (MetadataEntry entry : metadataEntries) {
+         builder.put(entry.getKey(), entry.getValue());
+      }
+      return builder.build();
    }
 
    @Override
@@ -127,4 +137,64 @@
       return super.string().add("metadataEntries", metadataEntries);
    }
 
+   @Override
+   public void clear() {
+      throw new UnsupportedOperationException();
+   }
+
+   @Override
+   public boolean containsKey(Object arg0) {
+      return toMap().containsKey(arg0);
+   }
+
+   @Override
+   public boolean containsValue(Object arg0) {
+      return toMap().containsValue(arg0);
+   }
+
+   @Override
+   public Set<Map.Entry<String, String>> entrySet() {
+      return toMap().entrySet();
+   }
+
+   @Override
+   public String get(Object arg0) {
+      return toMap().get(arg0);
+   }
+
+   @Override
+   public boolean isEmpty() {
+      return getMetadataEntries().size() == 0;
+   }
+
+   @Override
+   public Set<String> keySet() {
+      return toMap().keySet();
+   }
+
+   @Override
+   public String put(String arg0, String arg1) {
+      throw new UnsupportedOperationException();
+   }
+
+   @Override
+   public void putAll(Map<? extends String, ? extends String> arg0) {
+      throw new UnsupportedOperationException();
+   }
+
+   @Override
+   public String remove(Object arg0) {
+      throw new UnsupportedOperationException();
+   }
+
+   @Override
+   public int size() {
+      return getMetadataEntries().size();
+   }
+
+   @Override
+   public Collection<String> values() {
+      return toMap().values();
+   }
+
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/MetadataEntry.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/MetadataEntry.java
index 0319146..bb93f43 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/MetadataEntry.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/MetadataEntry.java
@@ -42,6 +42,7 @@
  *
  * @author danikov
  */
+//TODO: this is a ridiculously complicated way of representing Map<String, String>
 @XmlRootElement(name = "MetadataEntry")
 public class MetadataEntry extends Resource {
 
@@ -136,7 +137,7 @@
 
    }
 
-   private MetadataEntry() {
+   MetadataEntry() {
       // for JAXB
    }
 
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Reference.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Reference.java
index ee81e06..ba80711 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Reference.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Reference.java
@@ -29,26 +29,24 @@
 import javax.xml.bind.annotation.XmlType;
 
 import org.jclouds.logging.Logger;
+import org.jclouds.vcloud.director.v1_5.user.VCloudDirectorApi;
 
 import com.google.common.base.Objects;
 import com.google.common.base.Objects.ToStringHelper;
 
 /**
  * A reference to a resource.
- *
+ * 
  * Contains an href attribute and optional name and type attributes.
  * <p>
+ * 
  * <pre>
  * &lt;xs:complexType name="ReferenceType"&gt;
  * </pre>
- *
+ * 
  * @author grkvlt@apache.org
  */
-@XmlSeeAlso({
-         VAppReference.class,
-         CatalogReference.class,
-         RoleReference.class
-})
+@XmlSeeAlso({ VAppReference.class, CatalogReference.class, RoleReference.class })
 @XmlRootElement(name = "Reference")
 @XmlType(name = "ReferenceType")
 public class Reference {
@@ -66,14 +64,13 @@
 
    private static class ConcreteBuilder extends Builder<ConcreteBuilder> {
    }
-   
+
    public static class Builder<B extends Builder<B>> {
 
       private URI href;
-      private String id;
       private String name;
       private String type;
-      
+
       @SuppressWarnings("unchecked")
       protected B self() {
          return (B) this;
@@ -88,14 +85,6 @@
       }
 
       /**
-       * @see Reference#getId()
-       */
-      public B id(String id) {
-         this.id = id;
-         return self();
-      }
-
-      /**
        * @see Reference#getType()
        */
       public B type(String type) {
@@ -116,37 +105,33 @@
       }
 
       public B fromReference(Reference in) {
-         return href(in.getHref()).id(in.getId()).name(in.getName()).type(in.getType());
+         return href(in.getHref()).name(in.getName()).type(in.getType());
       }
 
       public B fromEntity(Entity in) {
-         return href(in.getHref()).id(in.getId()).name(in.getName()).type(in.getType());
+         return href(in.getHref()).name(in.getName()).type(in.getType());
       }
-      
+
       protected B fromAttributes(Map<String, String> attributes) {
-         return href(URI.create(attributes.get("href"))).id(attributes.get("id")).name(attributes.get("name")).type(attributes.get("type"));
+         return href(URI.create(attributes.get("href"))).name(attributes.get("name")).type(attributes.get("type"));
       }
    }
 
    @XmlAttribute(required = true)
    private URI href;
    @XmlAttribute
-   private String id;
-   @XmlAttribute
    private String name;
    @XmlAttribute
    private String type;
 
    protected Reference(Builder<?> builder) {
       this.href = builder.href;
-      this.id = builder.id;
       this.name = builder.name;
       this.type = builder.type;
    }
 
-   protected Reference(URI href, String id, String name, String type) {
+   protected Reference(URI href, String name, String type) {
       this.href = href;
-      this.id = id;
       this.name = name;
       this.type = type;
    }
@@ -165,7 +150,7 @@
     * particular context. Although URLs have a well-known syntax and a well-understood
     * interpretation, a api should treat each href as an opaque string. The rules that govern how
     * the server constructs href strings might change in future releases.
-    *
+    * 
     * @return an opaque reference and should never be parsed
     */
    public URI getHref() {
@@ -173,21 +158,11 @@
    }
 
    /**
-    * The resource identifier, expressed in URN format.
-    * <p/>
-    * The value of this attribute uniquely identifies the resource, persists for the life of the
-    * resource, and is never reused.
-    */
-   public String getId() {
-      return id;
-   }
-
-   /**
     * Contains the name of the the entity.
     * <p/>
     * The object type, specified as a MIME content type, of the object that the link references.
     * This attribute is present only for links to objects. It is not present for links to actions.
-    *
+    * 
     * @return type definition, type, expressed as an HTTP Content-Type
     */
    public String getName() {
@@ -199,7 +174,7 @@
     * <p/>
     * The object type, specified as a MIME content type, of the object that the link references.
     * This attribute is present only for links to objects. It is not present for links to actions.
-    *
+    * 
     * @return type definition, type, expressed as an HTTP Content-Type
     */
    public String getType() {
@@ -213,12 +188,12 @@
       if (o == null || getClass() != o.getClass())
          return false;
       Reference that = Reference.class.cast(o);
-      return equal(this.href, that.href) && equal(this.id, that.id) && equal(this.name, that.name) && equal(this.type, that.type);
+      return equal(this.href, that.href) && equal(this.name, that.name) && equal(this.type, that.type);
    }
 
    @Override
    public int hashCode() {
-      return Objects.hashCode(href, id, name, type);
+      return Objects.hashCode(href, name, type);
    }
 
    @Override
@@ -227,13 +202,15 @@
    }
 
    protected ToStringHelper string() {
-      return Objects.toStringHelper("").add("href", href).add("id", id).add("name", name).add("type", type);
+      return Objects.toStringHelper("").add("href", href).add("name", name).add("type", type);
    }
-   
+
+   /**
+    * @see VCloudDirectorApi#resolveEntity
+    */
+   @Deprecated
    public Reference toAdminReference(String endpoint) {
-      return toBuilder()
-        .type(null)
-        .href(URI.create(getHref().toASCIIString().replace(endpoint, endpoint+"/admin")))
-        .build();
+      return toBuilder().type(null).href(URI.create(getHref().toASCIIString().replace(endpoint, endpoint + "/admin")))
+               .build();
    }
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/RoleReference.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/RoleReference.java
index 2a9e54a..f7850b6 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/RoleReference.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/RoleReference.java
@@ -53,8 +53,8 @@
       super(builder);
    }
 
-   public RoleReference(URI href, String id, String name, String type) {
-      super(href, id, name, type);
+   public RoleReference(URI href, String name, String type) {
+      super(href, name, type);
    }
 
    protected RoleReference() {
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Session.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Session.java
index 568c834..fcb93190 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Session.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Session.java
@@ -70,7 +70,7 @@
       }
 
       /**
-       * @see Session#getOrg()
+       * @see Session#get()
        */
       public Builder org(String org) {
          this.org = org;
@@ -106,7 +106,7 @@
       }
 
       public Builder fromSession(Session in) {
-         return user(in.getUser()).org(in.getOrg()).href(in.getHref()).links(in.getLinks());
+         return user(in.getUser()).org(in.get()).href(in.getHref()).links(in.getLinks());
       }
    }
 
@@ -144,7 +144,7 @@
    /**
     * @return is the name of an organization of which the user is a member
     */
-   public String getOrg() {
+   public String get() {
       return org;
    }
 
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Task.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Task.java
index 332a375..c734ab2 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Task.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/Task.java
@@ -138,7 +138,7 @@
       }
 
       /**
-       * @see Task#getOrg()
+       * @see Task#get()
        */
       public B org(Reference org) {
          this.org = org;
@@ -241,7 +241,7 @@
       public B fromTask(Task in) {
          return fromEntityType(in)
                .error(in.getError())
-               .org(in.getOrg())
+               .org(in.get())
                .progress(in.getProgress())
                .owner(in.getOwner())
                .user(in.getUser())
@@ -310,7 +310,7 @@
    /**
     * The organization that started the task.
     */
-   public Reference getOrg() {
+   public Reference get() {
       return org;
    }
 
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/VAppReference.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/VAppReference.java
index 06f14d1..19cd924 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/VAppReference.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/VAppReference.java
@@ -53,8 +53,8 @@
       super(builder);
    }
 
-   public VAppReference(URI href, String id, String name, String type) {
-      super(href, id, name, type);
+   public VAppReference(URI href, String name, String type) {
+      super(href, name, type);
    }
 
    protected VAppReference() {
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/IpScope.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/IpScope.java
index 5c497b4..26580a0 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/IpScope.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/IpScope.java
@@ -131,7 +131,7 @@
       }
    }
 
-   private IpScope() {
+   IpScope() {
       // For JAXB
    }
 
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NatRule.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NatRule.java
index 0a84e29..28f8c90 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NatRule.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NatRule.java
@@ -140,7 +140,7 @@
       this.vmRule = vmRule;
    }
 
-   private NatRule() {
+   NatRule() {
       // for JAXB
    }
 
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NetworkConnection.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NetworkConnection.java
index 74d7b29..9b3b469 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NetworkConnection.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NetworkConnection.java
@@ -227,7 +227,7 @@
       this.needsCustomization = needsCustomization;
    }
 
-   private NetworkConnection() {
+   NetworkConnection() {
       // for JAXB
    }
 
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NetworkFeatures.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NetworkFeatures.java
index e8d3714..07cd191 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NetworkFeatures.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NetworkFeatures.java
@@ -76,7 +76,7 @@
       }
    }
 
-   private NetworkFeatures() {
+   NetworkFeatures() {
       // for JAXB
    }
 
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NetworkServiceType.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NetworkServiceType.java
index 3de01fb..cd624c8 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NetworkServiceType.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/network/NetworkServiceType.java
@@ -84,7 +84,7 @@
          return true;
       if (o == null || getClass() != o.getClass())
          return false;
-      NetworkServiceType that = NetworkServiceType.class.cast(o);
+      NetworkServiceType<?> that = NetworkServiceType.class.cast(o);
       return equal(isEnabled, that.isEnabled);
    }
 
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/org/OrgList.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/org/OrgList.java
index 716479d..350f659 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/org/OrgList.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/org/OrgList.java
@@ -18,7 +18,6 @@
  */
 package org.jclouds.vcloud.director.v1_5.domain.org;
 
-import static com.google.common.base.Objects.equal;
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import java.util.Collections;
@@ -30,7 +29,7 @@
 import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
 import org.jclouds.vcloud.director.v1_5.domain.Reference;
 
-import com.google.common.base.Objects;
+import com.google.common.collect.ForwardingSet;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
 
@@ -40,7 +39,7 @@
  * @author Adrian Cole
  */
 @XmlRootElement(name = "OrgList")
-public class OrgList {
+public class OrgList extends ForwardingSet<Reference> {
 
    public static final String MEDIA_TYPE = VCloudDirectorMediaType.ORG_LIST;
 
@@ -77,7 +76,7 @@
       }
 
       public Builder fromOrgList(OrgList in) {
-         return orgs(in.getOrgs());
+         return orgs(in.delegate());
       }
    }
 
@@ -92,27 +91,9 @@
    @XmlElement(name = "Org")
    private Set<Reference> orgs = Sets.newLinkedHashSet();
 
-   public Set<Reference> getOrgs() {
+   @Override
+   protected Set<Reference> delegate() {
       return Collections.unmodifiableSet(orgs);
    }
 
-   @Override
-   public boolean equals(Object o) {
-      if (this == o)
-         return true;
-      if (o == null || getClass() != o.getClass())
-         return false;
-      OrgList that = OrgList.class.cast(o);
-      return equal(orgs, that.orgs);
-   }
-
-   @Override
-   public int hashCode() {
-      return Objects.hashCode(orgs);
-   }
-
-   @Override
-   public String toString() {
-      return Objects.toStringHelper("").add("orgs", orgs).toString();
-   }
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/params/ControlAccessParams.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/params/ControlAccessParams.java
index f9b9740..edf0403 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/params/ControlAccessParams.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/params/ControlAccessParams.java
@@ -167,7 +167,7 @@
    /**
     * The access settings to be applied if {@link #isSharedToEveryone()} is false.
     *
-    * Required on create and modify if {@link #isSharedToEveryone()} is false.
+    * Required on create and edit if {@link #isSharedToEveryone()} is false.
     */
    public List<AccessSetting> getAccessSettings() {
       return accessSettings == null ? Collections.<AccessSetting>emptyList() : accessSettings;
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/params/PublishCatalogParams.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/params/PublishCatalogParams.java
index 1bd9b81..d2e1919 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/params/PublishCatalogParams.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/params/PublishCatalogParams.java
@@ -46,6 +46,7 @@
 @XmlType(propOrder = {
     "isPublished"
 })
+//TODO: this is ridiculous
 public class PublishCatalogParams {
    
    public static Builder builder() {
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/params/RecomposeVAppParams.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/params/RecomposeVAppParams.java
index ba80935..c097649 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/params/RecomposeVAppParams.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/params/RecomposeVAppParams.java
@@ -69,7 +69,7 @@
    public static abstract class Builder<B extends Builder<B>> extends ComposeVAppParams.Builder<B> {
 
       private List<Vm> createItem;
-      private List<Reference> deleteItem;
+      private List<Reference> removeItem;
 
       /**
        * @see RecomposeVAppParams#getCreateItem()
@@ -82,8 +82,8 @@
       /**
        * @see RecomposeVAppParams#getDeleteItem()
        */
-      public B deleteItem(List<Reference> deleteItem) {
-         this.deleteItem = deleteItem;
+      public B removeItem(List<Reference> removeItem) {
+         this.removeItem = removeItem;
          return self();
       }
 
@@ -93,7 +93,7 @@
       }
 
       public B fromRecomposeVAppParams(RecomposeVAppParams in) {
-         return fromComposeVAppParams(in).createItem(in.getCreateItem()).deleteItem(in.getDeleteItem());
+         return fromComposeVAppParams(in).createItem(in.getCreateItem()).removeItem(in.getDeleteItem());
       }
    }
 
@@ -104,13 +104,13 @@
    private RecomposeVAppParams(Builder<?> builder) {
       super(builder);
       this.createItem = builder.createItem;
-      this.deleteItem = builder.deleteItem;
+      this.removeItem = builder.removeItem;
    }
 
    @XmlElement(name = "CreateItem")
    protected List<Vm> createItem;
    @XmlElement(name = "DeleteItem")
-   protected List<Reference> deleteItem;
+   protected List<Reference> removeItem;
 
    /**
     * Gets the value of the createItem property.
@@ -123,13 +123,13 @@
    }
 
    /**
-    * Gets the value of the deleteItem property.
+    * Gets the value of the removeItem property.
     */
    public List<Reference> getDeleteItem() {
-      if (deleteItem == null) {
-         deleteItem = new ArrayList<Reference>();
+      if (removeItem == null) {
+         removeItem = new ArrayList<Reference>();
       }
-      return this.deleteItem;
+      return this.removeItem;
    }
 
    @Override
@@ -140,17 +140,17 @@
          return false;
       RecomposeVAppParams that = RecomposeVAppParams.class.cast(o);
       return super.equals(that) &&
-            equal(this.createItem, that.createItem) && equal(this.deleteItem, that.deleteItem);
+            equal(this.createItem, that.createItem) && equal(this.removeItem, that.removeItem);
    }
 
    @Override
    public int hashCode() {
-      return Objects.hashCode(super.hashCode(), createItem, deleteItem);
+      return Objects.hashCode(super.hashCode(), createItem, removeItem);
    }
 
    @Override
    public ToStringHelper string() {
-      return super.string().add("createItem", createItem).add("deleteItem", deleteItem);
+      return super.string().add("createItem", createItem).add("removeItem", removeItem);
    }
 
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/params/SourcedCompositionItemParam.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/params/SourcedCompositionItemParam.java
index e76d24f..b74e4c0 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/params/SourcedCompositionItemParam.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/params/SourcedCompositionItemParam.java
@@ -147,7 +147,7 @@
       this.sourceDelete = sourceDelete;
    }
 
-   private SourcedCompositionItemParam() {
+   SourcedCompositionItemParam() {
       // for JAXB
    }
 
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryList.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryList.java
index b8949e7..997e458 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryList.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryList.java
@@ -61,7 +61,7 @@
    private static class ConcreteBuilder extends Builder<ConcreteBuilder> {
    }
    
-   private QueryList() {
+   QueryList() {
       // for JAXB
    }
 
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultAdminGroupRecord.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultAdminGroupRecord.java
index 083445a..4880c13 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultAdminGroupRecord.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultAdminGroupRecord.java
@@ -64,7 +64,7 @@
       }
 
       /**
-       * @see QueryResultAdminGroupRecord#getOrg()
+       * @see QueryResultAdminGroupRecord#get()
        */
       public B org(String val) {
          this.org = val;
@@ -95,7 +95,7 @@
       public B fromQueryResultAdminGroupRecord(QueryResultAdminGroupRecord in) {
          return fromQueryResultRecordType(in)
                   .name(in.getName())
-                  .org(in.getOrg())
+                  .org(in.get())
                   .roleName(in.getRoleName())
                   .isReadOnly(in.isReadOnly());
       }
@@ -133,7 +133,7 @@
    /**
     * Organization reference or id
     */
-   public String getOrg() {
+   public String get() {
       return org;
    }
 
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultAdminUserRecord.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultAdminUserRecord.java
index cc7c0a9..159ace1 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultAdminUserRecord.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultAdminUserRecord.java
@@ -71,7 +71,7 @@
       }
 
       /**
-       * @see QueryResultAdminUserRecord#getOrg()
+       * @see QueryResultAdminUserRecord#get()
        */
       public B org(String val) {
          this.org = val;
@@ -158,7 +158,7 @@
       public B fromQueryResultAdminUserRecord(QueryResultAdminUserRecord in) {
          return fromQueryResultRecordType(in)
                   .name(in.getName())
-                  .org(in.getOrg())
+                  .org(in.get())
                   .fullName(in.getFullName())
                   .isEnabled(in.isEnabled())
                   .numberOfDeployedVMs(in.getNumberOfDeployedVMs())
@@ -224,7 +224,7 @@
    /**
     * Organization reference or id
     */
-   public String getOrg() {
+   public String get() {
       return org;
    }
 
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultAdminVdcRecord.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultAdminVdcRecord.java
index a2cb3d9..4f53ebc 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultAdminVdcRecord.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultAdminVdcRecord.java
@@ -186,7 +186,7 @@
       }
 
       /**
-       * @see QueryResultAdminVdcRecord#getOrg()
+       * @see QueryResultAdminVdcRecord#get()
        */
       public B org(String val) {
          this.org = val;
@@ -270,7 +270,7 @@
                   .providerVdcName(in.getProviderVdcName())
                   .providerVdc(in.getProviderVdc())
                   .orgName(in.getOrgName())
-                  .org(in.getOrg())
+                  .org(in.get())
                   .numberOfVApps(in.getNumberOfVApps())
                   .numberOfMedia(in.getNumberOfMedia())
                   .numberOfVAppTemplates(in.getNumberOfVAppTemplates())
@@ -458,7 +458,7 @@
    /**
     * Organization reference or id
     */
-   public String getOrg() {
+   public String get() {
       return org;
    }
 
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultMediaRecord.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultMediaRecord.java
index 475484e..a6d32f0 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultMediaRecord.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultMediaRecord.java
@@ -112,7 +112,7 @@
       }
 
       /**
-       * @see QueryResultMediaRecord#getOrg()
+       * @see QueryResultMediaRecord#get()
        */
       public B org(String val) {
          this.org = val;
@@ -188,7 +188,7 @@
                   .name(in.getName())
                   .vdc(in.getVdc())
                   .vdcName(in.getVdcName())
-                  .org(in.getOrg())
+                  .org(in.get())
                   .creationDate(in.getCreationDate())
                   .isBusy(in.isBusy())
                   .storageB(in.getStorageB())
@@ -296,7 +296,7 @@
    /**
     * Organization reference or id
     */
-   public String getOrg() {
+   public String get() {
       return org;
    }
 
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultNetworkRecord.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultNetworkRecord.java
index 5f6bd1d..990da38 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultNetworkRecord.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultNetworkRecord.java
@@ -168,7 +168,7 @@
       isBusy = builder.isBusy;
    }
 
-   private QueryResultNetworkRecord() {
+   QueryResultNetworkRecord() {
       // for JAXB
    }
 
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultVAppTemplateRecord.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultVAppTemplateRecord.java
index ba30b63..04b52b3 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultVAppTemplateRecord.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultVAppTemplateRecord.java
@@ -119,7 +119,7 @@
       }
 
       /**
-       * @see QueryResultVAppTemplateRecord#getOrg()
+       * @see QueryResultVAppTemplateRecord#get()
        */
       public B org(String val) {
          this.org = val;
@@ -187,7 +187,7 @@
                .isPublished(in.isPublished())
                .vdc(in.getVdc())
                .vdcName(in.getVdcName())
-               .org(in.getOrg())
+               .org(in.get())
                .creationDate(in.getCreationDate())
                .isBusy(in.isBusy())
                .isGoldMaster(in.isGoldMaster())
@@ -292,7 +292,7 @@
    /**
     * Organization reference or id
     */
-   public String getOrg() {
+   public String get() {
       return org;
    }
 
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/CatalogApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/CatalogApi.java
index c323b05..08e9ff6 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/CatalogApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/CatalogApi.java
@@ -23,89 +23,116 @@
 
 import org.jclouds.concurrent.Timeout;
 import org.jclouds.rest.annotations.Delegate;
+import org.jclouds.rest.annotations.EndpointParam;
 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.domain.Metadata;
+import org.jclouds.vcloud.director.v1_5.functions.href.CatalogItemURNToHref;
+import org.jclouds.vcloud.director.v1_5.functions.href.CatalogURNToHref;
 
 /**
  * Provides synchronous access to {@link Catalog} objects.
  * 
  * @see CatalogAsyncApi
- * @author grkvlt@apache.org
+ * @author grkvlt@apache.org, Adrian Cole
  */
 @Timeout(duration = 180, timeUnit = TimeUnit.SECONDS)
 public interface CatalogApi {
 
    /**
     * Retrieves a catalog.
-    *
+    * 
     * <pre>
     * GET /catalog/{id}
     * </pre>
-    *
-    * @param catalogUri the reference for the catalog
+    * 
+    * @param catalogUri
+    *           the reference for the catalog
     * @return a catalog
     */
-   Catalog getCatalog(URI catalogUri);
+   Catalog get(String catalogUrn);
+
+   Catalog get(URI catalogHref);
 
    /**
     * Creates a catalog item in a catalog.
-    *
+    * 
     * <pre>
     * POST /catalog/{id}/catalogItems
     * </pre>
-    *
-    * @param catalogUri the URI of the catalog
-    * @param item the catalog item to create
-    * @return the created catalog item
+    * 
+    * @param catalogUri
+    *           the URI of the catalog
+    * @param item
+    *           the catalog item to add
+    * @return the addd catalog item
     */
-   CatalogItem addCatalogItem(URI catalogUri, CatalogItem item);
+   CatalogItem addItem(String catalogUrn, CatalogItem item);
+
+   CatalogItem addItem(URI catalogHref, CatalogItem item);
 
    /**
     * Retrieves a catalog item.
-    *
+    * 
     * <pre>
     * GET /catalogItem/{id}
     * </pre>
     * 
-    * @param catalogItemRef the reference for the catalog item
+    * @param catalogItemRef
+    *           the reference for the catalog item
     * @return the catalog item
     */
-   CatalogItem getCatalogItem(URI catalogItemRef);
+   CatalogItem getItem(String catalogItemUrn);
+
+   CatalogItem getItem(URI catalogItemHref);
 
    /**
     * Modifies a catalog item.
-    *
+    * 
     * <pre>
     * PUT /catalogItem/{id}
     * </pre>
-    *
-    * @param catalogItemRef the reference for the catalog item
-    * @param catalogItem the catalog item
-    * @return the updated catalog item
+    * 
+    * @param catalogItemRef
+    *           the reference for the catalog item
+    * @param catalogItem
+    *           the catalog item
+    * @return the edited catalog item
     */
-   CatalogItem updateCatalogItem(URI catalogItemRef, CatalogItem catalogItem);
+   CatalogItem editItem(String catalogItemUrn, CatalogItem catalogItem);
+
+   CatalogItem editItem(URI catalogItemHref, CatalogItem catalogItem);
 
    /**
     * Deletes a catalog item.
-    *
+    * 
     * <pre>
     * DELETE /catalogItem/{id}
     * </pre>
-    *
-    * @param catalogItemRef the reference for the catalog item
+    * 
+    * @param catalogItemRef
+    *           the reference for the catalog item
     */
-   void deleteCatalogItem(URI catalogItemRef);
+   void removeItem(String catalogItemUrn);
+
+   void removeItem(URI catalogItemHref);
 
    /**
     * @return synchronous access to {@link Metadata.Readable} features
     */
    @Delegate
-   MetadataApi.Readable getMetadataApi();
+   MetadataApi.Readable getMetadataApi(@EndpointParam(parser = CatalogURNToHref.class) String catalogUrn);
+
+   @Delegate
+   MetadataApi.Readable getMetadataApi(@EndpointParam URI catalogItemHref);
 
    /**
     * @return synchronous access to {@link Metadata.Writeable} features for CatalogItems
     */
    @Delegate
-   MetadataApi.Writeable getCatalogItemMetadataApi();
+   MetadataApi.Writeable getItemMetadataApi(@EndpointParam(parser = CatalogItemURNToHref.class) String catalogItemUrn);
+
+   @Delegate
+   MetadataApi.Writeable getItemMetadataApi(@EndpointParam URI catalogItemHref);
 
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/CatalogAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/CatalogAsyncApi.java
index c7e39b7..6808341 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/CatalogAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/CatalogAsyncApi.java
@@ -39,73 +39,130 @@
 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.domain.Metadata;
 import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
+import org.jclouds.vcloud.director.v1_5.functions.href.CatalogItemURNToHref;
+import org.jclouds.vcloud.director.v1_5.functions.href.CatalogURNToHref;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
 /**
  * @see CatalogApi
- * @author grkvlt@apache.org
+ * @author grkvlt@apache.org, Adrian Cole
  */
 @RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface CatalogAsyncApi {
 
    /**
-    * Retrieves a catalog.
+    * @see CatalogApi#get(String)
     */
    @GET
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<? extends Catalog> getCatalog(@EndpointParam URI catalogUri);
+   ListenableFuture<? extends Catalog> get(@EndpointParam(parser = CatalogURNToHref.class) String catalogUrn);
 
    /**
-    * Creates a catalog item in a catalog.
+    * @see CatalogApi#addItem(String, CatalogItem)
     */
    @POST
    @Path("/catalogItems")
    @Consumes(VCloudDirectorMediaType.CATALOG_ITEM)
    @Produces(VCloudDirectorMediaType.CATALOG_ITEM)
    @JAXBResponseParser
-   ListenableFuture<CatalogItem> addCatalogItem(@EndpointParam URI catalogUri,
-         @BinderParam(BindToXMLPayload.class) CatalogItem catalogItem);
-   
+   ListenableFuture<CatalogItem> addItem(@EndpointParam(parser = CatalogURNToHref.class) String catalogUrn,
+            @BinderParam(BindToXMLPayload.class) CatalogItem catalogItem);
+
    /**
-    * Retrieves a catalog item.
+    * @see CatalogApi#getItem(String)
     */
    @GET
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<CatalogItem> getCatalogItem(@EndpointParam URI catalogItemUri);
+   ListenableFuture<CatalogItem> getItem(@EndpointParam(parser = CatalogItemURNToHref.class) String catalogItemUrn);
 
    /**
-    * Modifies a catalog item.
+    * @see CatalogApi#editItem(String, CatalogItem)
     */
    @PUT
    @Consumes(VCloudDirectorMediaType.CATALOG_ITEM)
    @Produces(VCloudDirectorMediaType.CATALOG_ITEM)
    @JAXBResponseParser
-   ListenableFuture<CatalogItem> updateCatalogItem(@EndpointParam URI catalogItemUri,
-         @BinderParam(BindToXMLPayload.class)  CatalogItem catalogItem);
+   ListenableFuture<CatalogItem> editItem(@EndpointParam(parser = CatalogItemURNToHref.class) String catalogItemUrn,
+            @BinderParam(BindToXMLPayload.class) CatalogItem catalogItem);
 
    /**
-    * Deletes a catalog item.
+    * @see CatalogApi#removeItem(String)
     */
    @DELETE
    @Consumes
    @JAXBResponseParser
-   ListenableFuture<Void> deleteCatalogItem(@EndpointParam URI catalogItemUri);
+   ListenableFuture<Void> removeItem(@EndpointParam(parser = CatalogItemURNToHref.class) String catalogItemUrn);
+
+   /**
+    * @see CatalogApi#get(URI)
+    */
+   @GET
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.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
+   @ExceptionParser(ReturnNullOnNotFoundOr404.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);
 
    /**
     * @return asynchronous access to {@link Metadata.Readable} features
     */
    @Delegate
-   MetadataAsyncApi.Readable getMetadataApi();
+   MetadataAsyncApi.Readable getMetadataApi(@EndpointParam(parser = CatalogURNToHref.class) String catalogUrn);
+   
+   @Delegate
+   MetadataAsyncApi.Readable getMetadataApi(@EndpointParam URI catalogItemHref);
 
    /**
-    * @return asynchronous access to {@link Metadata.Writeable} features for CatalogItems
+    * @see CatalogApi#getItemMetadataApi
     */
    @Delegate
-   MetadataAsyncApi.Writeable getCatalogItemMetadataApi();
+   MetadataAsyncApi.Writeable getItemMetadataApi(@EndpointParam(parser = CatalogItemURNToHref.class) String catalogItemUrn);
+
+   @Delegate
+   MetadataAsyncApi.Writeable getItemMetadataApi(@EndpointParam URI catalogItemHref);
+
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaApi.java
index a68719a..d3629e7 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaApi.java
@@ -23,16 +23,19 @@
 
 import org.jclouds.concurrent.Timeout;
 import org.jclouds.rest.annotations.Delegate;
+import org.jclouds.rest.annotations.EndpointParam;
 import org.jclouds.vcloud.director.v1_5.domain.Media;
+import org.jclouds.vcloud.director.v1_5.domain.Metadata;
 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.functions.href.MediaURNToHref;
 
 /**
  * Provides synchronous access to {@link Media}.
  * 
  * @see MediaAsyncApi
- * @author danikov
+ * @author danikov, Adrian Cole
  */
 @Timeout(duration = 180, timeUnit = TimeUnit.SECONDS)
 public interface MediaApi {
@@ -42,48 +45,62 @@
     * 
     * @return the media or null if not found
     */
-   Media getMedia(URI mediaUri);
-   
+   Media get(String mediaUrn);
+
+   Media get(URI mediaHref);
+
    /**
     * Creates a media (and present upload link for the floppy/iso file).
     * 
-    * @return The response will return a link to transfer site to be able to continue with uploading the media.
+    * @return The response will return a link to transfer site to be able to continue with uploading
+    *         the media.
     */
-   Media createMedia(URI uploadLink, Media 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.
+    * 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.
+    * @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 cloneMedia(URI cloneLink, CloneMediaParams params);
-   
+   Media clone(String mediaUrn, CloneMediaParams params);
+
+   Media clone(URI mediaHref, CloneMediaParams params);
+
    /**
     * Updates the name/description of a media.
     * 
-    * @return a task. This operation is asynchronous and the user should monitor the returned 
-    * task status in order to check when it is completed.
+    * @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 updateMedia(URI mediaUri, Media media);
-   
+   Task edit(String mediaUrn, Media media);
+
+   Task edit(URI mediaHref, Media media);
+
    /**
     * Deletes a media.
     */
-   Task deleteMedia(URI mediaUri);
-   
+   Task remove(String mediaUrn);
+
+   Task remove(URI mediaHref);
+
    /**
     * Retrieves an owner.
     * 
     * @return the owner or null if not found
     */
-   Owner getOwner(URI mediaUri);
-   
+   Owner getOwner(String mediaUrn);
+
+   Owner getOwner(URI mediaHref);
+
    /**
     * @return synchronous access to {@link Metadata.Writeable} features
     */
    @Delegate
-   MetadataApi.Writeable getMetadataApi();
+   MetadataApi.Writeable getMetadataApi(@EndpointParam(parser = MediaURNToHref.class) String mediaUrn);
+
+   @Delegate
+   MetadataApi.Writeable getMetadataApi(@EndpointParam URI mediaHref);
 
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaAsyncApi.java
index 92490bf..57132b2 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MediaAsyncApi.java
@@ -38,68 +38,116 @@
 import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
 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.Metadata;
 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.href.MediaURNToHref;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
 /**
  * @see MediaApi
- * @author danikov
+ * @author danikov, Adrian Cole
  */
 @RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface MediaAsyncApi {
 
    /**
-    * @see MediaApi#getMedia(URI)
+    * @see MediaApi#get(String)
     */
    @GET
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<Media> getMedia(@EndpointParam URI uri);
-   
+   ListenableFuture<Media> get(@EndpointParam(parser = MediaURNToHref.class) String mediaUrn);
+
    /**
-    * @see MediaApi#createMedia(URI, Media)
+    * @see MediaApi#add(URI, Media)
     */
    @POST
    @Consumes(VCloudDirectorMediaType.MEDIA)
    @Produces(VCloudDirectorMediaType.MEDIA)
    @JAXBResponseParser
-   ListenableFuture<Media> createMedia(@EndpointParam URI link,
-         @BinderParam(BindToXMLPayload.class) Media media);
-   
-   
+   ListenableFuture<Media> add(@EndpointParam URI updateHref, @BinderParam(BindToXMLPayload.class) Media media);
+
    /**
-    * @see MediaApi#cloneMedia(URI, CloneMediaParams)
+    * @see MediaApi#clone(String, CloneMediaParams)
     */
    @POST
    @Path("/action/cloneMedia")
    @Consumes(VCloudDirectorMediaType.MEDIA)
    @Produces(VCloudDirectorMediaType.CLONE_MEDIA_PARAMS)
    @JAXBResponseParser
-   ListenableFuture<Media> cloneMedia(@EndpointParam URI vdcRef,
-         @BinderParam(BindToXMLPayload.class) CloneMediaParams params);
-   
+   ListenableFuture<Media> clone(@EndpointParam(parser = MediaURNToHref.class) String mediaUrn,
+            @BinderParam(BindToXMLPayload.class) CloneMediaParams params);
+
    /**
-    * @see MediaApi#updateMedia(URI, Media))
+    * @see MediaApi#editMedia(String, Media)
     */
    @PUT
    @Consumes(VCloudDirectorMediaType.TASK)
    @Produces(VCloudDirectorMediaType.MEDIA)
    @JAXBResponseParser
-   ListenableFuture<Task> updateMedia(@EndpointParam URI uri, @BinderParam(BindToXMLPayload.class) Media media);
-   
+   ListenableFuture<Task> edit(@EndpointParam(parser = MediaURNToHref.class) String mediaUrn,
+            @BinderParam(BindToXMLPayload.class) Media media);
+
    /**
-   * @see MediaApi#deleteMedia(URI))
-   */
+    * @see MediaApi#removeMedia(String)
+    */
    @DELETE
    @Consumes(VCloudDirectorMediaType.TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> deleteMedia(@EndpointParam URI uri);
-   
+   ListenableFuture<Task> remove(@EndpointParam(parser = MediaURNToHref.class) String mediaUrn);
+
+   /**
+    * @see MediaApi#getOwner(String)
+    */
+   @GET
+   @Path("/owner")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<Owner> getOwner(@EndpointParam(parser = MediaURNToHref.class) String mediaUrn);
+
+   /**
+    * @see MediaApi#get(URI)
+    */
+   @GET
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.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)
     */
@@ -108,11 +156,14 @@
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<Owner> getOwner(@EndpointParam URI uri);
-   
+   ListenableFuture<Owner> getOwner(@EndpointParam URI mediaHref);
+
    /**
-   * @return asynchronous access to {@link Metadata.Writeable} features
-   */
+    * @return asynchronous access to {@link Metadata.Writeable} features
+    */
    @Delegate
-   MetadataAsyncApi.Writeable getMetadataApi();
+   MetadataAsyncApi.Writeable getMetadataApi(@EndpointParam(parser = MediaURNToHref.class) String mediaUrn);
+
+   @Delegate
+   MetadataAsyncApi.Writeable getMetadataApi(@EndpointParam URI mediaHref);
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MetadataApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MetadataApi.java
index 1b4aa4b..18db889 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MetadataApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MetadataApi.java
@@ -18,7 +18,6 @@
  */
 package org.jclouds.vcloud.director.v1_5.features;
 
-import java.net.URI;
 import java.util.concurrent.TimeUnit;
 
 import org.jclouds.concurrent.Timeout;
@@ -33,51 +32,51 @@
  * @author danikov
  */
 public interface MetadataApi {
-   
+
    @Timeout(duration = 180, timeUnit = TimeUnit.SECONDS)
    public static interface Readable extends MetadataApi {
-   
       /**
        * Retrieves an list of metadata
        * 
        * @return a list of metadata
        */
-      Metadata getMetadata(URI uri);
-      
+      Metadata get();
+
       /**
        * Retrieves a metadata value
        * 
        * @return the metadata value, or null if not found
        */
-      MetadataValue getMetadataValue(URI uri, String key);
+      MetadataValue getValue(String key);
    }
-   
+
    @Timeout(duration = 180, timeUnit = TimeUnit.SECONDS)
    public static interface Writeable extends Readable {
-   
+
       /**
        * Merges the metadata for a media with the information provided.
        * 
-       * @return a task. This operation is asynchronous and the user should monitor the returned 
-       * task status in order to check when it is completed.
+       * @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 mergeMetadata(URI uri, Metadata metadata);
+      Task merge(Metadata metadata);
 
       /**
-       * Sets the metadata for the particular key for the media to the value provided. 
-       * Note: this will replace any existing metadata information
+       * Sets the metadata for the particular key for the media to the value provided. Note: this
+       * will replace any existing metadata information
        * 
-       * @return a task. This operation is asynchronous and the user should monitor the returned 
-       * task status in order to check when it is completed.
+       * @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 setMetadata(URI uri, String key, MetadataValue metadataValue);
-      
+      Task putEntry(String key, MetadataValue metadataValue);
+
       /**
        * Deletes a metadata entry.
        * 
-       * @return a task. This operation is asynchronous and the user should monitor the returned 
-       * task status in order to check when it is completed.
+       * @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 deleteMetadataEntry(URI uri, String key);
+      Task removeEntry(String key);
+
    }
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MetadataAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MetadataAsyncApi.java
index cd1d98e..dcb9b1b 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MetadataAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/MetadataAsyncApi.java
@@ -30,7 +30,6 @@
 import javax.ws.rs.Produces;
 
 import org.jclouds.rest.annotations.BinderParam;
-import org.jclouds.rest.annotations.EndpointParam;
 import org.jclouds.rest.annotations.ExceptionParser;
 import org.jclouds.rest.annotations.JAXBResponseParser;
 import org.jclouds.rest.annotations.RequestFilters;
@@ -38,6 +37,7 @@
 import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
 import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
 import org.jclouds.vcloud.director.v1_5.domain.Metadata;
+import org.jclouds.vcloud.director.v1_5.domain.MetadataEntry;
 import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
 import org.jclouds.vcloud.director.v1_5.domain.Task;
 import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
@@ -48,64 +48,67 @@
  * @see MetadataApi
  * @author danikov
  */
+// TODO: take out the endpoint params and supply them in the Delegate calls.
 public interface MetadataAsyncApi {
 
    @RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
    public static interface Readable extends MetadataAsyncApi {
 
       /**
-       * @see MetadataApi.Readable#getMetadata(URISupplier)
+       * @see MetadataApi.Readable#get(URI)
        */
       @GET
       @Path("/metadata")
       @Consumes
       @JAXBResponseParser
       @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-      ListenableFuture<Metadata> getMetadata(@EndpointParam URI metaDataUri);
-      
+      ListenableFuture<Metadata> get();
+
       /**
-       * @see MetadataApi.Readable#getMetadataValue(URI, String)
+       * @see MetadataApi.Readable#getValue(String)
        */
       @GET
       @Path("/metadata/{key}")
       @Consumes
       @JAXBResponseParser
       @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-      ListenableFuture<MetadataValue> getMetadataValue(@EndpointParam URI metaDataUri, @PathParam("key") String key);
+      ListenableFuture<MetadataValue> getValue(@PathParam("key") String key);
+
    }
-   
+
    @RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
    public static interface Writeable extends Readable {
 
       /**
-       * @see MetadataApi.Writable#mergeMetadata(URI, Metadata))
+       * @see MetadataApi.Writable#merge(Metadata)
        */
       @POST
       @Path("/metadata")
       @Consumes(VCloudDirectorMediaType.TASK)
       @Produces(VCloudDirectorMediaType.METADATA)
       @JAXBResponseParser
-      ListenableFuture<Task> mergeMetadata(@EndpointParam URI metaDataUri, @BinderParam(BindToXMLPayload.class) Metadata metadata);
-      
+      ListenableFuture<Task> merge(@BinderParam(BindToXMLPayload.class) Metadata metadata);
+
       /**
-       * @see MetadataApi.Writable#setMetadata(URI, String, MetadataEntry))
+       * @see MetadataApi.Writeable#putEntry(String, MetadataEntry)
        */
       @PUT
       @Path("/metadata/{key}")
       @Consumes(VCloudDirectorMediaType.TASK)
       @Produces(VCloudDirectorMediaType.METADATA_VALUE)
       @JAXBResponseParser
-      ListenableFuture<Task> setMetadata(@EndpointParam URI metaDataUri,
-            @PathParam("key") String key, 
-            @BinderParam(BindToXMLPayload.class) MetadataValue metadataValue);
-      
+      // TODO: this is rediculous. get rid of the MetadataValue type, as it is only a string!
+      ListenableFuture<Task> putEntry(@PathParam("key") String key,
+               @BinderParam(BindToXMLPayload.class) MetadataValue metadataValue);
+
       /**
-       * @see MetadataApi.Writable#deleteMetadataEntry(URISupplier, String))
+       * @see MetadataApi.Writable#removeEntry(String)
        */
-       @DELETE
-       @Path("/metadata/{key}")
-       @Consumes(VCloudDirectorMediaType.TASK)
-       @JAXBResponseParser
-       ListenableFuture<Task> deleteMetadataEntry(@EndpointParam URI metaDataUri, @PathParam("key") String key);
+      @DELETE
+      @Path("/metadata/{key}")
+      @Consumes(VCloudDirectorMediaType.TASK)
+      @JAXBResponseParser
+      ListenableFuture<Task> removeEntry(@PathParam("key") String key);
+
    }
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/NetworkApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/NetworkApi.java
index 653110a..1de6875 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/NetworkApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/NetworkApi.java
@@ -23,13 +23,16 @@
 
 import org.jclouds.concurrent.Timeout;
 import org.jclouds.rest.annotations.Delegate;
+import org.jclouds.rest.annotations.EndpointParam;
+import org.jclouds.vcloud.director.v1_5.domain.Metadata;
 import org.jclouds.vcloud.director.v1_5.domain.network.Network;
+import org.jclouds.vcloud.director.v1_5.functions.href.NetworkURNToHref;
 
 /**
  * Provides synchronous access to {@link Network}.
  * 
  * @see NetworkAsyncApi
- * @author danikov
+ * @author danikov, Adrian Cole
  */
 @Timeout(duration = 180, timeUnit = TimeUnit.SECONDS)
 public interface NetworkApi {
@@ -39,11 +42,16 @@
     * 
     * @return the network or null if not found
     */
-   Network getNetwork(URI networkUri);
+   Network get(String networkUrn);
+
+   Network get(URI networkHref);
    
    /**
     * @return synchronous access to {@link Metadata.Readable} features
     */
    @Delegate
-   MetadataApi.Readable getMetadataApi();
+   MetadataApi.Readable getMetadataApi(@EndpointParam(parser = NetworkURNToHref.class) String networkUrn);
+
+   @Delegate
+   MetadataApi.Readable getMetadataApi(@EndpointParam URI networkHref);
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/NetworkAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/NetworkAsyncApi.java
index 49de11a..febe0f8 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/NetworkAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/NetworkAsyncApi.java
@@ -29,8 +29,10 @@
 import org.jclouds.rest.annotations.JAXBResponseParser;
 import org.jclouds.rest.annotations.RequestFilters;
 import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
+import org.jclouds.vcloud.director.v1_5.domain.Metadata;
 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.href.NetworkURNToHref;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -42,18 +44,30 @@
 public interface NetworkAsyncApi {
 
    /**
-    * @see NetworkApi#getNetwork(URI)
+    * @see NetworkApi#get(String)
     */
    @GET
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<? extends Network> getNetwork(@EndpointParam URI networkUri);
-   
+   ListenableFuture<? extends Network> get(@EndpointParam(parser = NetworkURNToHref.class) String networkUrn);
+
+   /**
+    * @see NetworkApi#get(URI)
+    */
+   @GET
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<? extends Network> get(@EndpointParam URI networkHref);
+
    /**
     * @return asynchronous access to {@link Metadata.Readable} features
     */
    @Delegate
-   MetadataAsyncApi.Readable getMetadataApi();
-   
+   MetadataAsyncApi.Readable getMetadataApi(@EndpointParam(parser = NetworkURNToHref.class) String networkUrn);
+
+   @Delegate
+   MetadataAsyncApi.Readable getMetadataApi(@EndpointParam URI networkHref);
+
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgApi.java
index bf2bc32..b73674e 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgApi.java
@@ -23,9 +23,11 @@
 
 import org.jclouds.concurrent.Timeout;
 import org.jclouds.rest.annotations.Delegate;
+import org.jclouds.rest.annotations.EndpointParam;
+import org.jclouds.vcloud.director.v1_5.domain.Metadata;
 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.domain.params.ControlAccessParams;
+import org.jclouds.vcloud.director.v1_5.functions.href.OrgURNToHref;
 
 /**
  * Provides synchronous access to {@link Org}.
@@ -38,51 +40,35 @@
 
    /**
     * Retrieves a list of organizations.
-    *
+    * 
     * <pre>
-    * GET /org
+    * GET / org
     * </pre>
     * 
     * @return a list of organizations
     */
-   OrgList getOrgList();
+   OrgList list();
 
    /**
     * Retrieves an organization.
-    *
+    * 
     * <pre>
     * GET /org/{id}
     * </pre>
     * 
     * @return the org or null if not found
     */
-   Org getOrg(URI orgRef);
+   Org get(String orgUrn);
 
-   /**
-    * Modifies a catalog control access.
-    *
-    * <pre>
-    * POST /org/{id}/catalog/{catalogId}/action/controlAccess
-    * </pre>
-    *
-    * @return the control access information
-    */
-   ControlAccessParams modifyControlAccess(URI orgRef, String catalogId, ControlAccessParams params);
+   Org get(URI orgHref);
 
    /**
-    * Retrieves the catalog control access information.
-    *
-    * <pre>
-    * GET /org/{id}/catalog/{catalogId}/controlAccess
-    * </pre>
-    *
-    * @return the control access information
-    */
-   ControlAccessParams getControlAccess(URI orgRef, String catalogId);
-   
-   /**
     * @return synchronous access to {@link Metadata.Readable} features
     */
    @Delegate
-   MetadataApi.Readable getMetadataApi();
+   MetadataApi.Readable getMetadataApi(@EndpointParam(parser = OrgURNToHref.class) String orgUrn);
+   
+   @Delegate
+   MetadataApi.Readable getMetadataApi(@EndpointParam URI orgHref);
+
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgAsyncApi.java
index eb776ac..7b2ef31 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/OrgAsyncApi.java
@@ -18,29 +18,23 @@
  */
 package org.jclouds.vcloud.director.v1_5.features;
 
-import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.CONTROL_ACCESS;
-
 import java.net.URI;
 
 import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
-import javax.ws.rs.POST;
 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.Delegate;
 import org.jclouds.rest.annotations.EndpointParam;
 import org.jclouds.rest.annotations.ExceptionParser;
 import org.jclouds.rest.annotations.JAXBResponseParser;
 import org.jclouds.rest.annotations.RequestFilters;
-import org.jclouds.rest.binders.BindToXMLPayload;
 import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
+import org.jclouds.vcloud.director.v1_5.domain.Metadata;
 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.domain.params.ControlAccessParams;
 import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
+import org.jclouds.vcloud.director.v1_5.functions.href.OrgURNToHref;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -52,49 +46,39 @@
 public interface OrgAsyncApi {
 
    /**
-    * @see OrgApi#getOrgList()
+    * @see OrgApi#list()
     */
    @GET
    @Path("/org/")
    @Consumes
    @JAXBResponseParser
-   ListenableFuture<OrgList> getOrgList();
+   ListenableFuture<OrgList> list();
 
    /**
-    * @see OrgApi#getOrg(URI)
+    * @see OrgApi#get(String)
     */
    @GET
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<? extends Org> getOrg(@EndpointParam URI orgUri);
+   ListenableFuture<? extends Org> get(@EndpointParam(parser = OrgURNToHref.class) String orgUrn);
 
    /**
-    * @see OrgApi#modifyControlAccess(URI, URI, ControlAccessParams)
-    */
-   @POST
-   @Path("/catalog/{catalogId}/action/controlAccess")
-   @Produces(CONTROL_ACCESS)
-   @Consumes(CONTROL_ACCESS)
-   @JAXBResponseParser
-   ListenableFuture<ControlAccessParams> modifyControlAccess(@EndpointParam URI orgRef,
-      @PathParam("catalogId") String catalogId,
-      @BinderParam(BindToXMLPayload.class) ControlAccessParams params);
-
-   /**
-    * @see OrgApi#getControlAccess(URI, URI, ControlAccessParams)
+    * @see OrgApi#get(URI)
     */
    @GET
-   @Path("/catalog/{catalogId}/controlAccess")
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<ControlAccessParams> getControlAccess(@EndpointParam URI orgRef,
-      @PathParam("catalogId") String catalogId);
+   ListenableFuture<? extends Org> get(@EndpointParam URI orgHref);
    
    /**
     * @return asynchronous access to {@link Metadata.Readable} features
     */
    @Delegate
-   MetadataAsyncApi.Readable getMetadataApi();
+   MetadataAsyncApi.Readable getMetadataApi(@EndpointParam(parser = OrgURNToHref.class) String orgUrn);
+
+   @Delegate
+   MetadataAsyncApi.Readable getMetadataApi(@EndpointParam URI orgHref);
+
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/QueryApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/QueryApi.java
index 9c3e763..14997e4 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/QueryApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/QueryApi.java
@@ -21,9 +21,10 @@
 import java.util.concurrent.TimeUnit;
 
 import org.jclouds.concurrent.Timeout;
+import org.jclouds.vcloud.director.v1_5.domain.Catalog;
 import org.jclouds.vcloud.director.v1_5.domain.CatalogReference;
-import org.jclouds.vcloud.director.v1_5.domain.Entity;
 import org.jclouds.vcloud.director.v1_5.domain.Link;
+import org.jclouds.vcloud.director.v1_5.domain.Media;
 import org.jclouds.vcloud.director.v1_5.domain.VApp;
 import org.jclouds.vcloud.director.v1_5.domain.VAppTemplate;
 import org.jclouds.vcloud.director.v1_5.domain.Vm;
@@ -41,15 +42,6 @@
 @Timeout(duration = 180, timeUnit = TimeUnit.SECONDS)
 public interface QueryApi {
 
-   /**
-    * Redirects to the URL of an entity with the given VCD ID.
-    *
-    * <pre>
-    * GET /entity/{id}
-    * </pre>
-    */
-   Entity entity(String id);
-
    // TODO Add a typed object for filter syntax, or at least a fluent builder
    
    /**
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/QueryAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/QueryAsyncApi.java
index 235de87..3fb5e58 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/QueryAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/QueryAsyncApi.java
@@ -21,16 +21,13 @@
 import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
 import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
 import javax.ws.rs.QueryParam;
 
-import org.jclouds.rest.annotations.ExceptionParser;
 import org.jclouds.rest.annotations.JAXBResponseParser;
 import org.jclouds.rest.annotations.QueryParams;
 import org.jclouds.rest.annotations.RequestFilters;
 import org.jclouds.rest.annotations.SkipEncoding;
-import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
-import org.jclouds.vcloud.director.v1_5.domain.Entity;
+import org.jclouds.vcloud.director.v1_5.domain.Catalog;
 import org.jclouds.vcloud.director.v1_5.domain.VApp;
 import org.jclouds.vcloud.director.v1_5.domain.query.CatalogReferences;
 import org.jclouds.vcloud.director.v1_5.domain.query.QueryList;
@@ -49,16 +46,6 @@
 public interface QueryAsyncApi {
 
    /**
-    * @see QueryApi#entity(String)
-    */
-   @GET
-   @Path("/entity/{id}")
-   @Consumes
-   @JAXBResponseParser
-   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<Entity> entity(@PathParam("id") String id);
-
-   /**
     * REST API General queries handler.
     */
    @GET
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/TaskApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/TaskApi.java
index 55357e5..78087c9 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/TaskApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/TaskApi.java
@@ -22,47 +22,56 @@
 import java.util.concurrent.TimeUnit;
 
 import org.jclouds.concurrent.Timeout;
+import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
+import org.jclouds.vcloud.director.v1_5.domain.Link;
 import org.jclouds.vcloud.director.v1_5.domain.Task;
 import org.jclouds.vcloud.director.v1_5.domain.TasksList;
+import org.jclouds.vcloud.director.v1_5.domain.org.Org;
 
 /**
  * Provides synchronous access to {@link Task} objects.
  * 
  * @see TaskAsyncApi
- * @author grkvlt@apache.org
+ * @author grkvlt@apache.org, Adrian Cole
  */
 @Timeout(duration = 180, timeUnit = TimeUnit.SECONDS)
 public interface TaskApi {
 
    /**
     * Retrieves a list of tasks.
-    *
+    * 
     * <pre>
     * GET /tasksList/{id}
     * </pre>
     * 
-    * @param orgURI the URI of the organization
+    * @param tasksListUrn
+    *           from {@link Org#getLinks()} where {@link Link#getType} is
+    *           {@link VCloudDirectorMediaType#TASKS_LIST}
     * @return a list of tasks
     */
-   TasksList getTaskList(URI orgURI);
+   TasksList getTasksList(URI tasksListHref);
 
    /**
     * Retrieves a task.
-    *
+    * 
     * <pre>
     * GET /task/{id}
     * </pre>
     * 
     * @return the task or null if not found
     */
-   Task getTask(URI taskUri);
+   Task get(String taskUrn);
+
+   Task get(URI taskHref);
 
    /**
     * Cancels a task.
-    *
+    * 
     * <pre>
     * POST /task/{id}/action/cancel
     * </pre>
     */
-   void cancelTask(URI taskUri);
+   void cancel(String taskUrn);
+
+   void cancel(URI taskHref);
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/TaskAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/TaskAsyncApi.java
index ee112d5..e8f7a16 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/TaskAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/TaskAsyncApi.java
@@ -33,41 +33,59 @@
 import org.jclouds.vcloud.director.v1_5.domain.Task;
 import org.jclouds.vcloud.director.v1_5.domain.TasksList;
 import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
-import org.jclouds.vcloud.director.v1_5.functions.OrgReferenceToTaskListEndpoint;
+import org.jclouds.vcloud.director.v1_5.functions.href.TaskURNToHref;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
 /**
  * @see TaskApi
- * @author grkvlt@apache.org
+ * @author grkvlt@apache.org, Adrian Cole
  */
 @RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface TaskAsyncApi {
-
+   
    /**
-    * @see TaskApi#getTaskList(URISupplier)
+    * @see TaskApi#getTasksList(URI)
     */
    @GET
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<TasksList> getTaskList(@EndpointParam(parser = OrgReferenceToTaskListEndpoint.class) URI orgURI);
+   ListenableFuture<TasksList> getTasksList(@EndpointParam URI tasksListHref);
 
    /**
-    * @see TaskApi#getTask(URI)
+    * @see TaskApi#get(String)
     */
    @GET
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<Task> getTask(@EndpointParam URI taskURI);
-
+   ListenableFuture<Task> get(@EndpointParam(parser = TaskURNToHref.class) String taskUrn);
+   
    /**
-    * @see TaskApi#cancelTask(URI)
+    * @see TaskApi#get(URI)
+    */
+   @GET
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<Task> get(@EndpointParam URI taskURI);
+   
+   /**
+    * @see TaskApi#cancel(String)
     */
    @POST
    @Path("/action/cancel")
    @Consumes
    @JAXBResponseParser
-   ListenableFuture<Void> cancelTask(@EndpointParam URI taskURI);
+   ListenableFuture<Void> cancel(@EndpointParam(parser = TaskURNToHref.class) String taskUrn);
+   
+   /**
+    * @see TaskApi#cancel(URI)
+    */
+   @POST
+   @Path("/action/cancel")
+   @Consumes
+   @JAXBResponseParser
+   ListenableFuture<Void> cancel(@EndpointParam URI taskURI);
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppApi.java
index 5d8bbb0..00bb708 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppApi.java
@@ -25,6 +25,7 @@
 import org.jclouds.dmtf.ovf.NetworkSection;
 import org.jclouds.dmtf.ovf.StartupSection;
 import org.jclouds.rest.annotations.Delegate;
+import org.jclouds.rest.annotations.EndpointParam;
 import org.jclouds.vcloud.director.v1_5.domain.Metadata;
 import org.jclouds.vcloud.director.v1_5.domain.Owner;
 import org.jclouds.vcloud.director.v1_5.domain.ProductSectionList;
@@ -36,11 +37,12 @@
 import org.jclouds.vcloud.director.v1_5.domain.params.UndeployVAppParams;
 import org.jclouds.vcloud.director.v1_5.domain.section.LeaseSettingsSection;
 import org.jclouds.vcloud.director.v1_5.domain.section.NetworkConfigSection;
+import org.jclouds.vcloud.director.v1_5.functions.href.VAppURNToHref;
 
 /**
  * Provides synchronous access to {@link VApp} objects.
- *
- * @author grkvlt@apache.org
+ * 
+ * @author grkvlt@apache.org, Adrian Cole
  * @see VAppAsyncApi
  * @version 1.5
  */
@@ -49,390 +51,456 @@
 
    /**
     * Retrieves a {@link VApp}.
-    *
+    * 
     * The {@link VApp} could be in one of these statuses:
     * <ul>
-    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#FAILED_CREATION FAILED_CREATION(-1)} -
-    *    Transient entity state, e.g., model object is created but the corresponding VC backing does not
-    *		exist yet. This is further sub-categorized in the respective entities.
-    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#UNRESOLVED UNRESOLVED(0)} -
-    *		Entity is whole, e.g., VM creation is complete and all the required model objects and VC backings are
-    *		created.
-    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#RESOLVED RESOLVED(1)} -
-    *		Entity is resolved.
-    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#DEPLOYED DEPLOYED(2)} -
-    *		Entity is deployed.
-    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#SUSPENDED SUSPENDED(3)} -
-    *		All VMs of the vApp are suspended.
-    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#POWERED_ON POWERED_ON(4)} -
-    *		All VMs of the vApp are powered on.
-    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#WAITING_FOR_INPUT WAITING_FOR_INPUT(5)} -
-    *		VM is pending response on a question.
-    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#UNKNOWN UNKNOWN(6)} -
-    *		Entity state could not be retrieved from the inventory, e.g., VM power state is null.
-    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#UNRECOGNIZED UNRECOGNIZED(7)} -
-    *		Entity state was retrieved from the inventory but could not be mapped to an internal state.
-    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#POWERED_OFF POWERED_OFF(8)} -
-    *		All VMs of the vApp are powered off.
-    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#INCONSISTENT_STATE INCONSISTENT_STATE(9)} -
-    *		Apply to VM status, if a vm is {@code POWERED_ON}, or {@code WAITING_FOR_INPUT}, but is
-    *    undeployed, it is in an inconsistent state.
-    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#MIXED MIXED(10)} -
-    *		vApp status is set to {@code MIXED} when the VMs in the vApp are in different power states
+    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#FAILED_CREATION
+    * FAILED_CREATION(-1)} - Transient entity state, e.g., model object is addd but the
+    * corresponding VC backing does not exist yet. This is further sub-categorized in the respective
+    * entities.
+    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#UNRESOLVED
+    * UNRESOLVED(0)} - Entity is whole, e.g., VM creation is complete and all the required model
+    * objects and VC backings are created.
+    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#RESOLVED
+    * RESOLVED(1)} - Entity is resolved.
+    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#DEPLOYED
+    * DEPLOYED(2)} - Entity is deployed.
+    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#SUSPENDED
+    * SUSPENDED(3)} - All VMs of the vApp are suspended.
+    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#POWERED_ON
+    * POWERED_ON(4)} - All VMs of the vApp are powered on.
+    * <li>
+    * {@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#WAITING_FOR_INPUT
+    * WAITING_FOR_INPUT(5)} - VM is pending response on a question.
+    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#UNKNOWN
+    * UNKNOWN(6)} - Entity state could not be retrieved from the inventory, e.g., VM power state is
+    * null.
+    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#UNRECOGNIZED
+    * UNRECOGNIZED(7)} - Entity state was retrieved from the inventory but could not be mapped to an
+    * internal state.
+    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#POWERED_OFF
+    * POWERED_OFF(8)} - All VMs of the vApp are powered off.
+    * <li>
+    * {@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#INCONSISTENT_STATE
+    * INCONSISTENT_STATE(9)} - Apply to VM status, if a vm is {@code POWERED_ON}, or
+    * {@code WAITING_FOR_INPUT}, but is undeployed, it is in an inconsistent state.
+    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#MIXED MIXED(10)}
+    * - vApp status is set to {@code MIXED} when the VMs in the vApp are in different power states
     * </ul>
-    *
+    * 
     * <pre>
     * GET /vApp/{id}
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   VApp getVApp(URI vAppURI);
+   VApp get(String vAppUrn);
+
+   VApp get(URI vAppHref);
 
    /**
     * Modifies the name/description of a {@link VApp}.
-    *
+    * 
     * <pre>
     * PUT /vApp/{id}
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   Task modifyVApp(URI vAppURI, VApp vApp);
+   Task edit(String vAppUrn, VApp vApp);
+
+   Task edit(URI vAppHref, VApp vApp);
 
    /**
     * Deletes a {@link VApp}.
-    *
+    * 
     * <pre>
     * DELETE /vApp/{id}
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   Task deleteVApp(URI vAppURI);
+   Task remove(String vAppUrn);
+
+   Task remove(URI vAppHref);
 
    /**
     * Modifies the control access of a {@link VApp}.
-    *
+    * 
     * <pre>
     * POST /vApp/{id}/action/controlAccess
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   ControlAccessParams modifyControlAccess(URI vAppURI, ControlAccessParams params);
+   ControlAccessParams editControlAccess(String vAppUrn, ControlAccessParams params);
+
+   ControlAccessParams editControlAccess(URI vAppHref, ControlAccessParams params);
 
    /**
     * Deploys a {@link VApp}.
-    *
-    * Deployment means allocation of all resource for a vApp/VM like CPU and memory
-    * from a vDC resource pool. Deploying a vApp automatically deploys all of the
-    * virtual machines it contains. As of version 1.5 the operation supports force
-    * customization passed with {@link DeployVAppParamsType#setForceCustomization(Boolean)}
-    * parameter.
-    *
+    * 
+    * Deployment means allocation of all resource for a vApp/VM like CPU and memory from a vDC
+    * resource pool. Deploying a vApp automatically deploys all of the virtual machines it contains.
+    * As of version 1.5 the operation supports force customization passed with
+    * {@link DeployVAppParamsType#setForceCustomization(Boolean)} parameter.
+    * 
     * <pre>
     * POST /vApp/{id}/action/deploy
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   Task deploy(URI vAppURI, DeployVAppParams params);
+   Task deploy(String vAppUrn, DeployVAppParams params);
+
+   Task deploy(URI vAppHref, DeployVAppParams params);
 
    /**
     * Discard suspended state of a {@link VApp}.
-    *
-    * Discarding suspended state of a vApp automatically discarded suspended
-    * states of all of the virtual machines it contains.
-    *
+    * 
+    * Discarding suspended state of a vApp automatically discarded suspended states of all of the
+    * virtual machines it contains.
+    * 
     * <pre>
     * POST /vApp/{id}/action/discardSuspendedState
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   Task discardSuspendedState(URI vAppURI);
+   Task discardSuspendedState(String vAppUrn);
+
+   Task discardSuspendedState(URI vAppHref);
 
    /**
     * Place the {@link VApp} into maintenance mode.
-    *
-    * While in maintenance mode, a system admin can operate on the vApp as
-    * usual, but end users are restricted to read-only operations. Any
-    * user-initiated tasks running when the vApp enters maintenance mode will
-    * continue.
-    *
+    * 
+    * While in maintenance mode, a system admin can operate on the vApp as usual, but end users are
+    * restricted to read-only operations. Any user-initiated tasks running when the vApp enters
+    * maintenance mode will continue.
+    * 
     * <pre>
     * POST /vApp/{id}/action/enterMaintenanceMode
     * </pre>
-    *
+    * 
     * @since 1.5
     */
-   void enterMaintenanceMode(URI vAppURI);
+   void enterMaintenanceMode(String vAppUrn);
+
+   void enterMaintenanceMode(URI vAppHref);
 
    /**
     * Take the {@link VApp} out of maintenance mode.
-    *
+    * 
     * <pre>
     * POST /vApp/{id}/action/exitMaintenanceMode
     * </pre>
-    *
+    * 
     * @since 1.5
     */
-   void exitMaintenanceMode(URI vAppURI);
+   void exitMaintenanceMode(String vAppUrn);
+
+   void exitMaintenanceMode(URI vAppHref);
 
    /**
-    * Recompose a {@link VApp} by removing its own VMs and/or adding new ones from other
-    * vApps or vApp templates.
-    *
-    * To remove VMs you should put their references in elements. The way you add
-    * VMs is the same as described in compose vApp operation
-    * {@link VdcApi#composeVApp(URI, org.jclouds.vcloud.director.v1_5.domain.ComposeVAppParams)}.
-    * The status of vApp will be in {@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#UNRESOLVED}
-    * until the recompose task is finished.
-    *
+    * Recompose a {@link VApp} by removing its own VMs and/or adding new ones from other vApps or
+    * vApp templates.
+    * 
+    * To remove VMs you should put their references in elements. The way you add VMs is the same as
+    * described in compose vApp operation
+    * {@link VdcApi#composeVApp(String, org.jclouds.vcloud.director.v1_5.domain.ComposeVAppParams)}.
+    * The status of vApp will be in
+    * {@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#UNRESOLVED} until the
+    * recompose task is finished.
+    * 
     * <pre>
     * POST /vApp/{id}/action/recomposeVApp
     * </pre>
-    *
+    * 
     * @since 1.0
     */
-   Task recompose(URI vAppURI, RecomposeVAppParams params);
+   Task recompose(String vAppUrn, RecomposeVAppParams params);
+
+   Task recompose(URI vAppHref, RecomposeVAppParams params);
 
    /**
     * Undeploy a {@link VApp}.
-    *
-    * Undeployment means deallocation of all resources for a vApp/VM like CPU
-    * and memory from a vDC resource pool. Undeploying a vApp automatically
-    * undeploys all of the virtual machines it contains.
-    *
+    * 
+    * Undeployment means deallocation of all resources for a vApp/VM like CPU and memory from a vDC
+    * resource pool. Undeploying a vApp automatically undeploys all of the virtual machines it
+    * contains.
+    * 
     * <pre>
     * POST /vApp/{id}/action/undeploy
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   Task undeploy(URI vAppURI, UndeployVAppParams params);
+   Task undeploy(String vAppUrn, UndeployVAppParams params);
+
+   Task undeploy(URI vAppHref, UndeployVAppParams params);
 
    /**
     * Retrieves the control access information for a {@link VApp}.
-    *
-    * The vApp could be shared to everyone or could be shared to specific user,
-    * by modifying the control access values.
-    *
+    * 
+    * The vApp could be shared to everyone or could be shared to specific user, by editing the
+    * control access values.
+    * 
     * <pre>
     * GET /vApp/{id}/controlAccess
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   ControlAccessParams getControlAccess(URI vAppURI);
+   // TODO: revise
+   ControlAccessParams getAccessControl(String vAppUrn);
+
+   ControlAccessParams getAccessControl(URI vAppHref);
 
    /**
     * Powers off a {@link VApp}.
-    *
-    * If the operation is used over a vApp then all VMs are powered off. This operation is allowed only when the vApp/VM is powered on.
-    *
+    * 
+    * If the operation is used over a vApp then all VMs are powered off. This operation is allowed
+    * only when the vApp/VM is powered on.
+    * 
     * <pre>
     * POST /vApp/{id}/power/action/powerOff
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   Task powerOff(URI vAppURI);
+   Task powerOff(String vAppUrn);
+
+   Task powerOff(URI vAppHref);
 
    /**
     * Powers on a {@link VApp}.
-    *
-    * If the operation is used over a vApp then all VMs are powered on. This
-    * operation is allowed only when the vApp/VM is powered off.
-    *
+    * 
+    * If the operation is used over a vApp then all VMs are powered on. This operation is allowed
+    * only when the vApp/VM is powered off.
+    * 
     * <pre>
     * POST /vApp/{id}/power/action/powerOn
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   Task powerOn(URI vAppURI);
+   Task powerOn(String vAppUrn);
+
+   Task powerOn(URI vAppHref);
 
    /**
     * Reboots a {@link VApp}.
-    *
+    * 
     * The vApp/VM should be started in order to reboot it.
-    *
+    * 
     * <pre>
     * POST /vApp/{id}/power/action/reboot
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   Task reboot(URI vAppURI);
+   Task reboot(String vAppUrn);
+
+   Task reboot(URI vAppHref);
 
    /**
     * Resets a {@link VApp}.
-    *
-    * If the operation is used over a vApp then all VMs are reset. This
-    * operation is allowed only when the vApp/VM is powered on.
-    *
+    * 
+    * If the operation is used over a vApp then all VMs are reset. This operation is allowed only
+    * when the vApp/VM is powered on.
+    * 
     * <pre>
     * POST /vApp/{id}/power/action/reset
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   Task reset(URI vAppURI);
+   Task reset(String vAppUrn);
+
+   Task reset(URI vAppHref);
 
    /**
     * Shuts down a {@link VApp}.
-    *
-    * If the operation is used over a vApp then all VMs are shutdown. This
-    * operation is allowed only when the vApp/VM is powered on.
-    *
+    * 
+    * If the operation is used over a vApp then all VMs are shutdown. This operation is allowed only
+    * when the vApp/VM is powered on.
+    * 
     * <pre>
     * POST /vApp/{id}/power/action/shutdown
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   Task shutdown(URI vAppURI);
+   Task shutdown(String vAppUrn);
+
+   Task shutdown(URI vAppHref);
 
    /**
     * Suspends a {@link VApp}.
-    *
-    * If the operation is used over a vApp then all VMs are suspended. This
-    * operation is allowed only when the vApp/VM is powered on.
-    *
+    * 
+    * If the operation is used over a vApp then all VMs are suspended. This operation is allowed
+    * only when the vApp/VM is powered on.
+    * 
     * <pre>
     * POST /vApp/{id}/power/action/suspend
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   Task suspend(URI vAppURI);
+   Task suspend(String vAppUrn);
+
+   Task suspend(URI vAppHref);
 
    /**
     * Retrieves the lease settings section of a {@link VApp}.
-    *
+    * 
     * <pre>
     * GET /vApp/{id}/leaseSettingsSection
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   LeaseSettingsSection getLeaseSettingsSection(URI vAppURI);
+   LeaseSettingsSection getLeaseSettingsSection(String vAppUrn);
+
+   LeaseSettingsSection getLeaseSettingsSection(URI vAppHref);
 
    /**
     * Modifies the lease settings section of a {@link VApp}.
-    *
+    * 
     * <pre>
     * PUT /vApp/{id}/leaseSettingsSection
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   Task modifyLeaseSettingsSection(URI vAppURI, LeaseSettingsSection section);
+   Task editLeaseSettingsSection(String vAppUrn, LeaseSettingsSection section);
+
+   Task editLeaseSettingsSection(URI vAppHref, LeaseSettingsSection section);
 
    /**
     * Retrieves the network config section of a {@link VApp}.
-    *
+    * 
     * <pre>
     * GET /vApp/{id}/networkConfigSection
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   NetworkConfigSection getNetworkConfigSection(URI vAppURI);
+   NetworkConfigSection getNetworkConfigSection(String vAppUrn);
+
+   NetworkConfigSection getNetworkConfigSection(URI vAppHref);
 
    /**
     * Modifies the network config section of a {@link VApp}.
-    *
+    * 
     * <pre>
     * PUT /vApp/{id}/networkConfigSection
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   Task modifyNetworkConfigSection(URI vAppURI, NetworkConfigSection section);
+   Task editNetworkConfigSection(String vAppUrn, NetworkConfigSection section);
+
+   Task editNetworkConfigSection(URI vAppHref, NetworkConfigSection section);
 
    /**
     * Retrieves the network section of a {@link VApp}.
-    *
+    * 
     * <pre>
     * GET /vApp/{id}/networkSection
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   NetworkSection getNetworkSection(URI vAppURI);
+   NetworkSection getNetworkSection(String vAppUrn);
+
+   NetworkSection getNetworkSection(URI vAppHref);
 
    /**
     * Retrieves the owner of a {@link VApp}.
-    *
+    * 
     * <pre>
     * GET /vApp/{id}/owner
     * </pre>
-    *
+    * 
     * @since 1.5
     */
-   Owner getOwner(URI vAppURI);
+   Owner getOwner(String vAppUrn);
+
+   Owner getOwner(URI vAppHref);
 
    /**
     * Changes {@link VApp} owner.
-    *
+    * 
     * <pre>
     * PUT /vApp/{id}/owner
     * </pre>
-    *
+    * 
     * @since 1.5
     */
-   void modifyOwner(URI vAppURI, Owner owner);
+   void editOwner(String vAppUrn, Owner owner);
+
+   void editOwner(URI vAppHref, Owner owner);
 
    /**
     * Retrieves {@link VApp} product sections.
-    *
+    * 
     * <pre>
     * GET /vApp/{id}/productSections
     * </pre>
-    *
+    * 
     * @since 1.5
     */
-   ProductSectionList getProductSections(URI vAppURI);
+   ProductSectionList getProductSections(String vAppUrn);
+
+   ProductSectionList getProductSections(URI vAppHref);
 
    /**
     * Modifies the product section information of a {@link VApp}.
-    *
+    * 
     * <pre>
     * PUT /vApp/{id}/productSections
     * </pre>
-    *
+    * 
     * @since 1.5
     */
-   Task modifyProductSections(URI vAppURI, ProductSectionList sectionList);
+   Task editProductSections(String vAppUrn, ProductSectionList sectionList);
+
+   Task editProductSections(URI vAppHref, ProductSectionList sectionList);
 
    /**
     * Retrieves the startup section of a {@link VApp}.
-    *
+    * 
     * <pre>
     * GET /vApp/{id}/startupSection
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   StartupSection getStartupSection(URI vAppURI);
+   StartupSection getStartupSection(String vAppUrn);
+
+   StartupSection getStartupSection(URI vAppHref);
 
    /**
     * Modifies the startup section of a {@link VApp}.
-    *
+    * 
     * <pre>
     * PUT /vApp/{id}/startupSection
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   Task modifyStartupSection(URI vAppURI, StartupSection section);
+   Task editStartupSection(String vAppUrn, StartupSection section);
+
+   Task editStartupSection(URI vAppHref, StartupSection section);
 
    /**
     * Synchronous access to {@link VApp} {@link Metadata} features.
     */
    @Delegate
-   MetadataApi.Writeable getMetadataApi();
+   MetadataApi.Writeable getMetadataApi(@EndpointParam(parser = VAppURNToHref.class) String vAppUrn);
+
+   @Delegate
+   MetadataApi.Writeable getMetadataApi(@EndpointParam URI vAppHref);
+
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppAsyncApi.java
index ac3c112..a62bc84 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppAsyncApi.java
@@ -50,6 +50,7 @@
 import org.jclouds.rest.annotations.RequestFilters;
 import org.jclouds.rest.binders.BindToXMLPayload;
 import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
+import org.jclouds.vcloud.director.v1_5.domain.Metadata;
 import org.jclouds.vcloud.director.v1_5.domain.Owner;
 import org.jclouds.vcloud.director.v1_5.domain.ProductSectionList;
 import org.jclouds.vcloud.director.v1_5.domain.Task;
@@ -61,6 +62,7 @@
 import org.jclouds.vcloud.director.v1_5.domain.section.LeaseSettingsSection;
 import org.jclouds.vcloud.director.v1_5.domain.section.NetworkConfigSection;
 import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
+import org.jclouds.vcloud.director.v1_5.functions.href.VAppURNToHref;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -72,42 +74,320 @@
 public interface VAppAsyncApi {
 
    /**
-    * @see VAppApi#getVApp(URI)
+    * @see VAppApi#get(String)
     */
    @GET
    @Consumes(VAPP)
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<VApp> getVApp(@EndpointParam URI vAppURI);
+   ListenableFuture<VApp> get(@EndpointParam(parser = VAppURNToHref.class) String vAppUrn);
 
    /**
-    * @see VAppApi#modifyVApp(URI, VApp)
+    * @see VAppApi#edit(String, VApp)
     */
    @PUT
    @Produces(VAPP)
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> modifyVApp(@EndpointParam URI vAppURI,
-                                     @BinderParam(BindToXMLPayload.class) VApp vApp);
+   ListenableFuture<Task> edit(@EndpointParam(parser = VAppURNToHref.class) String vAppUrn,
+            @BinderParam(BindToXMLPayload.class) VApp vApp);
 
    /**
-    * @see VAppApi#deleteVApp(URI)
+    * @see VAppApi#remove(String)
     */
    @DELETE
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> deleteVApp(@EndpointParam URI vAppURI);
+   ListenableFuture<Task> remove(@EndpointParam(parser = VAppURNToHref.class) String vAppUrn);
 
    /**
-    * @see VAppApi#modifyControlAccess(URI, ControlAccessParams)
+    * @see VAppApi#editControlAccess(String, ControlAccessParams)
     */
    @POST
    @Path("/action/controlAccess")
    @Produces(CONTROL_ACCESS)
    @Consumes(CONTROL_ACCESS)
    @JAXBResponseParser
-   ListenableFuture<ControlAccessParams> modifyControlAccess(@EndpointParam URI vAppURI,
-                                                             @BinderParam(BindToXMLPayload.class) ControlAccessParams params);
+   ListenableFuture<ControlAccessParams> editControlAccess(@EndpointParam(parser = VAppURNToHref.class) String vAppUrn,
+            @BinderParam(BindToXMLPayload.class) ControlAccessParams params);
+
+   /**
+    * @see VAppApi#deploy(String, DeployVAppParams)
+    */
+   @POST
+   @Path("/action/deploy")
+   @Produces(DEPLOY_VAPP_PARAMS)
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> deploy(@EndpointParam(parser = VAppURNToHref.class) String vAppUrn,
+            @BinderParam(BindToXMLPayload.class) DeployVAppParams params);
+
+   /**
+    * @see VAppApi#discardSuspendedState(String)
+    */
+   @POST
+   @Path("/action/discardSuspendedState")
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> discardSuspendedState(@EndpointParam(parser = VAppURNToHref.class) String vAppUrn);
+
+   /**
+    * @see VAppApi#enterMaintenanceMode(String)
+    */
+   @POST
+   @Path("/action/enterMaintenanceMode")
+   @Consumes
+   @JAXBResponseParser
+   ListenableFuture<Void> enterMaintenanceMode(@EndpointParam(parser = VAppURNToHref.class) String vAppUrn);
+
+   /**
+    * @see VAppApi#exitMaintenanceMode(String)
+    */
+   @POST
+   @Path("/action/exitMaintenanceMode")
+   @Consumes
+   @JAXBResponseParser
+   ListenableFuture<Void> exitMaintenanceMode(@EndpointParam(parser = VAppURNToHref.class) String vAppUrn);
+
+   /**
+    * @see VAppApi#recompose(String, RecomposeVAppParams)
+    */
+   @POST
+   @Path("/action/recomposeVApp")
+   @Produces(RECOMPOSE_VAPP_PARAMS)
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> recompose(@EndpointParam(parser = VAppURNToHref.class) String vAppUrn,
+            @BinderParam(BindToXMLPayload.class) RecomposeVAppParams params);
+
+   /**
+    * @see VAppApi#undeploy(String, UndeployVAppParams)
+    */
+   @POST
+   @Path("/action/undeploy")
+   @Produces(UNDEPLOY_VAPP_PARAMS)
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> undeploy(@EndpointParam(parser = VAppURNToHref.class) String vAppUrn,
+            @BinderParam(BindToXMLPayload.class) UndeployVAppParams params);
+
+   /**
+    * @see VAppApi#getAccessControl(String)
+    */
+   @GET
+   @Path("/controlAccess")
+   @Consumes(CONTROL_ACCESS)
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<ControlAccessParams> getAccessControl(@EndpointParam(parser = VAppURNToHref.class) String vAppUrn);
+
+   /**
+    * @see VAppApi#powerOff(String)
+    */
+   @POST
+   @Path("/power/action/powerOff")
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> powerOff(@EndpointParam(parser = VAppURNToHref.class) String vAppUrn);
+
+   /**
+    * @see VAppApi#powerOn(String)
+    */
+   @POST
+   @Path("/power/action/powerOn")
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> powerOn(@EndpointParam(parser = VAppURNToHref.class) String vAppUrn);
+
+   /**
+    * @see VAppApi#reboot(String)
+    */
+   @POST
+   @Path("/power/action/powerOff")
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> reboot(@EndpointParam(parser = VAppURNToHref.class) String vAppUrn);
+
+   /**
+    * @see VAppApi#reset(String)
+    */
+   @POST
+   @Path("/power/action/reset")
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> reset(@EndpointParam(parser = VAppURNToHref.class) String vAppUrn);
+
+   /**
+    * @see VAppApi#shutdown(String)
+    */
+   @POST
+   @Path("/power/action/shutdown")
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> shutdown(@EndpointParam(parser = VAppURNToHref.class) String vAppUrn);
+
+   /**
+    * @see VAppApi#suspend(String)
+    */
+   @POST
+   @Path("/power/action/suspend")
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> suspend(@EndpointParam(parser = VAppURNToHref.class) String vAppUrn);
+
+   /**
+    * @see VAppApi#getLeaseSettingsSection(String)
+    */
+   @GET
+   @Path("/leaseSettingsSection")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<LeaseSettingsSection> getLeaseSettingsSection(
+            @EndpointParam(parser = VAppURNToHref.class) String vAppUrn);
+
+   /**
+    * @see VAppApi#editLeaseSettingsSection(String, LeaseSettingsSection)
+    */
+   @PUT
+   @Path("/leaseSettingsSection")
+   @Produces(LEASE_SETTINGS_SECTION)
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> editLeaseSettingsSection(@EndpointParam(parser = VAppURNToHref.class) String vAppUrn,
+            @BinderParam(BindToXMLPayload.class) LeaseSettingsSection section);
+
+   /**
+    * @see VAppApi#getNetworkConfigSection(String)
+    */
+   @GET
+   @Path("/networkConfigSection")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<NetworkConfigSection> getNetworkConfigSection(
+            @EndpointParam(parser = VAppURNToHref.class) String vAppUrn);
+
+   /**
+    * @see VAppApi#editNetworkConfigSection(String, NetworkConfigSection)
+    */
+   @PUT
+   @Path("/networkConfigSection")
+   @Produces(NETWORK_CONFIG_SECTION)
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> editNetworkConfigSection(@EndpointParam(parser = VAppURNToHref.class) String vAppUrn,
+            @BinderParam(BindToXMLPayload.class) NetworkConfigSection section);
+
+   /**
+    * @see VAppApi#getNetworkSection(String)
+    */
+   @GET
+   @Path("/networkSection")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<NetworkSection> getNetworkSection(@EndpointParam(parser = VAppURNToHref.class) String vAppUrn);
+
+   /**
+    * @see VAppApi#getOwner(String)
+    */
+   @GET
+   @Path("/owner")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<Owner> getOwner(@EndpointParam(parser = VAppURNToHref.class) String vAppUrn);
+
+   /**
+    * @see VAppApi#editOwner(String, Owner)
+    */
+   @PUT
+   @Path("/owner")
+   @Produces(OWNER)
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Void> editOwner(@EndpointParam(parser = VAppURNToHref.class) String vAppUrn,
+            @BinderParam(BindToXMLPayload.class) Owner owner);
+
+   /**
+    * @see VAppApi#getProductSections(String)
+    */
+   @GET
+   @Path("/productSections")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<ProductSectionList> getProductSections(@EndpointParam(parser = VAppURNToHref.class) String vAppUrn);
+
+   /**
+    * @see VAppApi#editProductSections(String, ProductSectionList)
+    */
+   @PUT
+   @Path("/productSections")
+   @Produces(PRODUCT_SECTION_LIST)
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> editProductSections(@EndpointParam(parser = VAppURNToHref.class) String vAppUrn,
+            @BinderParam(BindToXMLPayload.class) ProductSectionList sectionList);
+
+   /**
+    * @see VAppApi#getStartupSection(String)
+    */
+   @GET
+   @Path("/startupSection")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<StartupSection> getStartupSection(@EndpointParam(parser = VAppURNToHref.class) String vAppUrn);
+
+   /**
+    * @see VAppApi#editStartupSection(String, StartupSection)
+    */
+   @PUT
+   @Path("/startupSection")
+   @Produces(STARTUP_SECTION)
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> editStartupSection(@EndpointParam(parser = VAppURNToHref.class) String vAppUrn,
+            @BinderParam(BindToXMLPayload.class) StartupSection section);
+
+   /**
+    * @see VAppApi#get(URI)
+    */
+   @GET
+   @Consumes(VAPP)
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<VApp> get(@EndpointParam URI vAppHref);
+
+   /**
+    * @see VAppApi#edit(URI, VApp)
+    */
+   @PUT
+   @Produces(VAPP)
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> edit(@EndpointParam URI vAppHref, @BinderParam(BindToXMLPayload.class) VApp vApp);
+
+   /**
+    * @see VAppApi#remove(URI)
+    */
+   @DELETE
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> remove(@EndpointParam URI vAppHref);
+
+   /**
+    * @see VAppApi#editControlAccess(URI, ControlAccessParams)
+    */
+   @POST
+   @Path("/action/controlAccess")
+   @Produces(CONTROL_ACCESS)
+   @Consumes(CONTROL_ACCESS)
+   @JAXBResponseParser
+   ListenableFuture<ControlAccessParams> editControlAccess(@EndpointParam URI vAppHref,
+            @BinderParam(BindToXMLPayload.class) ControlAccessParams params);
 
    /**
     * @see VAppApi#deploy(URI, DeployVAppParams)
@@ -117,8 +397,8 @@
    @Produces(DEPLOY_VAPP_PARAMS)
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> deploy(@EndpointParam URI vAppURI,
-                                 @BinderParam(BindToXMLPayload.class) DeployVAppParams params);
+   ListenableFuture<Task> deploy(@EndpointParam URI vAppHref,
+            @BinderParam(BindToXMLPayload.class) DeployVAppParams params);
 
    /**
     * @see VAppApi#discardSuspendedState(URI)
@@ -127,7 +407,7 @@
    @Path("/action/discardSuspendedState")
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> discardSuspendedState(@EndpointParam URI vAppURI);
+   ListenableFuture<Task> discardSuspendedState(@EndpointParam URI vAppHref);
 
    /**
     * @see VAppApi#enterMaintenanceMode(URI)
@@ -136,7 +416,7 @@
    @Path("/action/enterMaintenanceMode")
    @Consumes
    @JAXBResponseParser
-   ListenableFuture<Void> enterMaintenanceMode(@EndpointParam URI vAppURI);
+   ListenableFuture<Void> enterMaintenanceMode(@EndpointParam URI vAppHref);
 
    /**
     * @see VAppApi#exitMaintenanceMode(URI)
@@ -145,7 +425,7 @@
    @Path("/action/exitMaintenanceMode")
    @Consumes
    @JAXBResponseParser
-   ListenableFuture<Void> exitMaintenanceMode(@EndpointParam URI vAppURI);
+   ListenableFuture<Void> exitMaintenanceMode(@EndpointParam URI vAppHref);
 
    /**
     * @see VAppApi#recompose(URI, RecomposeVAppParams)
@@ -155,8 +435,8 @@
    @Produces(RECOMPOSE_VAPP_PARAMS)
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> recompose(@EndpointParam URI vAppURI,
-                                    @BinderParam(BindToXMLPayload.class) RecomposeVAppParams params);
+   ListenableFuture<Task> recompose(@EndpointParam URI vAppHref,
+            @BinderParam(BindToXMLPayload.class) RecomposeVAppParams params);
 
    /**
     * @see VAppApi#undeploy(URI, UndeployVAppParams)
@@ -166,18 +446,18 @@
    @Produces(UNDEPLOY_VAPP_PARAMS)
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> undeploy(@EndpointParam URI vAppURI,
-                                   @BinderParam(BindToXMLPayload.class) UndeployVAppParams params);
+   ListenableFuture<Task> undeploy(@EndpointParam URI vAppHref,
+            @BinderParam(BindToXMLPayload.class) UndeployVAppParams params);
 
    /**
-    * @see VAppApi#getControlAccess(URI)
+    * @see VAppApi#getAccessControl(URI)
     */
    @GET
    @Path("/controlAccess")
    @Consumes(CONTROL_ACCESS)
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<ControlAccessParams> getControlAccess(@EndpointParam URI vAppURI);
+   ListenableFuture<ControlAccessParams> getAccessControl(@EndpointParam URI vAppHref);
 
    /**
     * @see VAppApi#powerOff(URI)
@@ -186,7 +466,7 @@
    @Path("/power/action/powerOff")
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> powerOff(@EndpointParam URI vAppURI);
+   ListenableFuture<Task> powerOff(@EndpointParam URI vAppHref);
 
    /**
     * @see VAppApi#powerOn(URI)
@@ -195,7 +475,7 @@
    @Path("/power/action/powerOn")
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> powerOn(@EndpointParam URI vAppURI);
+   ListenableFuture<Task> powerOn(@EndpointParam URI vAppHref);
 
    /**
     * @see VAppApi#reboot(URI)
@@ -204,7 +484,7 @@
    @Path("/power/action/powerOff")
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> reboot(@EndpointParam URI vAppURI);
+   ListenableFuture<Task> reboot(@EndpointParam URI vAppHref);
 
    /**
     * @see VAppApi#reset(URI)
@@ -213,7 +493,7 @@
    @Path("/power/action/reset")
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> reset(@EndpointParam URI vAppURI);
+   ListenableFuture<Task> reset(@EndpointParam URI vAppHref);
 
    /**
     * @see VAppApi#shutdown(URI)
@@ -222,7 +502,7 @@
    @Path("/power/action/shutdown")
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> shutdown(@EndpointParam URI vAppURI);
+   ListenableFuture<Task> shutdown(@EndpointParam URI vAppHref);
 
    /**
     * @see VAppApi#suspend(URI)
@@ -231,7 +511,7 @@
    @Path("/power/action/suspend")
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> suspend(@EndpointParam URI vAppURI);
+   ListenableFuture<Task> suspend(@EndpointParam URI vAppHref);
 
    /**
     * @see VAppApi#getLeaseSettingsSection(URI)
@@ -241,18 +521,18 @@
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<LeaseSettingsSection> getLeaseSettingsSection(@EndpointParam URI vAppURI);
+   ListenableFuture<LeaseSettingsSection> getLeaseSettingsSection(@EndpointParam URI vAppHref);
 
    /**
-    * @see VAppApi#modifyLeaseSettingsSection(URI, LeaseSettingsSection)
+    * @see VAppApi#editLeaseSettingsSection(URI, LeaseSettingsSection)
     */
    @PUT
    @Path("/leaseSettingsSection")
    @Produces(LEASE_SETTINGS_SECTION)
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> modifyLeaseSettingsSection(@EndpointParam URI vAppURI,
-                                                     @BinderParam(BindToXMLPayload.class) LeaseSettingsSection section);
+   ListenableFuture<Task> editLeaseSettingsSection(@EndpointParam URI vAppHref,
+            @BinderParam(BindToXMLPayload.class) LeaseSettingsSection section);
 
    /**
     * @see VAppApi#getNetworkConfigSection(URI)
@@ -262,18 +542,18 @@
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<NetworkConfigSection> getNetworkConfigSection(@EndpointParam URI vAppURI);
+   ListenableFuture<NetworkConfigSection> getNetworkConfigSection(@EndpointParam URI vAppHref);
 
    /**
-    * @see VAppApi#modifyNetworkConfigSection(URI, NetworkConfigSection)
+    * @see VAppApi#editNetworkConfigSection(URI, NetworkConfigSection)
     */
    @PUT
    @Path("/networkConfigSection")
    @Produces(NETWORK_CONFIG_SECTION)
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> modifyNetworkConfigSection(@EndpointParam URI vAppURI,
-                                                     @BinderParam(BindToXMLPayload.class) NetworkConfigSection section);
+   ListenableFuture<Task> editNetworkConfigSection(@EndpointParam URI vAppHref,
+            @BinderParam(BindToXMLPayload.class) NetworkConfigSection section);
 
    /**
     * @see VAppApi#getNetworkSection(URI)
@@ -283,7 +563,7 @@
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<NetworkSection> getNetworkSection(@EndpointParam URI vAppURI);
+   ListenableFuture<NetworkSection> getNetworkSection(@EndpointParam URI vAppHref);
 
    /**
     * @see VAppApi#getOwner(URI)
@@ -293,18 +573,17 @@
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<Owner> getOwner(@EndpointParam URI vAppURI);
+   ListenableFuture<Owner> getOwner(@EndpointParam URI vAppHref);
 
    /**
-    * @see VAppApi#modifyOwner(URI, Owner)
+    * @see VAppApi#editOwner(URI, Owner)
     */
    @PUT
    @Path("/owner")
    @Produces(OWNER)
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Void> modifyOwner(@EndpointParam URI vAppURI,
-                                      @BinderParam(BindToXMLPayload.class) Owner owner);
+   ListenableFuture<Void> editOwner(@EndpointParam URI vAppHref, @BinderParam(BindToXMLPayload.class) Owner owner);
 
    /**
     * @see VAppApi#getProductSections(URI)
@@ -314,19 +593,18 @@
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<ProductSectionList> getProductSections(@EndpointParam URI vAppURI);
+   ListenableFuture<ProductSectionList> getProductSections(@EndpointParam URI vAppHref);
 
    /**
-    * @see VAppApi#modifyProductSections(URI, ProductSectionList)
+    * @see VAppApi#editProductSections(URI, ProductSectionList)
     */
    @PUT
    @Path("/productSections")
    @Produces(PRODUCT_SECTION_LIST)
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> modifyProductSections(@EndpointParam URI vAppURI,
-                                                @BinderParam(BindToXMLPayload.class) ProductSectionList sectionList);
-
+   ListenableFuture<Task> editProductSections(@EndpointParam URI vAppHref,
+            @BinderParam(BindToXMLPayload.class) ProductSectionList sectionList);
 
    /**
     * @see VAppApi#getStartupSection(URI)
@@ -336,22 +614,26 @@
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<StartupSection> getStartupSection(@EndpointParam URI vAppURI);
+   ListenableFuture<StartupSection> getStartupSection(@EndpointParam URI vAppHref);
 
    /**
-    * @see VAppApi#modifyStartupSection(URI, StartupSection)
+    * @see VAppApi#editStartupSection(URI, StartupSection)
     */
    @PUT
    @Path("/startupSection")
    @Produces(STARTUP_SECTION)
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> modifyStartupSection(@EndpointParam URI vAppURI,
-                                               @BinderParam(BindToXMLPayload.class) StartupSection section);
+   ListenableFuture<Task> editStartupSection(@EndpointParam URI vAppHref,
+            @BinderParam(BindToXMLPayload.class) StartupSection section);
 
    /**
     * Asynchronous access to {@link VApp} {@link Metadata} features
     */
    @Delegate
-   MetadataAsyncApi.Writeable getMetadataApi();
+   MetadataAsyncApi.Writeable getMetadataApi(@EndpointParam(parser = VAppURNToHref.class) String vAppUrn);
+
+   @Delegate
+   MetadataAsyncApi.Writeable getMetadataApi(@EndpointParam URI vAppHref);
+
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateApi.java
index 38df0a4..5e962be 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateApi.java
@@ -24,56 +24,63 @@
 import org.jclouds.concurrent.Timeout;
 import org.jclouds.dmtf.ovf.NetworkSection;
 import org.jclouds.rest.annotations.Delegate;
+import org.jclouds.rest.annotations.EndpointParam;
+import org.jclouds.vcloud.director.v1_5.domain.Metadata;
 import org.jclouds.vcloud.director.v1_5.domain.Owner;
 import org.jclouds.vcloud.director.v1_5.domain.ProductSectionList;
 import org.jclouds.vcloud.director.v1_5.domain.References;
 import org.jclouds.vcloud.director.v1_5.domain.Task;
 import org.jclouds.vcloud.director.v1_5.domain.VAppTemplate;
 import org.jclouds.vcloud.director.v1_5.domain.dmtf.Envelope;
-import org.jclouds.vcloud.director.v1_5.domain.params.RelocateParams;
 import org.jclouds.vcloud.director.v1_5.domain.section.CustomizationSection;
-import org.jclouds.vcloud.director.v1_5.domain.section.GuestCustomizationSection;
 import org.jclouds.vcloud.director.v1_5.domain.section.LeaseSettingsSection;
 import org.jclouds.vcloud.director.v1_5.domain.section.NetworkConfigSection;
-import org.jclouds.vcloud.director.v1_5.domain.section.NetworkConnectionSection;
+import org.jclouds.vcloud.director.v1_5.functions.href.VAppTemplateURNToHref;
 
 /**
  * Provides synchronous access to {@link VAppTemplate} objects.
  * 
- * @author Adam Lowe
- * @see org.jclouds.vcloud.director.v1_5.features.VAppTemplateAsyncApi
+ * @author Adam Lowe, Adrian Cole
+ * @see VAppTemplateAsyncApi
  */
 @Timeout(duration = 180, timeUnit = TimeUnit.SECONDS)
 public interface VAppTemplateApi {
 
    /**
     * Retrieves a vApp template (can be used also to retrieve a VM from a vApp Template).
-    *
+    * 
     * The vApp could be in one of these statues:
     * <ul>
-    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#FAILED_CREATION FAILED_CREATION(-1)} -
-    *    Transient entity state, e.g., model object is created but the corresponding VC backing does not exist yet. This
-    *    is further sub-categorized in the respective entities.
-    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#UNRESOLVED UNRESOLVED(0)} -
-    *    Entity is whole, e.g., VM creation is complete and all the required model objects and VC backings are created.
-    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#RESOLVED RESOLVED(1)} -
-    *    Entity is resolved.
-    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#UNKNOWN UNKNOWN(6)} -
-    *    Entity state could not be retrieved from the inventory, e.g., VM power state is null.
-    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#POWERED_OFF POWERED_OFF(8)} -
-    *    All VMs of the vApp template are powered off.
-    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#MIXED MIXED(10)} -
-    *    vApp template status is set to {@code MIXED} when the VMs in the vApp are in different power states.
+    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#FAILED_CREATION
+    * FAILED_CREATION(-1)} - Transient entity state, e.g., model object is addd but the
+    * corresponding VC backing does not exist yet. This is further sub-categorized in the respective
+    * entities.
+    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#UNRESOLVED
+    * UNRESOLVED(0)} - Entity is whole, e.g., VM creation is complete and all the required model
+    * objects and VC backings are addd.
+    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#RESOLVED
+    * RESOLVED(1)} - Entity is resolved.
+    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#UNKNOWN
+    * UNKNOWN(6)} - Entity state could not be retrieved from the inventory, e.g., VM power state is
+    * null.
+    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#POWERED_OFF
+    * POWERED_OFF(8)} - All VMs of the vApp template are powered off.
+    * <li>{@link org.jclouds.vcloud.director.v1_5.domain.ResourceEntityType.Status#MIXED MIXED(10)}
+    * - vApp template status is set to {@code MIXED} when the VMs in the vApp are in different power
+    * states.
     * </ul>
     * 
     * <pre>
     * GET /vAppTemplate/{id}
     * </pre>
     * 
-    * @param templateUri the URI of the template
+    * @param templateUrn
+    *           the String of the template
     * @return the requested template
     */
-   VAppTemplate getVAppTemplate(URI templateUri);
+   VAppTemplate get(String templateUrn);
+
+   VAppTemplate get(URI templateHref);
 
    /**
     * Modifies only the name/description of a vApp template.
@@ -82,12 +89,16 @@
     * PUT /vAppTemplate/{id}
     * </pre>
     * 
-    * @param templateUri the URI of the template
-    * @param template the template containing the new name and/or description
-    * @return the task performing the action. This operation is asynchronous and the user should monitor the returned
-    *         task status in order to check when it is completed.
+    * @param templateUrn
+    *           the String of the template
+    * @param template
+    *           the template containing the new name and/or description
+    * @return the task performing the action. This operation is asynchronous and the user should
+    *         monitor the returned task status in order to check when it is completed.
     */
-   Task modifyVAppTemplate(URI templateUri, VAppTemplate template);
+   Task edit(String templateUrn, VAppTemplate template);
+
+   Task edit(URI templateHref, VAppTemplate template);
 
    /**
     * Deletes a vApp template.
@@ -96,24 +107,14 @@
     * DELETE /vAppTemplate/{id}
     * </pre>
     * 
-    * @param templateUri the URI of the template
-    * @return the task performing the action. This operation is asynchronous and the user should monitor the returned
-    *         task status in order to check when it is completed.
+    * @param templateUrn
+    *           the String of the template
+    * @return the task performing the action. This operation is asynchronous and the user should
+    *         monitor the returned task status in order to check when it is completed.
     */
-   Task deleteVappTemplate(URI templateUri);
+   Task remove(String templateUrn);
 
-   /**
-    * Consolidates a VM
-    * 
-    * <pre>
-    * POST /vAppTemplate/{id}/action/consolidate
-    * </pre>
-    * 
-    * @param templateUri the URI of the template
-    * @return the task performing the action. This operation is asynchronous and the user should monitor the returned
-    *         task status in order to check when it is completed.
-    */
-   Task consolidateVm(URI templateUri);
+   Task remove(URI templateHref);
 
    /**
     * Disables the download link to the ovf of a vApp template.
@@ -122,9 +123,12 @@
     * POST /vAppTemplate/{id}/action/disableDownload
     * </pre>
     * 
-    * @param templateUri the URI of the template
+    * @param templateUrn
+    *           the String of the template
     */
-   void disableDownload(URI templateUri);
+   void disableDownload(String templateUrn);
+
+   void disableDownload(URI templateHref);
 
    /**
     * Enables downloading of the ovf of a vApp template.
@@ -133,25 +137,14 @@
     * POST /vAppTemplate/{id}/action/enableDownload
     * </pre>
     * 
-    * @param templateUri the URI of the template
-    * @return the task performing the action. This operation is asynchronous and the user should monitor the returned
-    *         task status in order to check when it is completed.
+    * @param templateUrn
+    *           the String of the template
+    * @return the task performing the action. This operation is asynchronous and the user should
+    *         monitor the returned task status in order to check when it is completed.
     */
-   Task enableDownload(URI templateUri);
+   Task enableDownload(String templateUrn);
 
-   /**
-    * Relocates a virtual machine in a vApp template to a different datastore.
-    * 
-    * <pre>
-    * POST /vAppTemplate/{id}/action/relocate
-    * </pre>
-    * 
-    * @param templateUri the URI of the template
-    * @param params contains the reference to the new datastore
-    * @return the task performing the action. This operation is asynchronous and the user should monitor the returned
-    *         task status in order to check when it is completed.
-    */
-   Task relocateVm(URI templateUri, RelocateParams params);
+   Task enableDownload(URI templateHref);
 
    /**
     * Retrieves the customization section of a vApp template.
@@ -160,36 +153,13 @@
     * GET /vAppTemplate/{id}/customizationSection
     * </pre>
     * 
-    * @param templateUri the URI of the template
+    * @param templateUrn
+    *           the String of the template
     * @return the customization section
     */
-   CustomizationSection getCustomizationSection(URI templateUri);
+   CustomizationSection getCustomizationSection(String templateUrn);
 
-   /**
-    * Retrieves the Guest Customization Section of a VM
-    * 
-    * <pre>
-    * GET /vAppTemplate/{id}/guestCustomizationSection
-    * </pre>
-    * 
-    * @param templateUri the URI of the template
-    * @return the guest customization section
-    */
-   GuestCustomizationSection getGuestCustomizationSection(URI templateUri);
-
-   /**
-    * Modifies the guest customization options of a VM.
-    * 
-    * <pre>
-    * PUT /vAppTemplate/{id}/guestCustomizationSection
-    * </pre>
-    * 
-    * @param templateUri the URI of the template
-    * @param section the new configuration to apply
-    * @return the task performing the action. This operation is asynchronous and the user should monitor the returned
-    *         task status in order to check when it is completed.
-    */
-   Task modifyGuestCustomizationSection(URI templateUri, GuestCustomizationSection section);
+   CustomizationSection getCustomizationSection(URI templateHref);
 
    /**
     * Retrieves the lease settings section of a vApp or vApp template
@@ -198,10 +168,13 @@
     * GET /vAppTemplate/{id}/leaseSettingsSection
     * </pre>
     * 
-    * @param templateUri the URI of the template
+    * @param templateUrn
+    *           the String of the template
     * @return the lease settings
     */
-   LeaseSettingsSection getLeaseSettingsSection(URI templateUri);
+   LeaseSettingsSection getLeaseSettingsSection(String templateUrn);
+
+   LeaseSettingsSection getLeaseSettingsSection(URI templateHref);
 
    /**
     * Modifies the lease settings section of a vApp or vApp template.
@@ -210,12 +183,16 @@
     * PUT /vAppTemplate/{id}/leaseSettingsSection
     * </pre>
     * 
-    * @param templateUri the URI of the template
-    * @param section the new configuration to apply
-    * @return the task performing the action. This operation is asynchronous and the user should monitor the returned
-    *         task status in order to check when it is completed.
+    * @param templateUrn
+    *           the String of the template
+    * @param section
+    *           the new configuration to apply
+    * @return the task performing the action. This operation is asynchronous and the user should
+    *         monitor the returned task status in order to check when it is completed.
     */
-   Task modifyLeaseSettingsSection(URI templateUri, LeaseSettingsSection section);
+   Task editLeaseSettingsSection(String templateUrn, LeaseSettingsSection section);
+
+   Task editLeaseSettingsSection(URI templateHref, LeaseSettingsSection section);
 
    /**
     * Retrieves the network config section of a vApp or vApp template.
@@ -224,22 +201,13 @@
     * GET /vAppTemplate/{id}/networkConfigSection
     * </pre>
     * 
-    * @param templateUri the URI of the template
+    * @param templateUrn
+    *           the String of the template
     * @return the network config section requested
     */
-   NetworkConfigSection getNetworkConfigSection(URI templateUri);
+   NetworkConfigSection getNetworkConfigSection(String templateUrn);
 
-   /**
-    * Retrieves the network connection section of a VM
-    * 
-    * <pre>
-    * GET /vAppTemplate/{id}/networkConnectionSection
-    * </pre>
-    * 
-    * @param templateUri the URI of the template
-    * @return the network connection section requested
-    */
-   NetworkConnectionSection getNetworkConnectionSection(URI templateUri);
+   NetworkConfigSection getNetworkConfigSection(URI templateHref);
 
    /**
     * Retrieves the network section of a vApp or vApp template.
@@ -248,26 +216,32 @@
     * GET /vAppTemplate/{id}/networkSection
     * </pre>
     * 
-    * @param templateUri the URI of the template
+    * @param templateUrn
+    *           the String of the template
     * @return the network section requested
     */
-   NetworkSection getNetworkSection(URI templateUri);
+   NetworkSection getNetworkSection(String templateUrn);
+
+   NetworkSection getNetworkSection(URI templateHref);
 
    /**
     * Retrieves an OVF descriptor of a vApp template.
-    *
-    * This OVF represents the vApp template as it is, with all vCloud specific information (like mac address, parent
-    * networks, etc). The OVF which could be downloaded by enabling for download will not contain this information.
-    * There are no specific states bound to this entity.
+    * 
+    * This OVF represents the vApp template as it is, with all vCloud specific information (like mac
+    * address, parent networks, etc). The OVF which could be downloaded by enabling for download
+    * will not contain this information. There are no specific states bound to this entity.
     * 
     * <pre>
     * GET /vAppTemplate/{id}/ovf
     * </pre>
     * 
-    * @param templateUri the URI of the template
+    * @param templateUrn
+    *           the String of the template
     * @return the ovf envelope
     */
-   Envelope getOvf(URI templateUri);
+   Envelope getOvf(String templateUrn);
+
+   Envelope getOvf(URI templateHref);
 
    /**
     * Retrieves vApp template owner.
@@ -276,10 +250,13 @@
     * GET /vAppTemplate/{id}/owner
     * </pre>
     * 
-    * @param templateUri the URI of the template
+    * @param templateUrn
+    *           the String of the template
     * @return the owner of the vApp template
     */
-   Owner getOwner(URI templateUri);
+   Owner getOwner(String templateUrn);
+
+   Owner getOwner(URI templateHref);
 
    /**
     * Retrieves VAppTemplate/VM product sections
@@ -288,10 +265,13 @@
     * GET /vAppTemplate/{id}/productSections
     * </pre>
     * 
-    * @param templateUri the URI of the template
+    * @param templateUrn
+    *           the String of the template
     * @return the product sections
     */
-   ProductSectionList getProductSections(URI templateUri);
+   ProductSectionList getProductSections(String templateUrn);
+
+   ProductSectionList getProductSections(URI templateHref);
 
    /**
     * Modifies the product sections of a vApp or vApp template.
@@ -300,25 +280,35 @@
     * PUT /vAppTemplate/{id}/productSections
     * </pre>
     * 
-    * @param templateUri the URI of the template
-    * @return the task performing the action. This operation is asynchronous and the user should monitor the returned
-    *         task status in order to check when it is completed.
+    * @param templateUrn
+    *           the String of the template
+    * @return the task performing the action. This operation is asynchronous and the user should
+    *         monitor the returned task status in order to check when it is completed.
     */
-   Task modifyProductSections(URI templateUri, ProductSectionList sections);
+   Task editProductSections(String templateUrn, ProductSectionList sections);
+
+   Task editProductSections(URI templateHref, ProductSectionList sections);
 
    /**
     * <pre>
     * GET /vAppTemplate/{id}/shadowVms
     * </pre>
     * 
-    * @param templateUri the URI of the template
+    * @param templateUrn
+    *           the String of the template
     * @return shadowVM references
     */
-   References getShadowVms(URI templateUri);
+   References getShadowVms(String templateUrn);
+
+   References getShadowVms(URI templateHref);
 
    /**
     * @return synchronous access to {@link Metadata} features
     */
    @Delegate
-   MetadataApi.Writeable getMetadataApi();
+   MetadataApi.Writeable getMetadataApi(@EndpointParam(parser = VAppTemplateURNToHref.class) String templateUrn);
+
+   @Delegate
+   MetadataApi.Writeable getMetadataApi(@EndpointParam URI templateHref);
+
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateAsyncApi.java
index ff643b0..9804c3b 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateAsyncApi.java
@@ -19,14 +19,11 @@
 package org.jclouds.vcloud.director.v1_5.features;
 
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.CUSTOMIZATION_SECTION;
-import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.GUEST_CUSTOMIZATION_SECTION;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.LEASE_SETTINGS_SECTION;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.NETWORK_CONFIG_SECTION;
-import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.NETWORK_CONNECTION_SECTION;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.NETWORK_SECTION;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.OWNER;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.PRODUCT_SECTION_LIST;
-import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.RELOCATE_TEMPLATE;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.TASK;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.VAPP_TEMPLATE;
 
@@ -49,65 +46,206 @@
 import org.jclouds.rest.annotations.RequestFilters;
 import org.jclouds.rest.binders.BindToXMLPayload;
 import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
+import org.jclouds.vcloud.director.v1_5.domain.Metadata;
 import org.jclouds.vcloud.director.v1_5.domain.Owner;
 import org.jclouds.vcloud.director.v1_5.domain.ProductSectionList;
 import org.jclouds.vcloud.director.v1_5.domain.References;
 import org.jclouds.vcloud.director.v1_5.domain.Task;
 import org.jclouds.vcloud.director.v1_5.domain.VAppTemplate;
 import org.jclouds.vcloud.director.v1_5.domain.dmtf.Envelope;
-import org.jclouds.vcloud.director.v1_5.domain.params.RelocateParams;
 import org.jclouds.vcloud.director.v1_5.domain.section.CustomizationSection;
-import org.jclouds.vcloud.director.v1_5.domain.section.GuestCustomizationSection;
 import org.jclouds.vcloud.director.v1_5.domain.section.LeaseSettingsSection;
 import org.jclouds.vcloud.director.v1_5.domain.section.NetworkConfigSection;
-import org.jclouds.vcloud.director.v1_5.domain.section.NetworkConnectionSection;
 import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
+import org.jclouds.vcloud.director.v1_5.functions.href.VAppTemplateURNToHref;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
 /**
- * @author Adam Lowe
- * @see org.jclouds.vcloud.director.v1_5.features.VAppTemplateApi
+ * @author Adam Lowe, Adrian Cole
+ * @see VAppTemplateApi
  */
 @RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface VAppTemplateAsyncApi {
 
    /**
-    * @see VAppTemplateApi#getVAppTemplate(URI)
+    * @see VAppTemplateApi#get(String)
     */
    @GET
    @Consumes(VAPP_TEMPLATE)
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<VAppTemplate> getVAppTemplate(@EndpointParam URI reference);
-
+   ListenableFuture<VAppTemplate> get(@EndpointParam(parser = VAppTemplateURNToHref.class) String reference);
 
    /**
-    * @see VAppTemplateApi#modifyVAppTemplate(URI, VAppTemplate)
+    * @see VAppTemplateApi#edit(String, VAppTemplate)
     */
    @PUT
    @Produces(VAPP_TEMPLATE)
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> modifyVAppTemplate(@EndpointParam URI templateURI,
-                                             @BinderParam(BindToXMLPayload.class) VAppTemplate template);
+   ListenableFuture<Task> edit(@EndpointParam(parser = VAppTemplateURNToHref.class) String templateUrn,
+            @BinderParam(BindToXMLPayload.class) VAppTemplate template);
 
    /**
-    * @see VAppTemplateApi#deleteVappTemplate(URI)
+    * @see VAppTemplateApi#remove(String)
     */
    @DELETE
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> deleteVappTemplate(@EndpointParam URI templateUri);
+   ListenableFuture<Task> remove(@EndpointParam String templateUri);
 
    /**
-    * @see VAppTemplateApi#consolidateVm(URI)
+    * @see VAppTemplateApi#disableDownload(String)
+    */
+   @POST
+   @Path("/action/disableDownload")
+   @JAXBResponseParser
+   ListenableFuture<Void> disableDownload(@EndpointParam(parser = VAppTemplateURNToHref.class) String templateUrn);
+
+   /**
+    * @see VAppTemplateApi#enableDownload(String)
     */
    @POST
    @Consumes(TASK)
-   @Path("/action/consolidate")
+   @Path("/action/enableDownload")
    @JAXBResponseParser
-   ListenableFuture<Task> consolidateVm(@EndpointParam URI templateURI);
+   ListenableFuture<Task> enableDownload(@EndpointParam(parser = VAppTemplateURNToHref.class) String templateUrn);
+
+   /**
+    * @see VAppTemplateApi#getCustomizationSection(String)
+    */
+   @GET
+   @Consumes(CUSTOMIZATION_SECTION)
+   @Path("/customizationSection")
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<CustomizationSection> getCustomizationSection(
+            @EndpointParam(parser = VAppTemplateURNToHref.class) String templateUrn);
+
+   /**
+    * @see VAppTemplateApi#getLeaseSettingsSection(String)
+    */
+   @GET
+   @Consumes(LEASE_SETTINGS_SECTION)
+   @Path("/leaseSettingsSection")
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<LeaseSettingsSection> getLeaseSettingsSection(
+            @EndpointParam(parser = VAppTemplateURNToHref.class) String templateUrn);
+
+   /**
+    * @see VAppTemplateApi#editLeaseSettingsSection(String, LeaseSettingsSection)
+    */
+   @PUT
+   @Produces(LEASE_SETTINGS_SECTION)
+   @Consumes(TASK)
+   @Path("/leaseSettingsSection")
+   @JAXBResponseParser
+   ListenableFuture<Task> editLeaseSettingsSection(
+            @EndpointParam(parser = VAppTemplateURNToHref.class) String templateUrn,
+            @BinderParam(BindToXMLPayload.class) LeaseSettingsSection settingsSection);
+
+   /**
+    * @see VAppTemplateApi#getNetworkConfigSection(String)
+    */
+   @GET
+   @Consumes(NETWORK_CONFIG_SECTION)
+   @Path("/networkConfigSection")
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<NetworkConfigSection> getNetworkConfigSection(
+            @EndpointParam(parser = VAppTemplateURNToHref.class) String templateUrn);
+
+   /**
+    * @see VAppTemplateApi#getNetworkSection(String)
+    */
+   @GET
+   @Consumes(NETWORK_SECTION)
+   @Path("/networkSection")
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<NetworkSection> getNetworkSection(
+            @EndpointParam(parser = VAppTemplateURNToHref.class) String templateUrn);
+
+   /**
+    * @see VAppTemplateApi#getOvf(String)
+    */
+   @GET
+   @Consumes
+   @Path("/ovf")
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<Envelope> getOvf(@EndpointParam(parser = VAppTemplateURNToHref.class) String templateUrn);
+
+   /**
+    * @see VAppTemplateApi#getOwnerOfVAppTemplate(String)
+    */
+   @GET
+   @Consumes(OWNER)
+   @Path("/owner")
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<Owner> getOwner(@EndpointParam(parser = VAppTemplateURNToHref.class) String templateUrn);
+
+   /**
+    * @see VAppTemplateApi#getProductSectionsForVAppTemplate(String)
+    */
+   @GET
+   @Consumes(PRODUCT_SECTION_LIST)
+   @Path("/productSections")
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<ProductSectionList> getProductSections(
+            @EndpointParam(parser = VAppTemplateURNToHref.class) String templateUrn);
+
+   /**
+    * @see VAppTemplateApi#editProductSections(String, ProductSectionList)
+    */
+   @PUT
+   @Produces(PRODUCT_SECTION_LIST)
+   @Consumes(TASK)
+   @Path("/productSections")
+   @JAXBResponseParser
+   ListenableFuture<Task> editProductSections(@EndpointParam(parser = VAppTemplateURNToHref.class) String templateUrn,
+            @BinderParam(BindToXMLPayload.class) ProductSectionList sections);
+
+   /**
+    * @see VAppTemplateApi#getShadowVms(String)
+    */
+   @GET
+   @Consumes
+   @Path("/shadowVms")
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<References> getShadowVms(@EndpointParam(parser = VAppTemplateURNToHref.class) String templateUrn);
+
+   /**
+    * @see VAppTemplateApi#get(URI)
+    */
+   @GET
+   @Consumes(VAPP_TEMPLATE)
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<VAppTemplate> get(@EndpointParam URI reference);
+
+   /**
+    * @see VAppTemplateApi#edit(URI, VAppTemplate)
+    */
+   @PUT
+   @Produces(VAPP_TEMPLATE)
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> edit(@EndpointParam URI templateHref,
+            @BinderParam(BindToXMLPayload.class) VAppTemplate template);
+
+   /**
+    * @see VAppTemplateApi#remove(URI)
+    */
+   @DELETE
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> remove(@EndpointParam URI templateUri);
 
    /**
     * @see VAppTemplateApi#disableDownload(URI)
@@ -115,27 +253,16 @@
    @POST
    @Path("/action/disableDownload")
    @JAXBResponseParser
-   ListenableFuture<Void> disableDownload(@EndpointParam URI templateURI);
+   ListenableFuture<Void> disableDownload(@EndpointParam URI templateHref);
 
    /**
-    * @see VAppTemplateApi#enableDownloadVappTemplate(URI)
+    * @see VAppTemplateApi#enableDownload(URI)
     */
    @POST
    @Consumes(TASK)
    @Path("/action/enableDownload")
    @JAXBResponseParser
-   ListenableFuture<Task> enableDownload(@EndpointParam URI templateURI);
-
-   /**
-    * @see VAppTemplateApi#relocateVm(URI, RelocateParams)
-    */
-   @POST
-   @Produces(RELOCATE_TEMPLATE)
-   @Consumes(TASK)
-   @Path("/action/relocate")
-   @JAXBResponseParser
-   ListenableFuture<Task> relocateVm(@EndpointParam URI templateURI,
-                                     @BinderParam(BindToXMLPayload.class) RelocateParams params);
+   ListenableFuture<Task> enableDownload(@EndpointParam URI templateHref);
 
    /**
     * @see VAppTemplateApi#getCustomizationSection(URI)
@@ -145,28 +272,7 @@
    @Path("/customizationSection")
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<CustomizationSection> getCustomizationSection(@EndpointParam URI templateURI);
-
-   /**
-    * @see VAppTemplateApi#getGuestCustomizationSection(URI)
-    */
-   @GET
-   @Consumes(GUEST_CUSTOMIZATION_SECTION)
-   @Path("/guestCustomizationSection")
-   @JAXBResponseParser
-   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<GuestCustomizationSection> getGuestCustomizationSection(@EndpointParam URI templateURI);
-
-   /**
-    * @see VAppTemplateApi#modifyGuestCustomizationSection(URI, org.jclouds.vcloud.director.v1_5.domain.GuestCustomizationSection)
-    */
-   @PUT
-   @Produces(GUEST_CUSTOMIZATION_SECTION)
-   @Consumes(TASK)
-   @Path("/guestCustomizationSection")
-   @JAXBResponseParser
-   ListenableFuture<Task> modifyGuestCustomizationSection(@EndpointParam URI templateURI,
-                                                          @BinderParam(BindToXMLPayload.class) GuestCustomizationSection section);
+   ListenableFuture<CustomizationSection> getCustomizationSection(@EndpointParam URI templateHref);
 
    /**
     * @see VAppTemplateApi#getLeaseSettingsSection(URI)
@@ -176,28 +282,18 @@
    @Path("/leaseSettingsSection")
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<LeaseSettingsSection> getLeaseSettingsSection(@EndpointParam URI templateURI);
+   ListenableFuture<LeaseSettingsSection> getLeaseSettingsSection(@EndpointParam URI templateHref);
 
    /**
-    * @see VAppTemplateApi#modifyLeaseSettingsSection(URI, LeaseSettingsSection)
+    * @see VAppTemplateApi#editLeaseSettingsSection(URI, LeaseSettingsSection)
     */
    @PUT
    @Produces(LEASE_SETTINGS_SECTION)
    @Consumes(TASK)
    @Path("/leaseSettingsSection")
    @JAXBResponseParser
-   ListenableFuture<Task> modifyLeaseSettingsSection(@EndpointParam URI templateURI,
-                                                     @BinderParam(BindToXMLPayload.class) LeaseSettingsSection settingsSection);
-
-   /**
-    * @see VAppTemplateApi#getNetworkConnectionSection(URI)
-    */
-   @GET
-   @Consumes(NETWORK_CONNECTION_SECTION)
-   @Path("/networkConnectionSection")
-   @JAXBResponseParser
-   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<NetworkConnectionSection> getNetworkConnectionSection(@EndpointParam URI templateURI);
+   ListenableFuture<Task> editLeaseSettingsSection(@EndpointParam URI templateHref,
+            @BinderParam(BindToXMLPayload.class) LeaseSettingsSection settingsSection);
 
    /**
     * @see VAppTemplateApi#getNetworkConfigSection(URI)
@@ -207,17 +303,7 @@
    @Path("/networkConfigSection")
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<NetworkConfigSection> getNetworkConfigSection(@EndpointParam URI templateURI);
-
-   /**
-    * @see VAppTemplateApi#getNetworkConnectionSection(URI)
-    */
-   @GET
-   @Consumes(NETWORK_CONNECTION_SECTION)
-   @Path("/networkConnectionSection")
-   @JAXBResponseParser
-   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<NetworkConnectionSection> getVAppTemplateNetworkConnectionSection(@EndpointParam URI templateURI);
+   ListenableFuture<NetworkConfigSection> getNetworkConfigSection(@EndpointParam URI templateHref);
 
    /**
     * @see VAppTemplateApi#getNetworkSection(URI)
@@ -227,7 +313,7 @@
    @Path("/networkSection")
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<NetworkSection> getNetworkSection(@EndpointParam URI templateURI);
+   ListenableFuture<NetworkSection> getNetworkSection(@EndpointParam URI templateHref);
 
    /**
     * @see VAppTemplateApi#getOvf(URI)
@@ -237,7 +323,7 @@
    @Path("/ovf")
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<Envelope> getOvf(@EndpointParam URI templateURI);
+   ListenableFuture<Envelope> getOvf(@EndpointParam URI templateHref);
 
    /**
     * @see VAppTemplateApi#getOwnerOfVAppTemplate(URI)
@@ -247,7 +333,7 @@
    @Path("/owner")
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<Owner> getOwner(@EndpointParam URI templateURI);
+   ListenableFuture<Owner> getOwner(@EndpointParam URI templateHref);
 
    /**
     * @see VAppTemplateApi#getProductSectionsForVAppTemplate(URI)
@@ -257,19 +343,19 @@
    @Path("/productSections")
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<ProductSectionList> getProductSections(@EndpointParam URI templateURI);
+   ListenableFuture<ProductSectionList> getProductSections(@EndpointParam URI templateHref);
 
    /**
-    * @see VAppTemplateApi#modifyProductSections(URI, ProductSectionList)
+    * @see VAppTemplateApi#editProductSections(URI, ProductSectionList)
     */
    @PUT
    @Produces(PRODUCT_SECTION_LIST)
    @Consumes(TASK)
    @Path("/productSections")
    @JAXBResponseParser
-   ListenableFuture<Task> modifyProductSections(@EndpointParam URI templateURI,
-                                                @BinderParam(BindToXMLPayload.class) ProductSectionList sections);
-   
+   ListenableFuture<Task> editProductSections(@EndpointParam URI templateHref,
+            @BinderParam(BindToXMLPayload.class) ProductSectionList sections);
+
    /**
     * @see VAppTemplateApi#getShadowVms(URI)
     */
@@ -278,11 +364,15 @@
    @Path("/shadowVms")
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<References> getShadowVms(@EndpointParam URI templateURI);
+   ListenableFuture<References> getShadowVms(@EndpointParam URI templateHref);
 
    /**
     * @return asynchronous access to {@link Metadata} features
     */
    @Delegate
-   MetadataAsyncApi.Writeable getMetadataApi();
+   MetadataAsyncApi.Writeable getMetadataApi(@EndpointParam(parser = VAppTemplateURNToHref.class) String templateUrn);
+
+   @Delegate
+   MetadataAsyncApi.Writeable getMetadataApi(@EndpointParam URI templateHref);
+
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VdcApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VdcApi.java
index 5a04955..1c680fd 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VdcApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VdcApi.java
@@ -23,6 +23,7 @@
 
 import org.jclouds.concurrent.Timeout;
 import org.jclouds.rest.annotations.Delegate;
+import org.jclouds.rest.annotations.EndpointParam;
 import org.jclouds.vcloud.director.v1_5.domain.Media;
 import org.jclouds.vcloud.director.v1_5.domain.Metadata;
 import org.jclouds.vcloud.director.v1_5.domain.VApp;
@@ -35,13 +36,13 @@
 import org.jclouds.vcloud.director.v1_5.domain.params.ComposeVAppParams;
 import org.jclouds.vcloud.director.v1_5.domain.params.InstantiateVAppParams;
 import org.jclouds.vcloud.director.v1_5.domain.params.UploadVAppTemplateParams;
+import org.jclouds.vcloud.director.v1_5.functions.href.VdcURNToHref;
 
 /**
  * Provides synchronous access to a vDC.
  * 
  * @see VdcAsyncApi
- * @see <a href= "http://support.theenterprisecloud.com/kb/default.asp?id=984&Lang=1&SID=" />
- * @author danikov
+ * @author danikov, Adrian Cole
  */
 @Timeout(duration = 180, timeUnit = TimeUnit.SECONDS)
 public interface VdcApi {
@@ -51,7 +52,9 @@
     * 
     * @return the vdc or null if not found
     */
-   Vdc getVdc(URI vdcUri);
+   Vdc get(String vdcUrn);
+   
+   Vdc get(URI vdcHref);
    
    /**
     * Captures a vApp into vApp template.
@@ -63,8 +66,10 @@
     * @return a VApp resource which will contain a task. The user should should wait for this task to finish to be able
     *         to use the vApp.
     */
-   VAppTemplate captureVApp(URI vdcUri, CaptureVAppParams params);
+   VAppTemplate captureVApp(String vdcUrn, CaptureVAppParams params);
    
+   VAppTemplate captureVApp(URI vdcHref, CaptureVAppParams params);
+
    /**
     * Clones a media into new one.
     *
@@ -75,8 +80,10 @@
     * @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 cloneMedia(URI vdcUri, CloneMediaParams params);
+   Media cloneMedia(String vdcUrn, CloneMediaParams params);
    
+   Media cloneMedia(URI vdcHref, CloneMediaParams params);
+
    /**
     * Clones a vApp into new one.
     *
@@ -86,8 +93,10 @@
     * @return a VApp resource which will contain a task. The user should should wait for this task to finish to be able
     *         to use the vApp.
     */
-   VApp cloneVApp(URI vdcUri, CloneVAppParams params);
+   VApp cloneVApp(String vdcUrn, CloneVAppParams params);
    
+   VApp cloneVApp(URI vdcHref, CloneVAppParams params);
+
    /**
     * Clones a vApp template into new one.
     *
@@ -98,8 +107,10 @@
     * @return a VAppTemplate resource which will contain a task. The user should should wait for this task to finish to
     *         be able to use the VAppTemplate.
     */
-   VAppTemplate cloneVAppTemplate(URI vdcUri, CloneVAppTemplateParams params);
+   VAppTemplate cloneVAppTemplate(String vdcUrn, CloneVAppTemplateParams params);
    
+   VAppTemplate cloneVAppTemplate(URI vdcHref, CloneVAppTemplateParams params);
+
    /**
     * Composes a new vApp using VMs from other vApps or vApp templates.
     *
@@ -130,8 +141,10 @@
     * @return a VApp resource which will contain a task. The user should should wait for this task to finish to be able
     *         to use the vApp.
     */
-   VApp composeVApp(URI vdcUri, ComposeVAppParams params);
+   VApp composeVApp(String vdcUrn, ComposeVAppParams params);
    
+   VApp composeVApp(URI vdcHref, ComposeVAppParams params);
+
    /**
     * Instantiate a vApp template into a new vApp.
     *
@@ -145,8 +158,10 @@
     * @return a VApp resource which will contain a task. The user should should wait for this task to finish to be able
     *         to use the vApp.
     */
-   VApp instantiateVApp(URI vdcUri, InstantiateVAppParams params);
+   VApp instantiateVApp(String vdcUrn, InstantiateVAppParams params);
    
+   VApp instantiateVApp(URI vdcHref, InstantiateVAppParams params);
+
    /**
     * Uploading vApp template to a vDC.
     *
@@ -166,18 +181,26 @@
     * @return a VAppTemplate resource which will contain a task. The user should should wait for this task to finish to
     *         be able to use the VAppTemplate.
     */
-   VAppTemplate uploadVAppTemplate(URI vdcUri, UploadVAppTemplateParams params);
+   VAppTemplate uploadVAppTemplate(String vdcUrn, UploadVAppTemplateParams params);
    
+   VAppTemplate uploadVAppTemplate(URI vdcHref, UploadVAppTemplateParams params);
+
    /**
     * Creates a media (and present upload link for the floppy/iso file).
     * 
     * @return The response will return a link to transfer site to be able to continue with uploading the media.
     */
-   Media createMedia(URI vdcUri, Media media);
+   Media addMedia(String vdcUrn, Media media);
    
+   Media addMedia(URI vdcHref, Media media);
+
    /**
     * @return synchronous access to {@link Metadata.Readable} features
     */
    @Delegate
-   MetadataApi.Readable getMetadataApi();
+   MetadataApi.Readable getMetadataApi(@EndpointParam(parser = VdcURNToHref.class) String vdcUrn);
+
+   @Delegate
+   MetadataApi.Readable getMetadataApi(@EndpointParam URI vdcHref);
+
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VdcAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VdcAsyncApi.java
index 9e0cdaa..221fc78 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VdcAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VdcAsyncApi.java
@@ -36,6 +36,7 @@
 import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
 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.Metadata;
 import org.jclouds.vcloud.director.v1_5.domain.VApp;
 import org.jclouds.vcloud.director.v1_5.domain.VAppTemplate;
 import org.jclouds.vcloud.director.v1_5.domain.Vdc;
@@ -47,25 +48,124 @@
 import org.jclouds.vcloud.director.v1_5.domain.params.InstantiateVAppParams;
 import org.jclouds.vcloud.director.v1_5.domain.params.UploadVAppTemplateParams;
 import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
+import org.jclouds.vcloud.director.v1_5.functions.href.VdcURNToHref;
 
 import com.google.common.util.concurrent.ListenableFuture;
- 
+
 /**
  * @see VdcApi
- * @author danikov
+ * @author danikov, Adrian Cole
  */
 @RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface VdcAsyncApi {
- 
+
    /**
-    * @see VdcApi#getVdc(URI)
+    * @see VdcApi#get(String)
     */
    @GET
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<? extends Vdc> getVdc(@EndpointParam URI vdcURI);
-   
+   ListenableFuture<? extends Vdc> get(@EndpointParam(parser = VdcURNToHref.class) String vdcUrn);
+
+   /**
+    * @see VdcApi#captureVApp(String, CaptureVAppParams)
+    */
+   @POST
+   @Path("/action/captureVApp")
+   @Consumes(VCloudDirectorMediaType.VAPP_TEMPLATE)
+   @Produces(VCloudDirectorMediaType.CAPTURE_VAPP_PARAMS)
+   @JAXBResponseParser
+   ListenableFuture<VAppTemplate> captureVApp(@EndpointParam(parser = VdcURNToHref.class) String vdcUrn,
+            @BinderParam(BindToXMLPayload.class) CaptureVAppParams params);
+
+   /**
+    * @see VdcApi#cloneMedia(String, CloneMediaParams)
+    */
+   @POST
+   @Path("/action/cloneMedia")
+   @Consumes(VCloudDirectorMediaType.MEDIA)
+   @Produces(VCloudDirectorMediaType.CLONE_MEDIA_PARAMS)
+   @JAXBResponseParser
+   ListenableFuture<Media> cloneMedia(@EndpointParam(parser = VdcURNToHref.class) String vdcUrn,
+            @BinderParam(BindToXMLPayload.class) CloneMediaParams params);
+
+   /**
+    * @see VdcApi#cloneVApp(String, CloneVAppParams)
+    */
+   @POST
+   @Path("/action/cloneVApp")
+   @Consumes(VCloudDirectorMediaType.VAPP)
+   @Produces(VCloudDirectorMediaType.CLONE_VAPP_PARAMS)
+   // TODO fix these etc.
+   @JAXBResponseParser
+   ListenableFuture<VApp> cloneVApp(@EndpointParam(parser = VdcURNToHref.class) String vdcUrn,
+            @BinderParam(BindToXMLPayload.class) CloneVAppParams params);
+
+   /**
+    * @see VdcApi#cloneVAppTemplate(String, CloneVAppTemplateParams)
+    */
+   @POST
+   @Path("/action/cloneVAppTemplate")
+   @Consumes(VCloudDirectorMediaType.VAPP_TEMPLATE)
+   @Produces(VCloudDirectorMediaType.CLONE_VAPP_TEMPLATE_PARAMS)
+   @JAXBResponseParser
+   ListenableFuture<VAppTemplate> cloneVAppTemplate(@EndpointParam(parser = VdcURNToHref.class) String vdcUrn,
+            @BinderParam(BindToXMLPayload.class) CloneVAppTemplateParams params);
+
+   /**
+    * @see VdcApi#composeVApp(String, ComposeVAppParams)
+    */
+   @POST
+   @Path("/action/composeVApp")
+   @Consumes(VCloudDirectorMediaType.VAPP)
+   @Produces(VCloudDirectorMediaType.COMPOSE_VAPP_PARAMS)
+   @JAXBResponseParser
+   ListenableFuture<VApp> composeVApp(@EndpointParam(parser = VdcURNToHref.class) String vdcUrn,
+            @BinderParam(BindToXMLPayload.class) ComposeVAppParams params);
+
+   /**
+    * @see VdcApi#instantiateVApp(String, InstantiateVAppParamsType)
+    */
+   @POST
+   @Path("/action/instantiateVAppTemplate")
+   @Consumes(VCloudDirectorMediaType.VAPP)
+   @Produces(VCloudDirectorMediaType.INSTANTIATE_VAPP_TEMPLATE_PARAMS)
+   @JAXBResponseParser
+   ListenableFuture<VApp> instantiateVApp(@EndpointParam(parser = VdcURNToHref.class) String vdcUrn,
+            @BinderParam(BindToXMLPayload.class) InstantiateVAppParams params);
+
+   /**
+    * @see VdcApi#uploadVAppTemplate(String, UploadVAppTemplateParams)
+    */
+   @POST
+   @Path("/action/uploadVAppTemplate")
+   @Consumes(VCloudDirectorMediaType.VAPP_TEMPLATE)
+   @Produces(VCloudDirectorMediaType.UPLOAD_VAPP_TEMPLATE_PARAMS)
+   @JAXBResponseParser
+   ListenableFuture<VAppTemplate> uploadVAppTemplate(@EndpointParam(parser = VdcURNToHref.class) String vdcUrn,
+            @BinderParam(BindToXMLPayload.class) UploadVAppTemplateParams params);
+
+   /**
+    * @see VdcApi#addMedia(String, Media)
+    */
+   @POST
+   @Path("/media")
+   @Consumes(VCloudDirectorMediaType.MEDIA)
+   @Produces(VCloudDirectorMediaType.MEDIA)
+   @JAXBResponseParser
+   ListenableFuture<Media> addMedia(@EndpointParam(parser = VdcURNToHref.class) String vdcUrn,
+            @BinderParam(BindToXMLPayload.class) Media media);
+
+   /**
+    * @see VdcApi#get(URI)
+    */
+   @GET
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<? extends Vdc> get(@EndpointParam URI vdcHref);
+
    /**
     * @see VdcApi#captureVApp(URI, CaptureVAppParams)
     */
@@ -74,9 +174,9 @@
    @Consumes(VCloudDirectorMediaType.VAPP_TEMPLATE)
    @Produces(VCloudDirectorMediaType.CAPTURE_VAPP_PARAMS)
    @JAXBResponseParser
-   ListenableFuture<VAppTemplate> captureVApp(@EndpointParam URI vdcURI,
-         @BinderParam(BindToXMLPayload.class) CaptureVAppParams params);
-   
+   ListenableFuture<VAppTemplate> captureVApp(@EndpointParam URI vdcHref,
+            @BinderParam(BindToXMLPayload.class) CaptureVAppParams params);
+
    /**
     * @see VdcApi#cloneMedia(URI, CloneMediaParams)
     */
@@ -85,20 +185,21 @@
    @Consumes(VCloudDirectorMediaType.MEDIA)
    @Produces(VCloudDirectorMediaType.CLONE_MEDIA_PARAMS)
    @JAXBResponseParser
-   ListenableFuture<Media> cloneMedia(@EndpointParam URI vdcURI,
-         @BinderParam(BindToXMLPayload.class) CloneMediaParams params);
-   
+   ListenableFuture<Media> cloneMedia(@EndpointParam URI vdcHref,
+            @BinderParam(BindToXMLPayload.class) CloneMediaParams params);
+
    /**
     * @see VdcApi#cloneVApp(URI, CloneVAppParams)
     */
    @POST
    @Path("/action/cloneVApp")
    @Consumes(VCloudDirectorMediaType.VAPP)
-   @Produces(VCloudDirectorMediaType.CLONE_VAPP_PARAMS) //TODO fix these etc.
+   @Produces(VCloudDirectorMediaType.CLONE_VAPP_PARAMS)
+   // TODO fix these etc.
    @JAXBResponseParser
-   ListenableFuture<VApp> cloneVApp(@EndpointParam URI vdcURI,
-         @BinderParam(BindToXMLPayload.class) CloneVAppParams params);
-   
+   ListenableFuture<VApp> cloneVApp(@EndpointParam URI vdcHref,
+            @BinderParam(BindToXMLPayload.class) CloneVAppParams params);
+
    /**
     * @see VdcApi#cloneVAppTemplate(URI, CloneVAppTemplateParams)
     */
@@ -107,9 +208,9 @@
    @Consumes(VCloudDirectorMediaType.VAPP_TEMPLATE)
    @Produces(VCloudDirectorMediaType.CLONE_VAPP_TEMPLATE_PARAMS)
    @JAXBResponseParser
-   ListenableFuture<VAppTemplate> cloneVAppTemplate(@EndpointParam URI vdcURI,
-         @BinderParam(BindToXMLPayload.class) CloneVAppTemplateParams params);
-   
+   ListenableFuture<VAppTemplate> cloneVAppTemplate(@EndpointParam URI vdcHref,
+            @BinderParam(BindToXMLPayload.class) CloneVAppTemplateParams params);
+
    /**
     * @see VdcApi#composeVApp(URI, ComposeVAppParams)
     */
@@ -118,9 +219,9 @@
    @Consumes(VCloudDirectorMediaType.VAPP)
    @Produces(VCloudDirectorMediaType.COMPOSE_VAPP_PARAMS)
    @JAXBResponseParser
-   ListenableFuture<VApp> composeVApp(@EndpointParam URI vdcURI,
-         @BinderParam(BindToXMLPayload.class) ComposeVAppParams params);
-   
+   ListenableFuture<VApp> composeVApp(@EndpointParam URI vdcHref,
+            @BinderParam(BindToXMLPayload.class) ComposeVAppParams params);
+
    /**
     * @see VdcApi#instantiateVApp(URI, InstantiateVAppParamsType)
     */
@@ -129,9 +230,9 @@
    @Consumes(VCloudDirectorMediaType.VAPP)
    @Produces(VCloudDirectorMediaType.INSTANTIATE_VAPP_TEMPLATE_PARAMS)
    @JAXBResponseParser
-   ListenableFuture<VApp> instantiateVApp(@EndpointParam URI vdcURI,
-         @BinderParam(BindToXMLPayload.class) InstantiateVAppParams params);
-   
+   ListenableFuture<VApp> instantiateVApp(@EndpointParam URI vdcHref,
+            @BinderParam(BindToXMLPayload.class) InstantiateVAppParams params);
+
    /**
     * @see VdcApi#uploadVAppTemplate(URI, UploadVAppTemplateParams)
     */
@@ -140,24 +241,26 @@
    @Consumes(VCloudDirectorMediaType.VAPP_TEMPLATE)
    @Produces(VCloudDirectorMediaType.UPLOAD_VAPP_TEMPLATE_PARAMS)
    @JAXBResponseParser
-   ListenableFuture<VAppTemplate> uploadVAppTemplate(@EndpointParam URI vdcURI,
-         @BinderParam(BindToXMLPayload.class) UploadVAppTemplateParams params);
-   
+   ListenableFuture<VAppTemplate> uploadVAppTemplate(@EndpointParam URI vdcHref,
+            @BinderParam(BindToXMLPayload.class) UploadVAppTemplateParams params);
+
    /**
-    * @see VdcApi#createMedia(URI, Media)
+    * @see VdcApi#addMedia(URI, Media)
     */
    @POST
    @Path("/media")
    @Consumes(VCloudDirectorMediaType.MEDIA)
    @Produces(VCloudDirectorMediaType.MEDIA)
    @JAXBResponseParser
-   ListenableFuture<Media> createMedia(@EndpointParam URI vdcURI,
-         @BinderParam(BindToXMLPayload.class) Media media);
-    
+   ListenableFuture<Media> addMedia(@EndpointParam URI vdcHref, @BinderParam(BindToXMLPayload.class) Media media);
+
    /**
     * @return asynchronous access to {@link Metadata.Readable} features
     */
    @Delegate
-   MetadataAsyncApi.Readable getMetadataApi();
-    
+   MetadataAsyncApi.Readable getMetadataApi(@EndpointParam(parser = VdcURNToHref.class) String vdcUrn);
+
+   @Delegate
+   MetadataAsyncApi.Readable getMetadataApi(@EndpointParam URI vdcHref);
+
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VmApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VmApi.java
index ba213cd..afbd3b4 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VmApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VmApi.java
@@ -23,6 +23,8 @@
 
 import org.jclouds.concurrent.Timeout;
 import org.jclouds.rest.annotations.Delegate;
+import org.jclouds.rest.annotations.EndpointParam;
+import org.jclouds.vcloud.director.v1_5.domain.Metadata;
 import org.jclouds.vcloud.director.v1_5.domain.ProductSectionList;
 import org.jclouds.vcloud.director.v1_5.domain.RasdItemsList;
 import org.jclouds.vcloud.director.v1_5.domain.ScreenTicket;
@@ -41,11 +43,12 @@
 import org.jclouds.vcloud.director.v1_5.domain.section.OperatingSystemSection;
 import org.jclouds.vcloud.director.v1_5.domain.section.RuntimeInfoSection;
 import org.jclouds.vcloud.director.v1_5.domain.section.VirtualHardwareSection;
+import org.jclouds.vcloud.director.v1_5.functions.href.VmURNToHref;
 
 /**
  * Provides synchronous access to {@link Vm} objects.
- *
- * @author grkvlt@apache.org
+ * 
+ * @author grkvlt@apache.org, Adrian Cole
  * @see VmAsyncApi
  * @version 1.5
  */
@@ -54,465 +57,561 @@
 
    /**
     * Retrieves a {@link Vm}.
-    *
+    * 
     * @since 0.9
-    * @see VAppApi#getVApp(URI)
+    * @see VAppApi#get(String)
     */
-   Vm getVm(URI vmURI);
+   Vm get(String vmUrn);
+
+   Vm get(URI vmHref);
 
    /**
     * Modifies the name/description of a {@link Vm}.
-    *
+    * 
     * @since 0.9
-    * @see VAppApi#modifyVApp(URI, VApp)
+    * @see VAppApi#edit(String, VApp)
     */
-   Task modifyVm(URI vmURI, Vm vm);
+   Task edit(String vmUrn, Vm vm);
+
+   Task edit(URI vmHref, Vm vm);
 
    /**
     * Deletes a {@link Vm}.
-    *
+    * 
     * @since 0.9
-    * @see VAppApi#deleteVApp(URI)
+    * @see VAppApi#remove(String)
     */
-   Task deleteVm(URI vmURI);
+   Task remove(String vmUrn);
+
+   Task remove(URI vmHref);
 
    /**
     * Consolidates a {@link Vm}.
-    *
+    * 
     * <pre>
     * POST /vApp/{id}/action/consolidate
     * </pre>
-    *
+    * 
     * @since 1.5
     */
-   Task consolidateVm(URI vmURI);
+   Task consolidate(String vmUrn);
+
+   Task consolidate(URI vmHref);
 
    /**
     * Deploys a {@link Vm}.
-    *
+    * 
     * @since 0.9
-    * @see VAppApi#deploy(URI, DeployVAppParams)
+    * @see VAppApi#deploy(String, DeployVAppParams)
     */
-   Task deploy(URI vmURI, DeployVAppParams params);
+   Task deploy(String vmUrn, DeployVAppParams params);
+
+   Task deploy(URI vmHref, DeployVAppParams params);
 
    /**
     * Discard suspended state of a {@link Vm}.
-    *
+    * 
     * @since 0.9
-    * @see VAppApi#discardSuspendedState(URI)
+    * @see VAppApi#discardSuspendedState(String)
     */
-   Task discardSuspendedState(URI vmURI);
+   Task discardSuspendedState(String vmUrn);
+
+   Task discardSuspendedState(URI vmHref);
 
    /**
     * Installs VMware tools to the virtual machine.
-    *
+    * 
     * It should be running in order for them to be installed.
-    *
+    * 
     * <pre>
     * POST /vApp/{id}/action/installVMwareTools
     * </pre>
-    *
+    * 
     * @since 1.5
     */
-   Task installVMwareTools(URI vmURI);
+   Task installVMwareTools(String vmUrn);
+
+   Task installVMwareTools(URI vmHref);
 
    /**
     * Relocates a {@link Vm}.
-    *
+    * 
     * <pre>
     * POST /vApp/{id}/action/relocate
     * </pre>
-    *
+    * 
     * @since 1.5
     */
-   Task relocateVm(URI vmURI, RelocateParams params);
+   Task relocate(String vmUrn, RelocateParams params);
+
+   Task relocate(URI vmHref, RelocateParams params);
 
    /**
     * Undeploy a {@link Vm}.
-    *
+    * 
     * @since 0.9
-    * @see VAppApi#undeploy(URI, UndeployVAppParams)
+    * @see VAppApi#undeploy(String, UndeployVAppParams)
     */
-   Task undeploy(URI vmURI, UndeployVAppParams params);
+   Task undeploy(String vmUrn, UndeployVAppParams params);
+
+   Task undeploy(URI vmHref, UndeployVAppParams params);
 
    /**
-    * Upgrade virtual hardware version of a VM to the highest supported virtual
-    * hardware version of provider vDC where the VM locates.
-    *
+    * Upgrade virtual hardware version of a VM to the highest supported virtual hardware version of
+    * provider vDC where the VM locates.
+    * 
     * <pre>
     * POST /vApp/{id}/action/upgradeHardwareVersion
     * </pre>
-    *
+    * 
     * @since 1.5
     */
-   Task upgradeHardwareVersion(URI vmURI);
+   Task upgradeHardwareVersion(String vmUrn);
+
+   Task upgradeHardwareVersion(URI vmHref);
 
    /**
     * Powers off a {@link Vm}.
-    *
+    * 
     * @since 0.9
-    * @see VAppApi#powerOff(URI)
+    * @see VAppApi#powerOff(String)
     */
-   Task powerOff(URI vmURI);
+   Task powerOff(String vmUrn);
+
+   Task powerOff(URI vmHref);
 
    /**
     * Powers on a {@link Vm}.
-    *
+    * 
     * @since 0.9
-    * @see VAppApi#powerOn(URI)
+    * @see VAppApi#powerOn(String)
     */
-   Task powerOn(URI vmURI);
+   Task powerOn(String vmUrn);
+
+   Task powerOn(URI vmHref);
 
    /**
     * Reboots a {@link Vm}.
-    *
+    * 
     * @since 0.9
-    * @see VAppApi#reboot(URI)
+    * @see VAppApi#reboot(String)
     */
-   Task reboot(URI vmURI);
+   Task reboot(String vmUrn);
+
+   Task reboot(URI vmHref);
 
    /**
     * Resets a {@link Vm}.
-    *
+    * 
     * @since 0.9
-    * @see VAppApi#reset(URI)
+    * @see VAppApi#reset(String)
     */
-   Task reset(URI vmURI);
+   Task reset(String vmUrn);
+
+   Task reset(URI vmHref);
 
    /**
     * Shuts down a {@link Vm}.
-    *
+    * 
     * @since 0.9
-    * @see VAppApi#shutdown(URI)
+    * @see VAppApi#shutdown(String)
     */
-   Task shutdown(URI vmURI);
+   Task shutdown(String vmUrn);
+
+   Task shutdown(URI vmHref);
 
    /**
     * Suspends a {@link Vm}.
-    *
+    * 
     * @since 0.9
-    * @see VAppApi#suspend(URI)
+    * @see VAppApi#suspend(String)
     */
-   Task suspend(URI vmURI);
+   Task suspend(String vmUrn);
+
+   Task suspend(URI vmHref);
 
    /**
     * Retrieves the guest customization section of a {@link Vm}.
-    *
+    * 
     * <pre>
     * GET /vApp/{id}/guestCustomizationSection
     * </pre>
-    *
+    * 
     * @since 1.0
-    * @see VAppApi#
     */
-   GuestCustomizationSection getGuestCustomizationSection(URI vmURI);
+   GuestCustomizationSection getGuestCustomizationSection(String vmUrn);
+
+   GuestCustomizationSection getGuestCustomizationSection(URI vmHref);
 
    /**
     * Modifies the guest customization section of a {@link Vm}.
-    *
+    * 
     * <pre>
     * PUT /vApp/{id}/guestCustomizationSection
     * </pre>
-    *
+    * 
     * @since 1.0
     */
-   Task modifyGuestCustomizationSection(URI vmURI, GuestCustomizationSection section);
+   Task editGuestCustomizationSection(String vmUrn, GuestCustomizationSection section);
+
+   Task editGuestCustomizationSection(URI vmHref, GuestCustomizationSection section);
 
    /**
     * Ejects media from a {@link Vm}.
-    *
+    * 
     * <pre>
     * PUT /vApp/{id}/media/action/ejectMedia
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   Task ejectMedia(URI vmURI, MediaInsertOrEjectParams mediaParams);
+   Task ejectMedia(String vmUrn, MediaInsertOrEjectParams mediaParams);
+
+   Task ejectMedia(URI vmHref, MediaInsertOrEjectParams mediaParams);
 
    /**
     * Insert media into a {@link Vm}.
-    *
+    * 
     * <pre>
     * PUT /vApp/{id}/media/action/insertMedia
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   Task insertMedia(URI vmURI, MediaInsertOrEjectParams mediaParams);
+   Task insertMedia(String vmUrn, MediaInsertOrEjectParams mediaParams);
+
+   Task insertMedia(URI vmHref, MediaInsertOrEjectParams mediaParams);
 
    /**
     * Retrieves the network connection section of a {@link Vm}.
-    *
+    * 
     * <pre>
     * GET /vApp/{id}/networkConnectionSection
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   NetworkConnectionSection getNetworkConnectionSection(URI vmURI);
+   NetworkConnectionSection getNetworkConnectionSection(String vmUrn);
+
+   NetworkConnectionSection getNetworkConnectionSection(URI vmHref);
 
    /**
     * Modifies the network connection section of a {@link Vm}.
-    *
+    * 
     * <pre>
     * PUT /vApp/{id}/networkConnectionSection
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   Task modifyNetworkConnectionSection(URI vmURI, NetworkConnectionSection section);
+   Task editNetworkConnectionSection(String vmUrn, NetworkConnectionSection section);
+
+   Task editNetworkConnectionSection(URI vmHref, NetworkConnectionSection section);
 
    /**
     * Retrieves the operating system section of a {@link Vm}.
-    *
+    * 
     * <pre>
     * GET /vApp/{id}/operatingSystemSection
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   OperatingSystemSection getOperatingSystemSection(URI vmURI);
+   OperatingSystemSection getOperatingSystemSection(String vmUrn);
+
+   OperatingSystemSection getOperatingSystemSection(URI vmHref);
 
    /**
     * Modifies the operating system section of a {@link Vm}.
-    *
+    * 
     * <pre>
     * PUT /vApp/{id}/operatingSystemSection
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   Task modifyOperatingSystemSection(URI vmURI, OperatingSystemSection section);
+   Task editOperatingSystemSection(String vmUrn, OperatingSystemSection section);
+
+   Task editOperatingSystemSection(URI vmHref, OperatingSystemSection section);
 
    /**
     * Retrieves {@link Vm} product sections.
-    *
+    * 
     * @since 1.5
-    * @see VAppApi#getProductSections(URI)
+    * @see VAppApi#getProductSections(String)
     */
-   ProductSectionList getProductSections(URI vmURI);
+   ProductSectionList getProductSections(String vmUrn);
+
+   ProductSectionList getProductSections(URI vmHref);
 
    /**
     * Modifies the product section information of a {@link Vm}.
-    *
+    * 
     * @since 1.5
-    * @see VAppApi#modifyProductSections(URI, ProductSectionList)
+    * @see VAppApi#editProductSections(String, ProductSectionList)
     */
-   Task modifyProductSections(URI vmURI, ProductSectionList sectionList);
+   Task editProductSections(String vmUrn, ProductSectionList sectionList);
+
+   Task editProductSections(URI vmHref, ProductSectionList sectionList);
 
    /**
     * Retrieves a pending question for a {@link Vm}.
-    *
-    * The user should answer to the question by operation {@link #answerQuestion(URI, VmQuestionAnswer)}.
-    * Usually questions will be asked when the VM is powering on.
-    *
+    * 
+    * The user should answer to the question by operation
+    * {@link #answerQuestion(String, VmQuestionAnswer)}. Usually questions will be asked when the VM
+    * is powering on.
+    * 
     * <pre>
     * GET /vApp/{id}/question
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   VmPendingQuestion getPendingQuestion(URI vmURI);
+   VmPendingQuestion getPendingQuestion(String vmUrn);
+
+   VmPendingQuestion getPendingQuestion(URI vmHref);
 
    /**
     * Answer a pending question on a {@link Vm}.
-    *
-    * The answer IDs of choice and question should match the ones returned from operation {@link #getPendingQuestion(URI)}.
-    *
+    * 
+    * The answer IDs of choice and question should match the ones returned from operation
+    * {@link #getPendingQuestion(String)}.
+    * 
     * <pre>
     * POST /vApp/{id}/question/action/answer
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   void answerQuestion(URI vmURI, VmQuestionAnswer answer);
+   void answerQuestion(String vmUrn, VmQuestionAnswer answer);
+
+   void answerQuestion(URI vmHref, VmQuestionAnswer answer);
 
    /**
     * Retrieves the runtime info section of a {@link Vm}.
-    *
+    * 
     * <pre>
     * GET /vApp/{id}/runtimeInfoSection
     * </pre>
-    *
+    * 
     * @since 1.5
     */
-   RuntimeInfoSection getRuntimeInfoSection(URI vmURI);
+   RuntimeInfoSection getRuntimeInfoSection(String vmUrn);
+
+   RuntimeInfoSection getRuntimeInfoSection(URI vmHref);
 
    /**
     * Retrieves the thumbnail of the screen of a {@link Vm}.
-    *
+    * 
     * The content type of the response may vary (e.g. {@code image/png}, {@code image/gif}).
-    *
+    * 
     * <pre>
     * GET /vApp/{id}/screen
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   byte[] getScreenImage(URI vmURI);
+   byte[] getScreenImage(String vmUrn);
+
+   byte[] getScreenImage(URI vmHref);
 
    /**
     * Retrieve a screen ticket for remote console connection to a {@link Vm}.
-    *
-    * A screen ticket is a string that includes the virtual machine's IP address, its managed object reference, and a string
-    * that has been encoded as described in RFC 2396. Each VM element in a vApp includes a link where rel="screen:acquireTicket".
-    * You can use that link to request a screen ticket that you can use with the vmware-vmrc utility to open a VMware Remote
-    * Console for the virtual machine represented by that VM element. The vApp should be running to get a valid screen ticket.
-    *
+    * 
+    * A screen ticket is a string that includes the virtual machine's IP address, its managed object
+    * reference, and a string that has been encoded as described in RFC 2396. Each VM element in a
+    * vApp includes a link where rel="screen:acquireTicket". You can use that link to request a
+    * screen ticket that you can use with the vmware-vmrc utility to open a VMware Remote Console
+    * for the virtual machine represented by that VM element. The vApp should be running to get a
+    * valid screen ticket.
+    * 
     * <pre>
     * GET /vApp/{id}/screen/action/acquireTicket
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   ScreenTicket getScreenTicket(URI vmURI);
+   ScreenTicket getScreenTicket(String vmUrn);
+
+   ScreenTicket getScreenTicket(URI vmHref);
 
    /**
     * Retrieves the virtual hardware section of a {@link Vm}.
-    *
+    * 
     * <pre>
     * GET /vApp/{id}/virtualHardwareSection
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   VirtualHardwareSection getVirtualHardwareSection(URI vmURI);
+   VirtualHardwareSection getVirtualHardwareSection(String vmUrn);
+
+   VirtualHardwareSection getVirtualHardwareSection(URI vmHref);
 
    /**
     * Modifies the virtual hardware section of a {@link Vm}.
-    *
+    * 
     * <pre>
     * PUT /vApp/{id}/virtualHardwareSection
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   Task modifyVirtualHardwareSection(URI vmURI, VirtualHardwareSection section);
+   Task editVirtualHardwareSection(String vmUrn, VirtualHardwareSection section);
+
+   Task editVirtualHardwareSection(URI vmHref, VirtualHardwareSection section);
 
    /**
     * Retrieves the CPU properties in virtual hardware section of a {@link Vm}.
-    *
+    * 
     * <pre>
     * GET /vApp/{id}/virtualHardwareSection/cpu
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   RasdItem getVirtualHardwareSectionCpu(URI vmURI);
+   RasdItem getVirtualHardwareSectionCpu(String vmUrn);
+
+   RasdItem getVirtualHardwareSectionCpu(URI vmHref);
 
    /**
     * Modifies the CPU properties in virtual hardware section of a {@link Vm}.
-    *
+    * 
     * <pre>
     * PUT /vApp/{id}/virtualHardwareSection/cpu
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   Task modifyVirtualHardwareSectionCpu(URI vmURI, RasdItem rasd);
+   Task editVirtualHardwareSectionCpu(String vmUrn, RasdItem rasd);
+
+   Task editVirtualHardwareSectionCpu(URI vmHref, RasdItem rasd);
 
    /**
     * Retrieves a list of items for disks from virtual hardware section of a {@link Vm}.
-    *
+    * 
     * <pre>
     * GET /vApp/{id}/virtualHardwareSection/disks
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   RasdItemsList getVirtualHardwareSectionDisks(URI vmURI);
+   RasdItemsList getVirtualHardwareSectionDisks(String vmUrn);
+
+   RasdItemsList getVirtualHardwareSectionDisks(URI vmHref);
 
    /**
     * Modifies the disks list in virtual hardware section of a {@link Vm}.
-    *
+    * 
     * <pre>
     * PUT /vApp/{id}/virtualHardwareSection/disks
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   Task modifyVirtualHardwareSectionDisks(URI vmURI, RasdItemsList rasdItemsList);
+   Task editVirtualHardwareSectionDisks(String vmUrn, RasdItemsList rasdItemsList);
+
+   Task editVirtualHardwareSectionDisks(URI vmHref, RasdItemsList rasdItemsList);
 
    /**
     * Retrieves the list of items that represents the floppies and CD/DVD drives in a {@link Vm}.
-    *
+    * 
     * <pre>
     * GET /vApp/{id}/virtualHardwareSection/media
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   RasdItemsList getVirtualHardwareSectionMedia(URI vmURI);
+   RasdItemsList getVirtualHardwareSectionMedia(String vmUrn);
+
+   RasdItemsList getVirtualHardwareSectionMedia(URI vmHref);
 
    /**
-    * Retrieves the item that contains memory information from virtual hardware section of a {@link Vm}.
-    *
+    * Retrieves the item that contains memory information from virtual hardware section of a
+    * {@link Vm}.
+    * 
     * <pre>
     * GET /vApp/{id}/virtualHardwareSection/memory
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   RasdItem getVirtualHardwareSectionMemory(URI vmURI);
+   RasdItem getVirtualHardwareSectionMemory(String vmUrn);
+
+   RasdItem getVirtualHardwareSectionMemory(URI vmHref);
 
    /**
     * Modifies the memory properties in virtual hardware section of a {@link Vm}.
-    *
+    * 
     * <pre>
     * PUT /vApp/{id}/virtualHardwareSection/memory
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   Task modifyVirtualHardwareSectionMemory(URI vmURI, RasdItem rasd);
+   Task editVirtualHardwareSectionMemory(String vmUrn, RasdItem rasd);
+
+   Task editVirtualHardwareSectionMemory(URI vmHref, RasdItem rasd);
 
    /**
     * Retrieves a list of items for network cards from virtual hardware section of a {@link Vm}.
-    *
+    * 
     * <pre>
     * GET /vApp/{id}/virtualHardwareSection/networkCards
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   RasdItemsList getVirtualHardwareSectionNetworkCards(URI vmURI);
+   RasdItemsList getVirtualHardwareSectionNetworkCards(String vmUrn);
+
+   RasdItemsList getVirtualHardwareSectionNetworkCards(URI vmHref);
 
    /**
     * Modifies the network cards list in virtual hardware section of a {@link Vm}.
-    *
+    * 
     * <pre>
     * PUT /vApp/{id}/virtualHardwareSection/networkCards
     * </pre>
-    *
+    * 
     * @since 0.9
     */
-   Task modifyVirtualHardwareSectionNetworkCards(URI vmURI, RasdItemsList rasdItemsList);
+   Task editVirtualHardwareSectionNetworkCards(String vmUrn, RasdItemsList rasdItemsList);
+
+   Task editVirtualHardwareSectionNetworkCards(URI vmHref, RasdItemsList rasdItemsList);
 
    /**
     * Retrieves a list of items for serial ports from virtual hardware section of a {@link Vm}.
-    *
+    * 
     * <pre>
     * GET /vApp/{id}/virtualHardwareSection/serialPorts
     * </pre>
-    *
+    * 
     * @since 1.5
     */
-   RasdItemsList getVirtualHardwareSectionSerialPorts(URI vmURI);
+   RasdItemsList getVirtualHardwareSectionSerialPorts(String vmUrn);
+
+   RasdItemsList getVirtualHardwareSectionSerialPorts(URI vmHref);
 
    /**
     * Modifies the serial ports list in virtual hardware section of a {@link Vm}.
-    *
+    * 
     * <pre>
     * PUT /vApp/{id}/virtualHardwareSection/serialPorts
     * </pre>
-    *
+    * 
     * @since 1.5
     */
-   Task modifyVirtualHardwareSectionSerialPorts(URI vmURI, RasdItemsList rasdItemsList);
+   Task editVirtualHardwareSectionSerialPorts(String vmUrn, RasdItemsList rasdItemsList);
+
+   Task editVirtualHardwareSectionSerialPorts(URI vmHref, RasdItemsList rasdItemsList);
 
    /**
     * Synchronous access to {@link Vm} {@link Metadata} features.
     */
    @Delegate
-   MetadataApi.Writeable getMetadataApi();
+   MetadataApi.Writeable getMetadataApi(@EndpointParam(parser = VmURNToHref.class) String vmUrn);
+
+   @Delegate
+   MetadataApi.Writeable getMetadataApi(@EndpointParam URI vmHref);
+
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VmAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VmAsyncApi.java
index 0e958a1..efb6cd3 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VmAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/VmAsyncApi.java
@@ -44,6 +44,7 @@
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 
+import org.jclouds.dmtf.cim.ResourceAllocationSettingData;
 import org.jclouds.rest.annotations.BinderParam;
 import org.jclouds.rest.annotations.Delegate;
 import org.jclouds.rest.annotations.EndpointParam;
@@ -53,6 +54,7 @@
 import org.jclouds.rest.annotations.ResponseParser;
 import org.jclouds.rest.binders.BindToXMLPayload;
 import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
+import org.jclouds.vcloud.director.v1_5.domain.Metadata;
 import org.jclouds.vcloud.director.v1_5.domain.ProductSectionList;
 import org.jclouds.vcloud.director.v1_5.domain.RasdItemsList;
 import org.jclouds.vcloud.director.v1_5.domain.ScreenTicket;
@@ -72,51 +74,504 @@
 import org.jclouds.vcloud.director.v1_5.domain.section.VirtualHardwareSection;
 import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
 import org.jclouds.vcloud.director.v1_5.functions.ReturnPayloadBytes;
+import org.jclouds.vcloud.director.v1_5.functions.href.VmURNToHref;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
 /**
- * @author grkvlt@apache.org
+ * @author grkvlt@apache.org, Adrian Cole
  * @see VmApi
  */
 @RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface VmAsyncApi {
 
    /**
-    * @see VmApi#getVm(URI)
+    * @see VmApi#get(String)
     */
    @GET
    @Consumes(VM)
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<Vm> getVm(@EndpointParam URI vmURI);
+   ListenableFuture<Vm> get(@EndpointParam(parser = VmURNToHref.class) String vmUrn);
 
    /**
-    * @see VmApi#modifyVm(URI, Vm)
+    * @see VmApi#edit(String, Vm)
     */
    @PUT
    @Produces(VM)
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> modifyVm(@EndpointParam URI vmURI,
-                                   @BinderParam(BindToXMLPayload.class) Vm vApp);
+   ListenableFuture<Task> edit(@EndpointParam(parser = VmURNToHref.class) String vmUrn,
+            @BinderParam(BindToXMLPayload.class) Vm vApp);
 
    /**
-    * @see VmApi#deleteVm(URI)
+    * @see VmApi#remove(String)
     */
    @DELETE
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> deleteVm(@EndpointParam URI vmURI);
+   ListenableFuture<Task> remove(@EndpointParam(parser = VmURNToHref.class) String vmUrn);
 
    /**
-    * @see VmApi#consolidateVm(URI)
+    * @see VmApi#consolidate(String)
     */
    @POST
    @Path("/action/consolidate")
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> consolidateVm(@EndpointParam URI vmURI);
+   ListenableFuture<Task> consolidate(@EndpointParam(parser = VmURNToHref.class) String vmUrn);
+
+   /**
+    * @see VmApi#deploy(String, DeployVAppParams)
+    */
+   @POST
+   @Path("/action/deploy")
+   @Produces(DEPLOY_VAPP_PARAMS)
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> deploy(@EndpointParam(parser = VmURNToHref.class) String vmUrn,
+            @BinderParam(BindToXMLPayload.class) DeployVAppParams params);
+
+   /**
+    * @see VmApi#discardSuspendedState(String)
+    */
+   @POST
+   @Path("/action/discardSuspendedState")
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> discardSuspendedState(@EndpointParam(parser = VmURNToHref.class) String vmUrn);
+
+   /**
+    * @see VmApi#installVMwareTools(String)
+    */
+   @POST
+   @Path("/action/installVMwareTools")
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> installVMwareTools(@EndpointParam(parser = VmURNToHref.class) String vmUrn);
+
+   /**
+    * @see VmApi#relocate(String, RelocateParams)
+    */
+   @POST
+   @Path("/action/relocate")
+   @Produces(RELOCATE_VM_PARAMS)
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> relocate(@EndpointParam(parser = VmURNToHref.class) String vmUrn,
+            @BinderParam(BindToXMLPayload.class) RelocateParams params);
+
+   /**
+    * @see VmApi#undeploy(String, UndeployVAppParams)
+    */
+   @POST
+   @Path("/action/undeploy")
+   @Produces(UNDEPLOY_VAPP_PARAMS)
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> undeploy(@EndpointParam(parser = VmURNToHref.class) String vmUrn,
+            @BinderParam(BindToXMLPayload.class) UndeployVAppParams params);
+
+   /**
+    * @see VmApi#upgradeHardwareVersion(String)
+    */
+   @POST
+   @Path("/action/upgradeHardwareVersion")
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> upgradeHardwareVersion(@EndpointParam(parser = VmURNToHref.class) String vmUrn);
+
+   /**
+    * @see VmApi#powerOff(String)
+    */
+   @POST
+   @Path("/power/action/powerOff")
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> powerOff(@EndpointParam(parser = VmURNToHref.class) String vmUrn);
+
+   /**
+    * @see VmApi#powerOn(String)
+    */
+   @POST
+   @Path("/power/action/powerOn")
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> powerOn(@EndpointParam(parser = VmURNToHref.class) String vmUrn);
+
+   /**
+    * @see VmApi#reboot(String)
+    */
+   @POST
+   @Path("/power/action/powerOff")
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> reboot(@EndpointParam(parser = VmURNToHref.class) String vmUrn);
+
+   /**
+    * @see VmApi#reset(String)
+    */
+   @POST
+   @Path("/power/action/reset")
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> reset(@EndpointParam(parser = VmURNToHref.class) String vmUrn);
+
+   /**
+    * @see VmApi#shutdown(String)
+    */
+   @POST
+   @Path("/power/action/shutdown")
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> shutdown(@EndpointParam(parser = VmURNToHref.class) String vmUrn);
+
+   /**
+    * @see VmApi#suspend(String)
+    */
+   @POST
+   @Path("/power/action/suspend")
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> suspend(@EndpointParam(parser = VmURNToHref.class) String vmUrn);
+
+   /**
+    * @see VmApi#getGuestCustomizationSection(String)
+    */
+   @GET
+   @Path("/guestCustomizationSection")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<GuestCustomizationSection> getGuestCustomizationSection(
+            @EndpointParam(parser = VmURNToHref.class) String vmUrn);
+
+   /**
+    * @see VmApi#editGuestCustomizationSection(String, GuestCustomizationSection)
+    */
+   @PUT
+   @Path("/guestCustomizationSection")
+   @Produces(GUEST_CUSTOMIZATION_SECTION)
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> editGuestCustomizationSection(@EndpointParam(parser = VmURNToHref.class) String vmUrn,
+            @BinderParam(BindToXMLPayload.class) GuestCustomizationSection section);
+
+   /**
+    * @see VmApi#ejectMedia(String, MediaInsertOrEjectParams)
+    */
+   @POST
+   @Path("/media/action/ejectMedia")
+   @Produces(MEDIA_PARAMS)
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> ejectMedia(@EndpointParam(parser = VmURNToHref.class) String vmUrn,
+            @BinderParam(BindToXMLPayload.class) MediaInsertOrEjectParams mediaParams);
+
+   /**
+    * @see VmApi#insertMedia(String, MediaInsertOrEjectParams)
+    */
+   @POST
+   @Path("/media/action/insertMedia")
+   @Produces(MEDIA_PARAMS)
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> insertMedia(@EndpointParam(parser = VmURNToHref.class) String vmUrn,
+            @BinderParam(BindToXMLPayload.class) MediaInsertOrEjectParams mediaParams);
+
+   /**
+    * @see VmApi#getNetworkConnectionSection(String)
+    */
+   @GET
+   @Path("/networkConnectionSection")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<NetworkConnectionSection> getNetworkConnectionSection(
+            @EndpointParam(parser = VmURNToHref.class) String vmUrn);
+
+   /**
+    * @see VmApi#editNetworkConnectionSection(String, NetworkConnectionSection)
+    */
+   @PUT
+   @Path("/networkConnectionSection")
+   @Produces(NETWORK_CONNECTION_SECTION)
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> editNetworkConnectionSection(@EndpointParam(parser = VmURNToHref.class) String vmUrn,
+            @BinderParam(BindToXMLPayload.class) NetworkConnectionSection section);
+
+   /**
+    * @see VmApi#getOperatingSystemSection(String)
+    */
+   @GET
+   @Path("/operatingSystemSection")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<OperatingSystemSection> getOperatingSystemSection(
+            @EndpointParam(parser = VmURNToHref.class) String vmUrn);
+
+   /**
+    * @see VmApi#editOperatingSystemSection(String, OperatingSystemSection)
+    */
+   @PUT
+   @Path("/operatingSystemSection")
+   @Produces(OPERATING_SYSTEM_SECTION)
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> editOperatingSystemSection(@EndpointParam(parser = VmURNToHref.class) String vmUrn,
+            @BinderParam(BindToXMLPayload.class) OperatingSystemSection section);
+
+   /**
+    * @see VmApi#getProductSections(String)
+    */
+   @GET
+   @Path("/productSections")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<ProductSectionList> getProductSections(@EndpointParam(parser = VmURNToHref.class) String vmUrn);
+
+   /**
+    * @see VmApi#editProductSections(String, ProductSectionList)
+    */
+   @PUT
+   @Path("/productSections")
+   @Produces(PRODUCT_SECTION_LIST)
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> editProductSections(@EndpointParam(parser = VmURNToHref.class) String vmUrn,
+            @BinderParam(BindToXMLPayload.class) ProductSectionList sectionList);
+
+   /**
+    * @see VmApi#getPendingQuestion(String)
+    */
+   @GET
+   @Path("/question")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<VmPendingQuestion> getPendingQuestion(@EndpointParam(parser = VmURNToHref.class) String vmUrn);
+
+   /**
+    * @see VmApi#answerQuestion(String, VmQuestionAnswer)
+    */
+   @POST
+   @Path("/question/action/answer")
+   @Produces(VM_PENDING_ANSWER)
+   @Consumes
+   @JAXBResponseParser
+   ListenableFuture<Void> answerQuestion(@EndpointParam(parser = VmURNToHref.class) String vmUrn,
+            @BinderParam(BindToXMLPayload.class) VmQuestionAnswer answer);
+
+   /**
+    * @see VmApi#getRuntimeInfoSection(String)
+    */
+   @GET
+   @Path("/runtimeInfoSection")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<RuntimeInfoSection> getRuntimeInfoSection(@EndpointParam(parser = VmURNToHref.class) String vmUrn);
+
+   /**
+    * @see VmApi#getScreenImage(String)
+    */
+   @GET
+   @Path("/screen")
+   @Consumes(ANY_IMAGE)
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   @ResponseParser(ReturnPayloadBytes.class)
+   ListenableFuture<byte[]> getScreenImage(@EndpointParam(parser = VmURNToHref.class) String vmUrn);
+
+   /**
+    * @see VmApi#getScreenTicket(String)
+    */
+   @POST
+   @Path("/screen/action/acquireTicket")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<ScreenTicket> getScreenTicket(@EndpointParam(parser = VmURNToHref.class) String vmUrn);
+
+   /**
+    * @see VmApi#getVirtualHardwareSection(String)
+    */
+   @GET
+   @Path("/virtualHardwareSection")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<VirtualHardwareSection> getVirtualHardwareSection(
+            @EndpointParam(parser = VmURNToHref.class) String vmUrn);
+
+   /**
+    * @see VmApi#editVirtualHardwareSection(String, VirtualHardwareSection)
+    */
+   @PUT
+   @Path("/virtualHardwareSection")
+   @Produces(VIRTUAL_HARDWARE_SECTION)
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> editVirtualHardwareSection(@EndpointParam(parser = VmURNToHref.class) String vmUrn,
+            @BinderParam(BindToXMLPayload.class) VirtualHardwareSection section);
+
+   /**
+    * @see VmApi#getVirtualHardwareSectionCpu(String)
+    */
+   @GET
+   @Path("/virtualHardwareSection/cpu")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<RasdItem> getVirtualHardwareSectionCpu(@EndpointParam(parser = VmURNToHref.class) String vmUrn);
+
+   /**
+    * @see VmApi#editVirtualHardwareSectionCpu(String, ResourceAllocationSettingData)
+    */
+   @PUT
+   @Path("/virtualHardwareSection/cpu")
+   @Produces(OVF_RASD_ITEM)
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> editVirtualHardwareSectionCpu(@EndpointParam(parser = VmURNToHref.class) String vmUrn,
+            @BinderParam(BindToXMLPayload.class) RasdItem rasd);
+
+   /**
+    * @see VmApi#getVirtualHardwareSectionDisks(String)
+    */
+   @GET
+   @Path("/virtualHardwareSection/disks")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<RasdItemsList> getVirtualHardwareSectionDisks(
+            @EndpointParam(parser = VmURNToHref.class) String vmUrn);
+
+   /**
+    * @see VmApi#editVirtualHardwareSectionDisks(String, RasdItemsList)
+    */
+   @PUT
+   @Path("/virtualHardwareSection/disks")
+   @Produces(OVF_RASD_ITEMS_LIST)
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> editVirtualHardwareSectionDisks(@EndpointParam(parser = VmURNToHref.class) String vmUrn,
+            @BinderParam(BindToXMLPayload.class) RasdItemsList rasdItemsList);
+
+   /**
+    * @see VmApi#getVirtualHardwareSectionMedia(String)
+    */
+   @GET
+   @Path("/virtualHardwareSection/media")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<RasdItemsList> getVirtualHardwareSectionMedia(
+            @EndpointParam(parser = VmURNToHref.class) String vmUrn);
+
+   /**
+    * @see VmApi#getVirtualHardwareSectionMemory(String)
+    */
+   @GET
+   @Path("/virtualHardwareSection/memory")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<RasdItem> getVirtualHardwareSectionMemory(@EndpointParam(parser = VmURNToHref.class) String vmUrn);
+
+   /**
+    * @see VmApi#editVirtualHardwareSectionMemory(String, ResourceAllocationSettingData)
+    */
+   @PUT
+   @Path("/virtualHardwareSection/memory")
+   @Produces(OVF_RASD_ITEM)
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> editVirtualHardwareSectionMemory(@EndpointParam(parser = VmURNToHref.class) String vmUrn,
+            @BinderParam(BindToXMLPayload.class) RasdItem rasd);
+
+   /**
+    * @see VmApi#getVirtualHardwareSectionNetworkCards(String)
+    */
+   @GET
+   @Path("/virtualHardwareSection/networkCards")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<RasdItemsList> getVirtualHardwareSectionNetworkCards(
+            @EndpointParam(parser = VmURNToHref.class) String vmUrn);
+
+   /**
+    * @see VmApi#editVirtualHardwareSectionNetworkCards(String, RasdItemsList)
+    */
+   @PUT
+   @Path("/virtualHardwareSection/networkCards")
+   @Produces(OVF_RASD_ITEMS_LIST)
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> editVirtualHardwareSectionNetworkCards(
+            @EndpointParam(parser = VmURNToHref.class) String vmUrn,
+            @BinderParam(BindToXMLPayload.class) RasdItemsList rasdItemsList);
+
+   /**
+    * @see VmApi#getVirtualHardwareSectionSerialPorts(String)
+    */
+   @GET
+   @Path("/virtualHardwareSection/serialPorts")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<RasdItemsList> getVirtualHardwareSectionSerialPorts(
+            @EndpointParam(parser = VmURNToHref.class) String vmUrn);
+
+   /**
+    * @see VmApi#editVirtualHardwareSectionSerialPorts(String, RasdItemsList)
+    */
+   @PUT
+   @Path("/virtualHardwareSection/serialPorts")
+   @Produces(OVF_RASD_ITEMS_LIST)
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> editVirtualHardwareSectionSerialPorts(
+            @EndpointParam(parser = VmURNToHref.class) String vmUrn,
+            @BinderParam(BindToXMLPayload.class) RasdItemsList rasdItemsList);
+
+   /**
+    * @see VmApi#get(URI)
+    */
+   @GET
+   @Consumes(VM)
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<Vm> get(@EndpointParam URI vmHref);
+
+   /**
+    * @see VmApi#edit(URI, Vm)
+    */
+   @PUT
+   @Produces(VM)
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> edit(@EndpointParam URI vmHref, @BinderParam(BindToXMLPayload.class) Vm vApp);
+
+   /**
+    * @see VmApi#remove(URI)
+    */
+   @DELETE
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> remove(@EndpointParam URI vmHref);
+
+   /**
+    * @see VmApi#consolidate(URI)
+    */
+   @POST
+   @Path("/action/consolidate")
+   @Consumes(TASK)
+   @JAXBResponseParser
+   ListenableFuture<Task> consolidate(@EndpointParam URI vmHref);
 
    /**
     * @see VmApi#deploy(URI, DeployVAppParams)
@@ -126,8 +581,7 @@
    @Produces(DEPLOY_VAPP_PARAMS)
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> deploy(@EndpointParam URI vmURI,
-                                 @BinderParam(BindToXMLPayload.class) DeployVAppParams params);
+   ListenableFuture<Task> deploy(@EndpointParam URI vmHref, @BinderParam(BindToXMLPayload.class) DeployVAppParams params);
 
    /**
     * @see VmApi#discardSuspendedState(URI)
@@ -136,7 +590,7 @@
    @Path("/action/discardSuspendedState")
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> discardSuspendedState(@EndpointParam URI vmURI);
+   ListenableFuture<Task> discardSuspendedState(@EndpointParam URI vmHref);
 
    /**
     * @see VmApi#installVMwareTools(URI)
@@ -145,18 +599,17 @@
    @Path("/action/installVMwareTools")
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> installVMwareTools(@EndpointParam URI vmURI);
+   ListenableFuture<Task> installVMwareTools(@EndpointParam URI vmHref);
 
    /**
-    * @see VmApi#relocateVm(URI, RelocateParams)
+    * @see VmApi#relocate(URI, RelocateParams)
     */
    @POST
    @Path("/action/relocate")
    @Produces(RELOCATE_VM_PARAMS)
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> relocateVm(@EndpointParam URI vmURI,
-                                     @BinderParam(BindToXMLPayload.class) RelocateParams params);
+   ListenableFuture<Task> relocate(@EndpointParam URI vmHref, @BinderParam(BindToXMLPayload.class) RelocateParams params);
 
    /**
     * @see VmApi#undeploy(URI, UndeployVAppParams)
@@ -166,8 +619,8 @@
    @Produces(UNDEPLOY_VAPP_PARAMS)
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> undeploy(@EndpointParam URI vmURI,
-                                   @BinderParam(BindToXMLPayload.class) UndeployVAppParams params);
+   ListenableFuture<Task> undeploy(@EndpointParam URI vmHref,
+            @BinderParam(BindToXMLPayload.class) UndeployVAppParams params);
 
    /**
     * @see VmApi#upgradeHardwareVersion(URI)
@@ -176,7 +629,7 @@
    @Path("/action/upgradeHardwareVersion")
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> upgradeHardwareVersion(@EndpointParam URI vmURI);
+   ListenableFuture<Task> upgradeHardwareVersion(@EndpointParam URI vmHref);
 
    /**
     * @see VmApi#powerOff(URI)
@@ -185,7 +638,7 @@
    @Path("/power/action/powerOff")
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> powerOff(@EndpointParam URI vmURI);
+   ListenableFuture<Task> powerOff(@EndpointParam URI vmHref);
 
    /**
     * @see VmApi#powerOn(URI)
@@ -194,7 +647,7 @@
    @Path("/power/action/powerOn")
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> powerOn(@EndpointParam URI vmURI);
+   ListenableFuture<Task> powerOn(@EndpointParam URI vmHref);
 
    /**
     * @see VmApi#reboot(URI)
@@ -203,7 +656,7 @@
    @Path("/power/action/powerOff")
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> reboot(@EndpointParam URI vmURI);
+   ListenableFuture<Task> reboot(@EndpointParam URI vmHref);
 
    /**
     * @see VmApi#reset(URI)
@@ -212,7 +665,7 @@
    @Path("/power/action/reset")
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> reset(@EndpointParam URI vmURI);
+   ListenableFuture<Task> reset(@EndpointParam URI vmHref);
 
    /**
     * @see VmApi#shutdown(URI)
@@ -221,7 +674,7 @@
    @Path("/power/action/shutdown")
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> shutdown(@EndpointParam URI vmURI);
+   ListenableFuture<Task> shutdown(@EndpointParam URI vmHref);
 
    /**
     * @see VmApi#suspend(URI)
@@ -230,7 +683,7 @@
    @Path("/power/action/suspend")
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> suspend(@EndpointParam URI vmURI);
+   ListenableFuture<Task> suspend(@EndpointParam URI vmHref);
 
    /**
     * @see VmApi#getGuestCustomizationSection(URI)
@@ -240,18 +693,18 @@
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<GuestCustomizationSection> getGuestCustomizationSection(@EndpointParam URI vmURI);
+   ListenableFuture<GuestCustomizationSection> getGuestCustomizationSection(@EndpointParam URI vmHref);
 
    /**
-    * @see VmApi#modifyGuestCustomizationSection(URI, GuestCustomizationSection)
+    * @see VmApi#editGuestCustomizationSection(URI, GuestCustomizationSection)
     */
    @PUT
    @Path("/guestCustomizationSection")
    @Produces(GUEST_CUSTOMIZATION_SECTION)
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> modifyGuestCustomizationSection(@EndpointParam URI vmURI,
-                                                          @BinderParam(BindToXMLPayload.class) GuestCustomizationSection section);
+   ListenableFuture<Task> editGuestCustomizationSection(@EndpointParam URI vmHref,
+            @BinderParam(BindToXMLPayload.class) GuestCustomizationSection section);
 
    /**
     * @see VmApi#ejectMedia(URI, MediaInsertOrEjectParams)
@@ -261,8 +714,8 @@
    @Produces(MEDIA_PARAMS)
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> ejectMedia(@EndpointParam URI vmURI,
-                                     @BinderParam(BindToXMLPayload.class) MediaInsertOrEjectParams mediaParams);
+   ListenableFuture<Task> ejectMedia(@EndpointParam URI vmHref,
+            @BinderParam(BindToXMLPayload.class) MediaInsertOrEjectParams mediaParams);
 
    /**
     * @see VmApi#insertMedia(URI, MediaInsertOrEjectParams)
@@ -272,8 +725,8 @@
    @Produces(MEDIA_PARAMS)
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> insertMedia(@EndpointParam URI vmURI,
-                                      @BinderParam(BindToXMLPayload.class) MediaInsertOrEjectParams mediaParams);
+   ListenableFuture<Task> insertMedia(@EndpointParam URI vmHref,
+            @BinderParam(BindToXMLPayload.class) MediaInsertOrEjectParams mediaParams);
 
    /**
     * @see VmApi#getNetworkConnectionSection(URI)
@@ -283,18 +736,18 @@
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<NetworkConnectionSection> getNetworkConnectionSection(@EndpointParam URI vmURI);
+   ListenableFuture<NetworkConnectionSection> getNetworkConnectionSection(@EndpointParam URI vmHref);
 
    /**
-    * @see VmApi#modifyNetworkConnectionSection(URI, NetworkConnectionSection)
+    * @see VmApi#editNetworkConnectionSection(URI, NetworkConnectionSection)
     */
    @PUT
    @Path("/networkConnectionSection")
    @Produces(NETWORK_CONNECTION_SECTION)
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> modifyNetworkConnectionSection(@EndpointParam URI vmURI,
-                                                         @BinderParam(BindToXMLPayload.class) NetworkConnectionSection section);
+   ListenableFuture<Task> editNetworkConnectionSection(@EndpointParam URI vmHref,
+            @BinderParam(BindToXMLPayload.class) NetworkConnectionSection section);
 
    /**
     * @see VmApi#getOperatingSystemSection(URI)
@@ -304,18 +757,18 @@
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<OperatingSystemSection> getOperatingSystemSection(@EndpointParam URI vmURI);
+   ListenableFuture<OperatingSystemSection> getOperatingSystemSection(@EndpointParam URI vmHref);
 
    /**
-    * @see VmApi#modifyOperatingSystemSection(URI, OperatingSystemSection)
+    * @see VmApi#editOperatingSystemSection(URI, OperatingSystemSection)
     */
    @PUT
    @Path("/operatingSystemSection")
    @Produces(OPERATING_SYSTEM_SECTION)
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> modifyOperatingSystemSection(@EndpointParam URI vmURI,
-                                                       @BinderParam(BindToXMLPayload.class) OperatingSystemSection section);
+   ListenableFuture<Task> editOperatingSystemSection(@EndpointParam URI vmHref,
+            @BinderParam(BindToXMLPayload.class) OperatingSystemSection section);
 
    /**
     * @see VmApi#getProductSections(URI)
@@ -325,18 +778,18 @@
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<ProductSectionList> getProductSections(@EndpointParam URI vmURI);
+   ListenableFuture<ProductSectionList> getProductSections(@EndpointParam URI vmHref);
 
    /**
-    * @see VmApi#modifyProductSections(URI, ProductSectionList)
+    * @see VmApi#editProductSections(URI, ProductSectionList)
     */
    @PUT
    @Path("/productSections")
    @Produces(PRODUCT_SECTION_LIST)
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> modifyProductSections(@EndpointParam URI vmURI,
-                                                @BinderParam(BindToXMLPayload.class) ProductSectionList sectionList);
+   ListenableFuture<Task> editProductSections(@EndpointParam URI vmHref,
+            @BinderParam(BindToXMLPayload.class) ProductSectionList sectionList);
 
    /**
     * @see VmApi#getPendingQuestion(URI)
@@ -346,7 +799,7 @@
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<VmPendingQuestion> getPendingQuestion(@EndpointParam URI vmURI);
+   ListenableFuture<VmPendingQuestion> getPendingQuestion(@EndpointParam URI vmHref);
 
    /**
     * @see VmApi#answerQuestion(URI, VmQuestionAnswer)
@@ -356,8 +809,8 @@
    @Produces(VM_PENDING_ANSWER)
    @Consumes
    @JAXBResponseParser
-   ListenableFuture<Void> answerQuestion(@EndpointParam URI vmURI,
-                                         @BinderParam(BindToXMLPayload.class) VmQuestionAnswer answer);
+   ListenableFuture<Void> answerQuestion(@EndpointParam URI vmHref,
+            @BinderParam(BindToXMLPayload.class) VmQuestionAnswer answer);
 
    /**
     * @see VmApi#getRuntimeInfoSection(URI)
@@ -367,7 +820,7 @@
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<RuntimeInfoSection> getRuntimeInfoSection(@EndpointParam URI vmURI);
+   ListenableFuture<RuntimeInfoSection> getRuntimeInfoSection(@EndpointParam URI vmHref);
 
    /**
     * @see VmApi#getScreenImage(URI)
@@ -377,7 +830,7 @@
    @Consumes(ANY_IMAGE)
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
    @ResponseParser(ReturnPayloadBytes.class)
-   ListenableFuture<byte[]> getScreenImage(@EndpointParam URI vmURI);
+   ListenableFuture<byte[]> getScreenImage(@EndpointParam URI vmHref);
 
    /**
     * @see VmApi#getScreenTicket(URI)
@@ -387,7 +840,7 @@
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<ScreenTicket> getScreenTicket(@EndpointParam URI vmURI);
+   ListenableFuture<ScreenTicket> getScreenTicket(@EndpointParam URI vmHref);
 
    /**
     * @see VmApi#getVirtualHardwareSection(URI)
@@ -397,18 +850,18 @@
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<VirtualHardwareSection> getVirtualHardwareSection(@EndpointParam URI vmURI);
+   ListenableFuture<VirtualHardwareSection> getVirtualHardwareSection(@EndpointParam URI vmHref);
 
    /**
-    * @see VmApi#modifyVirtualHardwareSection(URI, VirtualHardwareSection)
+    * @see VmApi#editVirtualHardwareSection(URI, VirtualHardwareSection)
     */
    @PUT
    @Path("/virtualHardwareSection")
    @Produces(VIRTUAL_HARDWARE_SECTION)
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> modifyVirtualHardwareSection(@EndpointParam URI vmURI,
-                                                       @BinderParam(BindToXMLPayload.class) VirtualHardwareSection section);
+   ListenableFuture<Task> editVirtualHardwareSection(@EndpointParam URI vmHref,
+            @BinderParam(BindToXMLPayload.class) VirtualHardwareSection section);
 
    /**
     * @see VmApi#getVirtualHardwareSectionCpu(URI)
@@ -418,18 +871,18 @@
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<RasdItem> getVirtualHardwareSectionCpu(@EndpointParam URI vmURI);
+   ListenableFuture<RasdItem> getVirtualHardwareSectionCpu(@EndpointParam URI vmHref);
 
    /**
-    * @see VmApi#modifyVirtualHardwareSectionCpu(URI, ResourceAllocationSettingData)
+    * @see VmApi#editVirtualHardwareSectionCpu(URI, ResourceAllocationSettingData)
     */
    @PUT
    @Path("/virtualHardwareSection/cpu")
    @Produces(OVF_RASD_ITEM)
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> modifyVirtualHardwareSectionCpu(@EndpointParam URI vmURI,
-                                                          @BinderParam(BindToXMLPayload.class) RasdItem rasd);
+   ListenableFuture<Task> editVirtualHardwareSectionCpu(@EndpointParam URI vmHref,
+            @BinderParam(BindToXMLPayload.class) RasdItem rasd);
 
    /**
     * @see VmApi#getVirtualHardwareSectionDisks(URI)
@@ -439,18 +892,18 @@
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<RasdItemsList> getVirtualHardwareSectionDisks(@EndpointParam URI vmURI);
+   ListenableFuture<RasdItemsList> getVirtualHardwareSectionDisks(@EndpointParam URI vmHref);
 
    /**
-    * @see VmApi#modifyVirtualHardwareSectionDisks(URI, RasdItemsList)
+    * @see VmApi#editVirtualHardwareSectionDisks(URI, RasdItemsList)
     */
    @PUT
    @Path("/virtualHardwareSection/disks")
    @Produces(OVF_RASD_ITEMS_LIST)
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> modifyVirtualHardwareSectionDisks(@EndpointParam URI vmURI,
-                                                            @BinderParam(BindToXMLPayload.class) RasdItemsList rasdItemsList);
+   ListenableFuture<Task> editVirtualHardwareSectionDisks(@EndpointParam URI vmHref,
+            @BinderParam(BindToXMLPayload.class) RasdItemsList rasdItemsList);
 
    /**
     * @see VmApi#getVirtualHardwareSectionMedia(URI)
@@ -460,7 +913,7 @@
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<RasdItemsList> getVirtualHardwareSectionMedia(@EndpointParam URI vmURI);
+   ListenableFuture<RasdItemsList> getVirtualHardwareSectionMedia(@EndpointParam URI vmHref);
 
    /**
     * @see VmApi#getVirtualHardwareSectionMemory(URI)
@@ -470,18 +923,18 @@
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<RasdItem> getVirtualHardwareSectionMemory(@EndpointParam URI vmURI);
+   ListenableFuture<RasdItem> getVirtualHardwareSectionMemory(@EndpointParam URI vmHref);
 
    /**
-    * @see VmApi#modifyVirtualHardwareSectionMemory(URI, ResourceAllocationSettingData)
+    * @see VmApi#editVirtualHardwareSectionMemory(URI, ResourceAllocationSettingData)
     */
    @PUT
    @Path("/virtualHardwareSection/memory")
    @Produces(OVF_RASD_ITEM)
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> modifyVirtualHardwareSectionMemory(@EndpointParam URI vmURI,
-                                                             @BinderParam(BindToXMLPayload.class) RasdItem rasd);
+   ListenableFuture<Task> editVirtualHardwareSectionMemory(@EndpointParam URI vmHref,
+            @BinderParam(BindToXMLPayload.class) RasdItem rasd);
 
    /**
     * @see VmApi#getVirtualHardwareSectionNetworkCards(URI)
@@ -491,18 +944,18 @@
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<RasdItemsList> getVirtualHardwareSectionNetworkCards(@EndpointParam URI vmURI);
+   ListenableFuture<RasdItemsList> getVirtualHardwareSectionNetworkCards(@EndpointParam URI vmHref);
 
    /**
-    * @see VmApi#modifyVirtualHardwareSectionNetworkCards(URI, RasdItemsList)
+    * @see VmApi#editVirtualHardwareSectionNetworkCards(URI, RasdItemsList)
     */
    @PUT
    @Path("/virtualHardwareSection/networkCards")
    @Produces(OVF_RASD_ITEMS_LIST)
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> modifyVirtualHardwareSectionNetworkCards(@EndpointParam URI vmURI,
-                                                                   @BinderParam(BindToXMLPayload.class) RasdItemsList rasdItemsList);
+   ListenableFuture<Task> editVirtualHardwareSectionNetworkCards(@EndpointParam URI vmHref,
+            @BinderParam(BindToXMLPayload.class) RasdItemsList rasdItemsList);
 
    /**
     * @see VmApi#getVirtualHardwareSectionSerialPorts(URI)
@@ -512,22 +965,26 @@
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<RasdItemsList> getVirtualHardwareSectionSerialPorts(@EndpointParam URI vmURI);
+   ListenableFuture<RasdItemsList> getVirtualHardwareSectionSerialPorts(@EndpointParam URI vmHref);
 
    /**
-    * @see VmApi#modifyVirtualHardwareSectionSerialPorts(URI, RasdItemsList)
+    * @see VmApi#editVirtualHardwareSectionSerialPorts(URI, RasdItemsList)
     */
    @PUT
    @Path("/virtualHardwareSection/serialPorts")
    @Produces(OVF_RASD_ITEMS_LIST)
    @Consumes(TASK)
    @JAXBResponseParser
-   ListenableFuture<Task> modifyVirtualHardwareSectionSerialPorts(@EndpointParam URI vmURI,
-                                                                  @BinderParam(BindToXMLPayload.class) RasdItemsList rasdItemsList);
+   ListenableFuture<Task> editVirtualHardwareSectionSerialPorts(@EndpointParam URI vmHref,
+            @BinderParam(BindToXMLPayload.class) RasdItemsList rasdItemsList);
 
    /**
     * Asynchronous access to {@Vm} {@link Metadata} features.
     */
    @Delegate
-   MetadataAsyncApi.Writeable getMetadataApi();
+   MetadataAsyncApi.Writeable getMetadataApi(@EndpointParam(parser = VmURNToHref.class) String vmUrn);
+
+   @Delegate
+   MetadataAsyncApi.Writeable getMetadataApi(@EndpointParam URI vmHref);
+
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminCatalogApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminCatalogApi.java
index 7625050..45937d9 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminCatalogApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminCatalogApi.java
@@ -23,68 +23,83 @@
 
 import org.jclouds.concurrent.Timeout;
 import org.jclouds.rest.annotations.Delegate;
+import org.jclouds.rest.annotations.EndpointParam;
 import org.jclouds.vcloud.director.v1_5.domain.AdminCatalog;
+import org.jclouds.vcloud.director.v1_5.domain.Metadata;
 import org.jclouds.vcloud.director.v1_5.domain.Owner;
+import org.jclouds.vcloud.director.v1_5.domain.params.ControlAccessParams;
 import org.jclouds.vcloud.director.v1_5.domain.params.PublishCatalogParams;
 import org.jclouds.vcloud.director.v1_5.features.CatalogApi;
 import org.jclouds.vcloud.director.v1_5.features.MetadataApi;
+import org.jclouds.vcloud.director.v1_5.functions.href.CatalogURNToAdminHref;
 
 /**
  * Provides synchronous access to {@link AdminCatalog} objects.
  * 
  * @see AdminCatalogAsyncApi
- * @author danikov
+ * @author danikov, Adrian Cole
  */
 @Timeout(duration = 180, timeUnit = TimeUnit.SECONDS)
 public interface AdminCatalogApi extends CatalogApi {
-   
-   
+
    /**
-    * Creates a catalog in an organization. The catalog will always be created in unpublished state.
-    *
+    * Creates a catalog in an organization. The catalog will always be addd in unpublished state.
+    * 
     * <pre>
     * POST /admin/org/{id}/catalogs
     * </pre>
-    *
-    * @param orgRef the reference for the org
+    * 
+    * @param orgUrn
+    *           the urn for the org
     * @return contains a , which will point to the running asynchronous creation operation.
     */
-   AdminCatalog createCatalog(URI orgRef, AdminCatalog catalog);
+   AdminCatalog addCatalogToOrg(AdminCatalog catalog, String orgUrn);
+
+   AdminCatalog addCatalogToOrg(AdminCatalog catalog, URI catalogAdminHref);
 
    /**
     * Retrieves a catalog.
-    *
+    * 
     * <pre>
     * GET /admin/catalog/{id}
     * </pre>
-    *
-    * @param catalogRef the reference for the catalog
+    * 
+    * @param catalogUrn
+    *           the urn for the catalog
     * @return a catalog
     */
    @Override
-   AdminCatalog getCatalog(URI catalogRef);
+   AdminCatalog get(String catalogUrn);
    
+   @Override
+   AdminCatalog get(URI catalogAdminHref);
+
    /**
-    * Modifies a catalog. A catalog could be published or unpublished. The IsPublished property is treated as a 
-    * read only value by the server. In order to control publishing settings use the 'publish' action must be used.
+    * Modifies a catalog. A catalog could be published or unpublished. The IsPublished property is
+    * treated as a read only value by the server. In order to control publishing settings use the
+    * 'publish' action must be used.
     * 
     * <pre>
     * PUT /admin/catalog/{id}
     * </pre>
     * 
-    * @return the updated catalog
+    * @return the edited catalog
     */
-   AdminCatalog updateCatalog(URI catalogRef, AdminCatalog catalog);
-   
+   AdminCatalog edit(String catalogUrn, AdminCatalog catalog);
+
+   AdminCatalog edit(URI catalogAdminHref, AdminCatalog catalog);
+
    /**
-    * Deletes a catalog. The catalog could be deleted if it is either published or unpublished.
+    * Deletes a catalog. The catalog could be removed if it is either published or unpublished.
     * 
     * <pre>
     * DELETE /admin/catalog/{id}
     * </pre>
     */
-   void deleteCatalog(URI catalogRef);
-   
+   void remove(String catalogUrn);
+
+   void remove(URI catalogAdminHref);
+
    /**
     * Retrieves the owner of a catalog.
     * 
@@ -94,8 +109,10 @@
     * 
     * @return the owner or null if not found
     */
-   Owner getOwner(URI catalogRef);
-   
+   Owner getOwner(String catalogUrn);
+
+   Owner getOwner(URI catalogAdminHref);
+
    /**
     * Changes owner for catalog.
     * 
@@ -103,20 +120,58 @@
     * PUT /admin/catalog/{id}/owner
     * </pre>
     */
-   void setOwner(URI catalogRef, Owner newOwner);
+   void setOwner(String catalogUrn, Owner newOwner);
+
+   void setOwner(URI catalogAdminHref, Owner newOwner);
+
+   // TODO: lot of work to pass in a single boolean, would like to polymorphically include something
+   // like:
+   // void publishCatalog(String catalogUrn)
    
    /**
-    * Publish a catalog. Publishing a catalog makes the catalog visible to all organizations in a vCloud.
+    * Publish a catalog. Publishing a catalog makes the catalog visible to all organizations in a
+    * vCloud.
+    * @param orgUrn
     */
-   void publishCatalog(URI catalogRef, PublishCatalogParams params);
+   void publish(String catalogUrn, PublishCatalogParams params);
+
+   void publish(URI catalogAdminHref, PublishCatalogParams params);
+
+   /**
+    * Modifies a catalog control access.
+    *
+    * <pre>
+    * POST /org/{id}/catalog/{catalogId}/action/controlAccess
+    * </pre>
+    *
+    * @return the control access information
+    */
+   ControlAccessParams editAccessControl(String catalogUrn, ControlAccessParams params);
+
+   ControlAccessParams editAccessControl(URI catalogAdminHref, ControlAccessParams params);
+
+   /**
+    * Retrieves the catalog control access information.
+    *
+    * <pre>
+    * GET /org/{id}/catalog/{catalogId}/controlAccess
+    * </pre>
+    *
+    * @return the control access information
+    */
+   ControlAccessParams getAccessControl(String catalogUrn);
    
-   //TODO: lot of work to pass in a single boolean, would like to polymorphically include something like:
-   //void publishCatalog(URI catalogRef)
+   ControlAccessParams getAccessControl(URI catalogAdminHref);
 
    /**
     * @return synchronous access to {@link Metadata.Writeable} features
     */
    @Override
    @Delegate
-   MetadataApi.Writeable getMetadataApi();
+   MetadataApi.Writeable getMetadataApi(@EndpointParam(parser = CatalogURNToAdminHref.class) String catalogUrn);
+
+   @Override
+   @Delegate
+   MetadataApi.Writeable getMetadataApi(@EndpointParam URI catalogAdminHref);
+
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminCatalogAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminCatalogAsyncApi.java
index 239a6a1..7c42a91 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminCatalogAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminCatalogAsyncApi.java
@@ -18,6 +18,8 @@
  */
 package org.jclouds.vcloud.director.v1_5.features.admin;
 
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.CONTROL_ACCESS;
+
 import java.net.URI;
 
 import javax.ws.rs.Consumes;
@@ -38,97 +40,218 @@
 import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
 import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
 import org.jclouds.vcloud.director.v1_5.domain.AdminCatalog;
+import org.jclouds.vcloud.director.v1_5.domain.Metadata;
 import org.jclouds.vcloud.director.v1_5.domain.Owner;
+import org.jclouds.vcloud.director.v1_5.domain.params.ControlAccessParams;
 import org.jclouds.vcloud.director.v1_5.domain.params.PublishCatalogParams;
 import org.jclouds.vcloud.director.v1_5.features.CatalogAsyncApi;
 import org.jclouds.vcloud.director.v1_5.features.MetadataAsyncApi;
 import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
+import org.jclouds.vcloud.director.v1_5.functions.href.CatalogURNToAdminHref;
+import org.jclouds.vcloud.director.v1_5.functions.href.OrgURNToAdminHref;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
 /**
  * @see AdminCatalogApi
- * @author danikov
+ * @author danikov, Adrian Cole
  */
 @RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface AdminCatalogAsyncApi extends CatalogAsyncApi {
-   
+
    /**
-    * @see AdminApi#createCatalog(URI, AdminCatalog)
+    * @see AdminCatalogApi#addCatalogToOrg(AdminCatalog, String)
     */
    @POST
    @Path("/catalogs")
    @Consumes(VCloudDirectorMediaType.ADMIN_CATALOG)
    @Produces(VCloudDirectorMediaType.ADMIN_CATALOG)
    @JAXBResponseParser
-   ListenableFuture<AdminCatalog> createCatalog(@EndpointParam URI orgRef, 
-         @BinderParam(BindToXMLPayload.class) AdminCatalog catalog);
+   ListenableFuture<AdminCatalog> addCatalogToOrg(@BinderParam(BindToXMLPayload.class) AdminCatalog catalog,
+            @EndpointParam(parser = OrgURNToAdminHref.class) String orgUrn);
 
    /**
-    * @see AdminApi#getCatalog(URI)
+    * @see AdminCatalogApi#addCatalogToOrg(AdminCatalog, URI)
+    */
+   @POST
+   @Path("/catalogs")
+   @Consumes(VCloudDirectorMediaType.ADMIN_CATALOG)
+   @Produces(VCloudDirectorMediaType.ADMIN_CATALOG)
+   @JAXBResponseParser
+   ListenableFuture<AdminCatalog> addCatalogToOrg(@BinderParam(BindToXMLPayload.class) AdminCatalog catalog,
+            @EndpointParam URI orgHref);
+
+   /**
+    * @see AdminCatalogApi#get(String)
     */
    @Override
    @GET
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<AdminCatalog> getCatalog(@EndpointParam URI catalogRef);
+   ListenableFuture<AdminCatalog> get(@EndpointParam(parser = CatalogURNToAdminHref.class) String catalogUrn);
 
    /**
-    * @see AdminApi#getCatalog(URI)
+    * @see AdminCatalogApi#get(URI)
+    */
+   @Override
+   @GET
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<AdminCatalog> get(@EndpointParam URI orgHref);
+
+   /**
+    * @see AdminCatalogApi#edit(String, AdminCatalog)
     */
    @PUT
    @Consumes(VCloudDirectorMediaType.ADMIN_CATALOG)
    @Produces(VCloudDirectorMediaType.ADMIN_CATALOG)
    @JAXBResponseParser
-   ListenableFuture<AdminCatalog> updateCatalog(@EndpointParam URI catalogRef, 
-         @BinderParam(BindToXMLPayload.class) AdminCatalog catalog);
-   
+   ListenableFuture<AdminCatalog> edit(@EndpointParam(parser = CatalogURNToAdminHref.class) String catalogUrn,
+            @BinderParam(BindToXMLPayload.class) AdminCatalog catalog);
+
    /**
-    * @see AdminApi#deleteCatalog(URI)
+    * @see AdminCatalogApi#edit(URI, AdminCatalog)
+    */
+   @PUT
+   @Consumes(VCloudDirectorMediaType.ADMIN_CATALOG)
+   @Produces(VCloudDirectorMediaType.ADMIN_CATALOG)
+   @JAXBResponseParser
+   ListenableFuture<AdminCatalog> edit(@EndpointParam URI catalogAdminHref,
+            @BinderParam(BindToXMLPayload.class) AdminCatalog catalog);
+
+   /**
+    * @see AdminCatalogApi#remove(String)
     */
    @DELETE
    @Consumes
    @JAXBResponseParser
-   ListenableFuture<Void> deleteCatalog(@EndpointParam URI catalogRef);
-   
+   ListenableFuture<Void> remove(@EndpointParam(parser = CatalogURNToAdminHref.class) String catalogUrn);
+
    /**
-    * @see AdminApi#getOwner(URI)
+    * @see AdminCatalogApi#remove(URI)
+    */
+   @DELETE
+   @Consumes
+   @JAXBResponseParser
+   ListenableFuture<Void> remove(@EndpointParam URI catalogAdminHref);
+
+   /**
+    * @see AdminCatalogApi#getOwner(String)
     */
    @GET
    @Path("/owner")
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<Owner> getOwner(@EndpointParam URI catalogRef);
-   
+   ListenableFuture<Owner> getOwner(@EndpointParam(parser = CatalogURNToAdminHref.class) String catalogUrn);
+
    /**
-    * @see AdminApi#setOwner(URI, Owner)
+    * @see AdminCatalogApi#getOwner(URI)
+    */
+   @GET
+   @Path("/owner")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<Owner> getOwner(@EndpointParam URI catalogAdminHref);
+
+   /**
+    * @see AdminCatalogApi#setOwner(String, Owner)
     */
    @PUT
    @Path("/owner")
    @Consumes
    @Produces(VCloudDirectorMediaType.OWNER)
    @JAXBResponseParser
-   ListenableFuture<Void> setOwner(@EndpointParam URI catalogRef,
-         @BinderParam(BindToXMLPayload.class) Owner newOwner);
-   
+   ListenableFuture<Void> setOwner(@EndpointParam(parser = CatalogURNToAdminHref.class) String catalogUrn,
+            @BinderParam(BindToXMLPayload.class) Owner newOwner);
+
    /**
-    * @see AdminApi#AdminApi(URI, PublishCatalogParams)
+    * @see AdminCatalogApi#setOwner(URI, Owner)
+    */
+   @PUT
+   @Path("/owner")
+   @Consumes
+   @Produces(VCloudDirectorMediaType.OWNER)
+   @JAXBResponseParser
+   ListenableFuture<Void> setOwner(@EndpointParam URI catalogAdminHref,
+            @BinderParam(BindToXMLPayload.class) Owner newOwner);
+
+   /**
+    * @see AdminCatalogApi#publish(String, PublishCatalogParams)
     */
    @POST
    @Path("/action/publish")
    @Consumes
    @Produces(VCloudDirectorMediaType.PUBLISH_CATALOG_PARAMS)
    @JAXBResponseParser
-   ListenableFuture<Void> publishCatalog(@EndpointParam URI catalogRef,
-         @BinderParam(BindToXMLPayload.class) PublishCatalogParams params);
+   ListenableFuture<Void> publish(@EndpointParam(parser = CatalogURNToAdminHref.class) String catalogUrn,
+            @BinderParam(BindToXMLPayload.class) PublishCatalogParams params);
 
    /**
+    * @see AdminCatalogApi#publish(URI, PublishCatalogParams)
+    */
+   @POST
+   @Path("/action/publish")
+   @Consumes
+   @Produces(VCloudDirectorMediaType.PUBLISH_CATALOG_PARAMS)
+   @JAXBResponseParser
+   ListenableFuture<Void> publish(@EndpointParam URI catalogAdminHref,
+            @BinderParam(BindToXMLPayload.class) PublishCatalogParams params);
+
+   /**
+    * @see AdminCatalogApi#editAccessControl(String, ControlAccessParams)
+    */
+   @POST
+   @Path("/action/controlAccess")
+   @Produces(CONTROL_ACCESS)
+   @Consumes(CONTROL_ACCESS)
+   @JAXBResponseParser
+   ListenableFuture<ControlAccessParams> editAccessControl(@EndpointParam(parser = CatalogURNToAdminHref.class) String catalogUrn,
+      @BinderParam(BindToXMLPayload.class) ControlAccessParams params);
+
+   /**
+    * @see AdminCatalogApi#editAccessControl(URI, ControlAccessParams)
+    */
+   @POST
+   @Path("/action/controlAccess")
+   @Produces(CONTROL_ACCESS)
+   @Consumes(CONTROL_ACCESS)
+   @JAXBResponseParser
+   ListenableFuture<ControlAccessParams> editAccessControl(@EndpointParam URI catalogAdminHref,
+      @BinderParam(BindToXMLPayload.class) ControlAccessParams params);
+   
+   /**
+    * @see AdminCatalogApi#getAccessControl(String)
+    */
+   @GET
+   @Path("/controlAccess")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<ControlAccessParams> getAccessControl(@EndpointParam(parser = CatalogURNToAdminHref.class) String catalogUrn);
+   
+   /**
+    * @see AdminCatalogApi#getAccessControl(URI)
+    */
+   @GET
+   @Path("/controlAccess")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<ControlAccessParams> getAccessControl(@EndpointParam URI catalogAdminHref);
+   
+   /**
     * @return synchronous access to {@link Metadata.Writeable} features
     */
    @Override
    @Delegate
-   MetadataAsyncApi.Writeable getMetadataApi();
+   MetadataAsyncApi.Writeable getMetadataApi(@EndpointParam(parser = CatalogURNToAdminHref.class) String catalogUrn);
+
+   @Override
+   @Delegate
+   MetadataAsyncApi.Writeable getMetadataApi(@EndpointParam URI catalogAdminHref);
 
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminNetworkApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminNetworkApi.java
index 241e5b2..4b9a4eb 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminNetworkApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminNetworkApi.java
@@ -23,73 +23,86 @@
 
 import org.jclouds.concurrent.Timeout;
 import org.jclouds.rest.annotations.Delegate;
+import org.jclouds.rest.annotations.EndpointParam;
 import org.jclouds.vcloud.director.v1_5.domain.Task;
 import org.jclouds.vcloud.director.v1_5.domain.network.Network;
 import org.jclouds.vcloud.director.v1_5.domain.org.OrgNetwork;
 import org.jclouds.vcloud.director.v1_5.features.MetadataApi;
 import org.jclouds.vcloud.director.v1_5.features.NetworkApi;
+import org.jclouds.vcloud.director.v1_5.functions.href.NetworkURNToAdminHref;
 
 /**
  * Provides synchronous access to admin {@link Network} objects.
  * 
  * @see AdminNetworkAsyncApi
- * @author danikov
+ * @author danikov, Adrian Cole
  */
 @Timeout(duration = 180, timeUnit = TimeUnit.SECONDS)
 public interface AdminNetworkApi extends NetworkApi {
-   
+
    /**
-    * Gets admin representation of network. This operation could return admin 
-    * representation of organization network or external network. vApp networks 
-    * do not have admin representation.
-    *
+    * Gets admin representation of network. This operation could return admin representation of
+    * organization network or external network. vApp networks do not have admin representation.
+    * 
     * <pre>
     * GET /admin/network/{id}
     * </pre>
-    *
-    * @param networkRef the reference for the network
+    * 
+    * @param networkUrn
+    *           the reference for the network
     * @return the network
     */
    @Override
-   Network getNetwork(URI networkRef);
-   
+   Network get(String networkUrn);
+
+   @Override
+   Network get(URI networkAdminHref);
+
    /**
     * Modifies an org network
-    *
+    * 
     * <pre>
     * PUT /admin/network/{id}
     * </pre>
-    *
-    * @param networkRef the reference for the network
-    * @param network the updated network
-    * @return a task. This operation is asynchronous and the user should monitor the 
-    * returned task status in order to check when it is completed.
+    * 
+    * @param networkUrn
+    *           the reference for the network
+    * @param network
+    *           the edited network
+    * @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 updateNetwork(URI networkRef, OrgNetwork network);
-   
+   Task edit(String networkUrn, OrgNetwork network);
+
+   Task edit(URI networkAdminHref, OrgNetwork network);
+
    /**
-    * Reset(undeploy & redeploy) networking services on a logical network. 
-    * The reset operation can be performed on: 
-    * - external networks 
-    * - organization networks 
-    * - vApp networks 
-    * The reset operation can be performed only on deployed networks.
-    *
+    * Reset(undeploy & redeploy) networking services on a logical network. The reset operation can
+    * be performed on: - external networks - organization networks - vApp networks The reset
+    * operation can be performed only on deployed networks.
+    * 
     * <pre>
     * POST /admin/network/{id}/action/reset
     * </pre>
-    *
-    * @param networkRef the reference for the network
-    * @return a task. This operation is asynchronous and the user should monitor the 
-    * returned task status in order to check when it is completed.
+    * 
+    * @param networkUrn
+    *           the reference for the network
+    * @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 resetNetwork(URI networkRef);
+   Task reset(String networkUrn);
    
+   Task reset(URI networkAdminHref);
+
    /**
-   * @return synchronous access to admin {@link MetadataApi.Writeable} features
-   */
+    * @return synchronous access to admin {@link MetadataApi.Writeable} features
+    */
    @Override
    @Delegate
-   MetadataApi.Writeable getMetadataApi();
+   MetadataApi.Writeable getMetadataApi(@EndpointParam(parser = NetworkURNToAdminHref.class) String networkUrn);
+
+   @Override
+   @Delegate
+   MetadataApi.Writeable getMetadataApi(@EndpointParam URI networkAdminHref);
 
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminNetworkAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminNetworkAsyncApi.java
index 76afd03..5d42274 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminNetworkAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminNetworkAsyncApi.java
@@ -37,11 +37,12 @@
 import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
 import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
 import org.jclouds.vcloud.director.v1_5.domain.Task;
-import org.jclouds.vcloud.director.v1_5.domain.network.ExternalNetwork;
+import org.jclouds.vcloud.director.v1_5.domain.network.Network;
 import org.jclouds.vcloud.director.v1_5.domain.org.OrgNetwork;
 import org.jclouds.vcloud.director.v1_5.features.MetadataAsyncApi;
 import org.jclouds.vcloud.director.v1_5.features.NetworkAsyncApi;
 import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
+import org.jclouds.vcloud.director.v1_5.functions.href.NetworkURNToAdminHref;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
@@ -51,40 +52,74 @@
  */
 @RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface AdminNetworkAsyncApi extends NetworkAsyncApi {
-   
+
    /**
-    * @see AdminNetworkApi#getNetwork(URI)
+    * @see AdminNetworkApi#get(String)
     */
    @Override
    @GET
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<ExternalNetwork> getNetwork(@EndpointParam URI networkRef);
-   
+   ListenableFuture<? extends Network> get(@EndpointParam(parser = NetworkURNToAdminHref.class) String networkUrn);
+
    /**
-    * @see AdminNetworkApi#updateNetwork(URI, OrgNetwork)
+    * @see AdminNetworkApi#get(URI)
+    */
+   @Override
+   @GET
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<? extends Network> get(@EndpointParam URI networkAdminHref);
+
+   /**
+    * @see AdminNetworkApi#edit(String, OrgNetwork)
     */
    @PUT
    @Consumes(VCloudDirectorMediaType.TASK)
    @Produces(VCloudDirectorMediaType.ADMIN_ORG_NETWORK)
    @JAXBResponseParser
-   ListenableFuture<Task> updateNetwork(@EndpointParam URI networkRef, 
-         @BinderParam(BindToXMLPayload.class) OrgNetwork network);
-   
+   ListenableFuture<Task> edit(@EndpointParam(parser = NetworkURNToAdminHref.class) String networkUrn,
+            @BinderParam(BindToXMLPayload.class) OrgNetwork network);
+
    /**
-    * @see AdminNetworkApi#resetNetwork(URI)
+    * @see AdminNetworkApi#edit(URI, OrgNetwork)
+    */
+   @PUT
+   @Consumes(VCloudDirectorMediaType.TASK)
+   @Produces(VCloudDirectorMediaType.ADMIN_ORG_NETWORK)
+   @JAXBResponseParser
+   ListenableFuture<Task> edit(@EndpointParam URI networkAdminHref,
+            @BinderParam(BindToXMLPayload.class) OrgNetwork network);
+
+   /**
+    * @see AdminNetworkApi#reset(String)
     */
    @POST
    @Path("/action/reset")
    @Consumes
    @JAXBResponseParser
-   ListenableFuture<Task> resetNetwork(@EndpointParam URI networkRef);
-   
+   ListenableFuture<Task> reset(@EndpointParam(parser = NetworkURNToAdminHref.class) String networkUrn);
+
+   /**
+    * @see AdminNetworkApi#reset(URI)
+    */
+   @POST
+   @Path("/action/reset")
+   @Consumes
+   @JAXBResponseParser
+   ListenableFuture<Task> reset(@EndpointParam URI networkAdminHref);
+
    /**
     * @return asynchronous access to admin {@link MetadataAsyncApi.Writeable} features
     */
    @Override
    @Delegate
-   MetadataAsyncApi.Writeable getMetadataApi();
+   MetadataAsyncApi.Writeable getMetadataApi(@EndpointParam(parser = NetworkURNToAdminHref.class) String networkUrn);
+
+   @Override
+   @Delegate
+   MetadataAsyncApi.Writeable getMetadataApi(@EndpointParam URI networkAdminHref);
+
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminOrgApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminOrgApi.java
index 93610f8..3622e29 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminOrgApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminOrgApi.java
@@ -23,7 +23,9 @@
 
 import org.jclouds.concurrent.Timeout;
 import org.jclouds.rest.annotations.Delegate;
+import org.jclouds.rest.annotations.EndpointParam;
 import org.jclouds.vcloud.director.v1_5.domain.org.AdminOrg;
+import org.jclouds.vcloud.director.v1_5.domain.org.Org;
 import org.jclouds.vcloud.director.v1_5.domain.org.OrgEmailSettings;
 import org.jclouds.vcloud.director.v1_5.domain.org.OrgGeneralSettings;
 import org.jclouds.vcloud.director.v1_5.domain.org.OrgLdapSettings;
@@ -33,197 +35,251 @@
 import org.jclouds.vcloud.director.v1_5.domain.org.OrgVAppTemplateLeaseSettings;
 import org.jclouds.vcloud.director.v1_5.features.MetadataApi;
 import org.jclouds.vcloud.director.v1_5.features.OrgApi;
+import org.jclouds.vcloud.director.v1_5.functions.href.OrgURNToAdminHref;
 
 /**
  * Provides synchronous access to {@link Org} objects.
  * 
- * @see GroupAsyncApi
- * @author danikov
+ * @see AdminOrgAsyncApi
+ * @author danikov, Adrian Cole
  */
 @Timeout(duration = 180, timeUnit = TimeUnit.SECONDS)
 public interface AdminOrgApi extends OrgApi {
-   
+
    /**
-    * Retrieves an admin view of an organization. 
-    * The organization might be enabled or disabled. 
-    * If enabled, the organization allows login and all other operations.
-    *
+    * Retrieves an admin view of an organization. The organization might be enabled or disabled. If
+    * enabled, the organization allows login and all other operations.
+    * 
     * <pre>
     * GET /admin/org/{id}
     * </pre>
-    *
-    * @param orgRef the reference for the admin org
+    * 
+    * @param orgUrn
+    *           the reference for the admin org
     * @return the admin org
     */
    @Override
-   AdminOrg getOrg(URI orgRef);
-   
+   AdminOrg get(String orgUrn);
+
+   @Override
+   AdminOrg get(URI orgAdminHref);
+
    /**
     * Gets organizational settings for this organization.
-    *
+    * 
     * <pre>
     * GET /admin/org/{id}/settings
     * </pre>
-    *
-    * @param orgRef the reference for the admin org
+    * 
+    * @param orgUrn
+    *           the reference for the admin org
     * @return the settings
     */
-   OrgSettings getSettings(URI orgRef);
-   
+   OrgSettings getSettings(String orgUrn);
+
+   OrgSettings getSettings(URI orgAdminHref);
+
    /**
     * Updates organizational settings for this organization.
     * 
     * <pre>
     * PUT /admin/org/{id}/settings
     * </pre>
-    * @param orgRef the reference for the admin org
-    * @param newSettings the requested updated settings
+    * 
+    * @param orgUrn
+    *           the reference for the admin org
+    * @param newSettings
+    *           the requested edited settings
     * @return the resultant settings
     */
-   OrgSettings updateSettings(URI orgRef, OrgSettings newSettings);
-   
+   OrgSettings editSettings(String orgUrn, OrgSettings newSettings);
+
+   OrgSettings editSettings(URI orgAdminHref, OrgSettings newSettings);
+
    /**
     * Retrieves email settings for an organization.
-    *
+    * 
     * <pre>
     * GET /admin/org/{id}/settings/email
     * </pre>
-    *
-    * @param orgRef the reference for the admin org
+    * 
+    * @param orgUrn
+    *           the reference for the admin org
     * @return the email settings
     */
-   OrgEmailSettings getEmailSettings(URI orgRef);
-   
+   OrgEmailSettings getEmailSettings(String orgUrn);
+
+   OrgEmailSettings getEmailSettings(URI orgAdminHref);
+
    /**
     * Updates email policy settings for organization.
     * 
     * <pre>
     * PUT /admin/org/{id}/settings/email
     * </pre>
-    * @param orgRef the reference for the admin org
-    * @param newSettings the requested updated settings
+    * 
+    * @param orgUrn
+    *           the reference for the admin org
+    * @param newSettings
+    *           the requested edited settings
     * @return the resultant settings
     */
-   OrgEmailSettings updateEmailSettings(URI orgRef, 
-         OrgEmailSettings newSettings);
-   
+   OrgEmailSettings editEmailSettings(String orgUrn, OrgEmailSettings newSettings);
+
+   OrgEmailSettings editEmailSettings(URI orgAdminHref, OrgEmailSettings newSettings);
+
    /**
     * Gets general organization settings.
-    *
+    * 
     * <pre>
     * GET /admin/org/{id}/settings/general
     * </pre>
-    *
-    * @param orgRef the reference for the admin org
+    * 
+    * @param orgUrn
+    *           the reference for the admin org
     * @return the lease settings
     */
-   OrgGeneralSettings getGeneralSettings(URI orgRef);
-   
+   OrgGeneralSettings getGeneralSettings(String orgUrn);
+
+   OrgGeneralSettings getGeneralSettings(URI orgAdminHref);
+
    /**
     * Updates general organization settings.
     * 
     * <pre>
     * PUT /admin/org/{id}/settings/general
     * </pre>
-    * @param orgRef the reference for the admin org
-    * @param newSettings the requested updated settings
+    * 
+    * @param orgUrn
+    *           the reference for the admin org
+    * @param newSettings
+    *           the requested edited settings
     * @return the resultant settings
     */
-   OrgGeneralSettings updateGeneralSettings(URI orgRef, 
-         OrgGeneralSettings newSettings);
-   
+   OrgGeneralSettings editGeneralSettings(String orgUrn, OrgGeneralSettings newSettings);
+
+   OrgGeneralSettings editGeneralSettings(URI orgAdminHref, OrgGeneralSettings newSettings);
+
    /**
     * Retrieves LDAP settings for an organization.
-    *
+    * 
     * <pre>
     * GET /admin/org/{id}/settings/ldap
     * </pre>
-    *
-    * @param orgRef the reference for the admin org
+    * 
+    * @param orgUrn
+    *           the reference for the admin org
     * @return the ldap settings
     */
-   OrgLdapSettings getLdapSettings(URI orgRef);
-   
+   OrgLdapSettings getLdapSettings(String orgUrn);
+
+   OrgLdapSettings getLdapSettings(URI orgAdminHref);
+
    /**
     * Retrieves password policy settings for an organization.
-    *
+    * 
     * <pre>
     * GET /admin/org/{id}/settings/passwordPolicy
     * </pre>
-    *
-    * @param orgRef the reference for the admin org
+    * 
+    * @param orgUrn
+    *           the reference for the admin org
     * @return the lease settings
     */
-   OrgPasswordPolicySettings getPasswordPolicy(URI orgRef);
-   
+   OrgPasswordPolicySettings getPasswordPolicy(String orgUrn);
+
+   OrgPasswordPolicySettings getPasswordPolicy(URI orgAdminHref);
+
    /**
     * Updates password policy settings for organization.
     * 
     * <pre>
     * PUT /admin/org/{id}/settings/passwordPolicy
     * </pre>
-    * @param orgRef the reference for the admin org
-    * @param newSettings the requested updated settings
+    * 
+    * @param orgUrn
+    *           the reference for the admin org
+    * @param newSettings
+    *           the requested edited settings
     * @return the resultant settings
     */
-   OrgPasswordPolicySettings updatePasswordPolicy(URI orgRef, 
-         OrgPasswordPolicySettings newSettings);
-   
+   OrgPasswordPolicySettings editPasswordPolicy(String orgUrn, OrgPasswordPolicySettings newSettings);
+
+   OrgPasswordPolicySettings editPasswordPolicy(URI orgAdminHref, OrgPasswordPolicySettings newSettings);
+
    /**
     * Gets organization resource cleanup settings on the level of vApp.
-    *
+    * 
     * <pre>
     * GET /admin/org/{id}/settings/vAppLeaseSettings
     * </pre>
-    *
-    * @param orgRef the reference for the admin org
+    * 
+    * @param orgUrn
+    *           the reference for the admin org
     * @return the lease settings
     */
-   OrgLeaseSettings getVAppLeaseSettings(URI orgRef);
-   
+   OrgLeaseSettings getVAppLeaseSettings(String orgUrn);
+
+   OrgLeaseSettings getVAppLeaseSettings(URI orgAdminHref);
+
    /**
     * Updates organization resource cleanup settings on the level of vApp.
     * 
     * <pre>
     * PUT /admin/org/{id}/settings/vAppLeaseSettings
     * </pre>
-    * @param orgRef the reference for the admin org
-    * @param newSettings the requested updated settings
+    * 
+    * @param orgUrn
+    *           the reference for the admin org
+    * @param newSettings
+    *           the requested edited settings
     * @return the resultant settings
     */
-   OrgLeaseSettings updateVAppLeaseSettings(URI orgRef, 
-         OrgLeaseSettings newSettings);
-   
+   OrgLeaseSettings editVAppLeaseSettings(String orgUrn, OrgLeaseSettings newSettings);
+
+   OrgLeaseSettings editVAppLeaseSettings(URI orgAdminHref, OrgLeaseSettings newSettings);
+
    /**
     * Retrieves expiration and storage policy for vApp templates in an organization.
-    *
+    * 
     * <pre>
     * GET /admin/org/{id}/settings/vAppTemplateLeaseSettings
     * </pre>
-    *
-    * @param orgRef the reference for the admin org
+    * 
+    * @param orgUrn
+    *           the reference for the admin org
     * @return the lease settings
     */
-   OrgVAppTemplateLeaseSettings getVAppTemplateLeaseSettings(URI orgRef);
-   
+   OrgVAppTemplateLeaseSettings getVAppTemplateLeaseSettings(String orgUrn);
+
+   OrgVAppTemplateLeaseSettings getVAppTemplateLeaseSettings(URI orgAdminHref);
+
    /**
     * Updates vApp template policy settings for organization.
     * 
     * <pre>
     * PUT /admin/org/{id}/settings/vAppTemplateLeaseSettings
     * </pre>
-    * @param orgRef the reference for the admin org
-    * @param newSettings the requested updated settings
+    * 
+    * @param orgUrn
+    *           the reference for the admin org
+    * @param newSettings
+    *           the requested edited settings
     * @return the resultant settings
     */
-   OrgVAppTemplateLeaseSettings updateVAppTemplateLeaseSettings(URI orgRef, 
-         OrgVAppTemplateLeaseSettings newSettings);
-   
+   OrgVAppTemplateLeaseSettings editVAppTemplateLeaseSettings(String orgUrn, OrgVAppTemplateLeaseSettings newSettings);
+
+   OrgVAppTemplateLeaseSettings editVAppTemplateLeaseSettings(URI orgAdminHref, OrgVAppTemplateLeaseSettings newSettings);
+
    /**
     * @return synchronous access to admin {@link MetadataApi.Writeable} features
     */
-    @Override
-    @Delegate
-    MetadataApi.Writeable getMetadataApi();
+   @Override
+   @Delegate
+   MetadataApi.Writeable getMetadataApi(@EndpointParam(parser = OrgURNToAdminHref.class) String orgUrn);
+
+   @Override
+   @Delegate
+   MetadataApi.Writeable getMetadataApi(@EndpointParam URI orgAdminHref);
 
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminOrgAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminOrgAsyncApi.java
index 2cdc111..bc7be01 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminOrgAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminOrgAsyncApi.java
@@ -46,26 +46,47 @@
 import org.jclouds.vcloud.director.v1_5.features.MetadataAsyncApi;
 import org.jclouds.vcloud.director.v1_5.features.OrgAsyncApi;
 import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
+import org.jclouds.vcloud.director.v1_5.functions.href.OrgURNToAdminHref;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
 /**
  * @see AdminOrgApi
- * @author danikov
+ * @author danikov, Adrian Cole
  */
 @RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface AdminOrgAsyncApi extends OrgAsyncApi {
-   
+
    /**
-    * @see AdminOrgApi#getOrg(URI)
+    * @see AdminOrgApi#get(String)
     */
    @Override
    @GET
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<AdminOrg> getOrg(@EndpointParam URI orgRef);
- 
+   ListenableFuture<AdminOrg> get(@EndpointParam(parser = OrgURNToAdminHref.class) String orgUrn);
+
+   /**
+    * @see AdminOrgApi#get(URI)
+    */
+   @Override
+   @GET
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<AdminOrg> get(@EndpointParam URI adminOrgHref);
+
+   /**
+    * @see AdminOrgApi#getSettings(String)
+    */
+   @GET
+   @Path("/settings")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<OrgSettings> getSettings(@EndpointParam(parser = OrgURNToAdminHref.class) String orgUrn);
+
    /**
     * @see AdminOrgApi#getSettings(URI)
     */
@@ -74,19 +95,40 @@
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<OrgSettings> getSettings(@EndpointParam URI orgRef);
+   ListenableFuture<OrgSettings> getSettings(@EndpointParam URI adminOrgHref);
 
    /**
-    * @see AdminOrgApi#updateSettings(URI, OrgSettings)
+    * @see AdminOrgApi#editSettings(String, OrgSettings)
     */
    @PUT
    @Path("/settings")
    @Consumes(VCloudDirectorMediaType.ORG_SETTINGS)
    @Produces(VCloudDirectorMediaType.ORG_SETTINGS)
    @JAXBResponseParser
-   ListenableFuture<OrgSettings> updateSettings(@EndpointParam URI orgRef, 
-         @BinderParam(BindToXMLPayload.class) OrgSettings settings);
- 
+   ListenableFuture<OrgSettings> editSettings(@EndpointParam(parser = OrgURNToAdminHref.class) String orgUrn,
+            @BinderParam(BindToXMLPayload.class) OrgSettings settings);
+
+   /**
+    * @see AdminOrgApi#editSettings(URI, OrgSettings)
+    */
+   @PUT
+   @Path("/settings")
+   @Consumes(VCloudDirectorMediaType.ORG_SETTINGS)
+   @Produces(VCloudDirectorMediaType.ORG_SETTINGS)
+   @JAXBResponseParser
+   ListenableFuture<OrgSettings> editSettings(@EndpointParam URI adminOrgHref,
+            @BinderParam(BindToXMLPayload.class) OrgSettings settings);
+
+   /**
+    * @see AdminOrgApi#getEmailSettings(String)
+    */
+   @GET
+   @Path("/settings/email")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<OrgEmailSettings> getEmailSettings(@EndpointParam(parser = OrgURNToAdminHref.class) String orgUrn);
+
    /**
     * @see AdminOrgApi#getEmailSettings(URI)
     */
@@ -95,19 +137,42 @@
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<OrgEmailSettings> getEmailSettings(@EndpointParam URI orgRef);
+   ListenableFuture<OrgEmailSettings> getEmailSettings(@EndpointParam URI adminOrgHref);
 
    /**
-    * @see AdminOrgApi#updateEmailSettings(URI, OrgEmailSettings)
+    * @see AdminOrgApi#editEmailSettings(String, OrgEmailSettings)
     */
    @PUT
    @Path("/settings/email")
    @Consumes(VCloudDirectorMediaType.ORG_EMAIL_SETTINGS)
    @Produces(VCloudDirectorMediaType.ORG_EMAIL_SETTINGS)
    @JAXBResponseParser
-   ListenableFuture<OrgEmailSettings> updateEmailSettings(@EndpointParam URI orgRef, 
-         @BinderParam(BindToXMLPayload.class) OrgEmailSettings settings);
- 
+   ListenableFuture<OrgEmailSettings> editEmailSettings(
+            @EndpointParam(parser = OrgURNToAdminHref.class) String orgUrn,
+            @BinderParam(BindToXMLPayload.class) OrgEmailSettings settings);
+
+   /**
+    * @see AdminOrgApi#editEmailSettings(URI, OrgEmailSettings)
+    */
+   @PUT
+   @Path("/settings/email")
+   @Consumes(VCloudDirectorMediaType.ORG_EMAIL_SETTINGS)
+   @Produces(VCloudDirectorMediaType.ORG_EMAIL_SETTINGS)
+   @JAXBResponseParser
+   ListenableFuture<OrgEmailSettings> editEmailSettings(@EndpointParam URI adminOrgHref,
+            @BinderParam(BindToXMLPayload.class) OrgEmailSettings settings);
+
+   /**
+    * @see AdminOrgApi#getGeneralSettings(String)
+    */
+   @GET
+   @Path("/settings/general")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<OrgGeneralSettings> getGeneralSettings(
+            @EndpointParam(parser = OrgURNToAdminHref.class) String orgUrn);
+
    /**
     * @see AdminOrgApi#getGeneralSettings(URI)
     */
@@ -116,20 +181,41 @@
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<OrgGeneralSettings> getGeneralSettings(@EndpointParam URI orgRef);
+   ListenableFuture<OrgGeneralSettings> getGeneralSettings(@EndpointParam URI adminOrgHref);
 
    /**
-    * @see AdminOrgApi#updateGeneralSettings(URI, OrgGeneralSettings)
+    * @see AdminOrgApi#editGeneralSettings(String, OrgGeneralSettings)
     */
    @PUT
    @Path("/settings/general")
    @Consumes(VCloudDirectorMediaType.ORG_GENERAL_SETTINGS)
    @Produces(VCloudDirectorMediaType.ORG_GENERAL_SETTINGS)
    @JAXBResponseParser
-   ListenableFuture<OrgGeneralSettings> updateGeneralSettings(
-         @EndpointParam URI orgRef, 
-         @BinderParam(BindToXMLPayload.class) OrgGeneralSettings settings);
-   
+   ListenableFuture<OrgGeneralSettings> editGeneralSettings(
+            @EndpointParam(parser = OrgURNToAdminHref.class) String orgUrn,
+            @BinderParam(BindToXMLPayload.class) OrgGeneralSettings settings);
+
+   /**
+    * @see AdminOrgApi#editGeneralSettings(URI, OrgGeneralSettings)
+    */
+   @PUT
+   @Path("/settings/general")
+   @Consumes(VCloudDirectorMediaType.ORG_GENERAL_SETTINGS)
+   @Produces(VCloudDirectorMediaType.ORG_GENERAL_SETTINGS)
+   @JAXBResponseParser
+   ListenableFuture<OrgGeneralSettings> editGeneralSettings(@EndpointParam URI adminOrgHref,
+            @BinderParam(BindToXMLPayload.class) OrgGeneralSettings settings);
+
+   /**
+    * @see AdminOrgApi#getPasswordPolicy(String)
+    */
+   @GET
+   @Path("/settings/ldap")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<OrgLdapSettings> getLdapSettings(@EndpointParam(parser = OrgURNToAdminHref.class) String orgUrn);
+
    /**
     * @see AdminOrgApi#getPasswordPolicy(URI)
     */
@@ -138,8 +224,19 @@
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<OrgLdapSettings> getLdapSettings(@EndpointParam URI orgRef);
- 
+   ListenableFuture<OrgLdapSettings> getLdapSettings(@EndpointParam URI adminOrgHref);
+
+   /**
+    * @see AdminOrgApi#getPasswordPolicy(String)
+    */
+   @GET
+   @Path("/settings/passwordPolicy")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<OrgPasswordPolicySettings> getPasswordPolicy(
+            @EndpointParam(parser = OrgURNToAdminHref.class) String orgUrn);
+
    /**
     * @see AdminOrgApi#getPasswordPolicy(URI)
     */
@@ -148,19 +245,42 @@
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<OrgPasswordPolicySettings> getPasswordPolicy(@EndpointParam URI orgRef);
+   ListenableFuture<OrgPasswordPolicySettings> getPasswordPolicy(@EndpointParam URI adminOrgHref);
 
    /**
-    * @see AdminOrgApi#updatePasswordPolicy(URI, OrgPasswordPolicySettings)
+    * @see AdminOrgApi#editPasswordPolicy(String, OrgPasswordPolicySettings)
     */
    @PUT
    @Path("/settings/passwordPolicy")
    @Consumes(VCloudDirectorMediaType.ORG_PASSWORD_POLICY_SETTINGS)
    @Produces(VCloudDirectorMediaType.ORG_PASSWORD_POLICY_SETTINGS)
    @JAXBResponseParser
-   ListenableFuture<OrgPasswordPolicySettings> updatePasswordPolicy(@EndpointParam URI orgRef, 
-         @BinderParam(BindToXMLPayload.class) OrgPasswordPolicySettings settings);
-   
+   ListenableFuture<OrgPasswordPolicySettings> editPasswordPolicy(
+            @EndpointParam(parser = OrgURNToAdminHref.class) String orgUrn,
+            @BinderParam(BindToXMLPayload.class) OrgPasswordPolicySettings settings);
+
+   /**
+    * @see AdminOrgApi#editPasswordPolicy(URI, OrgPasswordPolicySettings)
+    */
+   @PUT
+   @Path("/settings/passwordPolicy")
+   @Consumes(VCloudDirectorMediaType.ORG_PASSWORD_POLICY_SETTINGS)
+   @Produces(VCloudDirectorMediaType.ORG_PASSWORD_POLICY_SETTINGS)
+   @JAXBResponseParser
+   ListenableFuture<OrgPasswordPolicySettings> editPasswordPolicy(@EndpointParam URI adminOrgHref,
+            @BinderParam(BindToXMLPayload.class) OrgPasswordPolicySettings settings);
+
+   /**
+    * @see AdminOrgApi#getVAppLeaseSettings(String)
+    */
+   @GET
+   @Path("/settings/vAppLeaseSettings")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<OrgLeaseSettings> getVAppLeaseSettings(
+            @EndpointParam(parser = OrgURNToAdminHref.class) String orgUrn);
+
    /**
     * @see AdminOrgApi#getVAppLeaseSettings(URI)
     */
@@ -169,19 +289,42 @@
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<OrgLeaseSettings> getVAppLeaseSettings(@EndpointParam URI orgRef);
+   ListenableFuture<OrgLeaseSettings> getVAppLeaseSettings(@EndpointParam URI adminOrgHref);
 
    /**
-    * @see AdminOrgApi#updateVAppLeaseSettings(URI, OrgVAppLeaseSettings)
+    * @see AdminOrgApi#editVAppLeaseSettings(String, OrgVAppLeaseSettings)
     */
    @PUT
    @Path("/settings/vAppLeaseSettings")
    @Consumes(VCloudDirectorMediaType.ORG_LEASE_SETTINGS)
    @Produces(VCloudDirectorMediaType.ORG_LEASE_SETTINGS)
    @JAXBResponseParser
-   ListenableFuture<OrgLeaseSettings> updateVAppLeaseSettings(@EndpointParam URI orgRef, 
-         @BinderParam(BindToXMLPayload.class) OrgLeaseSettings settings);
- 
+   ListenableFuture<OrgLeaseSettings> editVAppLeaseSettings(
+            @EndpointParam(parser = OrgURNToAdminHref.class) String orgUrn,
+            @BinderParam(BindToXMLPayload.class) OrgLeaseSettings settings);
+
+   /**
+    * @see AdminOrgApi#editVAppLeaseSettings(URI, OrgVAppLeaseSettings)
+    */
+   @PUT
+   @Path("/settings/vAppLeaseSettings")
+   @Consumes(VCloudDirectorMediaType.ORG_LEASE_SETTINGS)
+   @Produces(VCloudDirectorMediaType.ORG_LEASE_SETTINGS)
+   @JAXBResponseParser
+   ListenableFuture<OrgLeaseSettings> editVAppLeaseSettings(@EndpointParam URI adminOrgHref,
+            @BinderParam(BindToXMLPayload.class) OrgLeaseSettings settings);
+
+   /**
+    * @see AdminOrgApi#getVAppTemplateLeaseSettings(String)
+    */
+   @GET
+   @Path("/settings/vAppTemplateLeaseSettings")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<OrgVAppTemplateLeaseSettings> getVAppTemplateLeaseSettings(
+            @EndpointParam(parser = OrgURNToAdminHref.class) String orgUrn);
+
    /**
     * @see AdminOrgApi#getVAppTemplateLeaseSettings(URI)
     */
@@ -190,23 +333,40 @@
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<OrgVAppTemplateLeaseSettings> getVAppTemplateLeaseSettings(@EndpointParam URI orgRef);
+   ListenableFuture<OrgVAppTemplateLeaseSettings> getVAppTemplateLeaseSettings(@EndpointParam URI adminOrgHref);
 
    /**
-    * @see AdminOrgApi#updateVAppTemplateLeaseSettings(URI, OrgVAppTemplateLeaseSettings)
+    * @see AdminOrgApi#editVAppTemplateLeaseSettings(String, OrgVAppTemplateLeaseSettings)
     */
    @PUT
    @Path("/settings/vAppTemplateLeaseSettings")
    @Consumes(VCloudDirectorMediaType.ORG_VAPP_TEMPLATE_LEASE_SETTINGS)
    @Produces(VCloudDirectorMediaType.ORG_VAPP_TEMPLATE_LEASE_SETTINGS)
    @JAXBResponseParser
-   ListenableFuture<OrgVAppTemplateLeaseSettings> updateVAppTemplateLeaseSettings(@EndpointParam URI orgRef, 
-         @BinderParam(BindToXMLPayload.class) OrgVAppTemplateLeaseSettings settings);
- 
+   ListenableFuture<OrgVAppTemplateLeaseSettings> editVAppTemplateLeaseSettings(
+            @EndpointParam(parser = OrgURNToAdminHref.class) String orgUrn,
+            @BinderParam(BindToXMLPayload.class) OrgVAppTemplateLeaseSettings settings);
+
+   /**
+    * @see AdminOrgApi#editVAppTemplateLeaseSettings(URI, OrgVAppTemplateLeaseSettings)
+    */
+   @PUT
+   @Path("/settings/vAppTemplateLeaseSettings")
+   @Consumes(VCloudDirectorMediaType.ORG_VAPP_TEMPLATE_LEASE_SETTINGS)
+   @Produces(VCloudDirectorMediaType.ORG_VAPP_TEMPLATE_LEASE_SETTINGS)
+   @JAXBResponseParser
+   ListenableFuture<OrgVAppTemplateLeaseSettings> editVAppTemplateLeaseSettings(@EndpointParam URI adminOrgHref,
+            @BinderParam(BindToXMLPayload.class) OrgVAppTemplateLeaseSettings settings);
+
    /**
     * @return asynchronous access to admin {@link MetadataAsyncApi.Writeable} features
     */
    @Override
    @Delegate
-   MetadataAsyncApi.Writeable getMetadataApi();
+   MetadataAsyncApi.Writeable getMetadataApi(@EndpointParam(parser = OrgURNToAdminHref.class) String orgUrn);
+
+   @Override
+   @Delegate
+   MetadataAsyncApi.Writeable getMetadataApi(@EndpointParam URI adminOrgHref);
+
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminVdcApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminVdcApi.java
index 334002f..14e0c83 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminVdcApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminVdcApi.java
@@ -27,13 +27,15 @@
 import org.jclouds.vcloud.director.v1_5.domain.AdminVdc;
 import org.jclouds.vcloud.director.v1_5.domain.Task;
 import org.jclouds.vcloud.director.v1_5.features.MetadataApi;
+import org.jclouds.vcloud.director.v1_5.features.MetadataApi.Writeable;
 import org.jclouds.vcloud.director.v1_5.features.VdcApi;
+import org.jclouds.vcloud.director.v1_5.functions.href.VdcURNToAdminHref;
 
 /**
  * Provides synchronous access to {@link AdminVdc}.
  * 
  * @see AdminVdcAsyncApi
- * @author danikov
+ * @author danikov, Adrian Cole
  */
 @Timeout(duration = 180, timeUnit = TimeUnit.SECONDS)
 public interface AdminVdcApi extends VdcApi {
@@ -42,43 +44,58 @@
     * Retrieves an admin view of virtual data center. The redwood admin can disable an 
     * organization vDC. This will prevent any further allocation to be used by the organization. 
     * Changing the state will not affect allocations already used. For example, if an organization 
-    * vDC is disabled, an organization user cannot deploy or create a new virtual machine in the 
-    * vDC (deploy uses memory and cpu allocations, and create uses storage allocation).
+    * vDC is disabled, an organization user cannot deploy or add a new virtual machine in the 
+    * vDC (deploy uses memory and cpu allocations, and add uses storage allocation).
     * 
     * @return the admin vDC or null if not found
     */
    @Override
-   AdminVdc getVdc(URI vdcRef);
+   AdminVdc get(String vdcUrn);
+
+   @Override
+   AdminVdc get(URI vdcAdminHref);
 
    /**
     * Modifies a Virtual Data Center. Virtual Data Center could be enabled or disabled. 
     * Additionally it could have one of these states FAILED_CREATION(-1), NOT_READY(0), 
     * READY(1), UNKNOWN(1) and UNRECOGNIZED(3).
     */
-   Task editVdc(URI vdcRef, AdminVdc vdc);
+   Task edit(String vdcUrn, AdminVdc vdc);
    
+   Task edit(URI vdcAdminHref, AdminVdc vdc);
+
    /**
-    * Deletes a Virtual Data Center. The Virtual Data Center should be disabled when delete is issued. 
+    * Deletes a Virtual Data Center. The Virtual Data Center should be disabled when remove is issued. 
     * Otherwise error code 400 Bad Request is returned.
     */
    // TODO Saw what exception, instead of 400 
-   Task deleteVdc(URI vdcRef);
-   
+   Task remove(String vdcUrn);
+
+   Task remove(URI vdcAdminHref);
+
    /**
     * Enables a Virtual Data Center. This operation enables disabled Virtual Data Center. 
     * If it is already enabled this operation has no effect.
     */
-   void enableVdc(@EndpointParam URI vdcRef);
+   void enable(String vdcUrn);
    
+   void enable(URI vdcAdminHref);
+
    /**
     * Disables a Virtual Data Center. If the Virtual Data Center is disabled this operation does not 
     * have an effect.
     */
-   void disableVdc(URI vdcRef);
-   
+   void disable(String vdcUrn);
+
+   void disable(URI vdcAdminHref);
+
    /**
     * @return synchronous access to {@link Writeable} features
     */
    @Delegate
-   MetadataApi.Writeable getMetadataApi();
+   MetadataApi.Writeable getMetadataApi(@EndpointParam(parser = VdcURNToAdminHref.class) String vdcUrn);
+
+   @Delegate
+   MetadataApi.Writeable getMetadataApi(@EndpointParam URI vdcAdminHref);
+
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminVdcAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminVdcAsyncApi.java
index 1d3778b..5f192f5 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminVdcAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminVdcAsyncApi.java
@@ -38,52 +38,118 @@
 import org.jclouds.vcloud.director.v1_5.domain.AdminVdc;
 import org.jclouds.vcloud.director.v1_5.domain.Task;
 import org.jclouds.vcloud.director.v1_5.features.MetadataAsyncApi;
+import org.jclouds.vcloud.director.v1_5.features.MetadataAsyncApi.Writeable;
 import org.jclouds.vcloud.director.v1_5.features.VdcAsyncApi;
 import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
+import org.jclouds.vcloud.director.v1_5.functions.href.VdcURNToAdminHref;
 
 import com.google.common.util.concurrent.ListenableFuture;
 
 /**
  * @see AdminVdcApi
- * @author danikov
+ * @author danikov, Adrian Cole
  */
 @RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface AdminVdcAsyncApi extends VdcAsyncApi {
-   
+   /**
+    * @see AdminVdcApi#get(String)
+    */
    @Override
    @GET
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<AdminVdc> getVdc(@EndpointParam URI vdcRef);
-   
+   ListenableFuture<AdminVdc> get(@EndpointParam(parser = VdcURNToAdminHref.class) String vdcUrn);
+
+   /**
+    * @see AdminVdcApi#edit(String, AdminVdc)
+    */
    @PUT
    @Consumes
    @Produces(VCloudDirectorMediaType.ADMIN_VDC)
    @JAXBResponseParser
-   ListenableFuture<Task> editVdc(@EndpointParam URI vdcRef, AdminVdc vdc);
-   
+   ListenableFuture<Task> edit(@EndpointParam(parser = VdcURNToAdminHref.class) String vdcUrn, AdminVdc vdc);
+
+   /**
+    * @see AdminVdcApi#remove(String)
+    */
    @DELETE
    @Consumes
    @JAXBResponseParser
-   ListenableFuture<Task> deleteVdc(@EndpointParam URI vdcRef);
-   
+   ListenableFuture<Task> remove(@EndpointParam(parser = VdcURNToAdminHref.class) String vdcUrn);
+
+   /**
+    * @see AdminVdcApi#enable(String)
+    */
    @POST
    @Consumes
    @Path("/action/enable")
    @JAXBResponseParser
-   ListenableFuture<Void> enableVdc(@EndpointParam URI vdcRef);
-   
+   ListenableFuture<Void> enable(@EndpointParam(parser = VdcURNToAdminHref.class) String vdcUrn);
+
+   /**
+    * @see AdminVdcApi#disable(String)
+    */
    @POST
    @Consumes
    @Path("/action/disable")
    @JAXBResponseParser
-   ListenableFuture<Void> disableVdc(@EndpointParam URI vdcRef);
-   
+   ListenableFuture<Void> disable(@EndpointParam(parser = VdcURNToAdminHref.class) String vdcUrn);
+
+   /**
+    * @see AdminVdcApi#get(URI)
+    */
+   @Override
+   @GET
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<AdminVdc> get(@EndpointParam URI vdcAdminHref);
+
+   /**
+    * @see AdminVdcApi#edit(URI, AdminVdc)
+    */
+   @PUT
+   @Consumes
+   @Produces(VCloudDirectorMediaType.ADMIN_VDC)
+   @JAXBResponseParser
+   ListenableFuture<Task> edit(@EndpointParam URI vdcAdminHref, AdminVdc vdc);
+
+   /**
+    * @see AdminVdcApi#remove(URI)
+    */
+   @DELETE
+   @Consumes
+   @JAXBResponseParser
+   ListenableFuture<Task> remove(@EndpointParam URI vdcAdminHref);
+
+   /**
+    * @see AdminVdcApi#enable(URI)
+    */
+   @POST
+   @Consumes
+   @Path("/action/enable")
+   @JAXBResponseParser
+   ListenableFuture<Void> enable(@EndpointParam URI vdcAdminHref);
+
+   /**
+    * @see AdminVdcApi#disable(URI)
+    */
+   @POST
+   @Consumes
+   @Path("/action/disable")
+   @JAXBResponseParser
+   ListenableFuture<Void> disable(@EndpointParam URI vdcAdminHref);
+
    /**
     * @return asynchronous access to {@link Writeable} features
     */
    @Override
    @Delegate
-   MetadataAsyncApi.Writeable getMetadataApi();
+   MetadataAsyncApi.Writeable getMetadataApi(@EndpointParam(parser = VdcURNToAdminHref.class) String vdcUrn);
+
+   @Override
+   @Delegate
+   MetadataAsyncApi.Writeable getMetadataApi(@EndpointParam URI vdcAdminHref);
+
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupApi.java
index da83f71..bb2a6a1 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupApi.java
@@ -28,7 +28,7 @@
  * Provides synchronous access to {@link Group} objects.
  * 
  * @see GroupAsyncApi
- * @author danikov
+ * @author danikov, Adrian Cole
  */
 @Timeout(duration = 180, timeUnit = TimeUnit.SECONDS)
 public interface GroupApi {
@@ -40,11 +40,13 @@
     * POST /admin/org/{id}/groups
     * </pre>
     *
-    * @param orgUri the admin org to create the group in
-    * @return the created group
+    * @param orgUrn the admin org to add the group in
+    * @return the addd group
     */
-   Group createGroup(URI adminOrgUri, Group group);
+   Group addGroupToOrg(Group group, String orgUrn);
    
+   Group addGroupToOrg(Group group, URI orgHref);
+
    /**
     * Retrieves a group.
     *
@@ -52,10 +54,12 @@
     * GET /admin/group/{id}
     * </pre>
     *
-    * @param groupURI the reference for the group
+    * @param groupString the reference for the group
     * @return a group
     */
-   Group getGroup(URI groupUri);
+   Group get(String groupUrn);
+
+   Group get(URI groupHref);
 
    /**
     * Modifies a group.
@@ -64,9 +68,11 @@
     * PUT /admin/group/{id}
     * </pre>
     * 
-    * @return the updated group
+    * @return the edited group
     */
-   Group updateGroup(URI groupRef, Group group);
+   Group edit(String groupUrn, Group group);
+
+   Group edit(URI groupHref, Group group);
 
    /**
     * Deletes a group.
@@ -75,5 +81,8 @@
     * DELETE /admin/group/{id}
     * </pre>
     */
-   void deleteGroup(URI groupRef);
+   void remove(String groupUrn);
+
+   void remove(URI groupHref);
+
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupAsyncApi.java
index f9653c7..cf2435b 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupAsyncApi.java
@@ -38,48 +38,89 @@
 import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
 import org.jclouds.vcloud.director.v1_5.domain.Group;
 import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
+import org.jclouds.vcloud.director.v1_5.functions.href.GroupURNToHref;
+import org.jclouds.vcloud.director.v1_5.functions.href.OrgURNToAdminHref;
 
 import com.google.common.util.concurrent.ListenableFuture;
-   
+
 /**
  * @see GroupApi
- * @author danikov
+ * @author danikov, Adrian Cole
  */
 @RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface GroupAsyncApi {
-   
+
+   /**
+    * @see GroupApi#addGroupToOrg(Group, String)
+    */
    @POST
    @Path("/groups")
    @Consumes(VCloudDirectorMediaType.GROUP)
    @Produces(VCloudDirectorMediaType.GROUP)
    @JAXBResponseParser
-   ListenableFuture<Group> createGroup(@EndpointParam URI adminOrgUri, 
-         @BinderParam(BindToXMLPayload.class) Group group);
+   ListenableFuture<Group> addGroupToOrg(@BinderParam(BindToXMLPayload.class) Group group,
+            @EndpointParam(parser = OrgURNToAdminHref.class) String adminUrn);
 
    /**
-    * @see GroupApi#getGroup(URI)
+    * @see GroupApi#get(String)
     */
    @GET
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<Group> getGroup(@EndpointParam URI groupUri);
+   ListenableFuture<Group> get(@EndpointParam(parser = GroupURNToHref.class) String groupUri);
 
    /**
-    * @see GroupApi#updateGroup(URI, Group)
+    * @see GroupApi#edit(String, Group)
     */
    @PUT
    @Consumes(VCloudDirectorMediaType.GROUP)
    @Produces(VCloudDirectorMediaType.GROUP)
    @JAXBResponseParser
-   ListenableFuture<Group> updateGroup(@EndpointParam URI groupRef, 
-         @BinderParam(BindToXMLPayload.class) Group group);
+   ListenableFuture<Group> edit(@EndpointParam(parser = GroupURNToHref.class) String groupUrn,
+            @BinderParam(BindToXMLPayload.class) Group group);
 
    /**
-    * @see GroupApi#deleteGroup(URI)
+    * @see GroupApi#remove(String)
     */
    @DELETE
    @Consumes
    @JAXBResponseParser
-   ListenableFuture<Void> deleteGroup(@EndpointParam URI groupRef);
+   ListenableFuture<Void> remove(@EndpointParam(parser = GroupURNToHref.class) String groupUrn);
+
+   /**
+    * @see GroupApi#addGroupToOrg(Group, URI)
+    */
+   @POST
+   @Path("/groups")
+   @Consumes(VCloudDirectorMediaType.GROUP)
+   @Produces(VCloudDirectorMediaType.GROUP)
+   @JAXBResponseParser
+   ListenableFuture<Group> addGroupToOrg(@BinderParam(BindToXMLPayload.class) Group group, @EndpointParam URI adminUrn);
+
+   /**
+    * @see GroupApi#get(URI)
+    */
+   @GET
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<Group> get(@EndpointParam URI groupUri);
+
+   /**
+    * @see GroupApi#edit(URI, Group)
+    */
+   @PUT
+   @Consumes(VCloudDirectorMediaType.GROUP)
+   @Produces(VCloudDirectorMediaType.GROUP)
+   @JAXBResponseParser
+   ListenableFuture<Group> edit(@EndpointParam URI groupUrn, @BinderParam(BindToXMLPayload.class) Group group);
+
+   /**
+    * @see GroupApi#remove(URI)
+    */
+   @DELETE
+   @Consumes
+   @JAXBResponseParser
+   ListenableFuture<Void> remove(@EndpointParam URI groupUrn);
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/UserApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/UserApi.java
index 4c9299a..36b2452 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/UserApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/UserApi.java
@@ -25,60 +25,71 @@
 import org.jclouds.vcloud.director.v1_5.domain.User;
 
 /**
- * Provides synchronous access to {@link Group} objects.
+ * Provides synchronous access to {@link User} objects.
  * 
- * @see GroupAsyncApi
- * @author danikov
+ * @see UserAsyncApi
+ * @author danikov, Adrian Cole
  */
 @Timeout(duration = 180, timeUnit = TimeUnit.SECONDS)
 public interface UserApi {
 
    /**
     * Creates or imports a user in an organization. The user could be enabled or disabled.
-    *
+    * 
     * <pre>
     * POST /admin/org/{id}/users
     * </pre>
-    *
-    * @param orgRef the reference for the org
-    * @return the created user
+    * 
+    * @param orgUrn
+    *           the urn for the org
+    * @return the addd user
     */
-   User createUser(URI orgRef, User user);
-   
+   User addUserToOrg(User user, String orgUrn);
+
+   User addUserToOrg(User user, URI orgAdminHref);
+
    /**
     * Retrieves a user. This entity could be enabled or disabled.
-    *
+    * 
     * <pre>
     * GET /admin/user/{id}
     * </pre>
-    *
-    * @param userRef the reference for the user
+    * 
+    * @param userUrn
+    *           the reference for the user
     * @return a user
     */
-   User getUser(URI userRef);
-   
+   User get(String userUrn);
+
+   User get(URI userHref);
+
    /**
-    * Modifies a user. The user object could be enabled or disabled. 
-    * Note: the lock status cannot be changed using this call: use unlockUser.
-    *
+    * Modifies a user. The user object could be enabled or disabled. Note: the lock status cannot be
+    * changed using this call: use unlockUser.
+    * 
     * <pre>
     * PUT /admin/user/{id}
     * </pre>
-    *
-    * @param userRef the reference for the user
+    * 
+    * @param userUrn
+    *           the reference for the user
     * @return the modified user
     */
-   User updateUser(URI userRef, User user);
+   User edit(String userUrn, User user);
    
+   User edit(URI userHref, User user);
+
    /**
-    * Deletes a user. Enabled and disabled users could be deleted.
+    * Deletes a user. Enabled and disabled users could be removed.
     * 
     * <pre>
     * DELETE /admin/catalog/{id}
     * </pre>
     */
-   void deleteUser(URI userRef);
+   void remove(String userUrn);
    
+   void remove(URI userHref);
+
    /**
     * Unlocks a user.
     * 
@@ -86,5 +97,7 @@
     * POST /admin/user/{id}/action/unlock
     * </pre>
     */
-   void unlockUser(URI userRef);
+   void unlock(String userUrn);
+
+   void unlock(URI userHref);
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/UserAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/UserAsyncApi.java
index c59c8b7..eeed709 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/UserAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/admin/UserAsyncApi.java
@@ -38,60 +38,108 @@
 import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
 import org.jclouds.vcloud.director.v1_5.domain.User;
 import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
+import org.jclouds.vcloud.director.v1_5.functions.href.OrgURNToAdminHref;
+import org.jclouds.vcloud.director.v1_5.functions.href.UserURNToHref;
 
 import com.google.common.util.concurrent.ListenableFuture;
-   
+
 /**
  * @see UserApi
- * @author danikov
+ * @author danikov, Adrian Cole
  */
 @RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
 public interface UserAsyncApi {
 
    /**
-    * @see UserApi#createUser(URI, User)
+    * @see UserApi#addUserToOrg(User, String)
     */
    @POST
    @Path("/users")
    @Consumes(VCloudDirectorMediaType.USER)
    @Produces(VCloudDirectorMediaType.USER)
    @JAXBResponseParser
-   ListenableFuture<User> createUser(@EndpointParam URI userRef, 
-         @BinderParam(BindToXMLPayload.class) User user);
-   
+   ListenableFuture<User> addUserToOrg(@BinderParam(BindToXMLPayload.class) User user,
+            @EndpointParam(parser = OrgURNToAdminHref.class) String orgUrn);
+
    /**
-    * @see UserApi#getUser(URI)
+    * @see UserApi#addUserToOrg(User, URI)
+    */
+   @POST
+   @Path("/users")
+   @Consumes(VCloudDirectorMediaType.USER)
+   @Produces(VCloudDirectorMediaType.USER)
+   @JAXBResponseParser
+   ListenableFuture<User> addUserToOrg(@BinderParam(BindToXMLPayload.class) User user,
+            @EndpointParam URI orgAdminHref);
+
+   /**
+    * @see UserApi#get(String)
     */
    @GET
    @Consumes
    @JAXBResponseParser
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
-   ListenableFuture<User> getUser(@EndpointParam URI userRef);
- 
+   ListenableFuture<User> get(@EndpointParam(parser = UserURNToHref.class) String userUrn);
+
    /**
-    * @see UserApi#updateUser(URI, User)
+    * @see UserApi#get(URI)
+    */
+   @GET
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<User> get(@EndpointParam URI userHref);
+
+   /**
+    * @see UserApi#edit(String, User)
     */
    @PUT
    @Consumes(VCloudDirectorMediaType.USER)
    @Produces(VCloudDirectorMediaType.USER)
    @JAXBResponseParser
-   ListenableFuture<User> updateUser(@EndpointParam URI userRef, 
-         @BinderParam(BindToXMLPayload.class) User user);
- 
+   ListenableFuture<User> edit(@EndpointParam(parser = UserURNToHref.class) String userUrn,
+            @BinderParam(BindToXMLPayload.class) User user);
+
    /**
-    * @see UserApi#deleteUser(URI)
+    * @see UserApi#edit(URI, User)
+    */
+   @PUT
+   @Consumes(VCloudDirectorMediaType.USER)
+   @Produces(VCloudDirectorMediaType.USER)
+   @JAXBResponseParser
+   ListenableFuture<User> edit(@EndpointParam URI userHref, @BinderParam(BindToXMLPayload.class) User user);
+
+   /**
+    * @see UserApi#remove(String)
     */
    @DELETE
    @Consumes
    @JAXBResponseParser
-   ListenableFuture<Void> deleteUser(@EndpointParam URI userRef);
- 
+   ListenableFuture<Void> remove(@EndpointParam(parser = UserURNToHref.class) String userUrn);
+
    /**
-    * @see UserApi#unlockUser(URI)
+    * @see UserApi#remove(URI)
+    */
+   @DELETE
+   @Consumes
+   @JAXBResponseParser
+   ListenableFuture<Void> remove(@EndpointParam URI userHref);
+
+   /**
+    * @see UserApi#unlock(String)
     */
    @POST
    @Path("/action/unlock")
    @Consumes
    @JAXBResponseParser
-   ListenableFuture<Void> unlockUser(@EndpointParam URI userRef);
+   ListenableFuture<Void> unlock(@EndpointParam(parser = UserURNToHref.class) String userUrn);
+
+   /**
+    * @see UserApi#unlock(URI)
+    */
+   @POST
+   @Path("/action/unlock")
+   @Consumes
+   @JAXBResponseParser
+   ListenableFuture<Void> unlock(@EndpointParam URI userHref);
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/AllCatalogItemsInCatalog.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/AllCatalogItemsInCatalog.java
index 603fa2a..f05f2b9 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/AllCatalogItemsInCatalog.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/AllCatalogItemsInCatalog.java
@@ -71,7 +71,7 @@
 
          @Override
          public Future<CatalogItem> apply(Reference from) {
-            return aapi.getCatalogApi().getCatalogItem(from.getHref());
+            return aapi.getCatalogApi().getItem(from.getHref());
          }
 
       }, executor, null, logger, "catalogItems in " + from.getHref());
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/AllCatalogsInOrg.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/AllCatalogsInOrg.java
index aba519a..2b74256 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/AllCatalogsInOrg.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/AllCatalogsInOrg.java
@@ -59,7 +59,7 @@
             new Function<Reference, Future<? extends Catalog>>() {
                @Override
                public Future<? extends Catalog> apply(Reference from) {
-                  return aapi.getCatalogApi().getCatalog(from.getHref());
+                  return aapi.getCatalogApi().get(from.getHref());
                }
 
             }, executor, null, logger, "catalogs in " + org.getName());
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/AllVdcsInOrg.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/AllVdcsInOrg.java
index a1385c2..82b12da 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/AllVdcsInOrg.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/AllVdcsInOrg.java
@@ -61,7 +61,7 @@
             new Function<Reference, Future<? extends Vdc>>() {
                @Override
                public Future<? extends Vdc> apply(Reference from) {
-                  return aapi.getVdcApi().getVdc(from.getHref());
+                  return aapi.getVdcApi().get(from.getHref());
                }
 
             }, executor, null, logger, "vdcs in org " + org.getName());
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/OrgReferenceToTaskListEndpoint.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/OrgReferenceToTaskListEndpoint.java
deleted file mode 100644
index 4131b3c..0000000
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/OrgReferenceToTaskListEndpoint.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/**
- * Licensed to jclouds, Inc. (jclouds) under one or more
- * contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  jclouds 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.functions;
-
-import java.net.URI;
-
-import javax.inject.Inject;
-import javax.inject.Singleton;
-
-import org.jclouds.rest.ResourceNotFoundException;
-import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
-import org.jclouds.vcloud.director.v1_5.domain.Link;
-import org.jclouds.vcloud.director.v1_5.domain.org.Org;
-import org.jclouds.vcloud.director.v1_5.features.OrgApi;
-
-import com.google.common.base.Function;
-import com.google.common.base.Preconditions;
-
-/**
- * @author grkvlt@apache.org
- */
-@Singleton
-public class OrgReferenceToTaskListEndpoint implements Function<Object, URI> {
-   private final OrgApi api;
-
-   @Inject
-   public OrgReferenceToTaskListEndpoint(OrgApi api) {
-      this.api = api;
-   }
-
-   @Override
-   public URI apply(Object input) {
-      Preconditions.checkNotNull(input);
-      Preconditions.checkArgument(input instanceof URI);
-      URI reference = (URI) input;
-      Org org = api.getOrg(reference);
-      if (org == null) {
-         throw new ResourceNotFoundException();
-      }
-      for (Link link : org.getLinks()) {
-         if (link.getType().equals(VCloudDirectorMediaType.TASKS_LIST)) {
-            return link.getHref();
-         }
-      }
-      throw new RuntimeException(String.format("Could not find a link of type %s", VCloudDirectorMediaType.TASKS_LIST));
-	};
-}
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/OrgsForLocations.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/OrgsForLocations.java
index 52346bd..334c9c5 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/OrgsForLocations.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/OrgsForLocations.java
@@ -18,75 +18,52 @@
  */
 package org.jclouds.vcloud.director.v1_5.functions;
 
-import static com.google.common.collect.Iterables.filter;
-import static com.google.common.collect.Iterables.transform;
-import static org.jclouds.concurrent.FutureIterables.transformParallel;
-
-import java.net.URI;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Future;
-
-import javax.annotation.Resource;
 import javax.inject.Inject;
-import javax.inject.Named;
 import javax.inject.Singleton;
 
-import org.jclouds.Constants;
 import org.jclouds.domain.Location;
-import org.jclouds.domain.LocationScope;
-import org.jclouds.logging.Logger;
+import org.jclouds.location.predicates.LocationPredicates;
 import org.jclouds.vcloud.director.v1_5.domain.org.Org;
-import org.jclouds.vcloud.director.v1_5.user.VCloudDirectorAsyncApi;
+import org.jclouds.vcloud.director.v1_5.user.VCloudDirectorApi;
 
 import com.google.common.base.Function;
-import com.google.common.base.Predicate;
-import com.google.common.collect.Sets;
+import static com.google.common.collect.FluentIterable.*;
 
 /**
- * @author danikov
+ * @author danikov, Adrian Cole
  */
 @Singleton
 public class OrgsForLocations implements Function<Iterable<Location>, Iterable<? extends Org>> {
-   @Resource
-   public Logger logger = Logger.NULL;
-   private final VCloudDirectorAsyncApi aapi;
-   private final ExecutorService executor;
+
+   private final VCloudDirectorApi api;
 
    @Inject
-   OrgsForLocations(VCloudDirectorAsyncApi aapi, @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) {
-      this.aapi = aapi;
-      this.executor = executor;
+   OrgsForLocations(VCloudDirectorApi api) {
+      this.api = api;
    }
 
    /**
-    * Zones are assignable, but we want regions. so we look for zones, whose
-    * parent is region. then, we use a set to extract the unique set.
+    * Zones are assignable, but we want regions. so we look for zones, whose parent is region. then,
+    * we use a set to extract the unique set.
     */
    @Override
    public Iterable<? extends Org> apply(Iterable<Location> from) {
-
-      return transformParallel(Sets.newLinkedHashSet(transform(filter(from, new Predicate<Location>() {
-
-         @Override
-         public boolean apply(Location input) {
-            return input.getScope() == LocationScope.ZONE;
-         }
-
-      }), new Function<Location, URI>() {
-
-         @Override
-         public URI apply(Location from) {
-            return URI.create(from.getParent().getId());
-         }
-
-      })), new Function<URI, Future<? extends Org>>() {
-
-         @Override
-         public Future<? extends Org> apply(URI from) {
-            return aapi.getOrgApi().getOrg(from);
-         }
-
-      }, executor, null, logger, "organizations for uris");
+      return from(from)
+            .filter(LocationPredicates.isZone())
+            .transform(new Function<Location, String>() {
+               @Override
+               public String apply(Location from) {
+                  return from.getParent().getId();
+               }
+            })
+            .transform(new Function<String, Org>() {
+      
+               @Override
+               public Org apply(String from) {
+                  return api.getOrgApi().get(from);
+               }
+      
+            });
    }
 
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/OrgsForNames.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/OrgsForNames.java
index d5bf6b2..5f307be 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/OrgsForNames.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/OrgsForNames.java
@@ -18,26 +18,17 @@
  */
 package org.jclouds.vcloud.director.v1_5.functions;
 
-import static org.jclouds.concurrent.FutureIterables.transformParallel;
-import static org.jclouds.vcloud.director.v1_5.predicates.ReferencePredicates.nameEquals;
+import static com.google.common.collect.FluentIterable.from;
 
-import java.util.Set;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Future;
-
-import javax.annotation.Resource;
 import javax.inject.Inject;
-import javax.inject.Named;
 import javax.inject.Singleton;
 
-import org.jclouds.Constants;
-import org.jclouds.logging.Logger;
 import org.jclouds.vcloud.director.v1_5.domain.Reference;
 import org.jclouds.vcloud.director.v1_5.domain.org.Org;
-import org.jclouds.vcloud.director.v1_5.user.VCloudDirectorAsyncApi;
 import org.jclouds.vcloud.director.v1_5.user.VCloudDirectorApi;
 
 import com.google.common.base.Function;
+import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
 
 /**
@@ -45,33 +36,28 @@
  */
 @Singleton
 public class OrgsForNames implements Function<Iterable<String>, Iterable<? extends Org>> {
-   @Resource
-   public Logger logger = Logger.NULL;
-   private final VCloudDirectorAsyncApi aapi;
-   private final VCloudDirectorApi sapi;
-   private final ExecutorService executor;
+   private final VCloudDirectorApi api;
 
    @Inject
-   OrgsForNames(VCloudDirectorAsyncApi aapi, 
-         VCloudDirectorApi sapi, 
-         @Named(Constants.PROPERTY_USER_THREADS) ExecutorService executor) {
-      this.aapi = aapi;
-      this.sapi = sapi;
-      this.executor = executor;
+   OrgsForNames(VCloudDirectorApi api) {
+      this.api = api;
    }
 
    @Override
-   public Iterable<? extends Org> apply(Iterable<String> from) {
-      final Set<Reference> orgs = sapi.getOrgApi().getOrgList().getOrgs();
-      
-      return transformParallel(from, new Function<String, Future<? extends Org>>() {
-
+   public Iterable<? extends Org> apply(final Iterable<String> from) {
+      return from(api.getOrgApi().list()).filter(new Predicate<Reference>() {
          @Override
-         public Future<? extends Org> apply(String from) {
-            return aapi.getOrgApi().getOrg(Iterables.find(orgs, nameEquals(from)).getHref());
+         public boolean apply(Reference in) {
+            return Iterables.contains(from, in.getName());
+         }
+      }).transform(new Function<Reference, Org>() {
+         
+         @Override
+         public Org apply(Reference in) {
+            return api.getOrgApi().get(in.getHref());
          }
 
-      }, executor, null, logger, "organizations for names");
+      });
    }
 
 }
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/URNToHref.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/URNToHref.java
new file mode 100644
index 0000000..e7eecbe
--- /dev/null
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/URNToHref.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  jclouds 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.functions;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.net.URI;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.javax.annotation.Nullable;
+import org.jclouds.vcloud.director.v1_5.domain.Entity;
+import org.jclouds.vcloud.director.v1_5.domain.Link;
+import org.jclouds.vcloud.director.v1_5.predicates.LinkPredicates;
+
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.Iterables;
+
+/**
+ * Resolves URN to its HREF via the entity Resolver
+ * 
+ * @author Adrian Cole
+ */
+@Singleton
+public abstract class URNToHref implements Function<Object, URI> {
+   private final LoadingCache<String, Entity> resolveEntityCache;
+
+   @Inject
+   public URNToHref(LoadingCache<String, Entity> resolveEntityCache) {
+      this.resolveEntityCache = checkNotNull(resolveEntityCache, "resolveEntityCache");
+   }
+
+   /**
+    * media type to search for.
+    * 
+    * @see VCloudDirectorMediaType
+    */
+   protected abstract String type();
+
+   @Override
+   public URI apply(@Nullable Object from) {
+      checkArgument(checkNotNull(from, "urn") instanceof String, "urn is a String argument");
+      Entity entity = resolveEntityCache.getUnchecked(from.toString());
+      Optional<Link> link = Iterables.tryFind(entity.getLinks(), LinkPredicates.typeEquals(type()));
+      checkArgument(link.isPresent(), "no link for type %s found for entity %s", type(), entity);
+      return link.get().getHref();
+   }
+}
\ No newline at end of file
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/VAppTemplatesForCatalogItems.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/VAppTemplatesForCatalogItems.java
index dbe94a2..2548d3d 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/VAppTemplatesForCatalogItems.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/VAppTemplatesForCatalogItems.java
@@ -90,7 +90,7 @@
          @Override
          public Future<? extends VAppTemplate> apply(CatalogItem from) {
             return new ExceptionParsingListenableFuture<VAppTemplate>(Futures.makeListenable(VCloudDirectorAsyncApi.class
-                     .cast(aapi).getVAppTemplateApi().getVAppTemplate(from.getEntity().getHref()), executor),
+                     .cast(aapi).getVAppTemplateApi().get(from.getEntity().getHref()), executor),
                      returnNullOnAuthorizationException);
          }
 
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/CatalogItemURNToHref.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/CatalogItemURNToHref.java
new file mode 100644
index 0000000..f8ba342
--- /dev/null
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/CatalogItemURNToHref.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  jclouds 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.functions.href;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
+import org.jclouds.vcloud.director.v1_5.domain.Entity;
+import org.jclouds.vcloud.director.v1_5.functions.URNToHref;
+
+import com.google.common.cache.LoadingCache;
+
+@Singleton
+public class CatalogItemURNToHref extends URNToHref {
+
+   @Inject
+   public CatalogItemURNToHref(LoadingCache<String, Entity> resolveEntityCache) {
+      super(resolveEntityCache);
+   }
+
+   @Override
+   protected String type() {
+      return VCloudDirectorMediaType.CATALOG_ITEM;
+   }
+
+}
\ No newline at end of file
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/CatalogURNToAdminHref.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/CatalogURNToAdminHref.java
new file mode 100644
index 0000000..b6d2680
--- /dev/null
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/CatalogURNToAdminHref.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  jclouds 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.functions.href;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
+import org.jclouds.vcloud.director.v1_5.domain.Entity;
+import org.jclouds.vcloud.director.v1_5.functions.URNToHref;
+
+import com.google.common.cache.LoadingCache;
+
+@Singleton
+public class CatalogURNToAdminHref extends URNToHref {
+
+   @Inject
+   public CatalogURNToAdminHref(LoadingCache<String, Entity> resolveEntityCache) {
+      super(resolveEntityCache);
+   }
+
+   @Override
+   protected String type() {
+      return VCloudDirectorMediaType.ADMIN_CATALOG;
+   }
+
+}
\ No newline at end of file
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/CatalogURNToHref.java
similarity index 60%
copy from labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java
copy to labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/CatalogURNToHref.java
index 2575c00..2629ccb 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/CatalogURNToHref.java
@@ -16,24 +16,28 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jclouds.vcloud.director.v1_5.functions;
+package org.jclouds.vcloud.director.v1_5.functions.href;
 
-import java.net.URI;
-
+import javax.inject.Inject;
 import javax.inject.Singleton;
 
-import org.jclouds.vcloud.director.v1_5.domain.Reference;
+import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
+import org.jclouds.vcloud.director.v1_5.domain.Entity;
+import org.jclouds.vcloud.director.v1_5.functions.URNToHref;
 
-import com.google.common.base.Function;
+import com.google.common.cache.LoadingCache;
 
-/**
- * @author danikov
- */
 @Singleton
-public class ReferenceToEndpoint implements Function<Reference, URI> {
-   
-   @Override
-   public URI apply(Reference from) {
-      return from.getHref();
+public class CatalogURNToHref extends URNToHref {
+
+   @Inject
+   public CatalogURNToHref(LoadingCache<String, Entity> resolveEntityCache) {
+      super(resolveEntityCache);
    }
-}
+
+   @Override
+   protected String type() {
+      return VCloudDirectorMediaType.CATALOG;
+   }
+
+}
\ No newline at end of file
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/GroupURNToHref.java
similarity index 60%
copy from labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java
copy to labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/GroupURNToHref.java
index 2575c00..b952baa 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/GroupURNToHref.java
@@ -16,24 +16,28 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jclouds.vcloud.director.v1_5.functions;
+package org.jclouds.vcloud.director.v1_5.functions.href;
 
-import java.net.URI;
-
+import javax.inject.Inject;
 import javax.inject.Singleton;
 
-import org.jclouds.vcloud.director.v1_5.domain.Reference;
+import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
+import org.jclouds.vcloud.director.v1_5.domain.Entity;
+import org.jclouds.vcloud.director.v1_5.functions.URNToHref;
 
-import com.google.common.base.Function;
+import com.google.common.cache.LoadingCache;
 
-/**
- * @author danikov
- */
 @Singleton
-public class ReferenceToEndpoint implements Function<Reference, URI> {
-   
-   @Override
-   public URI apply(Reference from) {
-      return from.getHref();
+public class GroupURNToHref extends URNToHref {
+
+   @Inject
+   public GroupURNToHref(LoadingCache<String, Entity> resolveEntityCache) {
+      super(resolveEntityCache);
    }
-}
+
+   @Override
+   protected String type() {
+      return VCloudDirectorMediaType.GROUP;
+   }
+
+}
\ No newline at end of file
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/MediaURNToHref.java
similarity index 60%
copy from labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java
copy to labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/MediaURNToHref.java
index 2575c00..929e6dc 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/MediaURNToHref.java
@@ -16,24 +16,28 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jclouds.vcloud.director.v1_5.functions;
+package org.jclouds.vcloud.director.v1_5.functions.href;
 
-import java.net.URI;
-
+import javax.inject.Inject;
 import javax.inject.Singleton;
 
-import org.jclouds.vcloud.director.v1_5.domain.Reference;
+import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
+import org.jclouds.vcloud.director.v1_5.domain.Entity;
+import org.jclouds.vcloud.director.v1_5.functions.URNToHref;
 
-import com.google.common.base.Function;
+import com.google.common.cache.LoadingCache;
 
-/**
- * @author danikov
- */
 @Singleton
-public class ReferenceToEndpoint implements Function<Reference, URI> {
-   
-   @Override
-   public URI apply(Reference from) {
-      return from.getHref();
+public class MediaURNToHref extends URNToHref {
+
+   @Inject
+   public MediaURNToHref(LoadingCache<String, Entity> resolveEntityCache) {
+      super(resolveEntityCache);
    }
-}
+
+   @Override
+   protected String type() {
+      return VCloudDirectorMediaType.MEDIA;
+   }
+
+}
\ No newline at end of file
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/NetworkURNToAdminHref.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/NetworkURNToAdminHref.java
new file mode 100644
index 0000000..bc5309c
--- /dev/null
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/NetworkURNToAdminHref.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  jclouds 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.functions.href;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
+import org.jclouds.vcloud.director.v1_5.domain.Entity;
+import org.jclouds.vcloud.director.v1_5.functions.URNToHref;
+
+import com.google.common.cache.LoadingCache;
+
+@Singleton
+public class NetworkURNToAdminHref extends URNToHref {
+
+   @Inject
+   public NetworkURNToAdminHref(LoadingCache<String, Entity> resolveEntityCache) {
+      super(resolveEntityCache);
+   }
+
+   @Override
+   protected String type() {
+      return VCloudDirectorMediaType.ADMIN_NETWORK;
+   }
+
+}
\ No newline at end of file
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/NetworkURNToHref.java
similarity index 60%
copy from labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java
copy to labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/NetworkURNToHref.java
index 2575c00..076056f 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/NetworkURNToHref.java
@@ -16,24 +16,28 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jclouds.vcloud.director.v1_5.functions;
+package org.jclouds.vcloud.director.v1_5.functions.href;
 
-import java.net.URI;
-
+import javax.inject.Inject;
 import javax.inject.Singleton;
 
-import org.jclouds.vcloud.director.v1_5.domain.Reference;
+import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
+import org.jclouds.vcloud.director.v1_5.domain.Entity;
+import org.jclouds.vcloud.director.v1_5.functions.URNToHref;
 
-import com.google.common.base.Function;
+import com.google.common.cache.LoadingCache;
 
-/**
- * @author danikov
- */
 @Singleton
-public class ReferenceToEndpoint implements Function<Reference, URI> {
-   
-   @Override
-   public URI apply(Reference from) {
-      return from.getHref();
+public class NetworkURNToHref extends URNToHref {
+
+   @Inject
+   public NetworkURNToHref(LoadingCache<String, Entity> resolveEntityCache) {
+      super(resolveEntityCache);
    }
-}
+
+   @Override
+   protected String type() {
+      return VCloudDirectorMediaType.NETWORK;
+   }
+
+}
\ No newline at end of file
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/OrgURNToAdminHref.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/OrgURNToAdminHref.java
new file mode 100644
index 0000000..eca7e6b
--- /dev/null
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/OrgURNToAdminHref.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  jclouds 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.functions.href;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
+import org.jclouds.vcloud.director.v1_5.domain.Entity;
+import org.jclouds.vcloud.director.v1_5.functions.URNToHref;
+
+import com.google.common.cache.LoadingCache;
+
+@Singleton
+public class OrgURNToAdminHref extends URNToHref {
+
+   @Inject
+   public OrgURNToAdminHref(LoadingCache<String, Entity> resolveEntityCache) {
+      super(resolveEntityCache);
+   }
+
+   @Override
+   protected String type() {
+      return VCloudDirectorMediaType.ADMIN_ORG;
+   }
+
+}
\ No newline at end of file
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/OrgURNToHref.java
similarity index 60%
copy from labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java
copy to labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/OrgURNToHref.java
index 2575c00..3f998ae 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/OrgURNToHref.java
@@ -16,24 +16,28 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jclouds.vcloud.director.v1_5.functions;
+package org.jclouds.vcloud.director.v1_5.functions.href;
 
-import java.net.URI;
-
+import javax.inject.Inject;
 import javax.inject.Singleton;
 
-import org.jclouds.vcloud.director.v1_5.domain.Reference;
+import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
+import org.jclouds.vcloud.director.v1_5.domain.Entity;
+import org.jclouds.vcloud.director.v1_5.functions.URNToHref;
 
-import com.google.common.base.Function;
+import com.google.common.cache.LoadingCache;
 
-/**
- * @author danikov
- */
 @Singleton
-public class ReferenceToEndpoint implements Function<Reference, URI> {
-   
-   @Override
-   public URI apply(Reference from) {
-      return from.getHref();
+public class OrgURNToHref extends URNToHref {
+
+   @Inject
+   public OrgURNToHref(LoadingCache<String, Entity> resolveEntityCache) {
+      super(resolveEntityCache);
    }
-}
+
+   @Override
+   protected String type() {
+      return VCloudDirectorMediaType.ORG;
+   }
+
+}
\ No newline at end of file
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/ResolveEntity.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/ResolveEntity.java
new file mode 100644
index 0000000..a7791bd
--- /dev/null
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/ResolveEntity.java
@@ -0,0 +1,49 @@
+/**
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  jclouds 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.functions.href;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.vcloud.director.v1_5.domain.Entity;
+import org.jclouds.vcloud.director.v1_5.user.VCloudDirectorApi;
+
+import com.google.common.base.Function;
+
+@Singleton
+public class ResolveEntity implements Function<String, Entity> {
+   private final VCloudDirectorApi api;
+
+   @Inject
+   public ResolveEntity(VCloudDirectorApi api) {
+      this.api = checkNotNull(api, "api");
+   }
+
+   @Override
+   public Entity apply(String input) {
+      return api.resolveEntity(checkNotNull(input, "urn"));
+   }
+
+   @Override
+   public String toString() {
+      return "resolveEntity()";
+   }
+}
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/TaskURNToHref.java
similarity index 60%
copy from labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java
copy to labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/TaskURNToHref.java
index 2575c00..5d28e2e 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/TaskURNToHref.java
@@ -16,24 +16,28 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jclouds.vcloud.director.v1_5.functions;
+package org.jclouds.vcloud.director.v1_5.functions.href;
 
-import java.net.URI;
-
+import javax.inject.Inject;
 import javax.inject.Singleton;
 
-import org.jclouds.vcloud.director.v1_5.domain.Reference;
+import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
+import org.jclouds.vcloud.director.v1_5.domain.Entity;
+import org.jclouds.vcloud.director.v1_5.functions.URNToHref;
 
-import com.google.common.base.Function;
+import com.google.common.cache.LoadingCache;
 
-/**
- * @author danikov
- */
 @Singleton
-public class ReferenceToEndpoint implements Function<Reference, URI> {
-   
-   @Override
-   public URI apply(Reference from) {
-      return from.getHref();
+public class TaskURNToHref extends URNToHref {
+
+   @Inject
+   public TaskURNToHref(LoadingCache<String, Entity> resolveEntityCache) {
+      super(resolveEntityCache);
    }
-}
+
+   @Override
+   protected String type() {
+      return VCloudDirectorMediaType.TASK;
+   }
+
+}
\ No newline at end of file
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/TasksListURNToHref.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/TasksListURNToHref.java
new file mode 100644
index 0000000..5af7295
--- /dev/null
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/TasksListURNToHref.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  jclouds 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.functions.href;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
+import org.jclouds.vcloud.director.v1_5.domain.Entity;
+import org.jclouds.vcloud.director.v1_5.functions.URNToHref;
+
+import com.google.common.cache.LoadingCache;
+
+@Singleton
+public class TasksListURNToHref extends URNToHref {
+
+   @Inject
+   public TasksListURNToHref(LoadingCache<String, Entity> resolveEntityCache) {
+      super(resolveEntityCache);
+   }
+
+   @Override
+   protected String type() {
+      return VCloudDirectorMediaType.TASKS_LIST;
+   }
+
+}
\ No newline at end of file
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/UserURNToHref.java
similarity index 60%
copy from labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java
copy to labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/UserURNToHref.java
index 2575c00..cf830fb 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/UserURNToHref.java
@@ -16,24 +16,28 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jclouds.vcloud.director.v1_5.functions;
+package org.jclouds.vcloud.director.v1_5.functions.href;
 
-import java.net.URI;
-
+import javax.inject.Inject;
 import javax.inject.Singleton;
 
-import org.jclouds.vcloud.director.v1_5.domain.Reference;
+import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
+import org.jclouds.vcloud.director.v1_5.domain.Entity;
+import org.jclouds.vcloud.director.v1_5.functions.URNToHref;
 
-import com.google.common.base.Function;
+import com.google.common.cache.LoadingCache;
 
-/**
- * @author danikov
- */
 @Singleton
-public class ReferenceToEndpoint implements Function<Reference, URI> {
-   
-   @Override
-   public URI apply(Reference from) {
-      return from.getHref();
+public class UserURNToHref extends URNToHref {
+
+   @Inject
+   public UserURNToHref(LoadingCache<String, Entity> resolveEntityCache) {
+      super(resolveEntityCache);
    }
-}
+
+   @Override
+   protected String type() {
+      return VCloudDirectorMediaType.USER;
+   }
+
+}
\ No newline at end of file
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/VAppTemplateURNToHref.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/VAppTemplateURNToHref.java
new file mode 100644
index 0000000..eb6c831
--- /dev/null
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/VAppTemplateURNToHref.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  jclouds 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.functions.href;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
+import org.jclouds.vcloud.director.v1_5.domain.Entity;
+import org.jclouds.vcloud.director.v1_5.functions.URNToHref;
+
+import com.google.common.cache.LoadingCache;
+
+@Singleton
+public class VAppTemplateURNToHref extends URNToHref {
+
+   @Inject
+   public VAppTemplateURNToHref(LoadingCache<String, Entity> resolveEntityCache) {
+      super(resolveEntityCache);
+   }
+
+   @Override
+   protected String type() {
+      return VCloudDirectorMediaType.VAPP_TEMPLATE;
+   }
+
+}
\ No newline at end of file
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/VAppURNToHref.java
similarity index 60%
copy from labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java
copy to labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/VAppURNToHref.java
index 2575c00..85ac172 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/VAppURNToHref.java
@@ -16,24 +16,28 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jclouds.vcloud.director.v1_5.functions;
+package org.jclouds.vcloud.director.v1_5.functions.href;
 
-import java.net.URI;
-
+import javax.inject.Inject;
 import javax.inject.Singleton;
 
-import org.jclouds.vcloud.director.v1_5.domain.Reference;
+import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
+import org.jclouds.vcloud.director.v1_5.domain.Entity;
+import org.jclouds.vcloud.director.v1_5.functions.URNToHref;
 
-import com.google.common.base.Function;
+import com.google.common.cache.LoadingCache;
 
-/**
- * @author danikov
- */
 @Singleton
-public class ReferenceToEndpoint implements Function<Reference, URI> {
-   
-   @Override
-   public URI apply(Reference from) {
-      return from.getHref();
+public class VAppURNToHref extends URNToHref {
+
+   @Inject
+   public VAppURNToHref(LoadingCache<String, Entity> resolveEntityCache) {
+      super(resolveEntityCache);
    }
-}
+
+   @Override
+   protected String type() {
+      return VCloudDirectorMediaType.VAPP;
+   }
+
+}
\ No newline at end of file
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/VdcURNToAdminHref.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/VdcURNToAdminHref.java
new file mode 100644
index 0000000..6fbd12ab
--- /dev/null
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/VdcURNToAdminHref.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  jclouds 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.functions.href;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
+import org.jclouds.vcloud.director.v1_5.domain.Entity;
+import org.jclouds.vcloud.director.v1_5.functions.URNToHref;
+
+import com.google.common.cache.LoadingCache;
+
+@Singleton
+public class VdcURNToAdminHref extends URNToHref {
+
+   @Inject
+   public VdcURNToAdminHref(LoadingCache<String, Entity> resolveEntityCache) {
+      super(resolveEntityCache);
+   }
+
+   @Override
+   protected String type() {
+      return VCloudDirectorMediaType.ADMIN_VDC;
+   }
+
+}
\ No newline at end of file
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/VdcURNToHref.java
similarity index 60%
copy from labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java
copy to labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/VdcURNToHref.java
index 2575c00..72b427a 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/VdcURNToHref.java
@@ -16,24 +16,28 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jclouds.vcloud.director.v1_5.functions;
+package org.jclouds.vcloud.director.v1_5.functions.href;
 
-import java.net.URI;
-
+import javax.inject.Inject;
 import javax.inject.Singleton;
 
-import org.jclouds.vcloud.director.v1_5.domain.Reference;
+import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
+import org.jclouds.vcloud.director.v1_5.domain.Entity;
+import org.jclouds.vcloud.director.v1_5.functions.URNToHref;
 
-import com.google.common.base.Function;
+import com.google.common.cache.LoadingCache;
 
-/**
- * @author danikov
- */
 @Singleton
-public class ReferenceToEndpoint implements Function<Reference, URI> {
-   
-   @Override
-   public URI apply(Reference from) {
-      return from.getHref();
+public class VdcURNToHref extends URNToHref {
+
+   @Inject
+   public VdcURNToHref(LoadingCache<String, Entity> resolveEntityCache) {
+      super(resolveEntityCache);
    }
-}
+
+   @Override
+   protected String type() {
+      return VCloudDirectorMediaType.VDC;
+   }
+
+}
\ No newline at end of file
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/VmURNToHref.java
similarity index 60%
copy from labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java
copy to labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/VmURNToHref.java
index 2575c00..0aa18ef 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/ReferenceToEndpoint.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/functions/href/VmURNToHref.java
@@ -16,24 +16,28 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.jclouds.vcloud.director.v1_5.functions;
+package org.jclouds.vcloud.director.v1_5.functions.href;
 
-import java.net.URI;
-
+import javax.inject.Inject;
 import javax.inject.Singleton;
 
-import org.jclouds.vcloud.director.v1_5.domain.Reference;
+import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
+import org.jclouds.vcloud.director.v1_5.domain.Entity;
+import org.jclouds.vcloud.director.v1_5.functions.URNToHref;
 
-import com.google.common.base.Function;
+import com.google.common.cache.LoadingCache;
 
-/**
- * @author danikov
- */
 @Singleton
-public class ReferenceToEndpoint implements Function<Reference, URI> {
-   
-   @Override
-   public URI apply(Reference from) {
-      return from.getHref();
+public class VmURNToHref extends URNToHref {
+
+   @Inject
+   public VmURNToHref(LoadingCache<String, Entity> resolveEntityCache) {
+      super(resolveEntityCache);
    }
-}
+
+   @Override
+   protected String type() {
+      return VCloudDirectorMediaType.VM;
+   }
+
+}
\ No newline at end of file
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/predicates/EntityPredicates.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/predicates/EntityPredicates.java
index bdd71dc..aedf381 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/predicates/EntityPredicates.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/predicates/EntityPredicates.java
@@ -30,9 +30,32 @@
 /**
  * Predicates for working with {@link EntityType} collections.
  * 
- * @author grkvlt@apache.org
+ * @author grkvlt@apache.org, Adrian Cole
  */
 public class EntityPredicates {
+   
+   /**
+    * Matches {@link EntityType entities} with the given id.
+    * 
+    * @param T type of the entity, for example {@link Vm}
+    * @param id value of the id attribute of the entity
+    * @return predicate that will match entities of the given id
+    */
+   public static <T extends Entity> Predicate<T> idEquals(final String id) {
+      checkNotNull(id, "id must be defined");
+
+      return new Predicate<T>() {
+         @Override
+         public boolean apply(T entity) {
+            return id.equals(entity.getId());
+         }
+
+         @Override
+         public String toString() {
+            return "idEquals(" + id + ")";
+         }
+      };
+   }
 
    /**
     * Matches {@link EntityType entities} with the given name.
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/predicates/LinkPredicates.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/predicates/LinkPredicates.java
index 91187b4..a2af20f 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/predicates/LinkPredicates.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/predicates/LinkPredicates.java
@@ -39,7 +39,7 @@
    /**
     * matches links of the given relation
     * 
-    * @param rel from {@code context.getApi().getCurrentSession().getOrg().getLinks()}
+    * @param rel from {@code context.getApi().getCurrentSession().get().getLinks()}
     * @return predicate that will match links of the given rel
     */
    public static Predicate<Link> relEquals(final String rel) {
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/predicates/TaskStatusEquals.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/predicates/TaskStatusEquals.java
index 2cd1304..15cf442 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/predicates/TaskStatusEquals.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/predicates/TaskStatusEquals.java
@@ -67,7 +67,7 @@
       logger.trace("looking for status on task %s", task);
 
       // TODO shouldn't we see if it's already done before getting it from API server?
-      task = taskApi.getTask(task.getHref());
+      task = taskApi.get(task.getHref());
       
       // perhaps task isn't available, yet
       if (task == null) return false;
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/predicates/TaskSuccess.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/predicates/TaskSuccess.java
index 6456529..e1059c5 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/predicates/TaskSuccess.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/predicates/TaskSuccess.java
@@ -58,7 +58,7 @@
       logger.trace("looking for status on task %s", task.getOperationName());
 
       // TODO shouldn't we see if it's already done before getting it from API server?
-      task = taskApi.getTask(task.getHref());
+      task = taskApi.get(task.getHref());
       
       // perhaps task isn't available, yet
       if (task == null) return false;
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/user/VCloudDirectorApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/user/VCloudDirectorApi.java
index 44ec9a6..cdbe899 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/user/VCloudDirectorApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/user/VCloudDirectorApi.java
@@ -22,6 +22,7 @@
 
 import org.jclouds.concurrent.Timeout;
 import org.jclouds.rest.annotations.Delegate;
+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.features.CatalogApi;
 import org.jclouds.vcloud.director.v1_5.features.MediaApi;
@@ -40,11 +41,21 @@
 /**
  * Provides synchronous access to VCloudDirector.
  * 
- * @see VCloudDirectorAdminAsyncApi
+ * @see VCloudDirectorAsyncApi
  * @author danikov
  */
 @Timeout(duration = 60, timeUnit = TimeUnit.SECONDS)
 public interface VCloudDirectorApi {
+
+   /**
+    * Redirects to the URL of an entity with the given VCD ID.
+    *
+    * <pre>
+    * GET /entity/{id}
+    * </pre>
+    */
+   Entity resolveEntity(String urn);
+   
    /**
     * @return the current login session
     */
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/user/VCloudDirectorAsyncApi.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/user/VCloudDirectorAsyncApi.java
index f91b234..a1eb5b2 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/user/VCloudDirectorAsyncApi.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/user/VCloudDirectorAsyncApi.java
@@ -18,8 +18,28 @@
  */
 package org.jclouds.vcloud.director.v1_5.user;
 
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+
 import org.jclouds.rest.annotations.Delegate;
+import org.jclouds.rest.annotations.ExceptionParser;
+import org.jclouds.rest.annotations.JAXBResponseParser;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.SkipEncoding;
+import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
+import org.jclouds.vcloud.director.v1_5.domain.Catalog;
+import org.jclouds.vcloud.director.v1_5.domain.Entity;
+import org.jclouds.vcloud.director.v1_5.domain.Media;
 import org.jclouds.vcloud.director.v1_5.domain.Session;
+import org.jclouds.vcloud.director.v1_5.domain.Task;
+import org.jclouds.vcloud.director.v1_5.domain.VApp;
+import org.jclouds.vcloud.director.v1_5.domain.VAppTemplate;
+import org.jclouds.vcloud.director.v1_5.domain.Vdc;
+import org.jclouds.vcloud.director.v1_5.domain.Vm;
+import org.jclouds.vcloud.director.v1_5.domain.network.Network;
+import org.jclouds.vcloud.director.v1_5.domain.org.Org;
 import org.jclouds.vcloud.director.v1_5.features.CatalogAsyncApi;
 import org.jclouds.vcloud.director.v1_5.features.NetworkAsyncApi;
 import org.jclouds.vcloud.director.v1_5.features.OrgAsyncApi;
@@ -30,7 +50,9 @@
 import org.jclouds.vcloud.director.v1_5.features.VAppTemplateAsyncApi;
 import org.jclouds.vcloud.director.v1_5.features.VdcAsyncApi;
 import org.jclouds.vcloud.director.v1_5.features.VmAsyncApi;
+import org.jclouds.vcloud.director.v1_5.filters.AddVCloudAuthorizationAndCookieToRequest;
 
+import com.google.common.util.concurrent.ListenableFuture;
 import com.google.inject.Provides;
 
 /**
@@ -39,7 +61,20 @@
  * @see VCloudDirectorApi
  * @author Adrian Cole
  */
+@RequestFilters(AddVCloudAuthorizationAndCookieToRequest.class)
+@SkipEncoding({ '-', ':' })
 public interface VCloudDirectorAsyncApi {
+
+   /**
+    * @see VCloudDirectorApi#resolveEntity(String)
+    */
+   @GET
+   @Path("/entity/{id}")
+   @Consumes
+   @JAXBResponseParser
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   ListenableFuture<Entity> resolveEntity(@PathParam("id") String id);
+
    /**
     * 
     * @return the current login session
@@ -58,31 +93,31 @@
     */
    @Delegate
    OrgAsyncApi getOrgApi();
-   
+
    /**
     * @return asynchronous access to {@link Task} features
     */
    @Delegate
    TaskAsyncApi getTaskApi();
-   
+
    /**
     * @return asynchronous access to {@link Network} features
     */
    @Delegate
    NetworkAsyncApi getNetworkApi();
-   
+
    /**
     * @return asynchronous access to {@link Catalog} features
     */
    @Delegate
    CatalogAsyncApi getCatalogApi();
-   
+
    /**
     * @return asynchronous access to {@link Media} features
     */
    @Delegate
    CatalogAsyncApi getMediaApi();
-   
+
    /**
     * @return asynchronous access to {@link Vdc} features
     */
@@ -94,7 +129,7 @@
     */
    @Delegate
    UploadAsyncApi getUploadApi();
-   
+
    /**
     * @return asynchronous access to {@link VApp} features
     */
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/AbstractVAppApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/AbstractVAppApiLiveTest.java
index d80d907..1be4816 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/AbstractVAppApiLiveTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/AbstractVAppApiLiveTest.java
@@ -107,8 +107,8 @@
    protected Vm vm;
    protected VApp vApp;
    protected VAppTemplate vAppTemplate;
-   protected URI vmURI;
-   protected URI vAppURI;
+   protected String vmUrn;
+   protected String vAppUrn;
 
    /**
     * Retrieves the required apis from the REST API context
@@ -134,39 +134,38 @@
    @BeforeClass(alwaysRun = true, description = "Retrieves the required apis from the REST API context")
    protected void setupEnvironment() {
       // Get the configured Vdc for the tests
-      vdc = vdcApi.getVdc(vdcURI);
-      assertNotNull(vdc, String.format(ENTITY_NON_NULL, VDC));
+      vdc = lazyGetVdc();
 
       // Get the configured VAppTemplate for the tests
-      vAppTemplate = vAppTemplateApi.getVAppTemplate(vAppTemplateURI);
+      vAppTemplate = vAppTemplateApi.get(vAppTemplateUrn);
       assertNotNull(vAppTemplate, String.format(ENTITY_NON_NULL, VAPP_TEMPLATE));
 
       // Instantiate a new VApp
       VApp vAppInstantiated = instantiateVApp();
       assertNotNull(vAppInstantiated, String.format(ENTITY_NON_NULL, VAPP));
-      vAppURI = vAppInstantiated.getHref();
+      vAppUrn = vAppInstantiated.getId();
 
       // Wait for the task to complete
       Task instantiateTask = Iterables.getOnlyElement(vAppInstantiated.getTasks());
       assertTrue(retryTaskSuccessLong.apply(instantiateTask), String.format(TASK_COMPLETE_TIMELY, "instantiateTask"));
 
       // Get the instantiated VApp
-      vApp = vAppApi.getVApp(vAppURI);
+      vApp = vAppApi.get(vAppUrn);
 
       // Get the Vm
       List<Vm> vms = vApp.getChildren().getVms();
       vm = Iterables.getOnlyElement(vms);
-      vmURI = vm.getHref();
+      vmUrn = vm.getId();
       assertFalse(vms.isEmpty(), "The VApp must have a Vm");
    }
 
-   protected void getGuestCustomizationSection(final Function<URI, GuestCustomizationSection> getGuestCustomizationSection) {
+   protected void getGuestCustomizationSection(final Function<String, GuestCustomizationSection> getGuestCustomizationSection) {
       // Get URI for child VM
-      URI vmURI = Iterables.getOnlyElement(vApp.getChildren().getVms()).getHref();
+      String vmUrn = Iterables.getOnlyElement(vApp.getChildren().getVms()).getId();
 
       // The method under test
       try {
-         GuestCustomizationSection section = getGuestCustomizationSection.apply(vmURI);
+         GuestCustomizationSection section = getGuestCustomizationSection.apply(vmUrn);
 
          // Check the retrieved object is well formed
          checkGuestCustomizationSection(section);
@@ -175,13 +174,13 @@
       }
    }
 
-   protected void getNetworkConnectionSection(final Function<URI, NetworkConnectionSection> getNetworkConnectionSection) {
+   protected void getNetworkConnectionSection(final Function<String, NetworkConnectionSection> getNetworkConnectionSection) {
       // Get URI for child VM
-      URI vmURI = Iterables.getOnlyElement(vApp.getChildren().getVms()).getHref();
+      String vmUrn = Iterables.getOnlyElement(vApp.getChildren().getVms()).getId();
 
       // The method under test
       try {
-         NetworkConnectionSection section = getNetworkConnectionSection.apply(vmURI);
+         NetworkConnectionSection section = getNetworkConnectionSection.apply(vmUrn);
 
          // Check the retrieved object is well formed
          checkNetworkConnectionSection(section);
@@ -190,18 +189,18 @@
       }
    }
 
-   @AfterClass(alwaysRun = true, description = "Cleans up the environment by deleting created VApps")
+   @AfterClass(alwaysRun = true, description = "Cleans up the environment by deleting addd VApps")
    protected void cleanUpEnvironment() {
-      vdc = vdcApi.getVdc(vdcURI); // Refresh
+      vdc = vdcApi.get(vdcUrn); // Refresh
 
       // Find references in the Vdc with the VApp type and in the list of instantiated VApp names
       Iterable<Reference> vApps = Iterables.filter(vdc.getResourceEntities(),
             Predicates.and(ReferencePredicates.<Reference> typeEquals(VCloudDirectorMediaType.VAPP), ReferencePredicates.<Reference> nameIn(vAppNames)));
 
-      // If we found any references, delete the VApp they point to
+      // If we found any references, remove the VApp they point to
       if (!Iterables.isEmpty(vApps)) {
          for (Reference ref : vApps) {
-            cleanUpVApp(ref.getHref()); // NOTE may fail, but should continue deleting
+            cleanUpVApp(context.getApi().getVAppApi().get(ref.getHref())); // NOTE may fail, but should continue deleting
          }
       } else {
          logger.warn("No VApps in list found in Vdc %s (%s)", vdc.getName(), Iterables.toString(vAppNames));
@@ -249,14 +248,14 @@
    /**
     * Power on a {@link VApp}.
     */
-   protected VApp powerOnVApp(final URI testVAppURI) {
-      VApp test = vAppApi.getVApp(testVAppURI);
+   protected VApp powerOnVApp(String vAppUrn) {
+      VApp test = vAppApi.get(vAppUrn);
       Status status = test.getStatus();
       if (status != Status.POWERED_ON) {
-         Task powerOn = vAppApi.powerOn(vm.getHref());
+         Task powerOn = vAppApi.powerOn(vAppUrn);
          assertTaskSucceedsLong(powerOn);
       }
-      test = vAppApi.getVApp(testVAppURI);
+      test = vAppApi.get(vAppUrn);
       assertStatus(VAPP, test, Status.POWERED_ON);
       return test;
    }
@@ -264,14 +263,14 @@
    /**
     * Power on a {@link Vm}.
     */
-   protected Vm powerOnVm(final URI testVmURI) {
-      Vm test = vmApi.getVm(testVmURI);
+   protected Vm powerOnVm(String vmUrn) {
+      Vm test = vmApi.get(vmUrn);
       Status status = test.getStatus();
       if (status != Status.POWERED_ON) {
-         Task powerOn = vmApi.powerOn(vm.getHref());
+         Task powerOn = vmApi.powerOn(vmUrn);
          assertTaskSucceedsLong(powerOn);
       }
-      test = vmApi.getVm(testVmURI);
+      test = vmApi.get(vmUrn);
       assertStatus(VM, test, Status.POWERED_ON);
       return test;
    }
@@ -279,14 +278,14 @@
    /**
     * Power off a {@link VApp}.
     */
-   protected VApp powerOffVApp(final URI testVAppURI) {
-      VApp test = vAppApi.getVApp(testVAppURI);
+   protected VApp powerOffVApp(String vAppUrn) {
+      VApp test = vAppApi.get(vAppUrn);
       Status status = test.getStatus();
       if (status != Status.POWERED_OFF) {
-         Task powerOff = vAppApi.powerOff(vm.getHref());
+         Task powerOff = vAppApi.powerOff(vAppUrn);
          assertTaskSucceedsLong(powerOff);
       }
-      test = vAppApi.getVApp(testVAppURI);
+      test = vAppApi.get(vAppUrn);
       assertStatus(VAPP, test, Status.POWERED_OFF);
       return test;
    }
@@ -294,15 +293,15 @@
    /**
     * Power off a {@link Vm}.
     */
-   protected Vm powerOffVm(final URI testVmURI) {
-      Vm test = vmApi.getVm(testVmURI);
+   protected Vm powerOffVm(String vmUrn) {
+      Vm test = vmApi.get(vmUrn);
       Status status = test.getStatus();
       if (status != Status.POWERED_OFF || test.isDeployed()) {
          UndeployVAppParams undeployParams = UndeployVAppParams.builder().build();
-         Task shutdownVapp = vAppApi.undeploy(test.getHref(), undeployParams);
+         Task shutdownVapp = vAppApi.undeploy(vmUrn, undeployParams);
          assertTaskSucceedsLong(shutdownVapp);
       }
-      test = vmApi.getVm(testVmURI);
+      test = vmApi.get(vmUrn);
       assertStatus(VM, test, Status.POWERED_OFF);
       return test;
    }
@@ -310,14 +309,14 @@
    /**
     * Suspend a {@link VApp}.
     */
-   protected VApp suspendVApp(final URI testVAppURI) {
-      VApp test = vAppApi.getVApp(testVAppURI);
+   protected VApp suspendVApp(String vAppUrn) {
+      VApp test = vAppApi.get(vAppUrn);
       Status status = test.getStatus();
       if (status != Status.SUSPENDED) {
-         Task suspend = vAppApi.suspend(vm.getHref());
+         Task suspend = vAppApi.suspend(vAppUrn);
          assertTaskSucceedsLong(suspend);
       }
-      test = vAppApi.getVApp(testVAppURI);
+      test = vAppApi.get(vAppUrn);
       assertStatus(VAPP, test, Status.SUSPENDED);
       return test;
    }
@@ -325,14 +324,14 @@
    /**
     * Suspend a {@link Vm}.
     */
-   protected Vm suspendVm(final URI testVmURI) {
-      Vm test = vmApi.getVm(testVmURI);
+   protected Vm suspendVm(String vmUrn) {
+      Vm test = vmApi.get(vmUrn);
       Status status = test.getStatus();
       if (status != Status.SUSPENDED) {
-         Task suspend = vmApi.suspend(vm.getHref());
+         Task suspend = vmApi.suspend(vmUrn);
          assertTaskSucceedsLong(suspend);
       }
-      test = vmApi.getVm(testVmURI);
+      test = vmApi.get(vmUrn);
       assertStatus(VM, test, Status.SUSPENDED);
       return test;
    }
@@ -340,16 +339,16 @@
    /**
     * Check the {@link VApp}s current status.
     */
-   protected void assertVAppStatus(final URI testVAppURI, final Status status) {
-      VApp testVApp = vAppApi.getVApp(testVAppURI);
+   protected void assertVAppStatus(final String vAppUrn, final Status status) {
+      VApp testVApp = vAppApi.get(vAppUrn);
       assertStatus(VAPP, testVApp, status);
    }
 
    /**
     * Check the {@link Vm}s current status.
     */
-   protected void assertVmStatus(final URI testVmURI, final Status status) {
-      Vm testVm = vmApi.getVm(testVmURI);
+   protected void assertVmStatus(String vmUrn, final Status status) {
+      Vm testVm = vmApi.get(vmUrn);
       assertStatus(VM, testVm, status);
    }
 
@@ -377,7 +376,7 @@
    }
    
    protected VAppNetworkConfiguration getVAppNetworkConfig(VApp vApp) {
-      Set<VAppNetworkConfiguration> vAppNetworkConfigs = vAppApi.getNetworkConfigSection(vApp.getHref()).getNetworkConfigs();
+      Set<VAppNetworkConfiguration> vAppNetworkConfigs = vAppApi.getNetworkConfigSection(vApp.getId()).getNetworkConfigs();
       return Iterables.tryFind(vAppNetworkConfigs, Predicates.notNull()).orNull();
    }
    
@@ -390,11 +389,11 @@
    }
    
    protected Set<NetworkConnection> listNetworkConnections(Vm vm) {
-      return vmApi.getNetworkConnectionSection(vm.getHref()).getNetworkConnections();
+      return vmApi.getNetworkConnectionSection(vm.getId()).getNetworkConnections();
    }
    
    protected Set<VAppNetworkConfiguration> listVappNetworkConfigurations(VApp vApp) {
-      Set<VAppNetworkConfiguration> vAppNetworkConfigs = vAppApi.getNetworkConfigSection(vApp.getHref()).getNetworkConfigs();
+      Set<VAppNetworkConfiguration> vAppNetworkConfigs = vAppApi.getNetworkConfigSection(vApp.getId()).getNetworkConfigs();
       return vAppNetworkConfigs;
    }
 }
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/HttpClientLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/HttpClientLiveTest.java
index b7d66ea..427db4a 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/HttpClientLiveTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/HttpClientLiveTest.java
@@ -79,15 +79,15 @@
       sessionWithToken = SessionWithToken.builder().session(session).token(response.getFirstHeaderOrNull("x-vcloud-authorization")).build();
 
       assertEquals(sessionWithToken.getSession().getUser(), user);
-      assertEquals(sessionWithToken.getSession().getOrg(), org);
+      assertEquals(sessionWithToken.getSession().get(), org);
       assertTrue(sessionWithToken.getSession().getLinks().size() > 0);
       assertNotNull(sessionWithToken.getToken());
 
       OrgList orgList = parser.fromXML(Strings2.toString(response.getPayload()), OrgList.class);
 
-      assertTrue(orgList.getOrgs().size() > 0, "must have orgs");
+      assertTrue(orgList.size() > 0, "must have orgs");
 
-      context.getApi().getOrgApi().getOrg(Iterables.getLast(orgList.getOrgs()).getHref());
+      context.getApi().getOrgApi().get(Iterables.getLast(orgList).getHref());
    }
 
    @Test(description = "GET /schema/{schemaFileName}", dependsOnMethods = { "testPostLogin", "testGetLogin" })
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorApiExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorApiExpectTest.java
index 343746d..7b5e238 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorApiExpectTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorApiExpectTest.java
@@ -31,6 +31,8 @@
 @Test(groups = "unit", testName = "VCloudDirectorApi")
 public class VCloudDirectorApiExpectTest extends VCloudDirectorAdminApiExpectTest {
 
+   //TODO: this inheritance is all wrong!!  the base client shouldn't inherit from the admin client tests!!
+   
    public void testRestClientModuleWorksProperly() throws Exception {
 
       VCloudDirectorApi apiWhenSessionsExist = requestSendsResponse(loginRequest, sessionResponse);
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorApiLiveTest.java
new file mode 100644
index 0000000..b2e86fd
--- /dev/null
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorApiLiveTest.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  jclouds 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;
+
+import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkEntityType;
+
+import org.jclouds.vcloud.director.v1_5.domain.Entity;
+import org.jclouds.vcloud.director.v1_5.domain.Reference;
+import org.jclouds.vcloud.director.v1_5.domain.org.Org;
+import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorApiLiveTest;
+import org.jclouds.vcloud.director.v1_5.user.VCloudDirectorApi;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+/**
+ * Tests live behavior of {@link VCloudDirectorApi}.
+ * 
+ * @author Adrian Cole
+ */
+@Test(groups = { "live", "user" }, singleThreaded = true, testName = "VCloudDirectorApiLiveTest")
+public class VCloudDirectorApiLiveTest extends BaseVCloudDirectorApiLiveTest {
+
+   @Test(description = "GET /entity/{id}")
+   public void testResolveEntity() {
+      for (Reference orgRef : context.getApi().getOrgApi().list()) {
+         Org org = context.getApi().getOrgApi().get(orgRef.getHref());
+         Entity entity = context.getApi().resolveEntity(org.getId());
+         checkEntityType(entity);
+      }
+   }
+
+   @Override
+   @BeforeClass(alwaysRun = true)
+   public void setupRequiredApis() {
+   }
+}
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorLiveTestConstants.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorLiveTestConstants.java
index c1ee58d..f6f2ec0 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorLiveTestConstants.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/VCloudDirectorLiveTestConstants.java
@@ -33,7 +33,7 @@
 
    /* Error codes from 100 to 199 reflect parsing and other errors in domain object fields and attributes. */
 
-   public static final String REF_REQ_LIVE = "ERR-101: %s reference required to perform live tests";
+   public static final String URN_REQ_LIVE = "ERR-101: %s urn required to perform live tests";
 
    public static final String OBJ_REQ_LIVE = "ERR-102: %s instance required to perform live tests";
 
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/domain/Checks.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/domain/Checks.java
index 6d4bcb3..fa1e6d1 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/domain/Checks.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/domain/Checks.java
@@ -165,8 +165,6 @@
       assertNotNull(reference.getHref(), String.format(NOT_NULL_OBJ_FIELD_FMT, "Href", "ReferenceType"));
 
       // Check optional fields
-      String id = reference.getId();
-      if (id != null) checkId(id);
       String type = reference.getType();
       if (type != null) checkType(type, validTypes);
       // NOTE name cannot be checked
@@ -257,7 +255,7 @@
       if (error != null) checkError(error);
       Reference user = task.getUser();
       if (user != null) checkReferenceType(user);
-      Reference org = task.getOrg();
+      Reference org = task.get();
       if (org != null) checkReferenceType(org);
       Integer progress = task.getProgress();
       if (progress != null) checkProgress(progress);
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/CatalogApiExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/CatalogApiExpectTest.java
index d5a9718..365a90c 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/CatalogApiExpectTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/CatalogApiExpectTest.java
@@ -18,6 +18,13 @@
  */
 package org.jclouds.vcloud.director.v1_5.features;
 
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ADMIN_CATALOG;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.CATALOG;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.CATALOG_ITEM;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ENTITY;
+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 static org.testng.Assert.assertEquals;
 
 import java.net.URI;
@@ -25,7 +32,6 @@
 import org.jclouds.http.HttpRequest;
 import org.jclouds.http.HttpResponse;
 import org.jclouds.vcloud.director.v1_5.VCloudDirectorApiExpectTest;
-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.domain.Link;
@@ -43,379 +49,406 @@
 /**
  * Test the {@link CatalogApi} by observing its side effects.
  * 
- * @author grkvlt@apache.org
+ * @author grkvlt@apache.org, Adrian Cole
  */
 @Test(groups = { "unit", "user" }, singleThreaded = true, testName = "CatalogApiExpectTest")
 public class CatalogApiExpectTest extends VCloudDirectorApiExpectTest {
+   static String catalog = "7212e451-76e1-4631-b2de-ba1dfd8080e4";
+   static String catalogUrn = "urn:vcloud:catalog:" + catalog;
+   static URI catalogHref = URI.create(endpoint + "/catalog/" + catalog);
+   
+   HttpRequest get = HttpRequest.builder()
+            .method("GET")
+            .endpoint(catalogHref)
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+            .build();
 
+    HttpResponse getResponse = HttpResponse.builder()
+            .statusCode(200)
+            .payload(payloadFromResourceWithContentType("/catalog/catalog.xml", CATALOG + ";version=1.5"))
+            .build();
+    
    @Test
-   public void testGetCatalog() {
-      HttpRequest catalogRequest = HttpRequest.builder()
-              .method("GET")
-              .endpoint(endpoint + "/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4")
-              .addHeader("Accept", "*/*")
-              .addHeader("x-vcloud-authorization", token)
-              .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
-              .build();
-
-      HttpResponse catalogResponse = HttpResponse.builder()
-              .statusCode(200)
-              .payload(payloadFromResourceWithContentType("/catalog/catalog.xml", VCloudDirectorMediaType.CATALOG + ";version=1.5"))
-              .build();
-
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, catalogRequest, catalogResponse);
-
-      Catalog expected = catalog();
-
-      URI catalogURI = URI.create(endpoint + "/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4");      
-      assertEquals(api.getCatalogApi().getCatalog(catalogURI), expected);
+   public void testGetCatalogHref() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, get, getResponse);
+      assertEquals(api.getCatalogApi().get(catalogHref), catalog());
    }
-
+   
+   HttpRequest resolveCatalog = HttpRequest.builder()
+            .method("GET")
+            .endpoint(endpoint + "/entity/" + catalogUrn)
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+            .build();
+   
+   String catalogEntity = asString(createXMLBuilder("Entity").a("xmlns", "http://www.vmware.com/vcloud/v1.5")
+                                                             .a("name", catalogUrn)
+                                                             .a("id", catalogUrn)
+                                                             .a("type", ENTITY)
+                                                             .a("href", endpoint + "/entity/" + catalogUrn)
+                                  .e("Link").a("rel", "alternate").a("type", CATALOG).a("href", catalogHref.toString()).up()
+                                  // TODO: remove this when VCloudDirectorApiExpectTest no longer inherits from VCloudDirectorAdminApiExpectTest
+                                  .e("Link").a("rel", "alternate").a("type", ADMIN_CATALOG).a("href", catalogHref.toString()).up());
+   
+   HttpResponse resolveCatalogResponse = HttpResponse.builder()
+           .statusCode(200)
+           .payload(payloadFromStringWithContentType(catalogEntity, ENTITY + ";version=1.5"))
+           .build();
+   
    @Test
-   public void testAddCatalogItem() {
-      HttpRequest catalogItemRequest = HttpRequest.builder()
+   public void testGetCatalogUrn() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, resolveCatalog, resolveCatalogResponse, get, getResponse);
+      assertEquals(api.getCatalogApi().get(catalogUrn), catalog());
+   }
+   
+   HttpRequest add = HttpRequest.builder()
             .method("POST")
-            .endpoint(endpoint + "/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4/catalogItems")
+            .endpoint(catalogHref + "/catalogItems")
             .addHeader("Accept", "application/vnd.vmware.vcloud.catalogItem+xml")
             .addHeader("x-vcloud-authorization", token)
             .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
-            .payload(payloadFromResourceWithContentType("/catalog/newCatalogItem.xml", VCloudDirectorMediaType.CATALOG_ITEM))
+            .payload(payloadFromResourceWithContentType("/catalog/newCatalogItem.xml", CATALOG_ITEM))
             .build();
 
-      HttpResponse catalogItemResponse = HttpResponse.builder()
-              .statusCode(200)
-              .payload(payloadFromResourceWithContentType("/catalog/createdCatalogItem.xml", VCloudDirectorMediaType.CATALOG_ITEM + ";version=1.5"))
+   HttpResponse addResponse = HttpResponse.builder()
+            .statusCode(200)
+            .payload(payloadFromResourceWithContentType("/catalog/adddCatalogItem.xml", CATALOG_ITEM + ";version=1.5"))
             .build();
-
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, catalogItemRequest, catalogItemResponse);
-
-      URI catalogURI = URI.create(endpoint + "/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4"); 
-      
-      CatalogItem newItem = CatalogItem.builder()
+   
+   CatalogItem newItem = CatalogItem.builder()
             .name("newCatalogItem")
             .description("New Catalog Item")
             .entity(ubuntuVappTemplateReference())
             .build();
 
-      CatalogItem expected = createdCatalogItem();
-      
-      assertEquals(api.getCatalogApi().addCatalogItem(catalogURI, newItem), expected);
-   }
-
    @Test
-   public void testGetCatalogMetadata() {
-      HttpRequest catalogRequest = HttpRequest.builder()
-            .method("GET")
-            .endpoint(endpoint + "/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4/metadata")
-            .addHeader("Accept", "*/*")
-            .addHeader("x-vcloud-authorization", token)
-            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
-
-      HttpResponse catalogResponse = HttpResponse.builder()
-              .statusCode(200)
-              .payload(payloadFromResourceWithContentType("/catalog/catalogMetadata.xml", VCloudDirectorMediaType.METADATA))
-            .build();
-
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, catalogRequest, catalogResponse);
-
-      URI catalogURI = URI.create(endpoint + "/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4");
-      
-      Metadata expected = Metadata.builder()
-            .type("application/vnd.vmware.vcloud.metadata+xml")
-            .href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4/metadata"))
-            .link(Link.builder()
-                  .rel("up")
-                  .type("application/vnd.vmware.vcloud.catalog+xml")
-                  .href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4"))
-                  .build())
-            .entries(ImmutableSet.of(metadataEntry()))
-            .build();
-      
-      assertEquals(api.getCatalogApi().getMetadataApi().getMetadata(catalogURI), expected);
-   }
-
-   @Test
-   public void testGetCatalogMetadataEntry() {
-      HttpRequest catalogRequest = HttpRequest.builder()
-            .method("GET")
-            .endpoint(endpoint + "/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4/metadata/KEY")
-            .addHeader("Accept", "*/*")
-            .addHeader("x-vcloud-authorization", token)
-            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
-
-      HttpResponse catalogResponse = HttpResponse.builder()
-              .statusCode(200)
-              .payload(payloadFromResourceWithContentType("/catalog/catalogMetadataValue.xml", VCloudDirectorMediaType.METADATA_VALUE))
-            .build();
-
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, catalogRequest, catalogResponse);
-
-      URI catalogURI = URI.create(endpoint + "/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4");
-      
-      MetadataValue expected = metadataValue();
-      
-      assertEquals(api.getCatalogApi().getMetadataApi().getMetadataValue(catalogURI, "KEY"), expected);
+   public void testAddCatalogItemHref() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, add, addResponse);
+      assertEquals(api.getCatalogApi().addItem(catalogHref, newItem), adddCatalogItem());
    }
    
    @Test
-   public void testGetCatalogItem() {
-      HttpRequest catalogItemRequest = HttpRequest.builder()
+   public void testAddCatalogItemUrn() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, resolveCatalog, resolveCatalogResponse, add, addResponse);
+      assertEquals(api.getCatalogApi().addItem(catalogUrn, newItem), adddCatalogItem());
+   }
+   
+   HttpRequest getMetadata = HttpRequest.builder()
             .method("GET")
-            .endpoint(endpoint + "/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df")
+            .endpoint(catalogHref + "/metadata")
             .addHeader("Accept", "*/*")
             .addHeader("x-vcloud-authorization", token)
             .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
 
-      HttpResponse catalogItemResponse = HttpResponse.builder()
-              .statusCode(200)
-              .payload(payloadFromResourceWithContentType("/catalog/catalogItem.xml", VCloudDirectorMediaType.CATALOG_ITEM))
+   HttpResponse getMetadataResponse = HttpResponse.builder()
+            .statusCode(200)
+            .payload(payloadFromResourceWithContentType("/catalog/catalogMetadata.xml", METADATA))
             .build();
 
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, catalogItemRequest, catalogItemResponse);
-
-      URI catalogItemURI =   URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df");
-         
-      CatalogItem expected = catalogItem();
-      
-      assertEquals(api.getCatalogApi().getCatalogItem(catalogItemURI), expected);
+   @Test
+   public void testGetCatalogMetadataHref() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, getMetadata, getMetadataResponse);
+      assertEquals(api.getCatalogApi().getMetadataApi(catalogHref).get(), metadata());
    }
 
+   static Metadata metadata() {
+      return Metadata.builder()
+                     .type("application/vnd.vmware.vcloud.metadata+xml")
+                     .href(URI.create(endpoint + "/catalog/" + catalog + "/metadata"))
+                     .link(Link.builder()
+                               .rel("up")
+                               .type("application/vnd.vmware.vcloud.catalog+xml")
+                               .href(catalogHref)
+                               .build())
+                     .entries(ImmutableSet.of(metadataEntry()))
+                     .build();
+   }
+   
+   HttpRequest getMetadataValue = HttpRequest.builder()
+            .method("GET")
+            .endpoint(catalogHref + "/metadata/KEY")
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
+
+   HttpResponse getMetadataValueResponse = HttpResponse.builder()
+            .statusCode(200)
+            .payload(payloadFromResourceWithContentType("/catalog/catalogMetadataValue.xml", METADATA_VALUE))
+            .build();
+
    @Test
-   public void testUpdateCatalogItem() {
-      HttpRequest catalogItemRequest = HttpRequest.builder()
+   public void testGetCatalogMetadataEntryHref() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, getMetadataValue, getMetadataValueResponse);
+      assertEquals(api.getCatalogApi().getMetadataApi(catalogHref).getValue("KEY"), metadataValue());
+   }
+
+   static String item = "a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df";
+   static URI itemHref = URI.create(endpoint + "/catalogItem/" + item);
+   static String itemUrn = "urn:vcloud:catalogitem:" + item;
+
+   HttpRequest resolveItem = HttpRequest.builder()
+            .method("GET")
+            .endpoint(endpoint + "/entity/" + itemUrn)
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+            .build();
+   
+   String itemEntity = asString(createXMLBuilder("Entity").a("xmlns", "http://www.vmware.com/vcloud/v1.5")
+                                                             .a("name", itemUrn)
+                                                             .a("id", itemUrn)
+                                                             .a("type", ENTITY)
+                                                             .a("href", endpoint + "/entity/" + itemUrn)
+                               .e("Link").a("rel", "alternate").a("type", CATALOG_ITEM).a("href", itemHref.toString()).up());
+
+   HttpResponse resolveItemResponse = HttpResponse.builder()
+            .statusCode(200)
+            .payload(payloadFromStringWithContentType(itemEntity, ENTITY + ";version=1.5"))
+            .build();
+   
+   HttpRequest getItem = HttpRequest.builder()
+            .method("GET")
+            .endpoint(endpoint + "/catalogItem/" + item)
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
+
+   HttpResponse getItemResponse = HttpResponse.builder()
+            .statusCode(200)
+            .payload(payloadFromResourceWithContentType("/catalog/catalogItem.xml", CATALOG_ITEM))
+            .build();
+      
+   @Test
+   public void testGetCatalogItemHref() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, getItem, getItemResponse);
+      assertEquals(api.getCatalogApi().getItem(itemHref), catalogItem());
+   }
+   
+   @Test
+   public void testGetCatalogItemUrn() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, resolveItem, resolveItemResponse, getItem, getItemResponse);
+      assertEquals(api.getCatalogApi().getItem(itemUrn), catalogItem());
+   }
+   
+   HttpRequest editItem = HttpRequest.builder()
             .method("PUT")
-            .endpoint(endpoint + "/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df")
+            .endpoint(endpoint + "/catalogItem/" + item)
             .addHeader("Accept", "application/vnd.vmware.vcloud.catalogItem+xml")
             .addHeader("x-vcloud-authorization", token)
             .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
-            .payload(payloadFromResourceWithContentType("/catalog/updateCatalogItem.xml", VCloudDirectorMediaType.CATALOG_ITEM))
+            .payload(payloadFromResourceWithContentType("/catalog/editCatalogItem.xml", CATALOG_ITEM))
             .build();
 
-      HttpResponse catalogItemResponse = HttpResponse.builder()
-              .statusCode(200)
-              .payload(payloadFromResourceWithContentType("/catalog/updateCatalogItem.xml", VCloudDirectorMediaType.CATALOG_ITEM + ";version=1.5"))
+   HttpResponse editItemResponse = HttpResponse.builder()
+            .statusCode(200)
+            .payload(payloadFromResourceWithContentType("/catalog/editCatalogItem.xml", CATALOG_ITEM + ";version=1.5"))
             .build();
 
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, catalogItemRequest, catalogItemResponse);
-
-      URI catalogItemURI = URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df");         
-      CatalogItem expected = catalogItem();
-      
-      assertEquals(api.getCatalogApi().updateCatalogItem(catalogItemURI, expected), expected);
+   @Test
+   public void testEditCatalogItemHref() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, editItem, editItemResponse);
+      assertEquals(api.getCatalogApi().editItem(itemHref, catalogItem()), catalogItem());
    }
    
    @Test
-   public void testDeleteCatalogItem() {
-      HttpRequest catalogItemRequest = HttpRequest.builder()
+   public void testEditCatalogItemUrn() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, resolveItem, resolveItemResponse, editItem, editItemResponse);
+      assertEquals(api.getCatalogApi().editItem(itemUrn, catalogItem()), catalogItem());
+   }
+   
+   HttpRequest removeItem = HttpRequest.builder()
             .method("DELETE")
-            .endpoint(endpoint + "/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df")
+            .endpoint(endpoint + "/catalogItem/" + item)
             .addHeader("Accept", "*/*")
             .addHeader("x-vcloud-authorization", token)
             .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
 
-      HttpResponse catalogItemResponse = HttpResponse.builder()
+   HttpResponse removeItemResponse = HttpResponse.builder()
             .statusCode(200)
             .build();
-
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, catalogItemRequest, catalogItemResponse);
-
-      URI catalogItemURI = URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df");
-         
-      api.getCatalogApi().deleteCatalogItem(catalogItemURI);
+      
+   @Test
+   public void testRemoveCatalogItemHref() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, removeItem, removeItemResponse);
+      api.getCatalogApi().removeItem(itemHref);
    }
 
    @Test
-   public void testGetCatalogItemMetadata() {
-      HttpRequest catalogItemRequest = HttpRequest.builder()
+   public void testRemoveCatalogItemUrn() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, resolveItem, resolveItemResponse, removeItem, removeItemResponse);
+      api.getCatalogApi().removeItem(itemUrn);
+   }
+   
+   HttpRequest getItemMetadata = HttpRequest.builder()
             .method("GET")
-            .endpoint(endpoint + "/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df/metadata")
+            .endpoint(endpoint + "/catalogItem/" + item + "/metadata")
             .addHeader("Accept", "*/*")
             .addHeader("x-vcloud-authorization", token)
             .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
 
-      HttpResponse catalogItemResponse = HttpResponse.builder()
-              .statusCode(200)
-              .payload(payloadFromResourceWithContentType("/catalog/catalogItemMetadata.xml", VCloudDirectorMediaType.METADATA))
+   HttpResponse getItemMetadataResponse = HttpResponse.builder()
+            .statusCode(200)
+            .payload(payloadFromResourceWithContentType("/catalog/catalogItemMetadata.xml", METADATA))
             .build();
-
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, catalogItemRequest, catalogItemResponse);
-
-      URI catalogItemURI = URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df");
       
-      Metadata expected = Metadata.builder()
+   Metadata expected = Metadata.builder()
             .type("application/vnd.vmware.vcloud.metadata+xml")
-            .href(URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df/metadata"))
+            .href(URI.create(endpoint + "/catalogItem/" + item + "/metadata"))
             .link(Link.builder()
                   .rel("up")
                   .type("application/vnd.vmware.vcloud.catalogItem+xml")
-                  .href(URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df"))
+                  .href(itemHref)
                   .build())
             .entries(ImmutableSet.of(itemMetadataEntry()))
             .build();
-      
-      assertEquals(api.getCatalogApi().getMetadataApi().getMetadata(catalogItemURI), expected);
-   }
 
    @Test
-   public void testMergeCatalogItemMetadata() {
-      HttpRequest catalogItemRequest = HttpRequest.builder()
+   public void testGetCatalogItemMetadataHref() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, getItemMetadata, getItemMetadataResponse);
+      assertEquals(api.getCatalogApi().getMetadataApi(itemHref).get(), expected);
+   }
+
+   HttpRequest mergeItemMetadata = HttpRequest.builder()
             .method("POST")
-            .endpoint(endpoint + "/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df/metadata")
+            .endpoint(endpoint + "/catalogItem/" + item + "/metadata")
             .addHeader("Accept", "application/vnd.vmware.vcloud.task+xml")
             .addHeader("x-vcloud-authorization", token)
             .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
-            .payload(payloadFromResourceWithContentType("/catalog/mergeCatalogItemMetadata.xml", VCloudDirectorMediaType.METADATA))
+            .payload(payloadFromResourceWithContentType("/catalog/mergeCatalogItemMetadata.xml", METADATA))
             .build();
 
-      HttpResponse catalogItemResponse = HttpResponse.builder()
-              .statusCode(200)
-              .payload(payloadFromResourceWithContentType("/catalog/mergeMetadataTask.xml", VCloudDirectorMediaType.TASK + ";version=1.5"))
+   HttpResponse mergeItemMetadataResponse = HttpResponse.builder()
+            .statusCode(200)
+            .payload(payloadFromResourceWithContentType("/catalog/mergeMetadataTask.xml", TASK + ";version=1.5"))
             .build();
-
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, catalogItemRequest, catalogItemResponse);
-
-      URI catalogItemURI = URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df");
- 
-      Metadata metadata = Metadata.builder().entry(MetadataEntry.builder().entry("KEY", "VALUE").build()).build();
       
-      Task expected = mergeMetadataTask();
-      
-      assertEquals(api.getCatalogApi().getCatalogItemMetadataApi().mergeMetadata(catalogItemURI, metadata), expected);
-   }
-
    @Test
-   public void testGetCatalogItemMetadataEntry() {
-      HttpRequest catalogItemRequest = HttpRequest.builder()
+   public void testMergeCatalogItemMetadataHref() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, mergeItemMetadata, mergeItemMetadataResponse);
+      // TODO: horrendous way of representing Map<String,String>
+      Metadata metadata = Metadata.builder().entry(MetadataEntry.builder().entry("KEY", "VALUE").build()).build();
+      assertEquals(api.getCatalogApi().getItemMetadataApi(itemHref).merge(metadata), mergeMetadataTask());
+   }
+   
+   HttpRequest getItemMetadataValue = HttpRequest.builder()
             .method("GET")
-            .endpoint(endpoint + "/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df/metadata/KEY")
+            .endpoint(endpoint + "/catalogItem/" + item + "/metadata/KEY")
             .addHeader("Accept", "*/*")
             .addHeader("x-vcloud-authorization", token)
             .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
-
-      HttpResponse catalogItemResponse = HttpResponse.builder()
-              .statusCode(200)
-              .payload(payloadFromResourceWithContentType("/catalog/catalogItemMetadataValue.xml", VCloudDirectorMediaType.METADATA_VALUE + ";version=1.5"))
+   
+   HttpResponse getItemMetadataValueResponse = HttpResponse.builder()
+            .statusCode(200)
+            .payload(payloadFromResourceWithContentType("/catalog/catalogItemMetadataValue.xml", METADATA_VALUE + ";version=1.5"))
             .build();
-
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, catalogItemRequest, catalogItemResponse);
-
-      URI catalogItemURI = URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df");
-      
-      MetadataValue expected = itemMetadataValue();
-      
-      assertEquals(api.getCatalogApi().getMetadataApi().getMetadataValue(catalogItemURI, "KEY"), expected);
-   }
-
+   
    @Test
-   public void testSetCatalogItemMetadataEntry() {
-      HttpRequest catalogItemRequest = HttpRequest.builder()
+   public void testGetCatalogItemMetadataEntryHref() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, getItemMetadataValue, getItemMetadataValueResponse);
+      assertEquals(api.getCatalogApi().getMetadataApi(itemHref).getValue("KEY"), itemMetadataValue());
+   }
+   
+   HttpRequest putItemMetadata = HttpRequest.builder()
             .method("PUT")
-            .endpoint(endpoint + "/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df/metadata/KEY")
+            .endpoint(endpoint + "/catalogItem/" + item + "/metadata/KEY")
             .addHeader("Accept", "application/vnd.vmware.vcloud.task+xml")
             .addHeader("x-vcloud-authorization", token)
             .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
-            .payload(payloadFromResourceWithContentType("/catalog/setCatalogItemMetadataValue.xml", VCloudDirectorMediaType.METADATA_VALUE))
+            .payload(payloadFromResourceWithContentType("/catalog/setCatalogItemMetadataValue.xml", METADATA_VALUE))
             .build();
 
-      HttpResponse catalogItemResponse = HttpResponse.builder()
+   HttpResponse putItemMetadataResponse = HttpResponse.builder()
             .statusCode(200)
-            .payload(payloadFromResourceWithContentType("/catalog/setMetadataValueTask.xml", VCloudDirectorMediaType.TASK + ";version=1.5"))
-            .build();
-
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, catalogItemRequest, catalogItemResponse);
-
-      URI catalogItemURI = URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df");
-      
-      MetadataValue value = MetadataValue.builder().value("KITTENS").build();
-      
-      Task expected = setMetadataValueTask();
-      
-      assertEquals(api.getCatalogApi().getCatalogItemMetadataApi().setMetadata(catalogItemURI, "KEY", value), expected);
-   }
-
+            .payload(payloadFromResourceWithContentType("/catalog/setMetadataValueTask.xml", TASK + ";version=1.5"))
+            .build(); 
+   
    @Test
-   public void testDeleteCatalogItemMetadataEntry() {
-      HttpRequest catalogItemRequest = HttpRequest.builder()
+   public void testSetCatalogItemMetadataEntryHref() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, putItemMetadata, putItemMetadataResponse);
+      assertEquals(api.getCatalogApi().getItemMetadataApi(itemHref).putEntry("KEY", MetadataValue.builder().value("KITTENS").build()), setMetadataValueTask());
+   }
+   
+   HttpRequest removeItemMetadataEntry = HttpRequest.builder()
             .method("DELETE")
-            .endpoint(endpoint + "/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df/metadata/KEY")
+            .endpoint(endpoint + "/catalogItem/" + item + "/metadata/KEY")
             .addHeader("Accept", "application/vnd.vmware.vcloud.task+xml")
             .addHeader("x-vcloud-authorization", token)
             .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
 
-      HttpResponse catalogItemResponse = HttpResponse.builder()
+   HttpResponse removeItemMetadataEntryResponse = HttpResponse.builder()
             .statusCode(200)
-            .payload(payloadFromResourceWithContentType("/catalog/deleteMetadataEntryTask.xml", VCloudDirectorMediaType.TASK))
-            .build();
-
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, catalogItemRequest, catalogItemResponse);
-
-      URI catalogItemURI = URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df");
-      
-      Task expected = deleteMetadataEntryTask();
-      
-      assertEquals(api.getCatalogApi().getCatalogItemMetadataApi().deleteMetadataEntry(catalogItemURI, "KEY"), expected);
+            .payload(payloadFromResourceWithContentType("/catalog/removeMetadataEntryTask.xml", TASK))
+            .build();   
+   
+   @Test
+   public void testRemoveCatalogItemMetadataEntryHref() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, removeItemMetadataEntry, removeItemMetadataEntryResponse);
+      assertEquals(api.getCatalogApi().getItemMetadataApi(itemHref).removeEntry("KEY"), removeEntryTask());
    }
-
+   
    public static final Catalog catalog() {
       return Catalog.builder()
       		      .name("QunyingTestCatalog")
       		      .type("application/vnd.vmware.vcloud.catalog+xml")
-      		      .id("urn:vcloud:catalog:7212e451-76e1-4631-b2de-ba1dfd8080e4")
-      		      .href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4"))
+      		      .id(catalogUrn)
+      		      .href(catalogHref)
       		      .link(Link.builder()
       		            .rel("up")
       		            .type("application/vnd.vmware.vcloud.org+xml")
-      		            .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
+      		            .href(URI.create(endpoint + "/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
       		            .build())
       		      .link(Link.builder()
       		            .rel("add")
       		            .type("application/vnd.vmware.vcloud.catalogItem+xml")
-      		            .href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4/catalogItems"))
+      		            .href(URI.create(endpoint + "/catalog/" + catalog + "/catalogItems"))
       		            .build())
       		      .link(Link.builder()
       		            .rel("down")
       		            .type("application/vnd.vmware.vcloud.metadata+xml")
-      		            .href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4/metadata"))
+      		            .href(URI.create(endpoint + "/catalog/" + catalog + "/metadata"))
       		            .build())
   		            .item(Reference.builder()
   		                  .type("application/vnd.vmware.vcloud.catalogItem+xml")
   		                  .name("ubuntu10")
-  		                  .href(URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df"))
+  		                  .href(itemHref)
   		                  .build())
   		            .item(Reference.builder()
   		                  .type("application/vnd.vmware.vcloud.catalogItem+xml")
   		                  .name("imageTesting")
-  		                  .href(URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a9e0afdb-a42b-4688-8409-2ac68cf22939"))
+  		                  .href(URI.create(endpoint + "/catalogItem/a9e0afdb-a42b-4688-8409-2ac68cf22939"))
   		                  .build())
       		      .description("Testing")
       		      .isPublished(false)
       		      .build();
    }
 
-   public static CatalogItem createdCatalogItem() {
+   public static CatalogItem adddCatalogItem() {
       return CatalogItem.builder()
                   .name("newCatalogItem")
-                  .id("urn:vcloud:catalogitem:a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df")
+                  .id("urn:vcloud:catalogitem:" + item)
                   .type("application/vnd.vmware.vcloud.catalogItem+xml")
-                  .href(URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df"))
+                  .href(itemHref)
                   .link(Link.builder()
                         .rel("up")
                         .type("application/vnd.vmware.vcloud.catalog+xml")
-                        .href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4"))
+                        .href(catalogHref)
                         .build())
                   .link(Link.builder()
                         .rel("down")
                         .type("application/vnd.vmware.vcloud.metadata+xml")
-                        .href(URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df/metadata"))
+                        .href(URI.create(endpoint + "/catalogItem/" + item + "/metadata"))
                         .build())
                   .link(Link.builder()
                         .rel("edit")
                         .type("application/vnd.vmware.vcloud.catalogItem+xml")
-                        .href(URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df"))
+                        .href(itemHref)
                         .build())
                   .link(Link.builder()
                         .rel("remove")
-                        .href(URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df"))
+                        .href(itemHref)
                         .build())
                   .description("New Catalog Item")
                   .entity(ubuntuVappTemplateReference())
@@ -426,17 +459,17 @@
       return Reference.builder()
                   .type("application/vnd.vmware.vcloud.vAppTemplate+xml")
                   .name("ubuntu10")
-                  .href(URI.create("https://vcloudbeta.bluelock.com/api/vAppTemplate/vappTemplate-ef4415e6-d413-4cbb-9262-f9bbec5f2ea9"))
+                  .href(URI.create(endpoint + "/vAppTemplate/vappTemplate-ef4415e6-d413-4cbb-9262-f9bbec5f2ea9"))
                   .build();
    }
 
    public static MetadataEntry metadataEntry() {
       return  MetadataEntry.builder()
-                  .href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4/metadata/KEY"))
+                  .href(URI.create(endpoint + "/catalog/" + catalog + "/metadata/KEY"))
                   .link(Link.builder()
                         .rel("up")
                         .type("application/vnd.vmware.vcloud.metadata+xml")
-                        .href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4/metadata"))
+                        .href(URI.create(endpoint + "/catalog/" + catalog + "/metadata"))
                         .build())
                   .entry("KEY", "VALUE")
                   .build();
@@ -444,11 +477,11 @@
 
    public static MetadataEntry itemMetadataEntry() {
       return  MetadataEntry.builder()
-                  .href(URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df/metadata/KEY"))
+                  .href(URI.create(endpoint + "/catalogItem/" + item + "/metadata/KEY"))
                   .link(Link.builder()
                         .rel("up")
                         .type("application/vnd.vmware.vcloud.metadata+xml")
-                        .href(URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df/metadata"))
+                        .href(URI.create(endpoint + "/catalogItem/" + item + "/metadata"))
                         .build())
                   .entry("KEY", "VALUE")
                   .build();
@@ -456,11 +489,11 @@
 
    public static MetadataValue metadataValue() {
       return  MetadataValue.builder()
-                  .href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4/metadata/KEY"))
+                  .href(URI.create(endpoint + "/catalog/" + catalog + "/metadata/KEY"))
                   .link(Link.builder()
                         .rel("up")
                         .type("application/vnd.vmware.vcloud.metadata+xml")
-                        .href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4/metadata"))
+                        .href(URI.create(endpoint + "/catalog/" + catalog + "/metadata"))
                         .build())
                   .value("VALUE")
                   .build();
@@ -468,11 +501,11 @@
 
    public static MetadataValue itemMetadataValue() {
       return  MetadataValue.builder()
-                  .href(URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df/metadata/KEY"))
+                  .href(URI.create(endpoint + "/catalogItem/" + item + "/metadata/KEY"))
                   .link(Link.builder()
                         .rel("up")
                         .type("application/vnd.vmware.vcloud.metadata+xml")
-                        .href(URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df/metadata"))
+                        .href(URI.create(endpoint + "/catalogItem/" + item + "/metadata"))
                         .build())
                   .value("VALUE")
                   .build();
@@ -481,27 +514,27 @@
    public static CatalogItem catalogItem() {
       return CatalogItem.builder()
             .name("ubuntu10")
-            .id("urn:vcloud:catalogitem:a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df")
+            .id("urn:vcloud:catalogitem:" + item)
             .type("application/vnd.vmware.vcloud.catalogItem+xml")
-            .href(URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df"))
+            .href(itemHref)
             .link(Link.builder()
                   .rel("up")
                   .type("application/vnd.vmware.vcloud.catalog+xml")
-                  .href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4"))
+                  .href(catalogHref)
                   .build())
             .link(Link.builder()
                   .rel("down")
                   .type("application/vnd.vmware.vcloud.metadata+xml")
-                  .href(URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df/metadata"))
+                  .href(URI.create(endpoint + "/catalogItem/" + item + "/metadata"))
                   .build())
             .link(Link.builder()
                   .rel("edit")
                   .type("application/vnd.vmware.vcloud.catalogItem+xml")
-                  .href(URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df"))
+                  .href(itemHref)
                   .build())
             .link(Link.builder()
                   .rel("remove")
-                  .href(URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df"))
+                  .href(itemHref)
                   .build())
             .description("For testing")
             .entity(ubuntuVappTemplateReference())
@@ -513,30 +546,30 @@
             .name("task")
             .id("urn:vcloud:task:c6dca927-eab4-41fa-ad6a-3ac58602541c")
             .type("application/vnd.vmware.vcloud.task+xml")
-            .href(URI.create("https://vcloudbeta.bluelock.com/api/task/c6dca927-eab4-41fa-ad6a-3ac58602541c"))
+            .href(URI.create(endpoint + "/task/c6dca927-eab4-41fa-ad6a-3ac58602541c"))
             .status("running")
             .startTime(dateService.iso8601DateParse("2012-02-13T06:35:08.011-05:00"))
             .expiryTime(dateService.iso8601DateParse("2012-05-13T06:35:08.011-04:00"))
             .operationName("metadataUpdate")
-            .operation("Updating metadata for Catalog Item (a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df)")
+            .operation("Updating metadata for Catalog Item (" + item + ")")
             .link(Link.builder()
                   .rel("task:cancel")
-                  .href(URI.create("https://vcloudbeta.bluelock.com/api/task/c6dca927-eab4-41fa-ad6a-3ac58602541c/action/cancel"))
+                  .href(URI.create(endpoint + "/task/c6dca927-eab4-41fa-ad6a-3ac58602541c/action/cancel"))
                   .build())
             .owner(Reference.builder()
                   .type("application/vnd.vmware.vcloud.catalogItem+xml")
                   .name("")
-                  .href(URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df"))
+                  .href(itemHref)
                   .build())
             .user(Reference.builder()
                   .type("application/vnd.vmware.admin.user+xml")
                   .name("adk@cloudsoftcorp.com")
-                  .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/user/e9eb1b29-0404-4c5e-8ef7-e584acc51da9"))
+                  .href(URI.create(endpoint + "/admin/user/e9eb1b29-0404-4c5e-8ef7-e584acc51da9"))
                   .build())
             .org(Reference.builder()
                   .type("application/vnd.vmware.vcloud.org+xml")
                   .name("JClouds")
-                  .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
+                  .href(URI.create(endpoint + "/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
                   .build())
             .build();
    }
@@ -546,63 +579,63 @@
             .name("task")
             .id("urn:vcloud:task:c6dca927-eab4-41fa-ad6a-3ac58602541c")
             .type("application/vnd.vmware.vcloud.task+xml")
-            .href(URI.create("https://vcloudbeta.bluelock.com/api/task/c6dca927-eab4-41fa-ad6a-3ac58602541c"))
+            .href(URI.create(endpoint + "/task/c6dca927-eab4-41fa-ad6a-3ac58602541c"))
             .status("running")
             .startTime(dateService.iso8601DateParse("2012-02-13T06:35:08.011-05:00"))
             .expiryTime(dateService.iso8601DateParse("2012-05-13T06:35:08.011-04:00"))
             .operationName("metadataSet")
-            .operation("Setting metadata for Catalog Item (a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df)")
+            .operation("Setting metadata for Catalog Item (" + item + ")")
             .link(Link.builder()
                   .rel("task:cancel")
-                  .href(URI.create("https://vcloudbeta.bluelock.com/api/task/c6dca927-eab4-41fa-ad6a-3ac58602541c/action/cancel"))
+                  .href(URI.create(endpoint + "/task/c6dca927-eab4-41fa-ad6a-3ac58602541c/action/cancel"))
                   .build())
             .owner(Reference.builder()
                   .type("application/vnd.vmware.vcloud.catalogItem+xml")
                   .name("")
-                  .href(URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df"))
+                  .href(itemHref)
                   .build())
             .user(Reference.builder()
                   .type("application/vnd.vmware.admin.user+xml")
                   .name("adk@cloudsoftcorp.com")
-                  .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/user/e9eb1b29-0404-4c5e-8ef7-e584acc51da9"))
+                  .href(URI.create(endpoint + "/admin/user/e9eb1b29-0404-4c5e-8ef7-e584acc51da9"))
                   .build())
             .org(Reference.builder()
                   .type("application/vnd.vmware.vcloud.org+xml")
                   .name("JClouds")
-                  .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
+                  .href(URI.create(endpoint + "/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
                   .build())
             .build();
    }
 
-   public static Task deleteMetadataEntryTask() {
+   public static Task removeEntryTask() {
       return Task.builder()
             .name("task")
             .id("urn:vcloud:task:c6dca927-eab4-41fa-ad6a-3ac58602541c")
             .type("application/vnd.vmware.vcloud.task+xml")
-            .href(URI.create("https://vcloudbeta.bluelock.com/api/task/c6dca927-eab4-41fa-ad6a-3ac58602541c"))
+            .href(URI.create(endpoint + "/task/c6dca927-eab4-41fa-ad6a-3ac58602541c"))
             .status("running")
             .startTime(dateService.iso8601DateParse("2012-02-13T06:35:08.011-05:00"))
             .expiryTime(dateService.iso8601DateParse("2012-05-13T06:35:08.011-04:00"))
             .operationName("metadataDelete")
-            .operation("Deleting metadata for Catalog Item (a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df)")
+            .operation("Deleting metadata for Catalog Item (" + item + ")")
             .link(Link.builder()
                   .rel("task:cancel")
-                  .href(URI.create("https://vcloudbeta.bluelock.com/api/task/c6dca927-eab4-41fa-ad6a-3ac58602541c/action/cancel"))
+                  .href(URI.create(endpoint + "/task/c6dca927-eab4-41fa-ad6a-3ac58602541c/action/cancel"))
                   .build())
             .owner(Reference.builder()
                   .type("application/vnd.vmware.vcloud.catalogItem+xml")
                   .name("")
-                  .href(URI.create("https://vcloudbeta.bluelock.com/api/catalogItem/a36fdac9-b8c2-43e2-9a4c-2ffaf3ee13df"))
+                  .href(itemHref)
                   .build())
             .user(Reference.builder()
                   .type("application/vnd.vmware.admin.user+xml")
                   .name("adk@cloudsoftcorp.com")
-                  .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/user/e9eb1b29-0404-4c5e-8ef7-e584acc51da9"))
+                  .href(URI.create(endpoint + "/admin/user/e9eb1b29-0404-4c5e-8ef7-e584acc51da9"))
                   .build())
             .org(Reference.builder()
                   .type("application/vnd.vmware.vcloud.org+xml")
                   .name("JClouds")
-                  .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
+                  .href(URI.create(endpoint + "/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
                   .build())
             .build();
    }
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/CatalogApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/CatalogApiLiveTest.java
index cae8017..50075aa 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/CatalogApiLiveTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/CatalogApiLiveTest.java
@@ -1,5 +1,5 @@
 /*
- * Licensed to jclouds, Inc. (jclouds) under one or more
+x * Licensed to jclouds, Inc. (jclouds) under one or more
  * contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
  * regarding copyright ownership.  jclouds licenses this file
@@ -21,8 +21,6 @@
 import static com.google.common.base.Predicates.and;
 import static com.google.common.collect.Iterables.find;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.CORRECT_VALUE_OBJECT_FMT;
-import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_REQ_LIVE;
-import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.REF_REQ_LIVE;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.TASK_COMPLETE_TIMELY;
 import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkCatalogItem;
 import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadata;
@@ -48,6 +46,7 @@
 import org.jclouds.vcloud.director.v1_5.domain.Reference;
 import org.jclouds.vcloud.director.v1_5.domain.Task;
 import org.jclouds.vcloud.director.v1_5.domain.Vdc;
+import org.jclouds.vcloud.director.v1_5.domain.org.Org;
 import org.jclouds.vcloud.director.v1_5.features.admin.AdminCatalogApi;
 import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorApiLiveTest;
 import org.testng.annotations.AfterClass;
@@ -76,57 +75,54 @@
    private Media media;
    private CatalogItem catalogItem;
 
-   private Reference catalogRef;
-
    @Override
    protected void setupRequiredApis() {
       // TODO why do I need a guard clause here?
-      if (adminCatalog != null) return;
+      if (adminCatalog != null)
+         return;
       catalogApi = context.getApi().getCatalogApi();
-      Reference orgRef = Iterables.getFirst(context.getApi().getOrgApi().getOrgList().getOrgs(), null).toAdminReference(endpoint);
-      
+      Org org = context.getApi().getOrgApi().get(Iterables.get(context.getApi().getOrgApi().list(), 0).getHref());
+
       if (adminContext != null) {
-         AdminCatalog newCatalog = AdminCatalog.builder()
-               .name(name("Test Catalog "))
-               .description("created by CatalogApiLiveTest")
-               .build();
-         
+         AdminCatalog newCatalog = AdminCatalog.builder().name(name("Test Catalog "))
+                  .description("created by CatalogApiLiveTest").build();
+
          AdminCatalogApi adminCatalogApi = adminContext.getApi().getCatalogApi();
-         adminCatalog = adminCatalogApi.createCatalog(orgRef.getHref(), newCatalog);
-         catalogRef = find(adminCatalog.getLinks(), and(relEquals("alternate"), typeEquals(VCloudDirectorMediaType.CATALOG)));
-   
-         Metadata newMetadata = Metadata.builder()
-               .entry(MetadataEntry.builder().entry("KEY", "MARMALADE").build())
-               .build();
-   
-         Task mergeCatalogMetadata = adminCatalogApi.getMetadataApi().mergeMetadata(adminCatalog.getHref(), newMetadata);
+         adminCatalog = adminCatalogApi.addCatalogToOrg(newCatalog, org.getId());
+         catalogUrn = catalogApi.get(
+                  find(adminCatalog.getLinks(),
+                           and(relEquals("alternate"), typeEquals(VCloudDirectorMediaType.CATALOG))).getHref()).getId();
+
+         Metadata newMetadata = Metadata.builder().entry(MetadataEntry.builder().entry("KEY", "MARMALADE").build())
+                  .build();
+
+         Task mergeCatalogMetadata = adminCatalogApi.getMetadataApi(adminCatalog.getId()).merge(newMetadata);
          checkTask(mergeCatalogMetadata);
-         assertTrue(retryTaskSuccess.apply(mergeCatalogMetadata), String.format(TASK_COMPLETE_TIMELY, "setupRequiredApis"));
-      } else {
-         catalogRef = Reference.builder().href(catalogURI).build();
+         assertTrue(retryTaskSuccess.apply(mergeCatalogMetadata),
+                  String.format(TASK_COMPLETE_TIMELY, "setupRequiredApis"));
       }
    }
-   
+
    @AfterClass(alwaysRun = true)
    public void tearDown() {
       if (catalogItem != null) {
          try {
-	         catalogApi.deleteCatalogItem(catalogItem.getHref());
+            catalogApi.removeItem(catalogItem.getId());
          } catch (Exception e) {
             logger.warn(e, "Error when deleting catalog item '%s'", catalogItem.getName());
          }
       }
       if (media != null) {
          try {
-	         Task delete = context.getApi().getMediaApi().deleteMedia(media.getHref());
-	         taskDoneEventually(delete);
+            Task remove = context.getApi().getMediaApi().remove(media.getId());
+            taskDoneEventually(remove);
          } catch (Exception e) {
             logger.warn(e, "Error when deleting media '%s'", media.getName());
          }
       }
       if (adminContext != null && adminCatalog != null) {
          try {
-	         adminContext.getApi().getCatalogApi().deleteCatalog(adminCatalog.getHref());
+            adminContext.getApi().getCatalogApi().remove(adminCatalog.getId());
          } catch (Exception e) {
             logger.warn(e, "Error when deleting catalog '%s'", adminCatalog.getName());
          }
@@ -136,125 +132,116 @@
 
    @Test(description = "GET /catalog/{id}")
    public void testGetCatalog() {
-      Catalog catalog = catalogApi.getCatalog(catalogRef.getHref());
+      Catalog catalog = lazyGetCatalog();
       assertNotNull(catalog);
       // Double check it's pointing at the correct catalog
-      assertEquals(catalog.getHref(), catalogRef.getHref());
+      assertEquals(catalog.getId(), catalogUrn);
    }
 
    @Test(description = "GET /catalogItem/{id}", dependsOnMethods = "testAddCatalogItem")
    public void testGetCatalogItem() {
-      CatalogItem catalogItem = catalogApi.getCatalogItem(this.catalogItem.getHref());
+      CatalogItem catalogItem = catalogApi.getItem(this.catalogItem.getId());
       checkCatalogItem(catalogItem);
       assertEquals(catalogItem.getEntity().getHref(), this.catalogItem.getEntity().getHref());
    }
 
    @Test(description = "POST /catalog/{id}/catalogItems")
    public void testAddCatalogItem() {
-      assertNotNull(vdcURI, String.format(REF_REQ_LIVE, VDC));
-      
       byte[] iso = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
-      Vdc vdc = context.getApi().getVdcApi().getVdc(vdcURI);
-      assertNotNull(vdc, String.format(OBJ_REQ_LIVE, VDC));
+      Vdc vdc = lazyGetVdc();
       Link addMedia = find(vdc.getLinks(), and(relEquals("add"), typeEquals(VCloudDirectorMediaType.MEDIA)));
-     
-      Media sourceMedia = Media.builder()
-            .type(VCloudDirectorMediaType.MEDIA)
-            .name("Test media 1")
-            .size(iso.length)
-            .imageType(Media.ImageType.ISO)
-            .description("Test media generated by testCreateMedia()")
-            .build();
-      media = context.getApi().getMediaApi().createMedia(addMedia.getHref(), sourceMedia);
+
+      Media sourceMedia = Media.builder().type(VCloudDirectorMediaType.MEDIA).name("Test media 1").size(iso.length)
+               .imageType(Media.ImageType.ISO).description("Test media generated by testAddMedia()").build();
+      media = context.getApi().getMediaApi().add(addMedia.getHref(), sourceMedia);
 
       Checks.checkMediaFor(VCloudDirectorMediaType.MEDIA, media);
 
-      CatalogItem editedCatalogItem = CatalogItem.builder()
-            .name("newitem")
-            .description("New Item")
-            .type(VCloudDirectorMediaType.CATALOG_ITEM)
-            .entity(Reference.builder().href(media.getHref()).build())
-            .build();
-      catalogItem = catalogApi.addCatalogItem(catalogRef.getHref(), editedCatalogItem);
+      CatalogItem editedCatalogItem = CatalogItem.builder().name("newitem").description("New Item")
+               .type(VCloudDirectorMediaType.CATALOG_ITEM).entity(Reference.builder().href(media.getHref()).build())
+               .build();
+      catalogItem = catalogApi.addItem(catalogUrn, editedCatalogItem);
       checkCatalogItem(catalogItem);
       assertEquals(catalogItem.getName(), "newitem");
       assertEquals(catalogItem.getDescription(), "New Item");
    }
 
    @Test(description = "PUT /catalogItem/{id}", dependsOnMethods = "testAddCatalogItem")
-   public void testUpdateCatalogItem() {     
-      CatalogItem updatedCatalogItem = CatalogItem.builder().fromCatalogItem(catalogItem).name("UPDATEDNAME").build();
-      catalogItem = catalogApi.updateCatalogItem(catalogItem.getHref(), updatedCatalogItem);
+   public void testEditCatalogItem() {
+      CatalogItem editedCatalogItem = CatalogItem.builder().fromCatalogItem(catalogItem).name("UPDATEDNAME").build();
+      catalogItem = catalogApi.editItem(catalogItem.getId(), editedCatalogItem);
       checkCatalogItem(catalogItem);
       assertEquals(catalogItem.getName(), "UPDATEDNAME");
    }
 
    // Note this runs after all the metadata tests
-   @Test(description = "DELETE /catalogItem/{id}", dependsOnMethods = "testDeleteCatalogItemMetadataValue")
-   public void testDeleteCatalogItem() {
-      catalogApi.deleteCatalogItem(catalogItem.getHref());
-      catalogItem = catalogApi.getCatalogItem(catalogItem.getHref());
+   @Test(description = "DELETE /catalogItem/{id}", dependsOnMethods = "testRemoveCatalogItemMetadataValue")
+   public void testRemoveCatalogItem() {
+      catalogApi.removeItem(catalogItem.getId());
+      catalogItem = catalogApi.getItem(catalogItem.getId());
       assertNull(catalogItem);
    }
 
    @Test(description = "GET /catalog/{id}/metadata")
    public void testGetCatalogMetadata() {
-      Metadata catalogMetadata = catalogApi.getMetadataApi().getMetadata(catalogRef.getHref());
+      Metadata catalogMetadata = catalogApi.getMetadataApi(catalogUrn).get();
       checkMetadata(catalogMetadata);
    }
 
    @Test(description = "GET /catalog/{id}/metadata/{key}")
    public void testGetCatalogMetadataValue() {
-      Metadata catalogMetadata = catalogApi.getMetadataApi().getMetadata(catalogRef.getHref());
-      MetadataEntry existingMetadataEntry = Iterables.find(catalogMetadata.getMetadataEntries(), new Predicate<MetadataEntry>() {
-         @Override
-         public boolean apply(MetadataEntry input) {
-            return input.getKey().equals("KEY");
-         }
-      });
-      MetadataValue metadataValue = catalogApi.getMetadataApi().getMetadataValue(catalogRef.getHref(), "KEY");
-      assertEquals(metadataValue.getValue(), existingMetadataEntry.getValue(),
-            String.format(CORRECT_VALUE_OBJECT_FMT, "Value", "MetadataValue", existingMetadataEntry.getValue(), metadataValue.getValue()));
+      Metadata catalogMetadata = catalogApi.getMetadataApi(catalogUrn).get();
+      MetadataEntry existingMetadataEntry = Iterables.find(catalogMetadata.getMetadataEntries(),
+               new Predicate<MetadataEntry>() {
+                  @Override
+                  public boolean apply(MetadataEntry input) {
+                     return input.getKey().equals("KEY");
+                  }
+               });
+      MetadataValue metadataValue = catalogApi.getMetadataApi(catalogApi.get(existingMetadataEntry.getHref()).getId())
+               .getValue("KEY");
+      assertEquals(metadataValue.getValue(), existingMetadataEntry.getValue(), String.format(CORRECT_VALUE_OBJECT_FMT,
+               "Value", "MetadataValue", existingMetadataEntry.getValue(), metadataValue.getValue()));
       checkMetadataValue(metadataValue);
    }
 
    @Test(description = "GET /catalogItem/{id}/metadata", dependsOnMethods = "testAddCatalogItem")
    public void testGetCatalogItemMetadata() {
-      Metadata catalogItemMetadata = catalogApi.getCatalogItemMetadataApi().getMetadata(catalogItem.getHref());
+      Metadata catalogItemMetadata = catalogApi.getItemMetadataApi(catalogItem.getId()).get();
       checkMetadata(catalogItemMetadata);
    }
 
    @Test(description = "POST /catalogItem/{id}/metadata", dependsOnMethods = "testAddCatalogItem")
    public void testMergeCatalogItemMetadata() {
-      Metadata newMetadata = Metadata.builder()
-            .entry(MetadataEntry.builder().entry("KEY", "MARMALADE").build())
-            .entry(MetadataEntry.builder().entry("VEGIMITE", "VALUE").build())
-            .build();
+      Metadata newMetadata = Metadata.builder().entry(MetadataEntry.builder().entry("KEY", "MARMALADE").build())
+               .entry(MetadataEntry.builder().entry("VEGIMITE", "VALUE").build()).build();
 
-      Metadata before = catalogApi.getCatalogItemMetadataApi().getMetadata(catalogItem.getHref());
-   
-      Task mergeCatalogItemMetadata = catalogApi.getCatalogItemMetadataApi().mergeMetadata(catalogItem.getHref(), newMetadata);
+      Metadata before = catalogApi.getItemMetadataApi(catalogItem.getId()).get();
+
+      Task mergeCatalogItemMetadata = catalogApi.getItemMetadataApi(catalogItem.getId()).merge(newMetadata);
       checkTask(mergeCatalogItemMetadata);
       assertTrue(retryTaskSuccess.apply(mergeCatalogItemMetadata),
-            String.format(TASK_COMPLETE_TIMELY, "mergeCatalogItemMetadata"));
-      Metadata mergedCatalogItemMetadata = catalogApi.getCatalogItemMetadataApi().getMetadata(catalogItem.getHref());
+               String.format(TASK_COMPLETE_TIMELY, "mergeCatalogItemMetadata"));
+      Metadata mergedCatalogItemMetadata = catalogApi.getItemMetadataApi(catalogItem.getId()).get();
 
       assertTrue(mergedCatalogItemMetadata.getMetadataEntries().size() > before.getMetadataEntries().size(),
-            "Should have added at least one other MetadataEntry to the CatalogItem");
-      
-      MetadataValue keyMetadataValue = catalogApi.getCatalogItemMetadataApi().getMetadataValue(catalogItem.getHref(), "KEY");
-      assertEquals(keyMetadataValue.getValue(), "MARMALADE", "The Value of the MetadataValue for KEY should have changed");
-      checkMetadataValue(keyMetadataValue);
-      
-      MetadataValue newKeyMetadataValue = catalogApi.getCatalogItemMetadataApi().getMetadataValue(catalogItem.getHref(), "VEGIMITE");
+               "Should have added at least one other MetadataEntry to the CatalogItem");
 
-      assertEquals(newKeyMetadataValue.getValue(), "VALUE", "The Value of the MetadataValue for NEW_KEY should have been set");
+      MetadataValue keyMetadataValue = catalogApi.getItemMetadataApi(catalogItem.getId()).getValue("KEY");
+      assertEquals(keyMetadataValue.getValue(), "MARMALADE",
+               "The Value of the MetadataValue for KEY should have changed");
+      checkMetadataValue(keyMetadataValue);
+
+      MetadataValue newKeyMetadataValue = catalogApi.getItemMetadataApi(catalogItem.getId()).getValue("VEGIMITE");
+
+      assertEquals(newKeyMetadataValue.getValue(), "VALUE",
+               "The Value of the MetadataValue for NEW_KEY should have been set");
       checkMetadataValue(newKeyMetadataValue);
    }
 
    @Test(description = "GET /catalogItem/{id}/metadata/{key}", dependsOnMethods = "testSetCatalogItemMetadataValue")
-   public void testGetCatalogItemMetadataValue() {      
-      MetadataValue metadataValue = catalogApi.getCatalogItemMetadataApi().getMetadataValue(catalogItem.getHref(), "KEY");
+   public void testGetCatalogItemMetadataValue() {
+      MetadataValue metadataValue = catalogApi.getItemMetadataApi(catalogItem.getId()).getValue("KEY");
       checkMetadataValue(metadataValue);
    }
 
@@ -262,24 +249,25 @@
    public void testSetCatalogItemMetadataValue() {
       MetadataValue newMetadataValue = MetadataValue.builder().value("NEW").build();
 
-      Task setCatalogItemMetadataValue = catalogApi.getCatalogItemMetadataApi().setMetadata(catalogItem.getHref(), "KEY", newMetadataValue);
+      Task setCatalogItemMetadataValue = catalogApi.getItemMetadataApi(catalogItem.getId()).putEntry("KEY",
+               newMetadataValue);
       checkTask(setCatalogItemMetadataValue);
-      assertTrue(retryTaskSuccess.apply(setCatalogItemMetadataValue), 
-            String.format(TASK_COMPLETE_TIMELY, "setCatalogItemMetadataValue"));
-      
-      MetadataValue updatedMetadataValue = catalogApi.getCatalogItemMetadataApi().getMetadataValue(catalogItem.getHref(), "KEY");
-      assertEquals(updatedMetadataValue.getValue(), newMetadataValue.getValue(),
-               String.format(CORRECT_VALUE_OBJECT_FMT, "Value", "MetadataValue", newMetadataValue.getValue(), updatedMetadataValue.getValue()));
-      checkMetadataValue(updatedMetadataValue);
+      assertTrue(retryTaskSuccess.apply(setCatalogItemMetadataValue),
+               String.format(TASK_COMPLETE_TIMELY, "setCatalogItemMetadataValue"));
+
+      MetadataValue editedMetadataValue = catalogApi.getItemMetadataApi(catalogItem.getId()).getValue("KEY");
+      assertEquals(editedMetadataValue.getValue(), newMetadataValue.getValue(), String.format(CORRECT_VALUE_OBJECT_FMT,
+               "Value", "MetadataValue", newMetadataValue.getValue(), editedMetadataValue.getValue()));
+      checkMetadataValue(editedMetadataValue);
    }
 
    @Test(description = "DELETE /catalogItem/{id}/metadata/{key}", dependsOnMethods = "testGetCatalogItemMetadataValue")
-   public void testDeleteCatalogItemMetadataValue() {
-      Task deleteCatalogItemMetadataValue = catalogApi.getCatalogItemMetadataApi().deleteMetadataEntry(catalogItem.getHref(), "KEY");
-      checkTask(deleteCatalogItemMetadataValue);
-      assertTrue(retryTaskSuccess.apply(deleteCatalogItemMetadataValue), 
-            String.format(TASK_COMPLETE_TIMELY, "deleteCatalogItemMetadataValue"));
-      MetadataValue deleted = catalogApi.getMetadataApi().getMetadataValue(catalogItem.getHref(), "KEY");
-      assertNull(deleted);
+   public void testRemoveCatalogItemMetadataValue() {
+      Task removeCatalogItemMetadataValue = catalogApi.getItemMetadataApi(catalogItem.getId()).removeEntry("KEY");
+      checkTask(removeCatalogItemMetadataValue);
+      assertTrue(retryTaskSuccess.apply(removeCatalogItemMetadataValue),
+               String.format(TASK_COMPLETE_TIMELY, "removeCatalogItemMetadataValue"));
+      MetadataValue removed = catalogApi.getItemMetadataApi(catalogItem.getId()).getValue("KEY");
+      assertNull(removed);
    }
 }
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/MediaApiExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/MediaApiExpectTest.java
index 7938bbe..3fbe284 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/MediaApiExpectTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/MediaApiExpectTest.java
@@ -53,17 +53,17 @@
 public class MediaApiExpectTest extends VCloudDirectorAdminApiExpectTest {
    
    @Test
-   public void testCreateMedia() {
+   public void testAddMedia() {
       URI uploadLink = URI.create(endpoint + "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/media");
 
       VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
             new VcloudHttpRequestPrimer()
                .apiCommand("POST", "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/media")
                .acceptMedia(VCloudDirectorMediaType.MEDIA)
-               .xmlFilePayload("/media/createMediaSource.xml", VCloudDirectorMediaType.MEDIA)
+               .xmlFilePayload("/media/addMediaSource.xml", VCloudDirectorMediaType.MEDIA)
                .httpRequestBuilder().build(), 
             new VcloudHttpResponsePrimer()
-               .xmlFilePayload("/media/createMedia.xml", VCloudDirectorMediaType.MEDIA)
+               .xmlFilePayload("/media/addMedia.xml", VCloudDirectorMediaType.MEDIA)
                .httpResponseBuilder().statusCode(201).build());
       
       Media source = Media.builder()
@@ -73,9 +73,9 @@
          .type("application/vnd.vmware.vcloud.media+xml")
          .description("Test media generated by testCreateMedia()")
          .build();
-      Media expected = createMedia();
+      Media expected = addMedia();
       
-      assertEquals(api.getMediaApi().createMedia(uploadLink, source), expected);
+      assertEquals(api.getMediaApi().add(uploadLink, source), expected);
    }
    
    @Test
@@ -98,14 +98,13 @@
          .source(Reference.builder()
                .type("application/vnd.vmware.vcloud.media+xml")
                .name("copied test media")
-               .id("urn:vcloud:media:da8361af-cccd-4103-a71c-493513c49094")
                .href(URI.create("https://mycloud.greenhousedata.com/api/media/da8361af-cccd-4103-a71c-493513c49094"))
                .build())
          .isSourceDelete(false)
          .build();
       Media expected = cloneMedia();
       
-      assertEquals(api.getMediaApi().cloneMedia(vdcURI, params), expected);
+      assertEquals(api.getMediaApi().clone(vdcURI, params), expected);
    }
    
    @Test
@@ -122,7 +121,7 @@
                .httpResponseBuilder().build());
       
       Media expected = getMedia();
-      assertEquals(api.getMediaApi().getMedia(mediaUri), expected);
+      assertEquals(api.getMediaApi().get(mediaUri), expected);
    }
    
    @Test
@@ -145,12 +144,12 @@
             .build();
        
       try {
-         api.getMediaApi().getMedia(mediaUri);
+         api.getMediaApi().get(mediaUri);
          fail("Should give HTTP 400 error");
       } catch (VCloudDirectorException vde) {
          assertEquals(vde.getError(), expected);
       } catch (Exception e) {
-         fail("Should have thrown a VCloudDirectorException");
+         fail("Should have thrown a VCloudDirectorException", e);
       }
    }
  
@@ -167,7 +166,7 @@
                .xmlFilePayload("/media/error403-catalog.xml", VCloudDirectorMediaType.ERROR)
                .httpResponseBuilder().statusCode(403).build());
  
-      assertNull(api.getMediaApi().getMedia(mediaUri));
+      assertNull(api.getMediaApi().get(mediaUri));
    }
  
    @Test
@@ -183,31 +182,31 @@
                .xmlFilePayload("/media/error403-fake.xml", VCloudDirectorMediaType.ERROR)
                .httpResponseBuilder().statusCode(403).build());
  
-      assertNull(api.getMediaApi().getMedia(mediaUri));
+      assertNull(api.getMediaApi().get(mediaUri));
    }
    
    @Test
-   public void testUpdateMedia() {
+   public void testEditMedia() {
       URI mediaUri = URI.create(endpoint + "/media/794eb334-754e-4917-b5a0-5df85cbd61d1");
 
       VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse,
             new VcloudHttpRequestPrimer()
                .apiCommand("PUT", "/media/794eb334-754e-4917-b5a0-5df85cbd61d1")
-               .xmlFilePayload("/media/updateMedia.xml", VCloudDirectorMediaType.MEDIA)
+               .xmlFilePayload("/media/editMedia.xml", VCloudDirectorMediaType.MEDIA)
                .acceptMedia(VCloudDirectorMediaType.TASK)
                .httpRequestBuilder().build(), 
             new VcloudHttpResponsePrimer()
-               .xmlFilePayload("/media/updateMediaTask.xml", VCloudDirectorMediaType.TASK)
+               .xmlFilePayload("/media/editMediaTask.xml", VCloudDirectorMediaType.TASK)
                .httpResponseBuilder().build());
       
-      Media update = updateMedia();
-      Task expected = updateMediaTask();
+      Media edit = editMedia();
+      Task expected = editMediaTask();
       
-      assertEquals(api.getMediaApi().updateMedia(mediaUri, update), expected);
+      assertEquals(api.getMediaApi().edit(mediaUri, edit), expected);
    }
    
    @Test
-   public void testDeleteMedia() {
+   public void testRemoveMedia() {
       URI mediaUri = URI.create(endpoint + "/media/794eb334-754e-4917-b5a0-5df85cbd61d1");
 
       VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
@@ -216,12 +215,12 @@
                .acceptMedia(VCloudDirectorMediaType.TASK)
                .httpRequestBuilder().build(), 
             new VcloudHttpResponsePrimer()
-               .xmlFilePayload("/media/deleteMediaTask.xml", VCloudDirectorMediaType.TASK)
+               .xmlFilePayload("/media/removeMediaTask.xml", VCloudDirectorMediaType.TASK)
                .httpResponseBuilder().build());
       
-      Task expected = deleteMediaTask();
+      Task expected = removeMediaTask();
 
-      assertEquals(api.getMediaApi().deleteMedia(mediaUri), expected);
+      assertEquals(api.getMediaApi().remove(mediaUri), expected);
    }
    
    @Test
@@ -240,7 +239,7 @@
       
       Metadata expected = metadata();
 
-      assertEquals(api.getMediaApi().getMetadataApi().getMetadata(mediaUri), expected);
+      assertEquals(api.getMediaApi().getMetadataApi(mediaUri).get(), expected);
    }
    
    @Test
@@ -260,7 +259,7 @@
       Metadata inputMetadata = metadata();
       Task expectedTask = mergeMetadataTask();
 
-      assertEquals(api.getMediaApi().getMetadataApi().mergeMetadata(mediaUri, inputMetadata), expectedTask);
+      assertEquals(api.getMediaApi().getMetadataApi(mediaUri).merge(inputMetadata), expectedTask);
    }
    
    public void testGetMetadataValue() {
@@ -278,7 +277,7 @@
       MetadataValue expected = metadataValue();
       
 
-      assertEquals(api.getMediaApi().getMetadataApi().getMetadataValue(mediaUri, "key"), expected);
+      assertEquals(api.getMediaApi().getMetadataApi(mediaUri).getValue("key"), expected);
    }
    
    @Test
@@ -299,11 +298,11 @@
       
       Task expectedTask = setMetadataEntryTask();
 
-      assertEquals(api.getMediaApi().getMetadataApi().setMetadata(mediaUri, "key", inputMetadataValue), expectedTask);
+      assertEquals(api.getMediaApi().getMetadataApi(mediaUri).putEntry("key", inputMetadataValue), expectedTask);
    }
    
    @Test
-   public void testDeleteMetadataValue() {
+   public void testRemoveMetadataValue() {
       URI mediaUri = URI.create("https://vcloudbeta.bluelock.com/api/media/794eb334-754e-4917-b5a0-5df85cbd61d1");
       
       VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
@@ -312,12 +311,12 @@
                .acceptMedia(VCloudDirectorMediaType.TASK)
                .httpRequestBuilder().build(),
             new VcloudHttpResponsePrimer()
-               .xmlFilePayload("/media/deleteMetadataEntryTask.xml", VCloudDirectorMediaType.TASK)
+               .xmlFilePayload("/media/removeMetadataEntryTask.xml", VCloudDirectorMediaType.TASK)
                .httpResponseBuilder().build());
       
-      Task expectedTask = deleteMetadataEntryTask();
+      Task expectedTask = removeEntryTask();
 
-      assertEquals(api.getMediaApi().getMetadataApi().deleteMetadataEntry(mediaUri, "key"), expectedTask);
+      assertEquals(api.getMediaApi().getMetadataApi(mediaUri).removeEntry("key"), expectedTask);
    }
    
    @Test
@@ -344,7 +343,7 @@
       assertEquals(api.getMediaApi().getOwner(mediaUri), expected);
    }
    
-   static Media createMedia() {
+   static Media addMedia() {
       return Media.builder()
          .size(0)
          .imageType(ImageType.ISO)
@@ -352,6 +351,7 @@
          .name("Test media 1")
          .id("urn:vcloud:media:d51b0b9d-099c-499f-97f8-4fbe40ba06d7")
          .type("application/vnd.vmware.vcloud.media+xml")
+         .description("Test media generated by testCreateMedia()")
          .href(URI.create("https://mycloud.greenhousedata.com/api/media/d51b0b9d-099c-499f-97f8-4fbe40ba06d7"))
          .link(Link.builder()
             .rel("up")
@@ -362,7 +362,6 @@
             .rel("remove")
             .href(URI.create("https://mycloud.greenhousedata.com/api/media/d51b0b9d-099c-499f-97f8-4fbe40ba06d7"))
             .build())
-         .description("Test media generated by testCreateMedia()")
          .files(ImmutableSet.of(File.builder()
                .size(0l)
                .bytesTransferred(0l)
@@ -474,7 +473,7 @@
          .build();
    }
    
-   private static Media updateMedia() {
+   private static Media editMedia() {
       return Media.builder()
          .size(175163392)
          .imageType(ImageType.ISO)
@@ -524,7 +523,7 @@
          .build();
    }
    
-   private static Task updateMediaTask() {
+   private static Task editMediaTask() {
       return Task.builder()
             .name("task")
             .id("urn:vcloud:task:c6dca927-eab4-41fa-ad6a-3ac58602541c")
@@ -557,7 +556,7 @@
             .build();
    }
    
-   public static Task deleteMediaTask() {
+   public static Task removeMediaTask() {
       return Task.builder()
          .name("task")
          .id("urn:vcloud:task:c6dca927-eab4-41fa-ad6a-3ac58602541c")
@@ -723,7 +722,7 @@
          .build();
    }
    
-   public static Task deleteMetadataEntryTask() {
+   public static Task removeEntryTask() {
       return Task.builder()
          .name("task")
          .id("urn:vcloud:task:c6dca927-eab4-41fa-ad6a-3ac58602541c")
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/MediaApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/MediaApiLiveTest.java
index 7bc33c6..66d611d 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/MediaApiLiveTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/MediaApiLiveTest.java
@@ -35,7 +35,6 @@
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_REQ_LIVE;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_UPDATABLE;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_REQ_LIVE;
-import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.REF_REQ_LIVE;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.TASK_COMPLETE_TIMELY;
 import static org.jclouds.vcloud.director.v1_5.predicates.LinkPredicates.relEquals;
 import static org.jclouds.vcloud.director.v1_5.predicates.LinkPredicates.typeEquals;
@@ -89,7 +88,7 @@
     */
    protected VdcApi vdcApi;
    protected MediaApi mediaApi;
-   
+
    /*
     * Shared state between dependent tests.
     */
@@ -105,296 +104,282 @@
       vdcApi = context.getApi().getVdcApi();
       mediaApi = context.getApi().getMediaApi();
    }
-   
+
    @AfterClass(alwaysRun = true)
    protected void tidyUp() {
       if (media != null) {
          try {
-	         Task delete = mediaApi.deleteMedia(media.getHref());
-	         taskDoneEventually(delete);
+            Task remove = mediaApi.remove(media.getId());
+            taskDoneEventually(remove);
          } catch (Exception e) {
             logger.warn(e, "Error when deleting media '%s': %s", media.getName());
          }
       }
       if (oldMedia != null) {
          try {
-	         Task delete = mediaApi.deleteMedia(oldMedia.getHref());
-	         taskDoneEventually(delete);
+            Task remove = mediaApi.remove(oldMedia.getId());
+            taskDoneEventually(remove);
          } catch (Exception e) {
             logger.warn(e, "Error when deleting media '%s': %s", oldMedia.getName());
          }
       }
    }
-   
+
    @Test(description = "POST /vdc/{id}/media")
-   public void testCreateMedia() throws URISyntaxException {
-      assertNotNull(vdcURI, String.format(REF_REQ_LIVE, VDC));
-      Vdc vdc = vdcApi.getVdc(vdcURI); 
-      assertNotNull(vdc, String.format(OBJ_REQ_LIVE, VDC));
+   public void testAddMedia() throws URISyntaxException {
+      Vdc vdc = lazyGetVdc();
       Link addMedia = find(vdc.getLinks(), and(relEquals("add"), typeEquals(VCloudDirectorMediaType.MEDIA)));
-      
+
       // TODO: generate an iso
       byte[] iso = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
-      
-      Media sourceMedia = Media.builder()
-            .type(VCloudDirectorMediaType.MEDIA)
-            .name("Test media "+random.nextInt())
-            .size(iso.length)
-            .imageType(Media.ImageType.ISO)
-            .description("Test media generated by testCreateMedia()")
-            .build();
-      media = mediaApi.createMedia(addMedia.getHref(), sourceMedia);
-      
+
+      Media sourceMedia = Media.builder().type(VCloudDirectorMediaType.MEDIA).name("Test media " + random.nextInt())
+               .size(iso.length).imageType(Media.ImageType.ISO).description("Test media generated by testAddMedia()")
+               .build();
+      media = mediaApi.add(addMedia.getHref(), sourceMedia);
+
       Checks.checkMediaFor(MEDIA, media);
-      
+
       assertNotNull(media.getFiles(), String.format(OBJ_FIELD_REQ, MEDIA, "files"));
-      assertTrue(media.getFiles().size() == 1, String.format(OBJ_FIELD_LIST_SIZE_EQ, MEDIA, "files", 1, media.getFiles().size()));
+      assertTrue(media.getFiles().size() == 1,
+               String.format(OBJ_FIELD_LIST_SIZE_EQ, MEDIA, "files", 1, media.getFiles().size()));
       File uploadFile = getFirst(media.getFiles(), null);
       assertNotNull(uploadFile, String.format(OBJ_FIELD_REQ, MEDIA, "files.first"));
       assertEquals(uploadFile.getSize(), Long.valueOf(iso.length));
       assertEquals(uploadFile.getSize().longValue(), sourceMedia.getSize(),
-            String.format(OBJ_FIELD_EQ, MEDIA, "uploadFile.size()", sourceMedia.getSize(), uploadFile.getSize()));
-      
+               String.format(OBJ_FIELD_EQ, MEDIA, "uploadFile.size()", sourceMedia.getSize(), uploadFile.getSize()));
+
       Set<Link> links = uploadFile.getLinks();
       assertNotNull(links, String.format(OBJ_FIELD_REQ, MEDIA, "uploadFile.links"));
       assertTrue(links.size() >= 1, String.format(OBJ_FIELD_LIST_SIZE_GE, MEDIA, "uploadfile.links", 1, links.size()));
-      assertTrue(Iterables.all(links, Predicates.or(LinkPredicates.relEquals(Link.Rel.UPLOAD_DEFAULT), LinkPredicates.relEquals(Link.Rel.UPLOAD_ALTERNATE))),
-            String.format(OBJ_FIELD_REQ, MEDIA, "uploadFile.links.first"));
+      assertTrue(
+               Iterables.all(
+                        links,
+                        Predicates.or(LinkPredicates.relEquals(Link.Rel.UPLOAD_DEFAULT),
+                                 LinkPredicates.relEquals(Link.Rel.UPLOAD_ALTERNATE))),
+               String.format(OBJ_FIELD_REQ, MEDIA, "uploadFile.links.first"));
 
       Link uploadLink = Iterables.find(links, LinkPredicates.relEquals(Link.Rel.UPLOAD_DEFAULT));
       context.getApi().getUploadApi().upload(uploadLink.getHref(), Payloads.newByteArrayPayload(iso));
-      
-      media = mediaApi.getMedia(media.getHref());
+
+      media = mediaApi.get(media.getId());
       if (media.getTasks().size() == 1) {
          Task uploadTask = Iterables.getOnlyElement(media.getTasks());
          Checks.checkTask(uploadTask);
          assertEquals(uploadTask.getStatus(), Task.Status.RUNNING);
          assertTrue(retryTaskSuccess.apply(uploadTask), String.format(TASK_COMPLETE_TIMELY, "uploadTask"));
-         media = mediaApi.getMedia(media.getHref());
+         media = mediaApi.get(media.getId());
       }
    }
-   
-   @Test(description = "GET /media/{id}", dependsOnMethods = { "testCreateMedia" })
+
+   @Test(description = "GET /media/{id}", dependsOnMethods = { "testAddMedia" })
    public void testGetMedia() {
-      media = mediaApi.getMedia(media.getHref());
+      media = mediaApi.get(media.getId());
       assertNotNull(media, String.format(OBJ_REQ_LIVE, MEDIA));
-      
+
       owner = media.getOwner();
       assertNotNull(owner, String.format(OBJ_FIELD_REQ_LIVE, MEDIA, "owner"));
       Checks.checkResourceType(media.getOwner());
-      
+
       Checks.checkMediaFor(MEDIA, media);
    }
-   
+
    @Test(description = "GET /media/{id}/owner", dependsOnMethods = { "testGetMedia" })
    public void testGetMediaOwner() {
-      Owner directOwner = mediaApi.getOwner(media.getHref());
-      assertEquals(owner.toBuilder()
-            .user(owner.getUser().toBuilder().id(null).build())
-            .build(),
-         directOwner.toBuilder().links(Collections.<Link>emptySet()).build(),
-         String.format(GETTER_RETURNS_SAME_OBJ,
-         "getOwner()", "owner", "media.getOwner()", owner.toString(), directOwner.toString()));
-      
+      Owner directOwner = mediaApi.getOwner(media.getId());
+      assertEquals(owner.toBuilder().user(owner.getUser()).build(),
+               directOwner.toBuilder().links(Collections.<Link> emptySet()).build(), String.format(
+                        GETTER_RETURNS_SAME_OBJ, "getOwner()", "owner", "media.getOwner()", owner.toString(),
+                        directOwner.toString()));
+
       // parent type
       Checks.checkResourceType(directOwner);
-      
+
       // required
       assertNotNull(directOwner.getUser(), String.format(OBJ_FIELD_REQ, "Owner", "user"));
       Checks.checkReferenceType(directOwner.getUser());
    }
-   
+
    @Test(description = "POST /vdc/{id}/action/cloneMedia", dependsOnMethods = { "testGetMediaOwner" })
    public void testCloneMedia() {
       oldMedia = media;
-      media = vdcApi.cloneMedia(vdcURI, CloneMediaParams.builder()
-            .source(Reference.builder().fromEntity(media).build())
-            .name("copied "+media.getName())
-            .description("copied by testCloneMedia()")
-            .build());
-      
+      media = vdcApi.cloneMedia(
+               vdcUrn,
+               CloneMediaParams.builder().source(Reference.builder().fromEntity(media).build())
+                        .name("copied " + media.getName()).description("copied by testCloneMedia()").build());
+
       Checks.checkMediaFor(VDC, media);
-      
+
       if (media.getTasks() != null) {
          Task copyTask = getFirst(media.getTasks(), null);
          if (copyTask != null) {
             Checks.checkTask(copyTask);
             assertTrue(retryTaskSuccess.apply(copyTask), String.format(TASK_COMPLETE_TIMELY, "copyTask"));
-            media = mediaApi.getMedia(media.getHref());
+            media = mediaApi.get(media.getId());
          }
       }
-      
+
       Checks.checkMediaFor(MEDIA, media);
-      assertTrue(media.clone(oldMedia), String.format(OBJ_FIELD_CLONE, MEDIA, "copied media", 
-            media.toString(), oldMedia.toString()));
-      
-      mediaApi.getMetadataApi().setMetadata(media.getHref(), "key", MetadataValue.builder().value("value").build());
-      
-      media = vdcApi.cloneMedia(vdcURI, CloneMediaParams.builder()
-            .source(Reference.builder().fromEntity(media).build())
-            .name("moved test media")
-            .description("moved by testCloneMedia()")
-            .isSourceDelete(true)
-            .build());
-      
+      assertTrue(media.clone(oldMedia),
+               String.format(OBJ_FIELD_CLONE, MEDIA, "copied media", media.toString(), oldMedia.toString()));
+
+      mediaApi.getMetadataApi(media.getId()).putEntry("key", MetadataValue.builder().value("value").build());
+
+      media = vdcApi
+               .cloneMedia(vdcUrn, CloneMediaParams.builder().source(Reference.builder().fromEntity(media).build())
+                        .name("moved test media").description("moved by testCloneMedia()").isSourceDelete(true).build());
+
       Checks.checkMediaFor(VDC, media);
-      
+
       if (media.getTasks() != null) {
          Task copyTask = getFirst(media.getTasks(), null);
          if (copyTask != null) {
             Checks.checkTask(copyTask);
             assertTrue(retryTaskSuccess.apply(copyTask), String.format(TASK_COMPLETE_TIMELY, "copyTask"));
-            media = mediaApi.getMedia(media.getHref());
+            media = mediaApi.get(media.getId());
          }
       }
-      
+
       Checks.checkMediaFor(MEDIA, media);
-      assertTrue(media.clone(oldMedia), String.format(OBJ_FIELD_CLONE, MEDIA, "moved media", 
-            media.toString(), oldMedia.toString()));
+      assertTrue(media.clone(oldMedia),
+               String.format(OBJ_FIELD_CLONE, MEDIA, "moved media", media.toString(), oldMedia.toString()));
    }
-   
+
    @Test(description = "PUT /media/{id}", dependsOnMethods = { "testCloneMedia" })
    public void testSetMedia() {
       String oldName = media.getName();
-      String newName = "new "+oldName;
+      String newName = "new " + oldName;
       String oldDescription = media.getDescription();
-      String newDescription = "new "+oldDescription;
+      String newDescription = "new " + oldDescription;
       media = media.toBuilder().name(newName).description(newDescription).build();
-      
-      Task updateMedia = mediaApi.updateMedia(media.getHref(), media);
-      Checks.checkTask(updateMedia);
-      assertTrue(retryTaskSuccess.apply(updateMedia), String.format(TASK_COMPLETE_TIMELY, "updateMedia"));
-      media = mediaApi.getMedia(media.getHref());
-      
+
+      Task editMedia = mediaApi.edit(media.getId(), media);
+      Checks.checkTask(editMedia);
+      assertTrue(retryTaskSuccess.apply(editMedia), String.format(TASK_COMPLETE_TIMELY, "editMedia"));
+      media = mediaApi.get(media.getId());
+
       assertTrue(equal(media.getName(), newName), String.format(OBJ_FIELD_UPDATABLE, MEDIA, "name"));
       assertTrue(equal(media.getDescription(), newDescription),
-            String.format(OBJ_FIELD_UPDATABLE, MEDIA, "description"));
-      
-      //TODO negative tests?
-      
+               String.format(OBJ_FIELD_UPDATABLE, MEDIA, "description"));
+
+      // TODO negative tests?
+
       Checks.checkMediaFor(MEDIA, media);
-      
+
       media = media.toBuilder().name(oldName).description(oldDescription).build();
-      
-      updateMedia = mediaApi.updateMedia(media.getHref(), media);
-      Checks.checkTask(updateMedia);
-      assertTrue(retryTaskSuccess.apply(updateMedia), String.format(TASK_COMPLETE_TIMELY, "updateMedia"));
-      media = mediaApi.getMedia(media.getHref());
+
+      editMedia = mediaApi.edit(media.getId(), media);
+      Checks.checkTask(editMedia);
+      assertTrue(retryTaskSuccess.apply(editMedia), String.format(TASK_COMPLETE_TIMELY, "editMedia"));
+      media = mediaApi.get(media.getId());
    }
-   
+
    @Test(description = "GET /media/{id}/metadata", dependsOnMethods = { "testSetMetadataValue" })
    public void testGetMetadata() {
-      metadata = mediaApi.getMetadataApi().getMetadata(media.getHref());
+      metadata = mediaApi.getMetadataApi(media.getId()).get();
       // required for testing
-      assertFalse(isEmpty(metadata.getMetadataEntries()),
-            String.format(OBJ_FIELD_REQ_LIVE, MEDIA, "metadata.entries"));
-      
+      assertFalse(isEmpty(metadata.getMetadataEntries()), String.format(OBJ_FIELD_REQ_LIVE, MEDIA, "metadata.entries"));
+
       Checks.checkMetadataFor(MEDIA, metadata);
    }
-   
+
    @Test(description = "POST /media/{id}/metadata", dependsOnMethods = { "testGetMedia" })
    public void testMergeMetadata() {
       // test new
       Set<MetadataEntry> inputEntries = ImmutableSet.of(MetadataEntry.builder().entry("testKey", "testValue").build());
-      Metadata inputMetadata = Metadata.builder()
-            .entries(inputEntries)
-            .build();
-      
-      Task mergeMetadata = mediaApi.getMetadataApi().mergeMetadata(media.getHref(), inputMetadata);
+      Metadata inputMetadata = Metadata.builder().entries(inputEntries).build();
+
+      Task mergeMetadata = mediaApi.getMetadataApi(media.getId()).merge(inputMetadata);
       Checks.checkTask(mergeMetadata);
       assertTrue(retryTaskSuccess.apply(mergeMetadata), String.format(TASK_COMPLETE_TIMELY, "mergeMetadata(new)"));
-      metadata = mediaApi.getMetadataApi().getMetadata(media.getHref());
+      metadata = mediaApi.getMetadataApi(media.getId()).get();
       Checks.checkMetadataFor(MEDIA, metadata);
       checkMetadataContainsEntries(metadata, inputEntries);
-      
-      media = mediaApi.getMedia(media.getHref());
+
+      media = mediaApi.get(media.getId());
       Checks.checkMediaFor(MEDIA, media);
-      
-      // test modify
+
+      // test edit
       inputEntries = ImmutableSet.of(MetadataEntry.builder().entry("testKey", "new testValue").build());
-      inputMetadata = Metadata.builder()
-            .entries(inputEntries)
-            .build();
-      
-      mergeMetadata = mediaApi.getMetadataApi().mergeMetadata(media.getHref(), inputMetadata);
+      inputMetadata = Metadata.builder().entries(inputEntries).build();
+
+      mergeMetadata = mediaApi.getMetadataApi(media.getId()).merge(inputMetadata);
       Checks.checkTask(mergeMetadata);
-      assertTrue(retryTaskSuccess.apply(mergeMetadata), String.format(TASK_COMPLETE_TIMELY, "mergeMetadata(modify)"));
-      metadata = mediaApi.getMetadataApi().getMetadata(media.getHref());
+      assertTrue(retryTaskSuccess.apply(mergeMetadata), String.format(TASK_COMPLETE_TIMELY, "mergeMetadata(edit)"));
+      metadata = mediaApi.getMetadataApi(media.getId()).get();
       Checks.checkMetadataFor(MEDIA, metadata);
       checkMetadataContainsEntries(metadata, inputEntries);
-      
-      media = mediaApi.getMedia(media.getHref());
+
+      media = mediaApi.get(media.getId());
       Checks.checkMediaFor(MEDIA, media);
    }
-   
+
    private void checkMetadataContainsEntries(Metadata metadata, Set<MetadataEntry> entries) {
       for (MetadataEntry inputEntry : entries) {
          boolean found = false;
          for (MetadataEntry entry : metadata.getMetadataEntries()) {
             if (equal(inputEntry.getKey(), entry.getKey())) {
-               found = true; break;
+               found = true;
+               break;
             }
          }
-         
+
          if (!found) {
-            String.format(OBJ_FIELD_CONTAINS, MEDIA, "metadata",
-                  Iterables.toString(metadata.getMetadataEntries()),
-                  Iterables.toString(entries));
+            String.format(OBJ_FIELD_CONTAINS, MEDIA, "metadata", Iterables.toString(metadata.getMetadataEntries()),
+                     Iterables.toString(entries));
          }
       }
    }
-   
+
    @Test(description = "GET /media/{id}/metadata/{key}", dependsOnMethods = { "testSetMetadataValue" })
    public void testGetMetadataValue() {
-      metadataValue = mediaApi.getMetadataApi().getMetadataValue(media.getHref(), "key");
+      metadataValue = mediaApi.getMetadataApi(media.getId()).getValue("key");
       Checks.checkMetadataValueFor(MEDIA, metadataValue);
    }
-   
+
    @Test(description = "PUT /media/{id}/metadata/{key}", dependsOnMethods = { "testMergeMetadata" })
    public void testSetMetadataValue() {
       metadataEntryValue = "value";
       MetadataValue newValue = MetadataValue.builder().value(metadataEntryValue).build();
-      
-      Task setMetadataEntry = mediaApi.getMetadataApi().setMetadata(media.getHref(), "key", newValue);
+
+      Task setMetadataEntry = mediaApi.getMetadataApi(media.getId()).putEntry("key", newValue);
       Checks.checkTask(setMetadataEntry);
-      assertTrue(retryTaskSuccess.apply(setMetadataEntry),
-            String.format(TASK_COMPLETE_TIMELY, "setMetadataEntry"));
-      metadataValue = mediaApi.getMetadataApi().getMetadataValue(media.getHref(), "key");
+      assertTrue(retryTaskSuccess.apply(setMetadataEntry), String.format(TASK_COMPLETE_TIMELY, "setMetadataEntry"));
+      metadataValue = mediaApi.getMetadataApi(media.getId()).getValue("key");
       Checks.checkMetadataValueFor(MEDIA, metadataValue);
    }
-   
-   @Test(description = "DELETE /media/{id}/metadata/{key}", dependsOnMethods = { "testGetMetadata", "testGetMetadataValue" } )
-   public void testDeleteMetadata() {
-      Task deleteMetadataEntry = mediaApi.getMetadataApi().deleteMetadataEntry(media.getHref(), "testKey");
-      Checks.checkTask(deleteMetadataEntry);
-      assertTrue(retryTaskSuccess.apply(deleteMetadataEntry),
-            String.format(TASK_COMPLETE_TIMELY, "deleteMetadataEntry"));
-      
-      metadataValue = mediaApi.getMetadataApi().getMetadataValue(media.getHref(), "testKey");
-      assertNull(metadataValue, String.format(OBJ_FIELD_ATTRB_DEL, MEDIA,
-               "Metadata", metadataValue != null ? metadataValue.toString() : "",
-               "MetadataEntry", metadataValue != null ? metadataValue.toString() : ""));
-      
-      metadataValue = mediaApi.getMetadataApi().getMetadataValue(media.getHref(), "key");
+
+   @Test(description = "DELETE /media/{id}/metadata/{key}", dependsOnMethods = { "testGetMetadata",
+            "testGetMetadataValue" })
+   public void testRemoveMetadata() {
+      Task removeEntry = mediaApi.getMetadataApi(media.getId()).removeEntry("testKey");
+      Checks.checkTask(removeEntry);
+      assertTrue(retryTaskSuccess.apply(removeEntry), String.format(TASK_COMPLETE_TIMELY, "removeEntry"));
+
+      metadataValue = mediaApi.getMetadataApi(media.getId()).getValue("testKey");
+      assertNull(metadataValue, String.format(OBJ_FIELD_ATTRB_DEL, MEDIA, "Metadata",
+               metadataValue != null ? metadataValue.toString() : "", "MetadataEntry",
+               metadataValue != null ? metadataValue.toString() : ""));
+
+      metadataValue = mediaApi.getMetadataApi(media.getId()).getValue("key");
       Checks.checkMetadataValueFor(MEDIA, metadataValue);
-      
-      media = mediaApi.getMedia(media.getHref());
+
+      media = mediaApi.get(media.getId());
       Checks.checkMediaFor(MEDIA, media);
    }
-   
-   @Test(description = "DELETE /media/{id}", dependsOnMethods = { "testDeleteMetadata" } )
-   public void testDeleteMedia() {
-      Task deleteMedia = mediaApi.deleteMedia(media.getHref());
-      Checks.checkTask(deleteMedia);
-      assertTrue(retryTaskSuccess.apply(deleteMedia),
-            String.format(TASK_COMPLETE_TIMELY, "deleteMedia"));
-      
-      media = mediaApi.getMedia(media.getHref());
+
+   @Test(description = "DELETE /media/{id}", dependsOnMethods = { "testRemoveMetadata" })
+   public void testRemoveMedia() {
+      Task removeMedia = mediaApi.remove(media.getId());
+      Checks.checkTask(removeMedia);
+      assertTrue(retryTaskSuccess.apply(removeMedia), String.format(TASK_COMPLETE_TIMELY, "removeMedia"));
+
+      media = mediaApi.get(media.getId());
       assertNull(media, String.format(OBJ_DEL, MEDIA, media != null ? media.toString() : ""));
-      
-      deleteMedia = mediaApi.deleteMedia(oldMedia.getHref());
-      Checks.checkTask(deleteMedia);
-      assertTrue(retryTaskSuccess.apply(deleteMedia), String.format(TASK_COMPLETE_TIMELY, "deleteMedia"));
+
+      removeMedia = mediaApi.remove(oldMedia.getId());
+      Checks.checkTask(removeMedia);
+      assertTrue(retryTaskSuccess.apply(removeMedia), String.format(TASK_COMPLETE_TIMELY, "removeMedia"));
       oldMedia = null;
    }
 }
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/NetworkApiExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/NetworkApiExpectTest.java
index 23f0d70..5458c81 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/NetworkApiExpectTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/NetworkApiExpectTest.java
@@ -18,14 +18,22 @@
  */
 package org.jclouds.vcloud.director.v1_5.features;
 
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ADMIN_NETWORK;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ENTITY;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ERROR;
+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.NETWORK;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ORG;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNull;
 import static org.testng.Assert.fail;
 
 import java.net.URI;
 
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
 import org.jclouds.vcloud.director.v1_5.VCloudDirectorException;
-import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
 import org.jclouds.vcloud.director.v1_5.domain.Error;
 import org.jclouds.vcloud.director.v1_5.domain.Link;
 import org.jclouds.vcloud.director.v1_5.domain.Metadata;
@@ -36,7 +44,6 @@
 import org.jclouds.vcloud.director.v1_5.domain.network.IpRange;
 import org.jclouds.vcloud.director.v1_5.domain.network.IpRanges;
 import org.jclouds.vcloud.director.v1_5.domain.network.IpScope;
-import org.jclouds.vcloud.director.v1_5.domain.network.Network;
 import org.jclouds.vcloud.director.v1_5.domain.network.Network.FenceMode;
 import org.jclouds.vcloud.director.v1_5.domain.network.NetworkConfiguration;
 import org.jclouds.vcloud.director.v1_5.domain.network.NetworkFeatures;
@@ -47,6 +54,7 @@
 import org.testng.annotations.Test;
 
 import com.google.common.collect.ImmutableSet;
+import com.google.common.net.HttpHeaders;
 
 /**
  * Test the {@link NetworkApi} via its side effects.
@@ -55,37 +63,40 @@
  */
 @Test(groups = { "unit", "user" }, singleThreaded = true, testName = "NetworkApiExpectTest")
 public class NetworkApiExpectTest extends VCloudDirectorAdminApiExpectTest {
-   
-   @Test
-   public void testGetNetwork() {
-      URI networkUri = URI.create(endpoint + "/network/f3ba8256-6f48-4512-aad6-600e85b4dc38");
 
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("GET", "/network/f3ba8256-6f48-4512-aad6-600e85b4dc38")
-            .acceptAnyMedia()
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/network/network.xml", VCloudDirectorMediaType.ORG_NETWORK)
-            .httpResponseBuilder().build());
-      
-      OrgNetwork expected = orgNetwork();
-      assertEquals(Network.<OrgNetwork>toSubType(api.getNetworkApi().getNetwork(networkUri)), expected);
+   static String network = "55a677cf-ab3f-48ae-b880-fab90421980c";
+   static String networkUrn = "urn:vcloud:network:" + network;
+   static URI networkHref = URI.create(endpoint + "/network/" + network);
+   
+   HttpRequest get = HttpRequest.builder()
+            .method("GET")
+            .endpoint(networkHref)
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+            .build();
+
+    HttpResponse getResponse = HttpResponse.builder()
+            .statusCode(200)
+            .payload(payloadFromResourceWithContentType("/network/network.xml", ORG + ";version=1.5"))
+            .build();
+    
+   @Test
+   public void testGetNetworkHref() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, get, getResponse);
+      assertEquals(api.getNetworkApi().get(networkHref), network());
    }
-
-   @Test
-   public void testGetNetworkWithInvalidId() {
-      URI networkUri = URI.create(endpoint + "/network/NOTAUUID");
-
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("GET", "/network/NOTAUUID")
-            .acceptAnyMedia()
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/network/error400.xml", VCloudDirectorMediaType.ERROR)
-            .httpResponseBuilder().statusCode(400).build());
    
+   @Test
+   public void testGetNetworkHrefInvalidId() {
+      
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
+               get.toBuilder().endpoint(endpoint + "/network/NOTAUUID").build(), 
+               HttpResponse.builder()
+                           .statusCode(400)
+                           .payload(payloadFromResourceWithContentType("/network/error400.xml", ERROR + ";version=1.5"))
+                           .build());
+      
       Error expected = Error.builder()
          .message("validation error : EntityRef has incorrect type, expected type is com.vmware.vcloud.entity.network.")
          .majorErrorCode(400)
@@ -93,7 +104,7 @@
          .build();
 
       try {
-         api.getNetworkApi().getNetwork(networkUri);
+         api.getNetworkApi().get(URI.create(endpoint + "/network/NOTAUUID"));
          fail("Should give HTTP 400 error");
       } catch (VCloudDirectorException vde) {
          assertEquals(vde.getError(), expected);
@@ -103,91 +114,125 @@
    }
 
    @Test
-   public void testGetNetworkWithCatalogId() {
-      URI networkUri = URI.create(endpoint + "/network/9e08c2f6-077a-42ce-bece-d5332e2ebb5c");
-
+   public void testGetNetworkHrefCatalogId() {
       VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("GET", "/network/9e08c2f6-077a-42ce-bece-d5332e2ebb5c")
-            .acceptAnyMedia()
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/network/error403-catalog.xml", VCloudDirectorMediaType.ERROR)
-            .httpResponseBuilder().statusCode(403).build());
+               get.toBuilder().endpoint(endpoint + "/network/9e08c2f6-077a-42ce-bece-d5332e2ebb5c").build(), 
+               HttpResponse.builder()
+                           .statusCode(403)
+                           .payload(payloadFromResourceWithContentType("/network/error403-catalog.xml", ERROR + ";version=1.5"))
+                           .build());
       
-      assertNull(api.getNetworkApi().getNetwork(networkUri));
+      assertNull(api.getNetworkApi().get(URI.create(endpoint + "/network/9e08c2f6-077a-42ce-bece-d5332e2ebb5c")));
    }
 
    @Test
-   public void testGetNetworkWithFakeId() {
-      URI networkUri = URI.create(endpoint + "/network/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
-
+   public void testGetNetworkHrefFakeId() {
       VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("GET", "/network/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")
-            .acceptAnyMedia()
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/network/error403-fake.xml", VCloudDirectorMediaType.ERROR)
-            .httpResponseBuilder().statusCode(403).build());
+               get.toBuilder().endpoint(endpoint + "/network/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee").build(), 
+               HttpResponse.builder()
+                           .statusCode(403)
+                           .payload(payloadFromResourceWithContentType("/network/error403-fake.xml", ERROR + ";version=1.5"))
+                           .build());
       
-      assertNull(api.getNetworkApi().getNetwork(networkUri));
+      assertNull(api.getNetworkApi().get(URI.create(endpoint + "/network/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")));
    }
    
+   HttpRequest resolveNetwork = HttpRequest.builder()
+            .method("GET")
+            .endpoint(endpoint + "/entity/" + networkUrn)
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+            .build();
+   
+   String networkEntity = asString(createXMLBuilder("Entity").a("xmlns", "http://www.vmware.com/vcloud/v1.5")
+                                                             .a("name", networkUrn)
+                                                             .a("id", networkUrn)
+                                                             .a("type", ENTITY)
+                                                             .a("href", endpoint + "/entity/" + networkUrn)
+                                  .e("Link").a("rel", "alternate").a("type", NETWORK).a("href", networkHref.toString()).up()
+                                  // TODO: remove this when VCloudDirectorApiExpectTest no longer inherits from VCloudDirectorAdminApiExpectTest
+                                  .e("Link").a("rel", "alternate").a("type", ADMIN_NETWORK).a("href", networkHref.toString()).up());
+   
+   HttpResponse resolveNetworkResponse = HttpResponse.builder()
+           .statusCode(200)
+           .payload(payloadFromStringWithContentType(networkEntity, ENTITY + ";version=1.5"))
+           .build();
+   
    @Test
-   public void testGetMetadata() {
-      URI networkUri = URI.create(endpoint + "/network/55a677cf-ab3f-48ae-b880-fab90421980c");
-      
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("GET", "/network/55a677cf-ab3f-48ae-b880-fab90421980c/metadata")
-            .acceptAnyMedia()
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/network/metadata.xml", VCloudDirectorMediaType.METADATA)
-            .httpResponseBuilder().build());
-      
-      Metadata expected = Metadata.builder()
-         .type("application/vnd.vmware.vcloud.metadata+xml")
-         .href(URI.create("https://vcloudbeta.bluelock.com/api/network/55a677cf-ab3f-48ae-b880-fab90421980c/metadata"))
-         .link(Link.builder()
-            .rel("up")
-            .type("application/vnd.vmware.vcloud.network+xml")
-            .href(URI.create("https://vcloudbeta.bluelock.com/api/network/55a677cf-ab3f-48ae-b880-fab90421980c"))
-            .build())
-         .entries(ImmutableSet.of(MetadataEntry.builder().entry("key", "value").build()))
-         .build();
- 
-       assertEquals(api.getNetworkApi().getMetadataApi().getMetadata(networkUri), expected);
+   public void testGetNetworkUrn() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, resolveNetwork, resolveNetworkResponse, get, getResponse);
+      assertEquals(api.getNetworkApi().get(networkUrn), network());
    }
    
-   @Test
-   public void testGetMetadataValue() {
-      URI networkUri = URI.create("https://vcloudbeta.bluelock.com/api/network/55a677cf-ab3f-48ae-b880-fab90421980c");
-      
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("GET", "/network/55a677cf-ab3f-48ae-b880-fab90421980c/metadata/KEY")
-            .acceptAnyMedia()
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/network/metadataValue.xml", VCloudDirectorMediaType.METADATA_ENTRY)
-            .httpResponseBuilder().build());
-      
-      MetadataValue expected = MetadataValue.builder()
-         .href(URI.create("https://vcloudbeta.bluelock.com/api/network/55a677cf-ab3f-48ae-b880-fab90421980c/metadata/key"))
-         .link(Link.builder()
-            .rel("up")
-            .type("application/vnd.vmware.vcloud.metadata+xml")
-            .href(URI.create("https://vcloudbeta.bluelock.com/api/network/55a677cf-ab3f-48ae-b880-fab90421980c/metadata"))
-            .build())
-         .value("value")
-         .build();
 
-      assertEquals(api.getNetworkApi().getMetadataApi().getMetadataValue(networkUri, "KEY"), expected);
+   HttpRequest getMetadata = HttpRequest.builder()
+            .method("GET")
+            .endpoint(networkHref + "/metadata")
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
+
+   HttpResponse getMetadataResponse = HttpResponse.builder()
+            .statusCode(200)
+            .payload(payloadFromResourceWithContentType("/network/metadata.xml", METADATA))
+            .build();
+
+   @Test
+   public void testGetNetworkMetadataHref() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, getMetadata, getMetadataResponse);
+      assertEquals(api.getNetworkApi().getMetadataApi(networkHref).get(), metadata());
+   }
+
+   static Metadata metadata() {
+      return Metadata.builder()
+                     .type("application/vnd.vmware.vcloud.metadata+xml")
+                     .href(URI.create(endpoint + "/network/" + network + "/metadata"))
+                     .link(Link.builder()
+                               .rel("up")
+                               .type("application/vnd.vmware.vcloud.network+xml")
+                               .href(networkHref)
+                               .build())
+                     .entries(ImmutableSet.of(metadataEntry()))
+                     .build();
    }
    
-   public static OrgNetwork orgNetwork() {
+   private static MetadataEntry metadataEntry() {
+      return MetadataEntry.builder().entry("key", "value").build();
+   }
+
+   HttpRequest getMetadataValue = HttpRequest.builder()
+            .method("GET")
+            .endpoint(networkHref + "/metadata/KEY")
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
+
+   HttpResponse getMetadataValueResponse = HttpResponse.builder()
+            .statusCode(200)
+            .payload(payloadFromResourceWithContentType("/network/metadataValue.xml", METADATA_VALUE))
+            .build();
+
+   @Test
+   public void testGetNetworkMetadataEntryHref() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, getMetadataValue, getMetadataValueResponse);
+      assertEquals(api.getNetworkApi().getMetadataApi(networkHref).getValue("KEY"), metadataValue());
+   }
+   
+   private MetadataValue metadataValue() {
+      return MetadataValue.builder()
+               .href(URI.create("https://vcloudbeta.bluelock.com/api/network/55a677cf-ab3f-48ae-b880-fab90421980c/metadata/key"))
+               .link(Link.builder()
+                  .rel("up")
+                  .type("application/vnd.vmware.vcloud.metadata+xml")
+                  .href(URI.create("https://vcloudbeta.bluelock.com/api/network/55a677cf-ab3f-48ae-b880-fab90421980c/metadata"))
+                  .build())
+               .value("value")
+               .build();
+   }
+
+
+   public static OrgNetwork network() {
       return OrgNetwork.builder()
          .name("ilsolation01-Jclouds")
          .id("urn:vcloud:network:f3ba8256-6f48-4512-aad6-600e85b4dc38")
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/NetworkApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/NetworkApiLiveTest.java
index c1d0967..40dc0f0 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/NetworkApiLiveTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/NetworkApiLiveTest.java
@@ -22,8 +22,8 @@
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_EQ;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_REQ_LIVE;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_REQ_LIVE;
-import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.REF_REQ_LIVE;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.REQUIRED_VALUE_OBJECT_FMT;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.URN_REQ_LIVE;
 import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkResourceType;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
@@ -51,94 +51,92 @@
  */
 @Test(groups = { "live", "user" }, singleThreaded = true, testName = "NetworkApiLiveTest")
 public class NetworkApiLiveTest extends BaseVCloudDirectorApiLiveTest {
-   
+
    public static final String NETWORK = "network";
- 
+
    /*
     * Convenience reference to API api.
     */
    protected NetworkApi networkApi;
-   
+
    private boolean metadataSet = false;
-    
+
    @Override
    @BeforeClass(alwaysRun = true)
    public void setupRequiredApis() {
       networkApi = context.getApi().getNetworkApi();
    }
-   
+
    @AfterClass(alwaysRun = true)
    public void cleanUp() {
       if (metadataSet) {
          try {
-	         Task delete = adminContext.getApi().getNetworkApi().getMetadataApi().deleteMetadataEntry(toAdminUri(networkURI), "key");
-	         taskDoneEventually(delete);
+            Task remove = adminContext.getApi().getNetworkApi().getMetadataApi(networkUrn).removeEntry("key");
+            taskDoneEventually(remove);
          } catch (Exception e) {
             logger.warn(e, "Error when deleting metadata");
          }
       }
    }
-   
+
    @Test(description = "GET /network/{id}")
    public void testGetNetwork() {
       // required for testing
-      assertNotNull(networkURI, String.format(REF_REQ_LIVE, NETWORK));
-       
-      Network abstractNetwork = networkApi.getNetwork(networkURI);
-      assertTrue(abstractNetwork instanceof OrgNetwork, String.format(REQUIRED_VALUE_OBJECT_FMT, 
-            ".class", NETWORK, abstractNetwork.getClass(),"OrgNetwork"));
+      assertNotNull(networkUrn, String.format(URN_REQ_LIVE, NETWORK));
+
+      Network abstractNetwork = networkApi.get(networkUrn);
+      assertTrue(abstractNetwork instanceof OrgNetwork,
+               String.format(REQUIRED_VALUE_OBJECT_FMT, ".class", NETWORK, abstractNetwork.getClass(), "OrgNetwork"));
       OrgNetwork network = Network.toSubType(abstractNetwork);
       assertNotNull(network, String.format(OBJ_REQ_LIVE, NETWORK));
       assertTrue(!network.getDescription().equals("DO NOT USE"), "Network isn't to be used for testing");
-       
+
       Checks.checkOrgNetwork(network);
    }
-   
+
    private void setupMetadata() {
-      adminContext.getApi().getNetworkApi().getMetadataApi().setMetadata(toAdminUri(networkURI), 
-            "key", MetadataValue.builder().value("value").build());
+      adminContext.getApi().getNetworkApi().getMetadataApi(networkUrn)
+               .putEntry("key", MetadataValue.builder().value("value").build());
       metadataSet = true;
    }
-   
+
    @Test(description = "GET /network/{id}/metadata", dependsOnMethods = { "testGetNetwork" })
    public void testGetMetadata() {
       if (adminContext != null) {
          setupMetadata();
       }
-      
-      Metadata metadata = networkApi.getMetadataApi().getMetadata(networkURI);
+
+      Metadata metadata = networkApi.getMetadataApi(networkUrn).get();
       // required for testing
-      assertFalse(Iterables.isEmpty(metadata.getMetadataEntries()), 
-            String.format(OBJ_FIELD_REQ_LIVE, NETWORK, "metadata.entries"));
-       
+      assertFalse(Iterables.isEmpty(metadata.getMetadataEntries()),
+               String.format(OBJ_FIELD_REQ_LIVE, NETWORK, "metadata.entries"));
+
       // parent type
       checkResourceType(metadata);
-       
+
       for (MetadataEntry entry : metadata.getMetadataEntries()) {
          // required elements and attributes
-         assertNotNull(entry.getKey(), 
-               String.format(OBJ_FIELD_ATTRB_REQ, networkApi, "MetadataEntry", entry.getKey(), "key"));
-         assertNotNull(entry.getValue(), 
-               String.format(OBJ_FIELD_ATTRB_REQ, networkApi, "MetadataEntry", entry.getValue(), "value"));
-          
+         assertNotNull(entry.getKey(),
+                  String.format(OBJ_FIELD_ATTRB_REQ, networkApi, "MetadataEntry", entry.getKey(), "key"));
+         assertNotNull(entry.getValue(),
+                  String.format(OBJ_FIELD_ATTRB_REQ, networkApi, "MetadataEntry", entry.getValue(), "value"));
+
          // parent type
          checkResourceType(entry);
       }
    }
-   
+
    @Test(description = "GET /network/{id}/metadata/{key}", dependsOnMethods = { "testGetMetadata" })
    public void testGetMetadataValue() {
-      MetadataValue metadataValue = networkApi.getMetadataApi().getMetadataValue(networkURI, "key");
-       
+      MetadataValue metadataValue = networkApi.getMetadataApi(networkUrn).getValue("key");
+
       // Check parent type
       checkResourceType(metadataValue);
-       
+
       // Check required elements and attributes
       String value = metadataValue.getValue();
-      assertNotNull(value, 
-            String.format(OBJ_FIELD_ATTRB_REQ, NETWORK, "MetadataEntry", 
-                  metadataValue.toString(), "value"));
-      assertEquals(value, "value", 
-            String.format(OBJ_FIELD_EQ, NETWORK, "metadataEntry.value", "value", value));
+      assertNotNull(value,
+               String.format(OBJ_FIELD_ATTRB_REQ, NETWORK, "MetadataEntry", metadataValue.toString(), "value"));
+      assertEquals(value, "value", String.format(OBJ_FIELD_EQ, NETWORK, "metadataEntry.value", "value", value));
    }
 }
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/OrgApiExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/OrgApiExpectTest.java
index aaf1902..06c6727 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/OrgApiExpectTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/OrgApiExpectTest.java
@@ -18,15 +18,18 @@
  */
 package org.jclouds.vcloud.director.v1_5.features;
 
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ADMIN_ORG;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ENTITY;
+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.ORG;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ORG_LIST;
 import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNull;
-import static org.testng.Assert.fail;
 
 import java.net.URI;
 
-import org.jclouds.vcloud.director.v1_5.VCloudDirectorException;
-import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
-import org.jclouds.vcloud.director.v1_5.domain.Error;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
 import org.jclouds.vcloud.director.v1_5.domain.Link;
 import org.jclouds.vcloud.director.v1_5.domain.Metadata;
 import org.jclouds.vcloud.director.v1_5.domain.MetadataEntry;
@@ -39,7 +42,7 @@
 import org.testng.annotations.Test;
 
 import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
+import com.google.common.net.HttpHeaders;
 
 /**
  * Allows us to test the {@link OrgApi} via its side effects.
@@ -51,9 +54,21 @@
 
    @Test
    public void testGetOrgList() {
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
-            getStandardRequest("GET", "/org/"),
-            getStandardPayloadResponse("/org/orglist.xml", VCloudDirectorMediaType.ORG_LIST));
+      HttpRequest list = HttpRequest.builder()
+               .method("GET")
+               .endpoint(endpoint + "/org/")
+               .addHeader("Accept", "*/*")
+               .addHeader("x-vcloud-authorization", token)
+               .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+               .build();
+
+      HttpResponse listResponse = HttpResponse.builder()
+               .statusCode(200)
+               .payload(payloadFromResourceWithContentType("/org/orglist.xml", ORG_LIST + ";version=1.5"))
+               .build();
+      
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, list, listResponse);
+
 
       OrgList expected = OrgList.builder()
             .org(Reference.builder()
@@ -63,130 +78,110 @@
                .build())
             .build();
 
-      assertEquals(api.getOrgApi().getOrgList(), expected);
-   }
-
-   @Test
-   public void testGetOrgFromOrgListReference() {
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
-            getStandardRequest("GET", "/org/"),
-            getStandardPayloadResponse("/org/orglist.xml", VCloudDirectorMediaType.ORG_LIST));
-
-      Reference org = Iterables.getOnlyElement(api.getOrgApi().getOrgList().getOrgs());
-      
-      api = requestsSendResponses(loginRequest, sessionResponse, 
-            getStandardRequest("GET", org.getHref()),
-            getStandardPayloadResponse("/org/org.xml", VCloudDirectorMediaType.ORG));
-
-      Org expected = org();
-
-      assertEquals(api.getOrgApi().getOrg(org.getHref()), expected);
-   }
-
-   @Test
-   public void testGetOrg() {
-      URI orgUri = URI.create(endpoint + "/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0");
-
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
-            getStandardRequest("GET", "/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"),
-            getStandardPayloadResponse("/org/org.xml", VCloudDirectorMediaType.ORG));
-      
-      Org expected = org();
-
-      assertEquals(api.getOrgApi().getOrg(orgUri), expected);
-   }
-
-   @Test
-   public void testGetOrgFailOnInvalidOrgId() {
-      URI orgUri = URI.create(endpoint + "/org/NOTAUUID");
-
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse,
-            getStandardRequest("GET", "/org/NOTAUUID"),
-            getStandardPayloadResponse(400, "/org/error400.xml", VCloudDirectorMediaType.ERROR));
-
-      Error expected = Error.builder()
-            .message("validation error on field 'id': String value has invalid format or length")
-            .majorErrorCode(400)
-            .minorErrorCode("BAD_REQUEST")
-            .build();
-
-      try {
-         api.getOrgApi().getOrg(orgUri);
-         fail("Should give HTTP 400 error");
-      } catch (VCloudDirectorException vde) {
-         assertEquals(vde.getError(), expected);
-      } catch (Exception e) {
-         fail("Should have thrown a VCloudDirectorException");
-      }
-   }
-
-   @Test
-   public void testGetOrgFailOnWrongOrgId() {
-      URI orgUri = URI.create(endpoint + "/org/9e08c2f6-077a-42ce-bece-d5332e2ebb5c");
-
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse,
-            getStandardRequest("GET", "/org/9e08c2f6-077a-42ce-bece-d5332e2ebb5c"),
-            getStandardPayloadResponse(403, "/org/error403-catalog.xml", VCloudDirectorMediaType.ERROR));
-
-      assertNull(api.getOrgApi().getOrg(orgUri));
-   }
-
-   @Test
-   public void testGetOrgFailOnFakeOrgId() {
-      URI orgUri = URI.create(endpoint + "/org/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee");
-
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse,
-            getStandardRequest("GET", "/org/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"),
-            getStandardPayloadResponse(403, "/org/error403-fake.xml", VCloudDirectorMediaType.ERROR));
-
-      assertNull(api.getOrgApi().getOrg(orgUri));
+      assertEquals(api.getOrgApi().list(), expected);
    }
    
-   @Test
-   public void testGetOrgMetadata() {
-      URI orgUri = URI.create(endpoint + "/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0");
-      
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
-            new VcloudHttpRequestPrimer()
-               .apiCommand("GET", "/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata")
-               .acceptAnyMedia()
-               .httpRequestBuilder().build(), 
-            new VcloudHttpResponsePrimer()
-               .xmlFilePayload("/org/orgMetadata.xml", VCloudDirectorMediaType.METADATA)
-               .httpResponseBuilder().build());
-      
-      Metadata expected = Metadata.builder()
-            .type("application/vnd.vmware.vcloud.metadata+xml")
-            .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata"))
-            .link(Link.builder()
-                  .rel("up")
-                  .type("application/vnd.vmware.vcloud.org+xml")
-                  .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
-                  .build())
-            .entries(ImmutableSet.of(metadataEntry()))
+   static String org = "6f312e42-cd2b-488d-a2bb-97519cd57ed0";
+   static String orgUrn = "urn:vcloud:org:" + org;
+   static URI orgHref = URI.create(endpoint + "/org/" + org);
+   
+   HttpRequest get = HttpRequest.builder()
+            .method("GET")
+            .endpoint(orgHref)
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
             .build();
- 
-       assertEquals(api.getOrgApi().getMetadataApi().getMetadata(orgUri), expected);
+
+    HttpResponse getResponse = HttpResponse.builder()
+            .statusCode(200)
+            .payload(payloadFromResourceWithContentType("/org/org.xml", ORG + ";version=1.5"))
+            .build();
+    
+   @Test
+   public void testGetOrgHref() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, get, getResponse);
+      assertEquals(api.getOrgApi().get(orgHref), org());
    }
    
+   HttpRequest resolveOrg = HttpRequest.builder()
+            .method("GET")
+            .endpoint(endpoint + "/entity/" + orgUrn)
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+            .build();
+   
+   String orgEntity = asString(createXMLBuilder("Entity").a("xmlns", "http://www.vmware.com/vcloud/v1.5")
+                                                             .a("name", orgUrn)
+                                                             .a("id", orgUrn)
+                                                             .a("type", ENTITY)
+                                                             .a("href", endpoint + "/entity/" + orgUrn)
+                                  .e("Link").a("rel", "alternate").a("type", ORG).a("href", orgHref.toString()).up()
+                                  // TODO: remove this when VCloudDirectorApiExpectTest no longer inherits from VCloudDirectorAdminApiExpectTest
+                                  .e("Link").a("rel", "alternate").a("type", ADMIN_ORG).a("href", orgHref.toString()).up());
+   
+   HttpResponse resolveOrgResponse = HttpResponse.builder()
+           .statusCode(200)
+           .payload(payloadFromStringWithContentType(orgEntity, ENTITY + ";version=1.5"))
+           .build();
+   
    @Test
-   public void testGetOrgMetadataValue() {
-      URI orgUri = URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0");
-      
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse,
-            new VcloudHttpRequestPrimer()
-               .apiCommand("GET", "/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata/KEY")
-               .acceptAnyMedia()
-               .httpRequestBuilder().build(), 
-            new VcloudHttpResponsePrimer()
-               .xmlFilePayload("/org/orgMetadataValue.xml", VCloudDirectorMediaType.METADATA_VALUE)
-               .httpResponseBuilder().build());
-      
-      MetadataValue expected = metadataValue();
+   public void testGetOrgUrn() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, resolveOrg, resolveOrgResponse, get, getResponse);
+      assertEquals(api.getOrgApi().get(orgUrn), org());
+   }
+   
 
-      assertEquals(api.getOrgApi().getMetadataApi().getMetadataValue(orgUri, "KEY"), expected);
+   HttpRequest getMetadata = HttpRequest.builder()
+            .method("GET")
+            .endpoint(orgHref + "/metadata")
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
+
+   HttpResponse getMetadataResponse = HttpResponse.builder()
+            .statusCode(200)
+            .payload(payloadFromResourceWithContentType("/org/orgMetadata.xml", METADATA))
+            .build();
+
+   @Test
+   public void testGetOrgMetadataHref() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, getMetadata, getMetadataResponse);
+      assertEquals(api.getOrgApi().getMetadataApi(orgHref).get(), metadata());
    }
 
+   static Metadata metadata() {
+      return Metadata.builder()
+                     .type("application/vnd.vmware.vcloud.metadata+xml")
+                     .href(URI.create(endpoint + "/org/" + org + "/metadata"))
+                     .link(Link.builder()
+                               .rel("up")
+                               .type("application/vnd.vmware.vcloud.org+xml")
+                               .href(orgHref)
+                               .build())
+                     .entries(ImmutableSet.of(metadataEntry()))
+                     .build();
+   }
+   
+   HttpRequest getMetadataValue = HttpRequest.builder()
+            .method("GET")
+            .endpoint(orgHref + "/metadata/KEY")
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
+
+   HttpResponse getMetadataValueResponse = HttpResponse.builder()
+            .statusCode(200)
+            .payload(payloadFromResourceWithContentType("/org/orgMetadataValue.xml", METADATA_VALUE))
+            .build();
+
+   @Test
+   public void testGetOrgMetadataEntryHref() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, getMetadataValue, getMetadataValueResponse);
+      assertEquals(api.getOrgApi().getMetadataApi(orgHref).getValue("KEY"), metadataValue());
+   }
+   
    public static Org org() {
       return Org.builder()
          .name("JClouds")
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/OrgApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/OrgApiLiveTest.java
index 201c9f0..050e814 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/OrgApiLiveTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/OrgApiLiveTest.java
@@ -21,7 +21,6 @@
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.CONDITION_FMT;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.CORRECT_VALUE_OBJECT_FMT;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.NOT_EMPTY_OBJECT_FMT;
-import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkControlAccessParams;
 import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadata;
 import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadataValue;
 import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkOrg;
@@ -30,17 +29,13 @@
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
 
-import java.net.URI;
-
 import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
 import org.jclouds.vcloud.director.v1_5.domain.AdminCatalog;
 import org.jclouds.vcloud.director.v1_5.domain.Metadata;
 import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
 import org.jclouds.vcloud.director.v1_5.domain.Reference;
 import org.jclouds.vcloud.director.v1_5.domain.Task;
-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.domain.params.ControlAccessParams;
 import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorApiLiveTest;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
@@ -49,10 +44,10 @@
 import com.google.common.collect.Iterables;
 
 /**
-* Tests live behavior of {@link OrgApi}.
-* 
-* @author grkvlt@apache.org
-*/
+ * Tests live behavior of {@link OrgApi}.
+ * 
+ * @author grkvlt@apache.org
+ */
 @Test(groups = { "live", "user" }, singleThreaded = true, testName = "OrgApiLiveTest")
 public class OrgApiLiveTest extends BaseVCloudDirectorApiLiveTest {
 
@@ -61,29 +56,26 @@
     */
 
    private OrgApi orgApi;
-   private URI catalogRef;
-   private String testCatalogId;
 
    @Override
    @BeforeClass(alwaysRun = true)
    public void setupRequiredApis() {
       orgApi = context.getApi().getOrgApi();
-      testCatalogId = catalogId;
    }
-   
+
    @AfterClass(alwaysRun = true)
    public void cleanUp() throws Exception {
       if (adminMembersSet) {
          try {
-	         Task delete = adminContext.getApi().getOrgApi().getMetadataApi().deleteMetadataEntry(toAdminUri(orgURI), "KEY");
-	         taskDoneEventually(delete);
+            Task remove = adminContext.getApi().getOrgApi().getMetadataApi(orgUrn).removeEntry("KEY");
+            taskDoneEventually(remove);
          } catch (Exception e) {
             logger.warn(e, "Error when deleting metadata entry");
          }
          try {
-	         adminContext.getApi().getCatalogApi().deleteCatalog(catalogRef);
+            adminContext.getApi().getCatalogApi().remove(catalogUrn);
          } catch (Exception e) {
-            logger.warn(e, "Error when deleting catalog'%s': %s", catalogRef);
+            logger.warn(e, "Error when deleting catalog'%s': %s", catalogUrn);
          }
       }
    }
@@ -93,107 +85,87 @@
     */
 
    private OrgList orgList;
-   private URI orgURI;
-   private Org org;
-   private boolean adminMembersSet = false; // track if test entities have been created
+   private boolean adminMembersSet = false; // track if test entities have been addd
 
    @Test(description = "GET /org")
    public void testGetOrgList() {
       // Call the method being tested
-      orgList = orgApi.getOrgList();
-      
+      orgList = orgApi.list();
+
       // NOTE The environment MUST have at least one organisation configured
-      
+
       // Check test requirements
-      assertFalse(Iterables.isEmpty(orgList.getOrgs()), String.format(NOT_EMPTY_OBJECT_FMT, "Org", "OrgList"));
-      
-      for (Reference orgRef : orgList.getOrgs()) {
-         assertEquals(orgRef.getType(), VCloudDirectorMediaType.ORG, String.format(CONDITION_FMT, "Reference.Type", VCloudDirectorMediaType.ORG, orgRef.getType()));
+      assertFalse(Iterables.isEmpty(orgList), String.format(NOT_EMPTY_OBJECT_FMT, "Org", "OrgList"));
+
+      for (Reference orgRef : orgList) {
+         assertEquals(orgRef.getType(), VCloudDirectorMediaType.ORG,
+                  String.format(CONDITION_FMT, "Reference.Type", VCloudDirectorMediaType.ORG, orgRef.getType()));
          checkReferenceType(orgRef);
       }
    }
 
    @Test(description = "GET /org/{id}", dependsOnMethods = { "testGetOrgList" })
    public void testGetOrg() {
-      Reference orgRef = Iterables.getFirst(orgList.getOrgs(), null);
+      Reference orgRef = Iterables.getFirst(orgList, null);
       assertNotNull(orgRef);
-      
-      orgURI = orgRef.getHref();
-      
+
       // Call the method being tested
-      org = orgApi.getOrg(orgURI);
+      org = orgApi.get(orgUrn);
+
+      assertEquals(orgApi.get(orgUrn), org);
 
       checkOrg(org);
-      
+
       if (adminContext != null) {
          setupAdminMembers();
       }
    }
-   
+
    /**
-    * If we're running in an admin context, it's cleaner to make temporary entities, plus eliminates the need for configuration
+    * If we're running in an admin context, it's cleaner to make temporary entities, plus eliminates
+    * the need for configuration
     */
    private void setupAdminMembers() {
-      adminContext.getApi().getOrgApi().getMetadataApi().setMetadata(toAdminUri(orgURI), 
-            "KEY", MetadataValue.builder().value("VALUE").build());
-      
-      AdminCatalog newCatalog = AdminCatalog.builder()
-            .name("Test Catalog "+getTestDateTimeStamp())
-            .description("created by testOrg()")
-            .build();
-      newCatalog = adminContext.getApi().getCatalogApi().createCatalog(toAdminUri(orgURI), newCatalog);
-      
-      catalogRef = newCatalog.getHref();
-      testCatalogId = newCatalog.getId().substring("urn:vcloud:catalog:".length()); 
-      
+      adminContext.getApi().getOrgApi().getMetadataApi(orgUrn)
+               .putEntry("KEY", MetadataValue.builder().value("VALUE").build());
+
+      AdminCatalog newCatalog = AdminCatalog.builder().name("Test Catalog " + getTestDateTimeStamp())
+               .description("created by testOrg()").build();
+      newCatalog = adminContext.getApi().getCatalogApi().addCatalogToOrg(newCatalog, orgUrn);
+
+      catalogUrn = newCatalog.getId();
+
       adminMembersSet = true;
    }
-   
+
    @Test(description = "GET /org/{id}/metadata", dependsOnMethods = { "testGetOrg" })
    public void testGetOrgMetadata() {
-      
+
       // Call the method being tested
-      Metadata metadata = orgApi.getMetadataApi().getMetadata(orgURI);
-      
+      Metadata metadata = orgApi.getMetadataApi(orgUrn).get();
+
       // NOTE The environment MUST have at one metadata entry for the first organisation configured
-      
+
       checkMetadata(metadata);
-      
+
       // Check requirements for this test
-      assertFalse(Iterables.isEmpty(metadata.getMetadataEntries()), String.format(NOT_EMPTY_OBJECT_FMT, "MetadataEntry", "Org"));
+      assertFalse(Iterables.isEmpty(metadata.getMetadataEntries()),
+               String.format(NOT_EMPTY_OBJECT_FMT, "MetadataEntry", "Org"));
    }
-   
+
    @Test(description = "GET /org/{id}/metadata/{key}", dependsOnMethods = { "testGetOrgMetadata" })
    public void testGetOrgMetadataValue() {
       // Call the method being tested
-      MetadataValue value = orgApi.getMetadataApi().getMetadataValue(orgURI, "KEY");
-      
-      // NOTE The environment MUST have configured the metadata entry as '{ key="KEY", value="VALUE" )'
+      MetadataValue value = orgApi.getMetadataApi(orgUrn).getValue("KEY");
+
+      // NOTE The environment MUST have configured the metadata entry as '{ key="KEY", value="VALUE"
+      // )'
 
       String expected = "VALUE";
 
       checkMetadataValue(value);
-      assertEquals(value.getValue(), expected, String.format(CORRECT_VALUE_OBJECT_FMT, "Value", "MetadataValue", expected, value.getValue()));
+      assertEquals(value.getValue(), expected,
+               String.format(CORRECT_VALUE_OBJECT_FMT, "Value", "MetadataValue", expected, value.getValue()));
    }
 
-   @Test(description = "GET /org/{id}/catalog/{catalogId}/controlAccess", dependsOnMethods = { "testGetOrg" })
-   public void testGetControlAccess() {
-      // Call the method being tested
-      ControlAccessParams params = orgApi.getControlAccess(orgURI, testCatalogId);
-
-      // Check params are well formed
-      checkControlAccessParams(params);
-   }
-
-   @Test(description = "POST /org/{id}/catalog/{catalogId}/action/controlAccess", dependsOnMethods = { "testGetControlAccess" })
-   public void testModifyControlAccess() {
-      // Setup params
-      ControlAccessParams params = orgApi.getControlAccess(orgURI, testCatalogId);
-
-      // Call the method being tested
-      ControlAccessParams modified = orgApi.modifyControlAccess(orgURI, testCatalogId, params);
-
-      // Check params are well formed
-      checkControlAccessParams(modified);
-   }
 }
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/QueryApiExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/QueryApiExpectTest.java
index dad3778..782be36 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/QueryApiExpectTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/QueryApiExpectTest.java
@@ -156,25 +156,21 @@
             .reference(CatalogReference.builder()
 		                  .type("application/vnd.vmware.vcloud.catalog+xml")
                         .name("QunyingTestCatalog")
-		                  .id("urn:vcloud:catalog:7212e451-76e1-4631-b2de-ba1dfd8080e4")
                         .href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4"))
                         .build())
             .reference(CatalogReference.builder()
 		                  .type("application/vnd.vmware.vcloud.catalog+xml")
                         .name("Public")
-                        .id("urn:vcloud:catalog:9e08c2f6-077a-42ce-bece-d5332e2ebb5c")
                         .href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/9e08c2f6-077a-42ce-bece-d5332e2ebb5c"))
                         .build())
             .reference(CatalogReference.builder()
 		                  .type("application/vnd.vmware.vcloud.catalog+xml")
                         .name("dantest")
-                        .id("urn:vcloud:catalog:b542aff4-9f97-4f51-a126-4330fbf62f02")
                         .href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/b542aff4-9f97-4f51-a126-4330fbf62f02"))
                         .build())
             .reference(CatalogReference.builder()
 		                  .type("application/vnd.vmware.vcloud.catalog+xml")
                         .name("test")
-                        .id("urn:vcloud:catalog:b7289d54-4ca4-497f-9a93-2d4afc97e3da")
                         .href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/b7289d54-4ca4-497f-9a93-2d4afc97e3da"))
                         .build())
             .build();
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/QueryApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/QueryApiLiveTest.java
index 158dd76..efccc33 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/QueryApiLiveTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/QueryApiLiveTest.java
@@ -18,9 +18,7 @@
  */
 package org.jclouds.vcloud.director.v1_5.features;
 
-import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.ENTITY_EQUAL;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.NOT_EMPTY_OBJECT_FMT;
-import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkEntityType;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertTrue;
@@ -34,8 +32,6 @@
 import java.util.Set;
 
 import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
-import org.jclouds.vcloud.director.v1_5.domain.Entity;
-import org.jclouds.vcloud.director.v1_5.domain.Link;
 import org.jclouds.vcloud.director.v1_5.domain.Resource;
 import org.jclouds.vcloud.director.v1_5.domain.Task;
 import org.jclouds.vcloud.director.v1_5.domain.VApp;
@@ -49,7 +45,6 @@
 import org.jclouds.vcloud.director.v1_5.domain.query.QueryResultVAppTemplateRecord;
 import org.jclouds.vcloud.director.v1_5.domain.query.QueryResultVMRecord;
 import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorApiLiveTest;
-import org.jclouds.vcloud.director.v1_5.predicates.ReferencePredicates;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
@@ -57,10 +52,10 @@
 import com.google.common.collect.Iterables;
 
 /**
-* Tests live behavior of {@link QueryApi}.
-* 
-* @author grkvlt@apache.org
-*/
+ * Tests live behavior of {@link QueryApi}.
+ * 
+ * @author grkvlt@apache.org
+ */
 @Test(groups = { "live", "user" }, singleThreaded = true, testName = "QueryApiLiveTest")
 public class QueryApiLiveTest extends BaseVCloudDirectorApiLiveTest {
 
@@ -69,104 +64,96 @@
     */
 
    private QueryApi queryApi;
-   private VAppTemplateApi vAppTemplateApi;
    private VAppApi vAppApi;
 
    private VApp vApp;
-   
+
    @AfterClass(alwaysRun = true)
    public void cleanUp() throws Exception {
-      if (vApp != null) cleanUpVApp(vApp);
+      if (vApp != null)
+         cleanUpVApp(vApp);
    }
 
    @Override
    @BeforeClass(alwaysRun = true)
    public void setupRequiredApis() {
       queryApi = context.getApi().getQueryApi();
-      vAppTemplateApi = context.getApi().getVAppTemplateApi();
       vAppApi = context.getApi().getVAppApi();
    }
 
-   @Test(description = "GET /entity/{id}")
-   public void testEntity() {
-      // Get a VAppTemplate to look up as an entity
-      VAppTemplate vAppTemplate = vAppTemplateApi.getVAppTemplate(vAppTemplateURI);
-      
-      // Method under test
-      Entity entity = queryApi.entity(vAppTemplate.getId());
-      
-      // Check returned entity
-      checkEntityType(entity);
-      
-      // Retrieve and check template using entity link
-      Link link = Iterables.find(entity.getLinks(), ReferencePredicates.<Link>typeEquals(VCloudDirectorMediaType.VAPP_TEMPLATE));
-      VAppTemplate retrieved = vAppTemplateApi.getVAppTemplate(link.getHref());
-      assertEquals(retrieved, vAppTemplate, String.format(ENTITY_EQUAL, "VAppTemplate"));
-      
-   }
-
    @Test(description = "GET /query")
    public void testQuery() {
-      VAppTemplate vAppTemplate = vAppTemplateApi.getVAppTemplate(vAppTemplateURI);
-      QueryResultRecords queryResult = queryApi.query("vAppTemplate", String.format("name==%s", vAppTemplate.getName()));
+      VAppTemplate vAppTemplate = lazyGetVAppTemplate();
+      QueryResultRecords queryResult = queryApi
+               .query("vAppTemplate", String.format("name==%s", vAppTemplate.getName()));
       Set<URI> hrefs = toHrefs(queryResult);
-      
-      assertRecordTypes(queryResult, Arrays.asList(VCloudDirectorMediaType.VAPP_TEMPLATE, null), QueryResultVAppTemplateRecord.class);
-      assertTrue(hrefs.contains(vAppTemplateURI), "VAppTemplates query result should include vAppTemplate "+vAppTemplateURI+"; but only has "+hrefs);
+
+      assertRecordTypes(queryResult, Arrays.asList(VCloudDirectorMediaType.VAPP_TEMPLATE, null),
+               QueryResultVAppTemplateRecord.class);
+      assertTrue(hrefs.contains(vAppTemplate.getHref()), "VAppTemplates query result should include vAppTemplate "
+               + vAppTemplate.getHref() + "; but only has " + hrefs);
    }
 
    @Test(description = "GET /catalogs/query")
    public void testQueryAllCatalogs() {
       QueryResultRecords catalogRecords = queryApi.catalogsQueryAll();
-      assertFalse(catalogRecords.getRecords().isEmpty(), String.format(NOT_EMPTY_OBJECT_FMT, "CatalogRecord", "QueryResultRecords"));
+      assertFalse(catalogRecords.getRecords().isEmpty(),
+               String.format(NOT_EMPTY_OBJECT_FMT, "CatalogRecord", "QueryResultRecords"));
    }
 
    @Test(description = "GET /catalogs/query?format=references", dependsOnMethods = { "testQueryAllCatalogs" })
    public void testQueryAllCatalogReferences() {
       CatalogReferences catalogReferences = queryApi.catalogReferencesQueryAll();
-      assertFalse(catalogReferences.getReferences().isEmpty(), String.format(NOT_EMPTY_OBJECT_FMT, "CatalogReference", "CatalogReferences"));
+      assertFalse(catalogReferences.getReferences().isEmpty(),
+               String.format(NOT_EMPTY_OBJECT_FMT, "CatalogReference", "CatalogReferences"));
    }
-   
+
    @Test(description = "GET /vAppTemplates/query")
    public void testQueryAllVAppTemplates() {
       QueryResultRecords queryResult = queryApi.vAppTemplatesQueryAll();
       Set<URI> hrefs = toHrefs(queryResult);
-      
-      assertRecordTypes(queryResult, Arrays.asList(VCloudDirectorMediaType.VAPP_TEMPLATE, null), QueryResultVAppTemplateRecord.class);
-      assertTrue(hrefs.contains(vAppTemplateURI), "VAppTemplates query result should include vAppTemplate "+vAppTemplateURI+"; but only has "+hrefs);
+
+      assertRecordTypes(queryResult, Arrays.asList(VCloudDirectorMediaType.VAPP_TEMPLATE, null),
+               QueryResultVAppTemplateRecord.class);
+      assertTrue(hrefs.contains(lazyGetVAppTemplate().getHref()), "VAppTemplates query result should include vAppTemplate "
+               + lazyGetVAppTemplate().getHref() + "; but only has " + hrefs);
    }
-   
+
    @Test(description = "GET /vAppTemplates/query?filter")
    public void testQueryVAppTemplatesWithFilter() {
-      VAppTemplate vAppTemplate = vAppTemplateApi.getVAppTemplate(vAppTemplateURI);
+      VAppTemplate vAppTemplate = lazyGetVAppTemplate();
       QueryResultRecords queryResult = queryApi.vAppTemplatesQuery(String.format("name==%s", vAppTemplate.getName()));
       Set<URI> hrefs = toHrefs(queryResult);
-      
-      assertRecordTypes(queryResult, Arrays.asList(VCloudDirectorMediaType.VAPP_TEMPLATE, null), QueryResultVAppTemplateRecord.class);
-      assertTrue(hrefs.contains(vAppTemplateURI), "VAppTemplates query result should have found vAppTemplate "+vAppTemplateURI);
+
+      assertRecordTypes(queryResult, Arrays.asList(VCloudDirectorMediaType.VAPP_TEMPLATE, null),
+               QueryResultVAppTemplateRecord.class);
+      assertTrue(hrefs.contains(vAppTemplate.getHref()), "VAppTemplates query result should have found vAppTemplate "
+               + vAppTemplate.getHref());
    }
 
    @Test(description = "GET /vApps/query")
    public void testQueryAllVApps() {
       vApp = instantiateVApp();
-      
+
       QueryResultRecords queryResult = queryApi.vAppsQueryAll();
       Set<URI> hrefs = toHrefs(queryResult);
-      
+
       assertRecordTypes(queryResult, Arrays.asList(VCloudDirectorMediaType.VAPP, null), QueryResultVAppRecord.class);
-      assertTrue(hrefs.contains(vApp.getHref()), "VApp query result should include vapp "+vApp.getHref()+"; but only has "+hrefs);
+      assertTrue(hrefs.contains(vApp.getHref()), "VApp query result should include vapp " + vApp.getHref()
+               + "; but only has " + hrefs);
    }
-   
-   @Test(description = "GET /vApps/query?filter", dependsOnMethods = { "testQueryAllVApps" } )
+
+   @Test(description = "GET /vApps/query?filter", dependsOnMethods = { "testQueryAllVApps" })
    public void testQueryVAppsWithFilter() {
       QueryResultRecords queryResult = queryApi.vAppsQuery(String.format("name==%s", vApp.getName()));
       Set<URI> hrefs = toHrefs(queryResult);
-      
+
       assertRecordTypes(queryResult, Arrays.asList(VCloudDirectorMediaType.VAPP, null), QueryResultVAppRecord.class);
-      assertEquals(hrefs, Collections.singleton(vApp.getHref()), "VApps query result should have found vApp "+vApp.getHref());
+      assertEquals(hrefs, Collections.singleton(vApp.getHref()),
+               "VApps query result should have found vApp " + vApp.getHref());
    }
-   
-   @Test(description = "GET /vms/query", dependsOnMethods = { "testQueryAllVApps" } )
+
+   @Test(description = "GET /vms/query", dependsOnMethods = { "testQueryAllVApps" })
    public void testQueryAllVms() {
       // Wait for vApp to have been entirely instantiated
       Task instantiateTask = Iterables.getFirst(vApp.getTasks(), null);
@@ -175,55 +162,60 @@
       }
 
       // Start the vApp so that it has VMs
-      Task task = vAppApi.powerOn(vApp.getHref());
+      Task task = vAppApi.powerOn(vApp.getId());
       assertTaskSucceedsLong(task);
-      
-      vApp = vAppApi.getVApp(vApp.getHref()); // reload, so it has the VMs
+
+      vApp = vAppApi.get(vApp.getId()); // reload, so it has the VMs
       List<Vm> vms = vApp.getChildren().getVms();
       Set<URI> vmHrefs = toHrefs(vms);
 
       // Method under test: do the query
       QueryResultRecords queryResult = queryApi.vmsQueryAll();
       Set<URI> hrefs = toHrefs(queryResult);
-      
+
       assertRecordTypes(queryResult, Arrays.asList(VCloudDirectorMediaType.VM, null), QueryResultVMRecord.class);
-      assertTrue(hrefs.containsAll(vmHrefs), "VMs query result should include vms "+vmHrefs+"; but only has "+hrefs);
+      assertTrue(hrefs.containsAll(vmHrefs), "VMs query result should include vms " + vmHrefs + "; but only has "
+               + hrefs);
    }
-   
-   @Test(description = "GET /vms/query?filter", dependsOnMethods = { "testQueryAllVms" } )
+
+   @Test(description = "GET /vms/query?filter", dependsOnMethods = { "testQueryAllVms" })
    public void testQueryAllVmsWithFilter() {
       List<Vm> vms = vApp.getChildren().getVms();
       Set<URI> vmHrefs = toHrefs(vms);
-      
+
       QueryResultRecords queryResult = queryApi.vmsQuery(String.format("containerName==%s", vApp.getName()));
       Set<URI> hrefs = toHrefs(queryResult);
-      
+
       assertRecordTypes(queryResult, Arrays.asList(VCloudDirectorMediaType.VM, null), QueryResultVMRecord.class);
-      assertEquals(hrefs, vmHrefs, "VMs query result should equal vms of vApp "+vApp.getName()+" ("+vmHrefs+"); but only has "+hrefs);
+      assertEquals(hrefs, vmHrefs, "VMs query result should equal vms of vApp " + vApp.getName() + " (" + vmHrefs
+               + "); but only has " + hrefs);
    }
-   
+
    @Test(description = "GET /mediaList/query")
    public void testQueryAllMedia() {
       QueryResultRecords queryResult = queryApi.mediaListQueryAll();
-      
+
       assertRecordTypes(queryResult, Arrays.asList(VCloudDirectorMediaType.VAPP, null), QueryResultMediaRecord.class);
    }
-   
+
    @Test(description = "GET /mediaList/query?filter")
    public void testQueryMediaWithFilter() {
       String mediaName = "abc";
       QueryResultRecords queryResult = queryApi.mediaListQuery(String.format("name==%s", mediaName));
-      
+
       assertRecordTypes(queryResult, Arrays.asList(VCloudDirectorMediaType.VAPP, null), QueryResultMediaRecord.class);
    }
-   
-   private static void assertRecordTypes(QueryResultRecords queryResult, Collection<String> validTypes, Class<?> validClazz) {
+
+   private static void assertRecordTypes(QueryResultRecords queryResult, Collection<String> validTypes,
+            Class<?> validClazz) {
       for (QueryResultRecordType record : queryResult.getRecords()) {
-         assertTrue(validTypes.contains(record.getType()), "invalid type for query result record, "+record.getType()+"; valid types are "+validTypes);
-         assertEquals(record.getClass(), validClazz, "invalid type for query result record, "+record.getClass()+"; expected "+validClazz);
+         assertTrue(validTypes.contains(record.getType()), "invalid type for query result record, " + record.getType()
+                  + "; valid types are " + validTypes);
+         assertEquals(record.getClass(), validClazz, "invalid type for query result record, " + record.getClass()
+                  + "; expected " + validClazz);
       }
    }
-   
+
    private Set<URI> toHrefs(QueryResultRecords queryResult) {
       Set<URI> hrefs = new LinkedHashSet<URI>();
       for (QueryResultRecordType record : queryResult.getRecords()) {
@@ -231,7 +223,7 @@
       }
       return hrefs;
    }
-   
+
    private Set<URI> toHrefs(Iterable<? extends Resource> resources) {
       Set<URI> hrefs = new LinkedHashSet<URI>();
       for (Resource resource : resources) {
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/TaskApiExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/TaskApiExpectTest.java
index 26e3143..a0091c8 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/TaskApiExpectTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/TaskApiExpectTest.java
@@ -18,9 +18,10 @@
  */
 package org.jclouds.vcloud.director.v1_5.features;
 
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ENTITY;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.TASK;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.TASKS_LIST;
 import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNull;
-import static org.testng.Assert.fail;
 
 import java.net.URI;
 
@@ -28,9 +29,6 @@
 
 import org.jclouds.http.HttpRequest;
 import org.jclouds.http.HttpResponse;
-import org.jclouds.vcloud.director.v1_5.VCloudDirectorException;
-import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
-import org.jclouds.vcloud.director.v1_5.domain.Error;
 import org.jclouds.vcloud.director.v1_5.domain.Reference;
 import org.jclouds.vcloud.director.v1_5.domain.Task;
 import org.jclouds.vcloud.director.v1_5.domain.TasksList;
@@ -45,183 +43,140 @@
  */
 @Test(groups = { "unit", "user" }, singleThreaded = true, testName = "TaskApiExpectTest")
 public class TaskApiExpectTest extends VCloudDirectorAdminApiExpectTest {
-
-   @Test
-   public void testTaskListForValidOrg() {
-      HttpRequest taskRequest = HttpRequest.builder()
-              .method("GET")
-              .endpoint(endpoint + "/tasksList/6f312e42-cd2b-488d-a2bb-97519cd57ed0")
-              .addHeader("Accept", "*/*")
-              .addHeader("x-vcloud-authorization", token)
-              .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
-
-      HttpResponse taskResponse = HttpResponse.builder()
-              .statusCode(200)
-              .payload(payloadFromResourceWithContentType("/task/taskslist.xml", VCloudDirectorMediaType.TASKS_LIST + ";version=1.5"))
-              .build();
-      
-      HttpRequest orgRequest = HttpRequest.builder().method("GET")
-            .endpoint(endpoint + "/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0")
+   static String tasksList = "6f312e42-cd2b-488d-a2bb-97519cd57ed0";
+   static URI tasksListHref = URI.create(endpoint + "/tasksList/" + tasksList);
+   
+   HttpRequest getTasksList = HttpRequest.builder()
+            .method("GET")
+            .endpoint(tasksListHref)
             .addHeader("Accept", "*/*")
             .addHeader("x-vcloud-authorization", token)
-            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+            .build();
 
-		HttpResponse orgResponse = HttpResponse.builder()
+    HttpResponse getTasksListResponse = HttpResponse.builder()
             .statusCode(200)
-            .payload(payloadFromResourceWithContentType("/org/org.xml", VCloudDirectorMediaType.TASKS_LIST + ";version=1.5"))
+            .payload(payloadFromResourceWithContentType("/task/tasksList.xml", TASKS_LIST + ";version=1.5"))
             .build();
-
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, taskRequest, taskResponse, orgRequest, orgResponse);
-
-      TasksList expected = TasksList.builder()
-              .name("Tasks Lists")
-              .type("application/vnd.vmware.vcloud.tasksList+xml")
-              .href(URI.create("https://vcloudbeta.bluelock.com/api/tasksList/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
-              .task(taskOne())
-              .task(taskTwo())
-              .build();
-
-      assertEquals(api.getTaskApi().getTaskList(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0")), expected);
-   }
-
+    
    @Test
-   public void testTaskListForInvalidOrgId() {
-      HttpRequest taskRequest = HttpRequest.builder().method("GET")
-              .endpoint(endpoint + "/tasksList/NOTAUUID")
-              .addHeader("Accept", "*/*")
-              .addHeader("x-vcloud-authorization", token).build();
-
-      HttpResponse taskResponse = HttpResponse.builder().build();
-      
-      HttpRequest orgRequest = HttpRequest.builder().method("GET")
-            .endpoint(endpoint + "/org/NOTAUUID")
-            .addHeader("Accept", "*/*")
-            .addHeader("x-vcloud-authorization", token)
-            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
-
-      HttpResponse orgResponse = HttpResponse.builder()
-            .statusCode(400)
-            .payload(payloadFromResourceWithContentType("/org/error400.xml", VCloudDirectorMediaType.ERROR + ";version=1.5"))
-            .build();
-
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, taskRequest, taskResponse, orgRequest, orgResponse);
-
-      Error expected = Error.builder()
-            .message("validation error on field 'id': String value has invalid format or length")
-            .majorErrorCode(400)
-            .minorErrorCode("BAD_REQUEST")
-            .build();
-
-      try {
-         api.getTaskApi().getTaskList(URI.create("https://vcloudbeta.bluelock.com/api/org/NOTAUUID"));
-         fail("Should give HTTP 400 error");
-      } catch (VCloudDirectorException vde) {
-         assertEquals(vde.getError(), expected);
-      } catch (Exception e) {
-         fail("Should have thrown a VCloudDirectorException");
-      }
+   public void testGetTasksListHref() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, getTasksList, getTasksListResponse);
+      assertEquals(api.getTaskApi().getTasksList(tasksListHref), tasksList());
    }
-
-   @Test
-   public void testTaskListForNotFoundOrgId() {
-      HttpRequest taskRequest = HttpRequest.builder().method("GET")
-            .endpoint(endpoint + "/tasksList/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")
-            .addHeader("Accept", "*/*")
-            .addHeader("x-vcloud-authorization", token)
-            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
-
-      HttpResponse taskResponse = HttpResponse.builder().build();
-      
-      HttpRequest orgRequest = HttpRequest.builder().method("GET")
-            .endpoint(endpoint + "/org/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")
-            .addHeader("Accept", "*/*")
-            .addHeader("x-vcloud-authorization", token)
-            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
-
-      HttpResponse orgResponse = HttpResponse.builder()
-            .statusCode(403)
-            .payload(payloadFromResourceWithContentType("/org/error403-fake.xml", VCloudDirectorMediaType.ERROR + ";version=1.5"))
-            .build();
-
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, taskRequest, taskResponse, orgRequest, orgResponse);
-
-		assertNull(api.getTaskApi().getTaskList(URI.create("https://vcloudbeta.bluelock.com/api/org/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")));
-   }
-
-   @Test
-   public void testGetTaskForTaskRef() {
-      HttpRequest taskRequest = HttpRequest.builder()
-              .method("GET")
-              .endpoint(endpoint + "/task/5fcd2af3-d0ec-45ce-9451-8c585a2c766b")
-              .addHeader("Accept", "*/*")
-              .addHeader("x-vcloud-authorization", token)
-              .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
-
-      HttpResponse taskResponse = HttpResponse.builder()
-              .statusCode(200)
-              .payload(payloadFromResourceWithContentType("/task/task.xml", VCloudDirectorMediaType.TASK + ";version=1.5"))
-              .build();
-
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, taskRequest, taskResponse);
-
-      URI taskUri = URI.create(endpoint + "/task/5fcd2af3-d0ec-45ce-9451-8c585a2c766b");
-      
-      //TODO: incorrect relationship, as task should not have a nested task container!!
-      Task expected = taskOne();
-
-      assertEquals(api.getTaskApi().getTask(taskUri), expected);
-   }
-
-   @Test
-   public void testCancelTaskByTaskRef() {
-      HttpRequest taskRequest = HttpRequest.builder()
-            .method("POST")
-            .endpoint(endpoint + "/task/5fcd2af3-d0ec-45ce-9451-8c585a2c766b/action/cancel")
-            .addHeader("Accept", "*/*")
-            .addHeader("x-vcloud-authorization", token)
-            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
-
-      HttpResponse taskResponse = HttpResponse.builder()
-            .statusCode(200)
-            .build();
-
-      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, taskRequest, taskResponse);
-
-      URI taskUri = URI.create(endpoint + "/task/5fcd2af3-d0ec-45ce-9451-8c585a2c766b");
-      
-      api.getTaskApi().cancelTask(taskUri);
-   }
-
-   public static Task taskOne() {
-      return Task.builder()
-		            .type("application/vnd.vmware.vcloud.task+xml")
-		            .name("task")
-		            .id("urn:vcloud:task:5fcd2af3-d0ec-45ce-9451-8c585a2c766b")
-		            .href(URI.create("https://vcloudbeta.bluelock.com/api/task/5fcd2af3-d0ec-45ce-9451-8c585a2c766b"))
-		            .status("success")
-		            .operation("Created Catalog QunyingTestCatalog(7212e451-76e1-4631-b2de-ba1dfd8080e4)")
-		            .operationName("catalogCreateCatalog")
-		            .startTime(dateService.iso8601DateParse("2012-02-07T00:16:28.450-05:00"))
-		            .endTime(dateService.iso8601DateParse("2012-02-07T00:16:28.867-05:00"))
-		            .expiryTime(dateService.iso8601DateParse("2012-05-07T00:16:28.450-04:00"))
-		            .owner(Reference.builder()
-		                  .type("application/vnd.vmware.vcloud.catalog+xml")
-		                  .name("QunyingTestCatalog")
-		                  .href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4"))
-		                  .build())
-		            .user(Reference.builder()
-		                  .type("application/vnd.vmware.admin.user+xml")
-		                  .name("JClouds")
-		                  .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
-		                  .build())
-		            .org(Reference.builder()
-		                  .type("application/vnd.vmware.vcloud.org+xml")
-		                  .name("JClouds")
-		                  .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
-		                  .build())
-		            .build();
+  
+   private TasksList tasksList() {
+      return TasksList.builder()
+               .name("Tasks Lists")
+               .type("application/vnd.vmware.vcloud.tasksList+xml")
+               .href(URI.create("https://vcloudbeta.bluelock.com/api/tasksList/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
+               .task(task())
+               .task(taskTwo())
+               .build();
    }
    
+   static String task = "5fcd2af3-d0ec-45ce-9451-8c585a2c766b";
+   static String taskUrn = "urn:vcloud:task:" + task;
+   static URI taskHref = URI.create(endpoint + "/task/" + task);
+   
+   HttpRequest get = HttpRequest.builder()
+            .method("GET")
+            .endpoint(taskHref)
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+            .build();
+
+    HttpResponse getResponse = HttpResponse.builder()
+            .statusCode(200)
+            .payload(payloadFromResourceWithContentType("/task/task.xml", TASK + ";version=1.5"))
+            .build();
+    
+   @Test
+   public void testGetTaskHref() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, get, getResponse);
+      assertEquals(api.getTaskApi().get(taskHref), task());
+   }
+   
+   HttpRequest resolveTask = HttpRequest.builder()
+            .method("GET")
+            .endpoint(endpoint + "/entity/" + taskUrn)
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+            .build();
+   
+   String taskEntity = asString(createXMLBuilder("Entity").a("xmlns", "http://www.vmware.com/vcloud/v1.5")
+                                                             .a("name", taskUrn)
+                                                             .a("id", taskUrn)
+                                                             .a("type", ENTITY)
+                                                             .a("href", endpoint + "/entity/" + taskUrn)
+                                  .e("Link").a("rel", "alternate").a("type", TASK).a("href", taskHref.toString()).up());
+   
+   HttpResponse resolveTaskResponse = HttpResponse.builder()
+           .statusCode(200)
+           .payload(payloadFromStringWithContentType(taskEntity, ENTITY + ";version=1.5"))
+           .build();
+   
+   @Test
+   public void testGetTaskUrn() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, resolveTask, resolveTaskResponse, get, getResponse);
+      assertEquals(api.getTaskApi().get(taskUrn), task());
+   }
+
+   public static Task task() {
+      return Task.builder()
+               .type("application/vnd.vmware.vcloud.task+xml")
+               .name("task")
+               .id("urn:vcloud:task:5fcd2af3-d0ec-45ce-9451-8c585a2c766b")
+               .href(URI.create("https://vcloudbeta.bluelock.com/api/task/5fcd2af3-d0ec-45ce-9451-8c585a2c766b"))
+               .status("success")
+               .operation("Created Catalog QunyingTestCatalog(7212e451-76e1-4631-b2de-ba1dfd8080e4)")
+               .operationName("catalogCreateCatalog")
+               .startTime(dateService.iso8601DateParse("2012-02-07T00:16:28.450-05:00"))
+               .endTime(dateService.iso8601DateParse("2012-02-07T00:16:28.867-05:00"))
+               .expiryTime(dateService.iso8601DateParse("2012-05-07T00:16:28.450-04:00"))
+               .owner(Reference.builder()
+                     .type("application/vnd.vmware.vcloud.catalog+xml")
+                     .name("QunyingTestCatalog")
+                     .href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4"))
+                     .build())
+               .user(Reference.builder()
+                     .type("application/vnd.vmware.admin.user+xml")
+                     .name("JClouds")
+                     .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
+                     .build())
+               .org(Reference.builder()
+                     .type("application/vnd.vmware.vcloud.org+xml")
+                     .name("JClouds")
+                     .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
+                     .build())
+               .build();
+   }
+
+   HttpRequest cancel = HttpRequest.builder()
+            .method("POST")
+            .endpoint(taskHref+ "/action/cancel")
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
+
+   HttpResponse cancelResponse = HttpResponse.builder()
+            .statusCode(200)
+            .build();
+   
+   @Test
+   public void testCancelTaskHref() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, cancel, cancelResponse);
+      api.getTaskApi().cancel(taskHref);
+   }
+   
+   @Test
+   public void testCancelTaskUrn() {
+      VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, resolveTask, resolveTaskResponse, cancel, cancelResponse);
+      api.getTaskApi().cancel(taskHref);
+   }
+
    public static Task taskTwo() {
       return Task.builder()
 		            .type("application/vnd.vmware.vcloud.task+xml")
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/TaskApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/TaskApiLiveTest.java
index c33c208..8f8db6c 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/TaskApiLiveTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/TaskApiLiveTest.java
@@ -25,12 +25,15 @@
 
 import java.net.URI;
 
+import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
 import org.jclouds.vcloud.director.v1_5.domain.Reference;
 import org.jclouds.vcloud.director.v1_5.domain.Task;
 import org.jclouds.vcloud.director.v1_5.domain.TasksList;
 import org.jclouds.vcloud.director.v1_5.domain.VApp;
+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.internal.BaseVCloudDirectorApiLiveTest;
+import org.jclouds.vcloud.director.v1_5.predicates.LinkPredicates;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
@@ -79,13 +82,17 @@
 
    @Test(description = "GET /tasksList/{id}")
    public void testGetTaskList() {
-      orgList = orgApi.getOrgList();
-      Reference orgRef = Iterables.getFirst(orgList.getOrgs(), null);
+      orgList = orgApi.list();
+      Reference orgRef = Iterables.getFirst(orgList, null);
       assertNotNull(orgRef);
       orgURI = orgRef.getHref();
       
+      Org org = orgApi.get(orgURI);
+      
+      URI taskListHref = Iterables.find(org.getLinks(), LinkPredicates.typeEquals(VCloudDirectorMediaType.TASKS_LIST)).getHref();
+
       // Call the method being tested
-      taskList = taskApi.getTaskList(orgURI);
+      taskList = taskApi.getTasksList(taskListHref);
       
       // NOTE The environment MUST have ...
       
@@ -105,7 +112,7 @@
       taskURI = taskRef.getHref();
 
       // Call the method being tested
-      task = taskApi.getTask(taskURI);
+      task = taskApi.get(taskURI);
 
       // Check required elements and attributes
       checkTask(task);
@@ -122,7 +129,7 @@
       assertTaskStatusEventually(task, Task.Status.RUNNING, ImmutableSet.of(Task.Status.ERROR, Task.Status.ABORTED));
 
       // Call the method being tested
-      taskApi.cancelTask(taskURI);
+      taskApi.cancel(taskURI);
       assertTaskStatusEventually(task, Task.Status.CANCELED, ImmutableSet.of(Task.Status.ERROR, Task.Status.ABORTED, Task.Status.SUCCESS));
    }
 }
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppApiExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppApiExpectTest.java
index 8c47dd8..3f0a622 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppApiExpectTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppApiExpectTest.java
@@ -82,15 +82,15 @@
       
       VApp expected = getVApp();
 
-      assertEquals(api.getVAppApi().getVApp(vAppURI), expected);
+      assertEquals(api.getVAppApi().get(vAppURI), expected);
    }
 
    @Test(enabled = false)
-   public void testModifyVApp() {
+   public void testEditVApp() {
       VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
          new VcloudHttpRequestPrimer()
             .apiCommand("PUT", vAppId)
-            .xmlFilePayload("/vApp/modifyVApp.xml", VCloudDirectorMediaType.VAPP)
+            .xmlFilePayload("/vApp/editVApp.xml", VCloudDirectorMediaType.VAPP)
             .acceptAnyMedia()
             .httpRequestBuilder().build(), 
          new VcloudHttpResponsePrimer()
@@ -101,25 +101,25 @@
 		modified.setName("new-name");
 		modified.setDescription("New Description");
 		
-		Task expected = modifyVAppTask();
+		Task expected = editVAppTask();
 		
-		assertEquals(api.getVAppApi().modifyVApp(vAppURI, modified), expected);
+		assertEquals(api.getVAppApi().edit(vAppURI, modified), expected);
    }
 
    @Test(enabled = false)
-   public void testDeleteVApp() {
+   public void testRemoveVApp() {
       VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
          new VcloudHttpRequestPrimer()
             .apiCommand("DELETE", vAppId)
             .acceptAnyMedia()
             .httpRequestBuilder().build(), 
          new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/vApp/deleteVAppTask.xml", VCloudDirectorMediaType.TASK)
+            .xmlFilePayload("/vApp/removeVAppTask.xml", VCloudDirectorMediaType.TASK)
             .httpResponseBuilder().build());
 		
-		Task expected = deleteVAppTask();
+		Task expected = removeVAppTask();
 		
-		assertEquals(api.getVAppApi().deleteVApp(vAppURI), expected);
+		assertEquals(api.getVAppApi().remove(vAppURI), expected);
    }
 
    @Test(enabled = false)
@@ -138,7 +138,7 @@
 		
 		ControlAccessParams expected = controlAccessParams();
 		         
-		assertEquals(api.getVAppApi().modifyControlAccess(vAppURI, params), expected);
+		assertEquals(api.getVAppApi().editControlAccess(vAppURI, params), expected);
    }
 
    @Test(enabled = false)
@@ -349,12 +349,12 @@
             .acceptAnyMedia()
             .httpRequestBuilder().build(), 
          new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/vApp/getControlAccess.xml", VCloudDirectorMediaType.VAPP)
+            .xmlFilePayload("/vApp/getAccessControl.xml", VCloudDirectorMediaType.VAPP)
             .httpResponseBuilder().build());
 
-      ControlAccessParams expected = getControlAccessParams();
+      ControlAccessParams expected = getAccessControlParams();
 
-      assertEquals(api.getVAppApi().getControlAccess(vAppURI), expected);
+      assertEquals(api.getVAppApi().getAccessControl(vAppURI), expected);
    }
 
    @Test(enabled = false)
@@ -374,23 +374,23 @@
    }
 
    @Test(enabled = false)
-   public void testModifyLeaseSettingsSection() {
+   public void testEditLeaseSettingsSection() {
       VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
          new VcloudHttpRequestPrimer()
             .apiCommand("PUT", vAppId + "/leaseSettingsSection")
-            .xmlFilePayload("/vApp/modifyLeaseSettingsSection.xml", VCloudDirectorMediaType.LEASE_SETTINGS_SECTION)
+            .xmlFilePayload("/vApp/editLeaseSettingsSection.xml", VCloudDirectorMediaType.LEASE_SETTINGS_SECTION)
             .acceptAnyMedia()
             .httpRequestBuilder().build(), 
          new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/vApp/modifyLeaseSettingsSectionTask.xml", VCloudDirectorMediaType.TASK)
+            .xmlFilePayload("/vApp/editLeaseSettingsSectionTask.xml", VCloudDirectorMediaType.TASK)
             .httpResponseBuilder().build());
       
       LeaseSettingsSection section = getLeaseSettingsSection().toBuilder()
             .build();
 		
-		Task expected = modifyLeaseSettingsSectionTask();
+		Task expected = editLeaseSettingsSectionTask();
 		
-		assertEquals(api.getVAppApi().modifyLeaseSettingsSection(vAppURI, section), expected);
+		assertEquals(api.getVAppApi().editLeaseSettingsSection(vAppURI, section), expected);
    }
 
    @Test(enabled = false)
@@ -410,23 +410,23 @@
    }
 
    @Test(enabled = false)
-   public void testModifyNetworkConfigSection() {
+   public void testEditNetworkConfigSection() {
       VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
          new VcloudHttpRequestPrimer()
             .apiCommand("PUT", vAppId + "/networkConfigSection")
-            .xmlFilePayload("/vApp/modifyNetworkConfigSection.xml", VCloudDirectorMediaType.NETWORK_CONFIG_SECTION)
+            .xmlFilePayload("/vApp/editNetworkConfigSection.xml", VCloudDirectorMediaType.NETWORK_CONFIG_SECTION)
             .acceptAnyMedia()
             .httpRequestBuilder().build(), 
          new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/vApp/modifyNetworkConfigSectionTask.xml", VCloudDirectorMediaType.TASK)
+            .xmlFilePayload("/vApp/editNetworkConfigSectionTask.xml", VCloudDirectorMediaType.TASK)
             .httpResponseBuilder().build());
 		      
 		NetworkConfigSection section = getNetworkConfigSection().toBuilder()
 		      .build();
 		
-		Task expected = modifyNetworkConfigSectionTask();
+		Task expected = editNetworkConfigSectionTask();
 		
-		assertEquals(api.getVAppApi().modifyNetworkConfigSection(vAppURI, section), expected);
+		assertEquals(api.getVAppApi().editNetworkConfigSection(vAppURI, section), expected);
    }
 
    @Test(enabled = false)
@@ -462,11 +462,11 @@
    }
 
    @Test(enabled = false)
-   public void testModifyOwner() {
+   public void testEditOwner() {
       VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
          new VcloudHttpRequestPrimer()
             .apiCommand("PUT", vAppId + "/owner")
-            .xmlFilePayload("/vApp/modifyOwner.xml", VCloudDirectorMediaType.OWNER)
+            .xmlFilePayload("/vApp/editOwner.xml", VCloudDirectorMediaType.OWNER)
             .acceptAnyMedia()
             .httpRequestBuilder().build(), 
          new VcloudHttpResponsePrimer()
@@ -475,7 +475,7 @@
       Owner owner = Owner.builder()
             .build();
 		
-		api.getVAppApi().modifyOwner(vAppURI, owner);
+		api.getVAppApi().editOwner(vAppURI, owner);
    }
 
    @Test(enabled = false)
@@ -495,20 +495,20 @@
    }
 
    @Test(enabled = false)
-   public void testModifyProductSections() {
+   public void testEditProductSections() {
       VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
          new VcloudHttpRequestPrimer()
             .apiCommand("PUT", vAppId + "/productSections")
-            .xmlFilePayload("/vApp/modifyProductSections.xml", VCloudDirectorMediaType.PRODUCT_SECTION_LIST)
+            .xmlFilePayload("/vApp/editProductSections.xml", VCloudDirectorMediaType.PRODUCT_SECTION_LIST)
             .acceptAnyMedia()
             .httpRequestBuilder().build(), 
          new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/vApp/modifyProductSections.xml", VCloudDirectorMediaType.VAPP)
+            .xmlFilePayload("/vApp/editProductSections.xml", VCloudDirectorMediaType.VAPP)
             .httpResponseBuilder().build());
 
-         Task expected = modifyProductSectionsTask();
+         Task expected = editProductSectionsTask();
 
-         assertEquals(api.getVAppApi().modifyProductSections(vAppURI, null), expected);
+         assertEquals(api.getVAppApi().editProductSections(vAppURI, null), expected);
    }
 
    @Test(enabled = false)
@@ -528,23 +528,23 @@
    }
 
    @Test(enabled = false)
-   public void testModifyStartupSection() {
+   public void testEditStartupSection() {
       VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
          new VcloudHttpRequestPrimer()
             .apiCommand("PUT", vAppId + "/startupSection")
-            .xmlFilePayload("/vApp/modifyStartupSection.xml", VCloudDirectorMediaType.STARTUP_SECTION)
+            .xmlFilePayload("/vApp/editStartupSection.xml", VCloudDirectorMediaType.STARTUP_SECTION)
             .acceptAnyMedia()
             .httpRequestBuilder().build(), 
          new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/vApp/modifyStartupSectionTask.xml", VCloudDirectorMediaType.TASK)
+            .xmlFilePayload("/vApp/editStartupSectionTask.xml", VCloudDirectorMediaType.TASK)
             .httpResponseBuilder().build());
       
       StartupSection section = null; // getStartupSection().toBuilder()
 //            .build();
 		
-		Task expected = modifyStartupSectionTask();
+		Task expected = editStartupSectionTask();
 		
-		assertEquals(api.getVAppApi().modifyStartupSection(vAppURI, section), expected);
+		assertEquals(api.getVAppApi().editStartupSection(vAppURI, section), expected);
    }
 
    public static VApp getVApp() {
@@ -571,14 +571,14 @@
       return vApp;
    }
 
-   public static Task modifyVAppTask() {
+   public static Task editVAppTask() {
       Task task = Task.builder()
             .build();
 
       return task;
    }
 
-   public static Task deleteVAppTask() {
+   public static Task removeVAppTask() {
       Task task = Task.builder()
             .build();
 
@@ -690,7 +690,7 @@
       return task;
    }
 
-   public static ControlAccessParams getControlAccessParams() {
+   public static ControlAccessParams getAccessControlParams() {
       ControlAccessParams params = ControlAccessParams.builder()
             .build();
 
@@ -704,7 +704,7 @@
       return section;
    }
 
-   public static Task modifyGuestCustomizationSectionTask() {
+   public static Task editGuestCustomizationSectionTask() {
       Task task = Task.builder()
             .build();
 
@@ -718,7 +718,7 @@
       return section;
    }
 
-   public static Task modifyLeaseSettingsSectionTask() {
+   public static Task editLeaseSettingsSectionTask() {
       Task task = Task.builder()
             .build();
 
@@ -746,7 +746,7 @@
       return section;
    }
 
-   public static Task modifyNetworkConfigSectionTask() {
+   public static Task editNetworkConfigSectionTask() {
       Task task = Task.builder()
             .build();
 
@@ -760,7 +760,7 @@
       return section;
    }
 
-   public static Task modifyNetworkConnectionSectionTask() {
+   public static Task editNetworkConnectionSectionTask() {
       Task task = Task.builder()
             .build();
 
@@ -781,7 +781,7 @@
       return section;
    }
 
-   public static Task modifyOperatingSystemSectionTask() {
+   public static Task editOperatingSystemSectionTask() {
       Task task = Task.builder()
             .build();
 
@@ -795,7 +795,7 @@
       return owner;
    }
 
-   public static Task modifyOwnerTask() {
+   public static Task editOwnerTask() {
       Task task = Task.builder()
             .build();
 
@@ -809,7 +809,7 @@
       return sectionItems;
    }
 
-   public static Task modifyProductSectionsTask() {
+   public static Task editProductSectionsTask() {
       Task task = Task.builder()
             .build();
 
@@ -857,7 +857,7 @@
       return section;
    }
 
-   public static Task modifyStartupSectionTask() {
+   public static Task editStartupSectionTask() {
       Task task = Task.builder()
             .build();
 
@@ -871,7 +871,7 @@
       return section;
    }
 
-   public static Task modifyVirtualHardwareSectionTask() {
+   public static Task editVirtualHardwareSectionTask() {
       Task task = Task.builder()
             .build();
 
@@ -885,7 +885,7 @@
       return cpu;
    }
 
-   public static Task modifyVirtualHardwareSectionCpuTask() {
+   public static Task editVirtualHardwareSectionCpuTask() {
       Task task = Task.builder()
             .build();
 
@@ -899,7 +899,7 @@
       return disks;
    }
 
-   public static Task modifyVirtualHardwareSectionDisksTask() {
+   public static Task editVirtualHardwareSectionDisksTask() {
       Task task = Task.builder()
             .build();
 
@@ -920,7 +920,7 @@
       return memory;
    }
 
-   public static Task modifyVirtualHardwareSectionMemoryTask() {
+   public static Task editVirtualHardwareSectionMemoryTask() {
       Task task = Task.builder()
             .build();
 
@@ -934,7 +934,7 @@
       return networkCards;
    }
 
-   public static Task modifyVirtualHardwareSectionNetworkCardsTask() {
+   public static Task editVirtualHardwareSectionNetworkCardsTask() {
       Task task = Task.builder()
             .build();
 
@@ -948,11 +948,11 @@
       return serialPorts;
    }
 
-   public static Task modifyVirtualHardwareSectionSerialPortsTask() {
+   public static Task editVirtualHardwareSectionSerialPortsTask() {
       return task("id", "name", "description", "status", "operation", "operationName", "startTime");
    }
 
-   /** Used by other methods to create a custom {@link Task} object. */
+   /** Used by other methods to add a custom {@link Task} object. */
    private static Task task(String taskId, String name, String description, String status, String operation, String operationName, String startTime) {
       Task task = Task.builder()
             .error(Error.builder().build())
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppApiLiveTest.java
index 3d31a13..49030f6 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppApiLiveTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppApiLiveTest.java
@@ -18,10 +18,6 @@
  */
 package org.jclouds.vcloud.director.v1_5.features;
 
-import static com.google.common.base.Predicates.and;
-import static com.google.common.collect.Iterables.contains;
-import static com.google.common.collect.Iterables.find;
-import static com.google.common.collect.Iterables.getFirst;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.CONDITION_FMT;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.CORRECT_VALUE_OBJECT_FMT;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.ENTITY_EQUAL;
@@ -43,12 +39,11 @@
 import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkProductSectionList;
 import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkStartupSection;
 import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkVApp;
-import static org.jclouds.vcloud.director.v1_5.predicates.LinkPredicates.relEquals;
-import static org.jclouds.vcloud.director.v1_5.predicates.LinkPredicates.typeEquals;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.fail;
 
 import java.net.URI;
 import java.util.List;
@@ -60,13 +55,9 @@
 import org.jclouds.dmtf.ovf.NetworkSection;
 import org.jclouds.dmtf.ovf.ProductSection;
 import org.jclouds.dmtf.ovf.StartupSection;
-import org.jclouds.io.Payloads;
 import org.jclouds.vcloud.director.v1_5.AbstractVAppApiLiveTest;
-import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
 import org.jclouds.vcloud.director.v1_5.domain.AccessSetting;
 import org.jclouds.vcloud.director.v1_5.domain.Checks;
-import org.jclouds.vcloud.director.v1_5.domain.Link;
-import org.jclouds.vcloud.director.v1_5.domain.Media;
 import org.jclouds.vcloud.director.v1_5.domain.Metadata;
 import org.jclouds.vcloud.director.v1_5.domain.MetadataEntry;
 import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
@@ -75,12 +66,24 @@
 import org.jclouds.vcloud.director.v1_5.domain.Reference;
 import org.jclouds.vcloud.director.v1_5.domain.ResourceEntity.Status;
 import org.jclouds.vcloud.director.v1_5.domain.Task;
+import org.jclouds.vcloud.director.v1_5.domain.User;
 import org.jclouds.vcloud.director.v1_5.domain.VApp;
 import org.jclouds.vcloud.director.v1_5.domain.VAppTemplate;
 import org.jclouds.vcloud.director.v1_5.domain.Vm;
+import org.jclouds.vcloud.director.v1_5.domain.network.DhcpService;
+import org.jclouds.vcloud.director.v1_5.domain.network.FirewallService;
+import org.jclouds.vcloud.director.v1_5.domain.network.IpRange;
+import org.jclouds.vcloud.director.v1_5.domain.network.IpRanges;
+import org.jclouds.vcloud.director.v1_5.domain.network.IpScope;
+import org.jclouds.vcloud.director.v1_5.domain.network.NatService;
+import org.jclouds.vcloud.director.v1_5.domain.network.Network;
+import org.jclouds.vcloud.director.v1_5.domain.network.Network.FenceMode;
 import org.jclouds.vcloud.director.v1_5.domain.network.NetworkAssignment;
+import org.jclouds.vcloud.director.v1_5.domain.network.NetworkConfiguration;
 import org.jclouds.vcloud.director.v1_5.domain.network.NetworkConnection;
 import org.jclouds.vcloud.director.v1_5.domain.network.NetworkConnection.IpAddressAllocationMode;
+import org.jclouds.vcloud.director.v1_5.domain.network.NetworkFeatures;
+import org.jclouds.vcloud.director.v1_5.domain.network.SyslogServerSettings;
 import org.jclouds.vcloud.director.v1_5.domain.network.VAppNetworkConfiguration;
 import org.jclouds.vcloud.director.v1_5.domain.params.ComposeVAppParams;
 import org.jclouds.vcloud.director.v1_5.domain.params.ControlAccessParams;
@@ -89,8 +92,6 @@
 import org.jclouds.vcloud.director.v1_5.domain.params.RecomposeVAppParams;
 import org.jclouds.vcloud.director.v1_5.domain.params.SourcedCompositionItemParam;
 import org.jclouds.vcloud.director.v1_5.domain.params.UndeployVAppParams;
-import org.jclouds.vcloud.director.v1_5.domain.query.QueryResultRecordType;
-import org.jclouds.vcloud.director.v1_5.domain.query.QueryResultRecords;
 import org.jclouds.vcloud.director.v1_5.domain.section.GuestCustomizationSection;
 import org.jclouds.vcloud.director.v1_5.domain.section.LeaseSettingsSection;
 import org.jclouds.vcloud.director.v1_5.domain.section.NetworkConfigSection;
@@ -100,8 +101,8 @@
 import org.testng.annotations.Test;
 
 import com.google.common.base.CharMatcher;
+import com.google.common.base.Optional;
 import com.google.common.base.Predicate;
-import com.google.common.base.Predicates;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
@@ -110,7 +111,7 @@
 
 /**
  * Tests behavior of the {@link VAppApi}.
- *
+ * 
  * @author grkvlt@apache.org
  */
 @Test(groups = { "live", "user" }, singleThreaded = true, testName = "VAppApiLiveTest")
@@ -118,69 +119,24 @@
 
    private MetadataValue metadataValue;
    private String key;
-   private URI testUserURI;
-   private boolean mediaCreated = false;
    private boolean testUserCreated = false;
-   
+   private User user;
+
    @BeforeClass(alwaysRun = true)
    protected void setupRequiredEntities() {
-      Set<Link> links = vdcApi.getVdc(vdcURI).getLinks();
 
-      if (mediaURI == null) {
-         Predicate<Link> addMediaLink = and(relEquals(Link.Rel.ADD), typeEquals(VCloudDirectorMediaType.MEDIA));
-         
-         if (contains(links, addMediaLink)) {
-            Link addMedia = find(links, addMediaLink);
-            byte[] iso = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
-            
-            Media sourceMedia = Media.builder()
-                  .type(VCloudDirectorMediaType.MEDIA)
-                  .name(name("media"))
-                  .size(iso.length)
-                  .imageType(Media.ImageType.ISO)
-                  .description("Test media generated by VAppApiLiveTest")
-                  .build();
-            Media media = context.getApi().getMediaApi().createMedia(addMedia.getHref(), sourceMedia);
-            
-            Link uploadLink = getFirst(getFirst(media.getFiles(), null).getLinks(), null);
-            context.getApi().getUploadApi().upload(uploadLink.getHref(), Payloads.newByteArrayPayload(iso));
-            
-            media = context.getApi().getMediaApi().getMedia(media.getHref());
-            
-            if (media.getTasks().size() == 1) {
-               Task uploadTask = Iterables.getOnlyElement(media.getTasks());
-               Checks.checkTask(uploadTask);
-               assertEquals(uploadTask.getStatus(), Task.Status.RUNNING);
-               assertTrue(retryTaskSuccess.apply(uploadTask), String.format(TASK_COMPLETE_TIMELY, "uploadTask"));
-               media = context.getApi().getMediaApi().getMedia(media.getHref());
-            }
-            
-            mediaURI = media.getHref();
-            mediaCreated = true;
-         }
-      }
-      
       if (adminContext != null) {
-         Link orgLink = find(links, and(relEquals("up"), typeEquals(VCloudDirectorMediaType.ORG)));
-         testUserURI = adminContext.getApi().getUserApi().createUser(toAdminUri(orgLink), randomTestUser("VAppAccessTest")).getHref();
-      } else {
-         testUserURI = userURI;
+         userUrn = adminContext.getApi().getUserApi().addUserToOrg(randomTestUser("VAppAccessTest"), org.getId())
+                  .getId();
       }
+      user = lazyGetUser();
    }
-   
+
    @AfterClass(alwaysRun = true, dependsOnMethods = { "cleanUpEnvironment" })
    public void cleanUp() {
-      if (adminContext != null && mediaCreated && mediaURI != null) {
+      if (adminContext != null && testUserCreated && userUrn != null) {
          try {
-            Task delete = context.getApi().getMediaApi().deleteMedia(mediaURI);
-            taskDoneEventually(delete);
-         } catch (Exception e) {
-            logger.warn(e, "Error when deleting media");
-         }
-      }
-      if (adminContext != null && testUserCreated && testUserURI != null) {
-         try {
-            adminContext.getApi().getUserApi().deleteUser(testUserURI);
+            adminContext.getApi().getUserApi().remove(userUrn);
          } catch (Exception e) {
             logger.warn(e, "Error when deleting user");
          }
@@ -188,262 +144,264 @@
    }
 
    /**
-    * @see VAppApi#getVApp(URI)
+    * @see VAppApi#get(URI)
     */
    @Test(description = "GET /vApp/{id}")
    public void testGetVApp() {
       // The method under test
-      vApp = vAppApi.getVApp(vAppURI);
+      vApp = vAppApi.get(vAppUrn);
 
       // Check the retrieved object is well formed
       checkVApp(vApp);
 
       // Check the required fields are set
-      assertEquals(vApp.isDeployed(), Boolean.FALSE, String.format(OBJ_FIELD_EQ, VAPP, "deployed", "FALSE", vApp.isDeployed().toString()));
-      assertTrue(vApp.getName().startsWith("test-vapp-"), String.format(MATCHES_STRING_FMT, "name", "test-vapp-*", vApp.getName()));
-      assertEquals(vApp.getDescription(), "Test VApp", String.format(OBJ_FIELD_EQ, VAPP, "Description", "Test VApp", vApp.getDescription()));
+      assertEquals(vApp.isDeployed(), Boolean.FALSE,
+               String.format(OBJ_FIELD_EQ, VAPP, "deployed", "FALSE", vApp.isDeployed().toString()));
+      assertTrue(vApp.getName().startsWith("test-vapp-"),
+               String.format(MATCHES_STRING_FMT, "name", "test-vapp-*", vApp.getName()));
+      assertEquals(vApp.getDescription(), "Test VApp",
+               String.format(OBJ_FIELD_EQ, VAPP, "Description", "Test VApp", vApp.getDescription()));
 
       // TODO instantiationParams instantiationParams()
       // TODO source.href vAppTemplateURI
 
       // Check status
-      assertVAppStatus(vAppURI, Status.POWERED_OFF);
+      assertVAppStatus(vAppUrn, Status.POWERED_OFF);
    }
-   
+
    @Test(description = "POST /vApp/{id}/action/recomposeVApp")
    public void testRecomposeVApp() {
-      Set<Vm> vms = getAvailableVMsFromVAppTemplates();
-  
-      VApp composedVApp = vdcApi.composeVApp(vdcURI, ComposeVAppParams.builder()
-            .name(name("composed-"))
-            .instantiationParams(instantiationParams())
-            .build());
       
+      VApp composedVApp = vdcApi.composeVApp(vdcUrn, ComposeVAppParams.builder()
+               .name(name("composed-"))
+               .instantiationParams(instantiationParams())
+               .build());
+      
+      Set<Vm> vms = getAvailableVMsFromVAppTemplate(vAppTemplate);
+          
       // get the first vm to be added to vApp
       Vm toAddVm = Iterables.get(vms, 0);
-      RecomposeVAppParams params = createRecomposeParams(composedVApp, toAddVm); 
+
+      // TODO clean up network config of the vm
+      //cleanUpNetworkConnectionSection(toAddVm);
       
+      RecomposeVAppParams params = addRecomposeParams(composedVApp, toAddVm);
+
       // The method under test
-      Task recomposeVApp = vAppApi.recompose(composedVApp.getHref(), params);
+      Task recomposeVApp = vAppApi.recompose(composedVApp.getId(), params);
       assertTaskSucceedsLong(recomposeVApp);
-      
-      // add another vm instance to vApp
-      params = createRecomposeParams(composedVApp, toAddVm); 
-      recomposeVApp = vAppApi.recompose(composedVApp.getHref(), params);
-      assertTaskSucceedsLong(recomposeVApp);
-      
-      // delete a vm
-      VApp configured = vAppApi.getVApp(composedVApp.getHref());
+
+      // remove a vm
+      VApp configured = vAppApi.get(composedVApp.getId());
       List<Vm> vmsToBeDeleted = configured.getChildren().getVms();
-      Vm toBeDeleted = Iterables.get(vmsToBeDeleted, 0);
-      Task deleteVm = vmApi.deleteVm(toBeDeleted.getHref());
-      assertTaskSucceedsLong(deleteVm);
+      Vm toBeDeleted = Iterables.find(vmsToBeDeleted, new Predicate<Vm>() {
+
+         @Override
+         public boolean apply(Vm vm) {
+            return vm.getName().startsWith("vm-");
+         }
       
-      Task deleteVApp = vAppApi.deleteVApp(composedVApp.getHref());
+      });
+      Task removeVm = vmApi.remove(toBeDeleted.getId());
+      assertTaskSucceedsLong(removeVm);
+      
+      Task deleteVApp = vAppApi.remove(composedVApp.getHref());
       assertTaskSucceedsLong(deleteVApp);
    }
 
-   private Set<Vm> getAvailableVMsFromVAppTemplates() {
-      Set<Vm> vms = Sets.newLinkedHashSet();
-      QueryResultRecords templatesRecords = queryApi.vAppTemplatesQueryAll();
-      for (QueryResultRecordType templateRecord : templatesRecords.getRecords()) {
-         VAppTemplate vAppTemplate = vAppTemplateApi.getVAppTemplate(templateRecord.getHref());
-         vms.addAll(vAppTemplate.getChildren());
-      }
-      return ImmutableSet.copyOf(Iterables.filter(vms, new Predicate<Vm>() {
-         // filter out vms in the vApp template with computer name that contains underscores, dots, or both.
+   private Set<Vm> getAvailableVMsFromVAppTemplate(VAppTemplate vAppTemplate) {
+      return ImmutableSet.copyOf(Iterables.filter(vAppTemplate.getChildren(), new Predicate<Vm>() {
+         // filter out vms in the vApp template with computer name that contains underscores, dots,
+         // or both.
          @Override
          public boolean apply(Vm input) {
-            GuestCustomizationSection guestCustomizationSection = vmApi.getGuestCustomizationSection(input.getHref());
+            GuestCustomizationSection guestCustomizationSection = vmApi.getGuestCustomizationSection(input.getId());
             String computerName = guestCustomizationSection.getComputerName();
-            String retainComputerName = CharMatcher.inRange('0', '9')
-                     .or(CharMatcher.inRange('a', 'z'))
-                     .or(CharMatcher.inRange('A', 'Z'))
-                     .or(CharMatcher.is('-'))
-                     .retainFrom(computerName);
+            String retainComputerName = CharMatcher.inRange('0', '9').or(CharMatcher.inRange('a', 'z'))
+                     .or(CharMatcher.inRange('A', 'Z')).or(CharMatcher.is('-')).retainFrom(computerName);
             return computerName.equals(retainComputerName);
          }
       }));
    }
-   
+
    /**
-    * @see VAppApi#modifyVApp(URI, VApp)
+    * @see VAppApi#edit(URI, VApp)
     */
    @Test(description = "PUT /vApp/{id}", dependsOnMethods = { "testGetVApp" })
-   public void testModifyVApp() {
-      VApp newVApp = VApp.builder()
-            .name(name("new-name-"))
-            .description("New Description")
-            .build();
+   public void testEditVApp() {
+      VApp newVApp = VApp.builder().name(name("new-name-")).description("New Description").build();
       vAppNames.add(newVApp.getName());
 
       // The method under test
-      Task modifyVApp = vAppApi.modifyVApp(vApp.getHref(), newVApp);
-      assertTrue(retryTaskSuccess.apply(modifyVApp), String.format(TASK_COMPLETE_TIMELY, "modifyVApp"));
+      Task editVApp = vAppApi.edit(vAppUrn, newVApp);
+      assertTrue(retryTaskSuccess.apply(editVApp), String.format(TASK_COMPLETE_TIMELY, "editVApp"));
 
-      // Get the updated VApp
-      vApp = vAppApi.getVApp(vApp.getHref());
+      // Get the edited VApp
+      vApp = vAppApi.get(vAppUrn);
 
       // Check the required fields are set
-      assertEquals(vApp.getName(), newVApp.getName(), String.format(OBJ_FIELD_EQ, VAPP, "Name", newVApp.getName(), vApp.getName()));
-      assertEquals(vApp.getDescription(), newVApp.getDescription(), String.format(OBJ_FIELD_EQ, VAPP, "Description", newVApp.getDescription(), vApp.getDescription()));
+      assertEquals(vApp.getName(), newVApp.getName(),
+               String.format(OBJ_FIELD_EQ, VAPP, "Name", newVApp.getName(), vApp.getName()));
+      assertEquals(vApp.getDescription(), newVApp.getDescription(),
+               String.format(OBJ_FIELD_EQ, VAPP, "Description", newVApp.getDescription(), vApp.getDescription()));
    }
 
    @Test(description = "POST /vApp/{id}/action/deploy", dependsOnMethods = { "testGetVApp" })
    public void testDeployVApp() {
       DeployVAppParams params = DeployVAppParams.builder()
-            .deploymentLeaseSeconds((int) TimeUnit.SECONDS.convert(1L, TimeUnit.HOURS))
-            .notForceCustomization()
-            .notPowerOn()
-            .build();
+               .deploymentLeaseSeconds((int) TimeUnit.SECONDS.convert(1L, TimeUnit.HOURS)).notForceCustomization()
+               .notPowerOn().build();
 
       // The method under test
-      Task deployVApp = vAppApi.deploy(vApp.getHref(), params);
+      Task deployVApp = vAppApi.deploy(vAppUrn, params);
       assertTrue(retryTaskSuccessLong.apply(deployVApp), String.format(TASK_COMPLETE_TIMELY, "deployVApp"));
 
-      // Get the updated VApp
-      vApp = vAppApi.getVApp(vApp.getHref());
+      // Get the edited VApp
+      vApp = vAppApi.get(vAppUrn);
 
       // Check the required fields are set
       assertTrue(vApp.isDeployed(), String.format(OBJ_FIELD_EQ, VAPP, "deployed", "TRUE", vApp.isDeployed().toString()));
 
       // Check status
-      assertVAppStatus(vAppURI, Status.POWERED_OFF);
+      assertVAppStatus(vAppUrn, Status.POWERED_OFF);
    }
 
    @Test(description = "POST /vApp/{id}/power/action/powerOn", dependsOnMethods = { "testDeployVApp" })
    public void testPowerOnVApp() {
       // Power off VApp
-      vApp = powerOffVApp(vApp.getHref());
+      vApp = powerOffVApp(vAppUrn);
 
       // The method under test
-      Task powerOnVApp = vAppApi.powerOn(vApp.getHref());
+      Task powerOnVApp = vAppApi.powerOn(vAppUrn);
       assertTaskSucceedsLong(powerOnVApp);
 
-      // Get the updated VApp
-      vApp = vAppApi.getVApp(vApp.getHref());
+      // Get the edited VApp
+      vApp = vAppApi.get(vAppUrn);
 
       // Check status
-      assertVAppStatus(vAppURI, Status.POWERED_ON);
+      assertVAppStatus(vAppUrn, Status.POWERED_ON);
    }
 
    @Test(description = "POST /vApp/{id}/power/action/reboot", dependsOnMethods = { "testDeployVApp" })
    public void testReboot() {
       // Power on VApp
-      vApp = powerOnVApp(vApp.getHref());
- 
+      vApp = powerOnVApp(vAppUrn);
+
       // The method under test
-      Task reboot = vAppApi.reboot(vApp.getHref());
+      Task reboot = vAppApi.reboot(vAppUrn);
       assertTaskSucceedsLong(reboot);
 
-      // Get the updated VApp
-      vApp = vAppApi.getVApp(vApp.getHref());
+      // Get the edited VApp
+      vApp = vAppApi.get(vAppUrn);
 
       // Check status
-      assertVAppStatus(vAppURI, Status.POWERED_OFF);
+      assertVAppStatus(vAppUrn, Status.POWERED_OFF);
    }
 
    @Test(description = "POST /vApp/{id}/power/action/shutdown", dependsOnMethods = { "testDeployVApp" })
    public void testShutdown() {
       // Power on VApp
-      vApp = powerOnVApp(vApp.getHref());
+      vApp = powerOnVApp(vAppUrn);
 
+      vApp = vAppApi.get(vAppUrn);
+      
       // The method under test
-      Task shutdown = vAppApi.shutdown(vApp.getHref());
+      Task shutdown = vAppApi.shutdown(vAppUrn);
       assertTaskSucceedsLong(shutdown);
 
-      // Get the updated VApp
-      vApp = vAppApi.getVApp(vApp.getHref());
+      // Get the edited VApp
+      vApp = vAppApi.get(vAppUrn);
 
       // Check status
-      assertVAppStatus(vApp.getHref(), Status.POWERED_OFF);
+      assertVAppStatus(vAppUrn, Status.POWERED_OFF);
 
       // Power on the VApp again
-      vApp = powerOnVApp(vApp.getHref());
+      vApp = powerOnVApp(vAppUrn);
    }
 
    @Test(description = "POST /vApp/{id}/power/action/suspend", dependsOnMethods = { "testDeployVApp" })
    public void testSuspend() {
       // Power on VApp
-      vApp = powerOnVApp(vApp.getHref());
+      vApp = powerOnVApp(vAppUrn);
 
       // The method under test
-      Task suspend = vAppApi.suspend(vAppURI);
+      Task suspend = vAppApi.suspend(vAppUrn);
       assertTaskSucceedsLong(suspend);
 
-      // Get the updated VApp
-      vApp = vAppApi.getVApp(vApp.getHref());
+      // Get the edited VApp
+      vApp = vAppApi.get(vAppUrn);
 
       // Check status
-      assertVAppStatus(vAppURI, Status.SUSPENDED);
+      assertVAppStatus(vAppUrn, Status.SUSPENDED);
 
       // Power on the VApp again
-      vApp = powerOnVApp(vApp.getHref());
+      vApp = powerOnVApp(vAppUrn);
    }
 
    @Test(description = "POST /vApp/{id}/power/action/reset", dependsOnMethods = { "testDeployVApp" })
    public void testReset() {
       // Power on VApp
-      vApp = powerOnVApp(vApp.getHref());
+      vApp = powerOnVApp(vAppUrn);
 
       // The method under test
-      Task reset = vAppApi.reset(vAppURI);
+      Task reset = vAppApi.reset(vAppUrn);
       assertTaskSucceedsLong(reset);
 
-      // Get the updated VApp
-      vApp = vAppApi.getVApp(vAppURI);
+      // Get the edited VApp
+      vApp = vAppApi.get(vAppUrn);
 
       // Check status
-      assertVAppStatus(vAppURI, Status.POWERED_ON);
+      assertVAppStatus(vAppUrn, Status.POWERED_ON);
    }
 
    @Test(description = "POST /vApp/{id}/action/undeploy", dependsOnMethods = { "testDeployVApp" })
    public void testUndeployVApp() {
       // Power on VApp
-      vApp = powerOnVApp(vApp.getHref());
+      vApp = powerOnVApp(vAppUrn);
 
       UndeployVAppParams params = UndeployVAppParams.builder().build();
 
       // The method under test
-      Task undeploy = vAppApi.undeploy(vApp.getHref(), params);
+      Task undeploy = vAppApi.undeploy(vAppUrn, params);
       assertTrue(retryTaskSuccess.apply(undeploy), String.format(TASK_COMPLETE_TIMELY, "undeploy"));
 
-      // Get the updated VApp
-      vApp = vAppApi.getVApp(vAppURI);
+      // Get the edited VApp
+      vApp = vAppApi.get(vAppUrn);
 
       // Check status
-      assertFalse(vApp.isDeployed(), String.format(OBJ_FIELD_EQ, VAPP, "deployed", "FALSE", vApp.isDeployed().toString()));
-      assertVAppStatus(vAppURI, Status.POWERED_OFF);
+      assertFalse(vApp.isDeployed(),
+               String.format(OBJ_FIELD_EQ, VAPP, "deployed", "FALSE", vApp.isDeployed().toString()));
+      assertVAppStatus(vAppUrn, Status.POWERED_OFF);
    }
 
    @Test(description = "POST /vApp/{id}/power/action/powerOff", dependsOnMethods = { "testUndeployVApp" })
    public void testPowerOffVApp() {
       // Power on VApp
-      vApp = powerOnVApp(vApp.getHref());
-      
+      vApp = powerOnVApp(vAppUrn);
+
       // The method under test
-      Task powerOffVApp = vAppApi.powerOff(vApp.getHref());
+      Task powerOffVApp = vAppApi.powerOff(vAppUrn);
       assertTrue(retryTaskSuccess.apply(powerOffVApp), String.format(TASK_COMPLETE_TIMELY, "powerOffVApp"));
 
-      // Get the updated VApp
-      vApp = vAppApi.getVApp(vAppURI);
+      // Get the edited VApp
+      vApp = vAppApi.get(vAppUrn);
 
       // Check status
-      assertVAppStatus(vAppURI, Status.POWERED_OFF);
+      assertVAppStatus(vAppUrn, Status.POWERED_OFF);
    }
 
    @Test(description = "POST /vApp/{id}/action/controlAccess", dependsOnMethods = { "testGetVApp" })
    public void testControlAccessUser() {
-      ControlAccessParams params = ControlAccessParams.builder()
-            .notSharedToEveryone()
-            .accessSetting(AccessSetting.builder()
-                  .subject(Reference.builder().href(testUserURI).type(ADMIN_USER).build())
-                  .accessLevel("ReadOnly")
-                  .build())
-            .build();
+      ControlAccessParams params = ControlAccessParams
+               .builder()
+               .notSharedToEveryone()
+               .accessSetting(
+                        AccessSetting.builder()
+                                 .subject(Reference.builder().href(user.getHref()).type(ADMIN_USER).build())
+                                 .accessLevel("ReadOnly").build()).build();
 
       // The method under test
-      ControlAccessParams modified = vAppApi.modifyControlAccess(vApp.getHref(), params);
+      ControlAccessParams modified = vAppApi.editControlAccess(vAppUrn, params);
 
       // Check the retrieved object is well formed
       checkControlAccessParams(modified);
@@ -453,14 +411,12 @@
 
    @Test(description = "POST /vApp/{id}/action/controlAccess", dependsOnMethods = { "testControlAccessUser" })
    public void testControlAccessEveryone() {
-      
-      ControlAccessParams params = ControlAccessParams.builder()
-            .sharedToEveryone()
-            .everyoneAccessLevel("FullControl")
-            .build();
-      
+
+      ControlAccessParams params = ControlAccessParams.builder().sharedToEveryone().everyoneAccessLevel("FullControl")
+               .build();
+
       // The method under test
-      ControlAccessParams modified = vAppApi.modifyControlAccess(vApp.getHref(), params);
+      ControlAccessParams modified = vAppApi.editControlAccess(vAppUrn, params);
 
       // Check the retrieved object is well formed
       checkControlAccessParams(modified);
@@ -472,62 +428,61 @@
    @Test(description = "POST /vApp/{id}/action/discardSuspendedState", dependsOnMethods = { "testDeployVApp" })
    public void testDiscardSuspendedState() {
       // Power on, then suspend the VApp
-      vApp = powerOnVApp(vAppURI);
-      vApp = suspendVApp(vAppURI);
-      
+      vApp = powerOnVApp(vAppUrn);
+      vApp = suspendVApp(vAppUrn);
+
       // The method under test
-      Task discardSuspendedState = vAppApi.discardSuspendedState(vApp.getHref());
-      assertTrue(retryTaskSuccess.apply(discardSuspendedState), String.format(TASK_COMPLETE_TIMELY, "discardSuspendedState"));
+      Task discardSuspendedState = vAppApi.discardSuspendedState(vAppUrn);
+      assertTrue(retryTaskSuccess.apply(discardSuspendedState),
+               String.format(TASK_COMPLETE_TIMELY, "discardSuspendedState"));
    }
 
-   @Test(description = "POST /vApp/{id}/action/enterMaintenanceMode", groups = {"systemAdmin"})
+   @Test(description = "POST /vApp/{id}/action/enterMaintenanceMode", groups = { "systemAdmin" })
    public void testEnterMaintenanceMode() {
 
       // Do this to a new vApp, so don't mess up subsequent tests by making the vApp read-only
       VApp temp = instantiateVApp();
       DeployVAppParams params = DeployVAppParams.builder()
-            .deploymentLeaseSeconds((int) TimeUnit.SECONDS.convert(1L, TimeUnit.HOURS))
-            .notForceCustomization()
-            .notPowerOn()
-            .build();
-      Task deployVApp = vAppApi.deploy(temp.getHref(), params);
+               .deploymentLeaseSeconds((int) TimeUnit.SECONDS.convert(1L, TimeUnit.HOURS)).notForceCustomization()
+               .notPowerOn().build();
+      Task deployVApp = vAppApi.deploy(temp.getId(), params);
       assertTaskSucceedsLong(deployVApp);
-      
+
       try {
          // Method under test
-         vAppApi.enterMaintenanceMode(temp.getHref());
-   
-         temp = vAppApi.getVApp(temp.getHref());
-         assertTrue(temp.isInMaintenanceMode(), String.format(CONDITION_FMT, "InMaintenanceMode", "TRUE", temp.isInMaintenanceMode()));
+         vAppApi.enterMaintenanceMode(temp.getId());
+
+         temp = vAppApi.get(temp.getId());
+         assertTrue(temp.isInMaintenanceMode(),
+                  String.format(CONDITION_FMT, "InMaintenanceMode", "TRUE", temp.isInMaintenanceMode()));
 
          // Exit maintenance mode
-         vAppApi.exitMaintenanceMode(temp.getHref());
+         vAppApi.exitMaintenanceMode(temp.getId());
       } finally {
          cleanUpVApp(temp);
       }
    }
 
-   @Test(description = "POST /vApp/{id}/action/exitMaintenanceMode", dependsOnMethods = { "testEnterMaintenanceMode" }, groups = {"systemAdmin"})
+   @Test(description = "POST /vApp/{id}/action/exitMaintenanceMode", dependsOnMethods = { "testEnterMaintenanceMode" }, groups = { "systemAdmin" })
    public void testExitMaintenanceMode() {
       // Do this to a new vApp, so don't mess up subsequent tests by making the vApp read-only
       VApp temp = instantiateVApp();
       DeployVAppParams params = DeployVAppParams.builder()
-            .deploymentLeaseSeconds((int) TimeUnit.SECONDS.convert(1L, TimeUnit.HOURS))
-            .notForceCustomization()
-            .notPowerOn()
-            .build();
-      Task deployVApp = vAppApi.deploy(temp.getHref(), params);
+               .deploymentLeaseSeconds((int) TimeUnit.SECONDS.convert(1L, TimeUnit.HOURS)).notForceCustomization()
+               .notPowerOn().build();
+      Task deployVApp = vAppApi.deploy(temp.getId(), params);
       assertTaskSucceedsLong(deployVApp);
-      
+
       try {
          // Enter maintenance mode
-         vAppApi.enterMaintenanceMode(temp.getHref());
-   
-         // Method under test
-         vAppApi.exitMaintenanceMode(temp.getHref());
+         vAppApi.enterMaintenanceMode(temp.getId());
 
-         temp = vAppApi.getVApp(temp.getHref());
-         assertFalse(temp.isInMaintenanceMode(), String.format(CONDITION_FMT, "InMaintenanceMode", "FALSE", temp.isInMaintenanceMode()));
+         // Method under test
+         vAppApi.exitMaintenanceMode(temp.getId());
+
+         temp = vAppApi.get(temp.getId());
+         assertFalse(temp.isInMaintenanceMode(),
+                  String.format(CONDITION_FMT, "InMaintenanceMode", "FALSE", temp.isInMaintenanceMode()));
       } finally {
          cleanUpVApp(temp);
       }
@@ -536,7 +491,7 @@
    @Test(description = "GET /vApp/{id}/controlAccess", dependsOnMethods = { "testGetVApp" })
    public void testGetControlAccess() {
       // The method under test
-      ControlAccessParams controlAccess = vAppApi.getControlAccess(vApp.getHref());
+      ControlAccessParams controlAccess = vAppApi.getAccessControl(vAppUrn);
 
       // Check the retrieved object is well formed
       checkControlAccessParams(controlAccess);
@@ -545,27 +500,26 @@
    @Test(description = "GET /vApp/{id}/leaseSettingsSection", dependsOnMethods = { "testGetVApp" })
    public void testGetLeaseSettingsSection() {
       // The method under test
-      LeaseSettingsSection section = vAppApi.getLeaseSettingsSection(vApp.getHref());
+      LeaseSettingsSection section = vAppApi.getLeaseSettingsSection(vAppUrn);
 
       // Check the retrieved object is well formed
       checkLeaseSettingsSection(section);
    }
 
    @Test(description = "PUT /vApp/{id}/leaseSettingsSection", dependsOnMethods = { "testGetLeaseSettingsSection" })
-   public void testModifyLeaseSettingsSection() {
+   public void testEditLeaseSettingsSection() {
       // Copy existing section
-      LeaseSettingsSection oldSection = vAppApi.getLeaseSettingsSection(vApp.getHref());
+      LeaseSettingsSection oldSection = vAppApi.getLeaseSettingsSection(vAppUrn);
       Integer twoHours = (int) TimeUnit.SECONDS.convert(2L, TimeUnit.HOURS);
-      LeaseSettingsSection newSection = oldSection.toBuilder()
-            .deploymentLeaseInSeconds(twoHours)
-            .build();
+      LeaseSettingsSection newSection = oldSection.toBuilder().deploymentLeaseInSeconds(twoHours).build();
 
       // The method under test
-      Task modifyLeaseSettingsSection = vAppApi.modifyLeaseSettingsSection(vApp.getHref(), newSection);
-      assertTrue(retryTaskSuccess.apply(modifyLeaseSettingsSection), String.format(TASK_COMPLETE_TIMELY, "modifyLeaseSettingsSection"));
+      Task editLeaseSettingsSection = vAppApi.editLeaseSettingsSection(vAppUrn, newSection);
+      assertTrue(retryTaskSuccess.apply(editLeaseSettingsSection),
+               String.format(TASK_COMPLETE_TIMELY, "editLeaseSettingsSection"));
 
       // Retrieve the modified section
-      LeaseSettingsSection modified = vAppApi.getLeaseSettingsSection(vApp.getHref());
+      LeaseSettingsSection modified = vAppApi.getLeaseSettingsSection(vAppUrn);
 
       // Check the retrieved object is well formed
       checkLeaseSettingsSection(modified);
@@ -573,71 +527,125 @@
       // Check the date fields
       if (modified.getDeploymentLeaseExpiration() != null && newSection.getDeploymentLeaseExpiration() != null) {
          assertTrue(modified.getDeploymentLeaseExpiration().after(newSection.getDeploymentLeaseExpiration()),
-               String.format("The new deploymentLeaseExpiration timestamp must be later than the original: %s > %s",
-                     dateService.iso8601DateFormat(modified.getDeploymentLeaseExpiration()),
-                     dateService.iso8601DateFormat(newSection.getDeploymentLeaseExpiration())));
+                  String.format("The new deploymentLeaseExpiration timestamp must be later than the original: %s > %s",
+                           dateService.iso8601DateFormat(modified.getDeploymentLeaseExpiration()),
+                           dateService.iso8601DateFormat(newSection.getDeploymentLeaseExpiration())));
       }
       if (modified.getStorageLeaseExpiration() != null && newSection.getStorageLeaseExpiration() != null) {
-         assertTrue(modified.getStorageLeaseExpiration().after(newSection.getStorageLeaseExpiration()),
-               String.format("The new storageLeaseExpiration timestamp must be later than the original: %s > %s",
-                     dateService.iso8601DateFormat(modified.getStorageLeaseExpiration()),
-                     dateService.iso8601DateFormat(newSection.getStorageLeaseExpiration())));
+         assertTrue(modified.getStorageLeaseExpiration().after(newSection.getStorageLeaseExpiration()), String.format(
+                  "The new storageLeaseExpiration timestamp must be later than the original: %s > %s",
+                  dateService.iso8601DateFormat(modified.getStorageLeaseExpiration()),
+                  dateService.iso8601DateFormat(newSection.getStorageLeaseExpiration())));
       }
 
       // Reset the date fields
-      modified = modified.toBuilder()
-            .deploymentLeaseExpiration(null)
-            .storageLeaseExpiration(null)
-            .build();
-      newSection = newSection.toBuilder()
-            .deploymentLeaseExpiration(null)
-            .storageLeaseExpiration(null)
-            .build();
+      modified = modified.toBuilder().deploymentLeaseExpiration(null).storageLeaseExpiration(null).build();
+      newSection = newSection.toBuilder().deploymentLeaseExpiration(null).storageLeaseExpiration(null).build();
 
       // Check the section was modified correctly
-      assertEquals(modified.getDeploymentLeaseInSeconds(), twoHours,
-            String.format(OBJ_FIELD_EQ, "LeaseSettingsSection", "DeploymentLeaseInSeconds", Integer.toString(twoHours), modified.getDeploymentLeaseInSeconds().toString()));
+      assertEquals(
+               modified.getDeploymentLeaseInSeconds(),
+               twoHours,
+               String.format(OBJ_FIELD_EQ, "LeaseSettingsSection", "DeploymentLeaseInSeconds",
+                        Integer.toString(twoHours), modified.getDeploymentLeaseInSeconds().toString()));
       assertEquals(modified, newSection, String.format(ENTITY_EQUAL, "LeaseSettingsSection"));
    }
 
    @Test(description = "GET /vApp/{id}/networkConfigSection", dependsOnMethods = { "testGetVApp" })
    public void testGetNetworkConfigSection() {
       // The method under test
-      NetworkConfigSection section = vAppApi.getNetworkConfigSection(vApp.getHref());
+      NetworkConfigSection section = vAppApi.getNetworkConfigSection(vAppUrn);
 
       // Check the retrieved object is well formed
       checkNetworkConfigSection(section);
    }
 
    @Test(description = "PUT /vApp/{id}/networkConfigSection", dependsOnMethods = { "testGetNetworkConfigSection" })
-   public void testModifyNetworkConfigSection() {
+   public void testEditNetworkConfigSection() {
+      
       // Copy existing section and update fields
-      NetworkConfigSection oldSection = vAppApi.getNetworkConfigSection(vApp.getHref());
-      VAppNetworkConfiguration networkConfig = VAppNetworkConfiguration.builder().build();
-      NetworkConfigSection newSection = oldSection.toBuilder().networkConfigs(ImmutableSet.of(networkConfig))
-            .build();
+      NetworkConfigSection oldSection = vAppApi.getNetworkConfigSection(vAppUrn);
+      Network network = lazyGetNetwork();
+      
+      tryFindBridgedNetworkInOrg();
+      IpRange ipRange = ipRange();
+      NetworkConfiguration newConfiguration = NetworkConfiguration.builder()
+               .ipScope(ipScope(ipRange))
+               .parentNetwork(Reference.builder().fromEntity(network).build())
+               .fenceMode(FenceMode.NAT_ROUTED)
+               .retainNetInfoAcrossDeployments(false)
+               .syslogServerSettings(SyslogServerSettings.builder().syslogServerIp1("192.168.14.27").build())
+               .features(NetworkFeatures.builder()
+                        .service(DhcpService.builder()
+                                 .ipRange(ipRange)
+                                 .build())
+                        .service(FirewallService.builder()
+                                 .logDefaultAction(false)
+                                 .defaultAction("drop")
+                                 .build())
+                        .service(NatService.builder()
+                                 .natType("portForwarding")
+                                 .enabled(false)
+                                 .build())                               
+                        .build())
+               .build();
+           
+      final String networkName = name("vAppNetwork-");
+      VAppNetworkConfiguration newVAppNetworkConfiguration = VAppNetworkConfiguration.builder()
+               .networkName(networkName)
+               .description(name("description-"))
+               .configuration(newConfiguration)
+               .build();
+
+      NetworkConfigSection newSection = oldSection.toBuilder().networkConfigs(ImmutableSet.of(newVAppNetworkConfiguration)).build();
 
       // The method under test
-      Task modifyNetworkConfigSection = vAppApi.modifyNetworkConfigSection(vApp.getHref(), newSection);
-      assertTrue(retryTaskSuccess.apply(modifyNetworkConfigSection), String.format(TASK_COMPLETE_TIMELY, "modifyNetworkConfigSection"));
+      Task editNetworkConfigSection = vAppApi.editNetworkConfigSection(vAppUrn, newSection);
+      assertTrue(retryTaskSuccess.apply(editNetworkConfigSection),
+               String.format(TASK_COMPLETE_TIMELY, "editNetworkConfigSection"));
 
       // Retrieve the modified section
-      NetworkConfigSection modified = vAppApi.getNetworkConfigSection(vApp.getHref());
+      NetworkConfigSection modified = vAppApi.getNetworkConfigSection(vAppUrn);
 
       // Check the retrieved object is well formed
       checkNetworkConfigSection(modified);
+      
+      Optional<VAppNetworkConfiguration> modifiedOptionalVAppNetwork = Iterables.tryFind(modified.getNetworkConfigs(), new IsVAppNetworkNamed(networkName));
+      if(!modifiedOptionalVAppNetwork.isPresent())
+         fail(String.format("Could not find vApp network named %s", networkName));
+      
+      Optional<VAppNetworkConfiguration> newOptionalVAppNetwork = Iterables.tryFind(newSection.getNetworkConfigs(), new IsVAppNetworkNamed(networkName));
+      if(!newOptionalVAppNetwork.isPresent())
+         fail(String.format("Could not find vApp network named %s", networkName));
 
-      // Check the modified section fields are set correctly
-//      assertEquals(modified.getInfo(), newSection.getInfo());
+      assertEquals(modifiedOptionalVAppNetwork.get().getNetworkName(), newOptionalVAppNetwork.get().getNetworkName(), String.format(ENTITY_EQUAL, "NetworkName"));
+      assertEquals(modifiedOptionalVAppNetwork.get().getConfiguration().getFenceMode(), newOptionalVAppNetwork.get().getConfiguration().getFenceMode(), String.format(ENTITY_EQUAL, "FenceMode"));
+      assertEquals(modifiedOptionalVAppNetwork.get().getConfiguration().getIpScope(), newOptionalVAppNetwork.get().getConfiguration().getIpScope(), String.format(ENTITY_EQUAL, "IpScope"));
+      assertEquals(modifiedOptionalVAppNetwork.get().getConfiguration().getNetworkFeatures(), newOptionalVAppNetwork.get().getConfiguration().getNetworkFeatures(), String.format(ENTITY_EQUAL, "NetworkFeatures"));
+   }
 
-      // Check the section was modified correctly
-      assertEquals(modified, newSection, String.format(ENTITY_EQUAL, "NetworkConfigSection"));
+   private IpRange ipRange() {
+      return IpRange.builder()
+               .startAddress("192.168.2.100")
+               .endAddress("192.168.2.199")
+               .build();
+   }
+
+   private IpScope ipScope(IpRange ipRange) {
+      IpRanges newIpRanges = IpRanges.builder()
+               .ipRange(ipRange)
+               .build();
+      return IpScope.builder()
+               .isInherited(false)
+               .gateway("192.168.2.1")
+               .netmask("255.255.0.0")
+               .ipRanges(newIpRanges).build();
    }
 
    @Test(description = "GET /vApp/{id}/networkSection", dependsOnMethods = { "testGetVApp" })
    public void testGetNetworkSection() {
       // The method under test
-      NetworkSection section = vAppApi.getNetworkSection(vApp.getHref());
+      NetworkSection section = vAppApi.getNetworkSection(vAppUrn);
 
       // Check the retrieved object is well formed
       checkNetworkSection(section);
@@ -646,21 +654,21 @@
    @Test(description = "GET /vApp/{id}/owner", dependsOnMethods = { "testGetVApp" })
    public void testGetOwner() {
       // The method under test
-      Owner owner = vAppApi.getOwner(vApp.getHref());
+      Owner owner = vAppApi.getOwner(vAppUrn);
 
       // Check the retrieved object is well formed
       checkOwner(owner);
    }
 
    @Test(description = "PUT /vApp/{id}/owner", dependsOnMethods = { "testGetOwner" })
-   public void testModifyOwner() {
-      Owner newOwner = Owner.builder().user(Reference.builder().href(testUserURI).type(ADMIN_USER).build()).build();
+   public void testEditOwner() {
+      Owner newOwner = Owner.builder().user(Reference.builder().href(user.getHref()).type(ADMIN_USER).build()).build();
 
       // The method under test
-      vAppApi.modifyOwner(vApp.getHref(), newOwner);
+      vAppApi.editOwner(vAppUrn, newOwner);
 
       // Get the new VApp owner
-      Owner modified = vAppApi.getOwner(vApp.getHref());
+      Owner modified = vAppApi.getOwner(vAppUrn);
 
       // Check the retrieved object is well formed
       checkOwner(modified);
@@ -672,32 +680,33 @@
    @Test(description = "GET /vApp/{id}/productSections", dependsOnMethods = { "testGetVApp" })
    public void testGetProductSections() {
       // The method under test
-      ProductSectionList sectionList = vAppApi.getProductSections(vApp.getHref());
+      ProductSectionList sectionList = vAppApi.getProductSections(vAppUrn);
 
       // Check the retrieved object is well formed
       checkProductSectionList(sectionList);
    }
 
    @Test(description = "PUT /vApp/{id}/productSections", dependsOnMethods = { "testGetProductSections" })
-   public void testModifyProductSections() {
-      // Copy existing section and update fields
-      ProductSectionList oldSections = vAppApi.getProductSections(vApp.getHref());
-      ProductSectionList newSections = oldSections.toBuilder()
-            .productSection(ProductSection.builder()
-                  .info("Information about the installed software") // Default ovf:Info text
-                  .required()
-                  .product(MsgType.builder().value("jclouds").build())
-                  .vendor(MsgType.builder().value("jclouds Inc.").build())
-                  // NOTE other ProductSection elements not returned by vCloud
-                  .build())
-            .build();
+   public void testEditProductSections() {
+      // Copy existing section and edit fields
+      ProductSectionList oldSections = vAppApi.getProductSections(vAppUrn);
+      ProductSectionList newSections = oldSections
+               .toBuilder()
+               .productSection(
+                        ProductSection.builder().info("Information about the installed software")
+                                 // Default ovf:Info text
+                                 .required().product(MsgType.builder().value("jclouds").build())
+                                 .vendor(MsgType.builder().value("jclouds Inc.").build())
+                                 // NOTE other ProductSection elements not returned by vCloud
+                                 .build()).build();
 
       // The method under test
-      Task modifyProductSections = vAppApi.modifyProductSections(vApp.getHref(), newSections);
-      assertTrue(retryTaskSuccess.apply(modifyProductSections), String.format(TASK_COMPLETE_TIMELY, "modifyProductSections"));
+      Task editProductSections = vAppApi.editProductSections(vAppUrn, newSections);
+      assertTrue(retryTaskSuccess.apply(editProductSections),
+               String.format(TASK_COMPLETE_TIMELY, "editProductSections"));
 
       // Retrieve the modified section
-      ProductSectionList modified = vAppApi.getProductSections(vApp.getHref());
+      ProductSectionList modified = vAppApi.getProductSections(vAppUrn);
 
       // Check the retrieved object is well formed
       checkProductSectionList(modified);
@@ -712,30 +721,29 @@
    @Test(description = "GET /vApp/{id}/startupSection", dependsOnMethods = { "testGetVApp" })
    public void testGetStartupSection() {
       // The method under test
-      StartupSection section = vAppApi.getStartupSection(vApp.getHref());
+      StartupSection section = vAppApi.getStartupSection(vAppUrn);
 
       // Check the retrieved object is well formed
       checkStartupSection(section);
    }
 
    @Test(description = "PUT /vApp/{id}/startupSection", dependsOnMethods = { "testGetStartupSection" })
-   public void testModifyStartupSection() {
-      // Copy existing section and update fields
-      StartupSection oldSection = vAppApi.getStartupSection(vApp.getHref());
+   public void testEditStartupSection() {
+      // Copy existing section and edit fields
+      StartupSection oldSection = vAppApi.getStartupSection(vAppUrn);
       StartupSection newSection = oldSection.toBuilder().build();
 
       // The method under test
-      Task modifyStartupSection = vAppApi.modifyStartupSection(vApp.getHref(), newSection);
-      assertTrue(retryTaskSuccess.apply(modifyStartupSection), String.format(TASK_COMPLETE_TIMELY, "modifyStartupSection"));
+      Task editStartupSection = vAppApi.editStartupSection(vAppUrn, newSection);
+      assertTrue(retryTaskSuccess.apply(editStartupSection), String.format(TASK_COMPLETE_TIMELY, "editStartupSection"));
 
       // Retrieve the modified section
-      StartupSection modified = vAppApi.getStartupSection(vApp.getHref());
+      StartupSection modified = vAppApi.getStartupSection(vAppUrn);
 
       // Check the retrieved object is well formed
       checkStartupSection(modified);
 
       // Check the modified section fields are set correctly
-      // assertEquals(modified.getX(), "");
       assertEquals(modified, newSection);
    }
 
@@ -744,50 +752,58 @@
       key = name("key-");
       String value = name("value-");
       metadataValue = MetadataValue.builder().value(value).build();
-      vAppApi.getMetadataApi().setMetadata(vApp.getHref(), key, metadataValue);
+      vAppApi.getMetadataApi(vAppUrn).putEntry(key, metadataValue);
 
       // Retrieve the value, and assert it was set correctly
-      MetadataValue newMetadataValue = vAppApi.getMetadataApi().getMetadataValue(vApp.getHref(), key);
+      MetadataValue newMetadataValue = vAppApi.getMetadataApi(vAppUrn).getValue(key);
 
       // Check the retrieved object is well formed
       checkMetadataValueFor(VAPP, newMetadataValue, value);
    }
-   
+
    @Test(description = "GET /vApp/{id}/metadata", dependsOnMethods = { "testSetMetadataValue" })
    public void testGetMetadata() {
       key = name("key-");
       String value = name("value-");
       metadataValue = MetadataValue.builder().value(value).build();
-      vAppApi.getMetadataApi().setMetadata(vApp.getHref(), key, metadataValue);
-      
+      vAppApi.getMetadataApi(vAppUrn).putEntry(key, metadataValue);
+
       // Call the method being tested
-      Metadata metadata = vAppApi.getMetadataApi().getMetadata(vApp.getHref());
-      
+      Metadata metadata = vAppApi.getMetadataApi(vAppUrn).get();
+
       checkMetadata(metadata);
-      
+
       // Check requirements for this test
-      assertFalse(Iterables.isEmpty(metadata.getMetadataEntries()), String.format(NOT_EMPTY_OBJECT_FMT, "MetadataEntry", "vApp"));
+      assertFalse(Iterables.isEmpty(metadata.getMetadataEntries()),
+               String.format(NOT_EMPTY_OBJECT_FMT, "MetadataEntry", "vApp"));
    }
-   
+
    @Test(description = "GET /vApp/{id}/metadata/{key}", dependsOnMethods = { "testGetMetadata" })
    public void testGetOrgMetadataValue() {
-      // Call the method being tested
-      MetadataValue value = vAppApi.getMetadataApi().getMetadataValue(vApp.getHref(), key);
       
+      key = name("key-");
+      String value = name("value-");
+      metadataValue = MetadataValue.builder().value(value).build();
+      vAppApi.getMetadataApi(vAppUrn).putEntry(key, metadataValue);
+      
+      // Call the method being tested
+      MetadataValue newValue = vAppApi.getMetadataApi(vAppUrn).getValue(key);
+
       String expected = metadataValue.getValue();
 
-      checkMetadataValue(value);
-      assertEquals(value.getValue(), expected, String.format(CORRECT_VALUE_OBJECT_FMT, "Value", "MetadataValue", expected, value.getValue()));
+      checkMetadataValue(newValue);
+      assertEquals(newValue.getValue(), expected,
+               String.format(CORRECT_VALUE_OBJECT_FMT, "Value", "MetadataValue", expected, newValue.getValue()));
    }
 
    @Test(description = "DELETE /vApp/{id}/metadata/{key}", dependsOnMethods = { "testSetMetadataValue" })
-   public void testDeleteMetadataEntry() {
+   public void testRemoveMetadataEntry() {
       // Delete the entry
-      Task task = vAppApi.getMetadataApi().deleteMetadataEntry(vApp.getHref(), key);
+      Task task = vAppApi.getMetadataApi(vAppUrn).removeEntry(key);
       retryTaskSuccess.apply(task);
 
-      // Confirm the entry has been deleted
-      Metadata newMetadata = vAppApi.getMetadataApi().getMetadata(vApp.getHref());
+      // Confirm the entry has been removed
+      Metadata newMetadata = vAppApi.getMetadataApi(vAppUrn).get();
 
       // Check the retrieved object is well formed
       checkMetadataKeyAbsentFor(VAPP, newMetadata, key);
@@ -795,54 +811,50 @@
 
    @Test(description = "POST /vApp/{id}/metadata", dependsOnMethods = { "testGetMetadata" })
    public void testMergeMetadata() {
-      Metadata oldMetadata = vAppApi.getMetadataApi().getMetadata(vApp.getHref());
+      Metadata oldMetadata = vAppApi.getMetadataApi(vAppUrn).get();
       Map<String, String> oldMetadataMap = Checks.metadataToMap(oldMetadata);
 
-      // Store a value, to be deleted
+      // Store a value, to be removed
       String key = name("key-");
       String value = name("value-");
-      Metadata addedMetadata = Metadata.builder()
-            .entry(MetadataEntry.builder().key(key).value(value).build())
-            .build();
-      Task task = vAppApi.getMetadataApi().mergeMetadata(vApp.getHref(), addedMetadata);
+      Metadata addedMetadata = Metadata.builder().entry(MetadataEntry.builder().key(key).value(value).build()).build();
+      Task task = vAppApi.getMetadataApi(vAppUrn).merge(addedMetadata);
       retryTaskSuccess.apply(task);
 
       // Confirm the entry contains everything that was there, and everything that was being added
-      Metadata newMetadata = vAppApi.getMetadataApi().getMetadata(vApp.getHref());
-      Map<String, String> expectedMetadataMap = ImmutableMap.<String, String>builder()
-            .putAll(oldMetadataMap)
-            .put(key, value)
-            .build();
+      Metadata newMetadata = vAppApi.getMetadataApi(vAppUrn).get();
+      Map<String, String> expectedMetadataMap = ImmutableMap.<String, String> builder().putAll(oldMetadataMap)
+               .put(key, value).build();
 
       // Check the retrieved object is well formed
       checkMetadataFor(VAPP, newMetadata, expectedMetadataMap);
    }
 
    /**
-    * @see VAppApi#deleteVApp(URI)
+    * @see VAppApi#remove(URI)
     */
    @Test(description = "DELETE /vApp/{id}")
-   public void testDeleteVApp() {
-      // Create a temporary VApp to delete
+   public void testRemoveVApp() {
+      // Create a temporary VApp to remove
       VApp temp = instantiateVApp();
 
       // The method under test
-      Task deleteVApp = vAppApi.deleteVApp(temp.getHref());
-      assertTrue(retryTaskSuccess.apply(deleteVApp), String.format(TASK_COMPLETE_TIMELY, "deleteVApp"));
+      Task removeVApp = vAppApi.remove(temp.getId());
+      assertTrue(retryTaskSuccess.apply(removeVApp), String.format(TASK_COMPLETE_TIMELY, "removeVApp"));
 
-      VApp deleted = vAppApi.getVApp(temp.getHref());
-      assertNull(deleted, "The VApp "+temp.getName()+" should have been deleted");
+      VApp removed = vAppApi.get(temp.getId());
+      assertNull(removed, "The VApp " + temp.getName() + " should have been removed");
    }
-   
+
    /**
     * Create the recompose vapp params.
-    *
+    * 
     * @param vappTemplateRef
     * @param vdc
     * @return
     * @throws VCloudException
     */
-   public RecomposeVAppParams createRecomposeParams(VApp vApp, Vm vm) {
+   public RecomposeVAppParams addRecomposeParams(VApp vApp, Vm vm) {
 
       // creating an item element. this item will contain the vm which should be added to the vapp.
       Reference reference = Reference.builder().name(name("vm-")).href(vm.getHref()).type(vm.getType()).build();
@@ -852,10 +864,11 @@
 
       Set<NetworkAssignment> networkAssignments = Sets.newLinkedHashSet();
 
-      // if the vm contains a network connection and the vApp does not contain any configured network
+      // if the vm contains a network connection and the vApp does not contain any configured
+      // network
       if (vmHasNetworkConnectionConfigured(vm)) {
          if (!vAppHasNetworkConfigured(vApp)) {
-            // create a new network connection section for the vm.
+            // add a new network connection section for the vm.
             NetworkConnectionSection networkConnectionSection = NetworkConnectionSection.builder()
                      .info("Empty network configuration parameters").build();
             // adding the network connection section to the instantiation params of the vapp.
@@ -867,14 +880,11 @@
          // configured network -> vm could be mapped to that network.
          else {
             Set<VAppNetworkConfiguration> vAppNetworkConfigurations = listVappNetworkConfigurations(vApp);
-            Set<NetworkConnection> listVmNetworkConnections = listNetworkConnections(vm);
-            for (NetworkConnection networkConnection : listVmNetworkConnections) {
-               for (VAppNetworkConfiguration vAppNetworkConfiguration : vAppNetworkConfigurations) {
-                  NetworkAssignment networkAssignment = NetworkAssignment.builder()
-                           .innerNetwork(vAppNetworkConfiguration.getNetworkName())
-                           .containerNetwork(vAppNetworkConfiguration.getNetworkName()).build();
-                  networkAssignments.add(networkAssignment);
-               }
+            for (VAppNetworkConfiguration vAppNetworkConfiguration : vAppNetworkConfigurations) {
+               NetworkAssignment networkAssignment = NetworkAssignment.builder()
+                        .innerNetwork(vAppNetworkConfiguration.getNetworkName())
+                        .containerNetwork(vAppNetworkConfiguration.getNetworkName()).build();
+               networkAssignments.add(networkAssignment);
             }
          }
       }
@@ -884,11 +894,7 @@
       // vapp network
       else {
          if (vAppHasNetworkConfigured(vApp)) {
-
             VAppNetworkConfiguration vAppNetworkConfiguration = getVAppNetworkConfig(vApp);
-            System.out.println(vAppNetworkConfiguration.getNetworkName());
-            System.out.println(vAppNetworkConfiguration.getDescription());
-
             NetworkConnection networkConnection = NetworkConnection.builder()
                      .network(vAppNetworkConfiguration.getNetworkName())
                      .ipAddressAllocationMode(IpAddressAllocationMode.DHCP).build();
@@ -904,18 +910,41 @@
 
       if (vmInstantiationParams != null)
          vmItem = SourcedCompositionItemParam.builder().fromSourcedCompositionItemParam(vmItem)
-                  .instantiationParams(vmInstantiationParams)
-                  .build();
-      
+                  .instantiationParams(vmInstantiationParams).build();
+
       if (networkAssignments != null)
          vmItem = SourcedCompositionItemParam.builder().fromSourcedCompositionItemParam(vmItem)
-                  .networkAssignment(networkAssignments)
-                  .build();
-      
-      return RecomposeVAppParams.builder().name(name("recompose-"))
-               // adding the vm item.
-               .sourcedItems(ImmutableList.of(vmItem)).build();
+                  .networkAssignment(networkAssignments).build();
 
+      return RecomposeVAppParams.builder().name(name("recompose-"))
+      // adding the vm item.
+               .sourcedItems(ImmutableList.of(vmItem)).build();
+   }
+   
+   private final class IsVAppNetworkNamed implements Predicate<VAppNetworkConfiguration> {
+      private final String networkName;
+
+      private IsVAppNetworkNamed(String networkName) {
+         this.networkName = networkName;
+      }
+
+      @Override
+      public boolean apply(VAppNetworkConfiguration input) {
+         return input.getNetworkName().equals(networkName);
+      }
+   }
+   
+   private void cleanUpNetworkConnectionSection(Vm toAddVm) {
+      NetworkConnectionSection networkConnectionSection = vmApi.getNetworkConnectionSection(toAddVm.getId());
+      Set<NetworkConnection> networkConnections = networkConnectionSection.getNetworkConnections();
+      for (NetworkConnection networkConnection : networkConnections) {
+         NetworkConnection newNetworkConnection = networkConnection.toBuilder().isConnected(false).build();
+         networkConnectionSection = networkConnectionSection.toBuilder().networkConnection(newNetworkConnection)
+                  .build();
+      }
+
+      Task configureNetwork = vmApi.editNetworkConnectionSection(toAddVm.getId(), networkConnectionSection);
+      assertTaskSucceedsLong(configureNetwork);
    }
 
 }
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppNetworksLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppNetworksLiveTest.java
index 8df1e59..4e2656e 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppNetworksLiveTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppNetworksLiveTest.java
@@ -18,14 +18,10 @@
  */
 package org.jclouds.vcloud.director.v1_5.features;
 
-import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.ENTITY_NON_NULL;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.TASK_COMPLETE_TIMELY;
 import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkNetworkConfigSection;
-import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertTrue;
-import static org.testng.Assert.fail;
 
-import java.net.URI;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -33,7 +29,6 @@
 import org.jclouds.vcloud.director.v1_5.AbstractVAppApiLiveTest;
 import org.jclouds.vcloud.director.v1_5.domain.Reference;
 import org.jclouds.vcloud.director.v1_5.domain.Task;
-import org.jclouds.vcloud.director.v1_5.domain.Vdc;
 import org.jclouds.vcloud.director.v1_5.domain.Vm;
 import org.jclouds.vcloud.director.v1_5.domain.network.FirewallRule;
 import org.jclouds.vcloud.director.v1_5.domain.network.FirewallRuleProtocols;
@@ -42,6 +37,7 @@
 import org.jclouds.vcloud.director.v1_5.domain.network.IpRanges;
 import org.jclouds.vcloud.director.v1_5.domain.network.IpScope;
 import org.jclouds.vcloud.director.v1_5.domain.network.NatService;
+import org.jclouds.vcloud.director.v1_5.domain.network.Network;
 import org.jclouds.vcloud.director.v1_5.domain.network.Network.FenceMode;
 import org.jclouds.vcloud.director.v1_5.domain.network.NetworkConfiguration;
 import org.jclouds.vcloud.director.v1_5.domain.network.NetworkConnection;
@@ -57,11 +53,8 @@
 import org.testng.annotations.Test;
 
 import com.google.common.base.Joiner;
-import com.google.common.base.Optional;
-import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 
@@ -78,16 +71,15 @@
    private static final String HTTP_SECURITY_GROUP = "http";
    private static final String DEFAULT_SECURITY_GROUP = "default";
    private String key;
-   private Reference parentNetworkRef;
    private Map<String, NetworkConfiguration> securityGroupToNetworkConfig;
-   private String orgNetworkName;
+   private Network network;
 
    @AfterClass(alwaysRun = true, dependsOnMethods = { "cleanUpEnvironment" })
    protected void tidyUp() {
       if (key != null) {
          try {
-	         Task delete = vAppTemplateApi.getMetadataApi().deleteMetadataEntry(vAppTemplateURI, key);
-	         taskDoneEventually(delete);
+	         Task remove = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).removeEntry(key);
+	         taskDoneEventually(remove);
          } catch (Exception e) {
             logger.warn(e, "Error when deleting metadata entry '%s'", key);
          }
@@ -96,9 +88,8 @@
    
    @BeforeClass
    void setUp() {
-      parentNetworkRef = lookUpNewtorkInVdc(networkURI);
-      securityGroupToNetworkConfig = createSecurityGroupToNetworkConfiguration(parentNetworkRef);
-      orgNetworkName = parentNetworkRef.getName();
+      network = lazyGetNetwork();
+      securityGroupToNetworkConfig = addSecurityGroupToNetworkConfiguration(Reference.builder().fromEntity(network).build());
    }
    
    @AfterMethod
@@ -107,12 +98,12 @@
    }
 
    @Test(description = "Create a vApp Network based on an org network with `default` firewall rules applied")
-   public void testCreateVAppNetworkWithDefaultSecurityGroup() {
+   public void testAddVAppNetworkWithDefaultSecurityGroup() {
       ImmutableList<String> securityGroups = ImmutableList.of(DEFAULT_SECURITY_GROUP);
-      createVAppNetworkWithSecurityGroupOnVApp(securityGroups, vAppURI);
+      addVAppNetworkWithSecurityGroupOnVApp(securityGroups, vAppUrn);
 
       // Retrieve the modified section
-      NetworkConfigSection modified = vAppApi.getNetworkConfigSection(vAppURI);
+      NetworkConfigSection modified = vAppApi.getNetworkConfigSection(vAppUrn);
 
       // Check the retrieved object is well formed
       checkNetworkConfigSection(modified);
@@ -126,12 +117,12 @@
    }
    
    @Test(description = "Create a vApp Network based on an org network with `http` firewall rules applied")
-   public void testCreateVAppNetworkWithHttpSecurityGroup() {
+   public void testAddVAppNetworkWithHttpSecurityGroup() {
       ImmutableList<String> securityGroups = ImmutableList.of(HTTP_SECURITY_GROUP);
-      createVAppNetworkWithSecurityGroupOnVApp(securityGroups, vAppURI);
+      addVAppNetworkWithSecurityGroupOnVApp(securityGroups, vAppUrn);
 
       // Retrieve the modified section
-      NetworkConfigSection modified = vAppApi.getNetworkConfigSection(vAppURI);
+      NetworkConfigSection modified = vAppApi.getNetworkConfigSection(vAppUrn);
 
       // Check the retrieved object is well formed
       checkNetworkConfigSection(modified);
@@ -145,12 +136,12 @@
    }
    
    @Test(description = "Create a vApp Network based on an org network with both `defautl` and `http` firewall rules applied")
-   public void testCreateVAppNetworkWithDefaultAndHttpSecurityGroup() {
+   public void testAddVAppNetworkWithDefaultAndHttpSecurityGroup() {
       ImmutableList<String> securityGroups = ImmutableList.of(DEFAULT_SECURITY_GROUP, HTTP_SECURITY_GROUP);
-      createVAppNetworkWithSecurityGroupOnVApp(securityGroups, vAppURI);
+      addVAppNetworkWithSecurityGroupOnVApp(securityGroups, vAppUrn);
 
       // Retrieve the modified section
-      NetworkConfigSection modified = vAppApi.getNetworkConfigSection(vAppURI);
+      NetworkConfigSection modified = vAppApi.getNetworkConfigSection(vAppUrn);
 
       // Check the retrieved object is well formed
       checkNetworkConfigSection(modified);
@@ -163,12 +154,12 @@
        */
    }
    
-   private void createVAppNetworkWithSecurityGroupOnVApp(ImmutableList<String> securityGroups, URI vAppURI) {
-      String newVAppNetworkName = generateVAppNetworkName(orgNetworkName, securityGroups);
+   private void addVAppNetworkWithSecurityGroupOnVApp(ImmutableList<String> securityGroups, String vAppUrn) {
+      String newVAppNetworkName = generateVAppNetworkName(network.getName(), securityGroups);
       // Create a vAppNetwork with firewall rules
       NetworkConfigSection newSection = generateNetworkConfigSection(securityGroups, newVAppNetworkName);
-      Task modifyNetworkConfigSection = vAppApi.modifyNetworkConfigSection(vAppURI, newSection);
-      assertTrue(retryTaskSuccess.apply(modifyNetworkConfigSection), String.format(TASK_COMPLETE_TIMELY, "modifyNetworkConfigSection"));
+      Task editNetworkConfigSection = vAppApi.editNetworkConfigSection(vAppUrn, newSection);
+      assertTrue(retryTaskSuccess.apply(editNetworkConfigSection), String.format(TASK_COMPLETE_TIMELY, "editNetworkConfigSection"));
       attachVmToVAppNetwork(vm, newVAppNetworkName);
    }
    
@@ -180,15 +171,15 @@
          firewallRules.addAll(securityGroupFirewallRules);
       }
       
-      FirewallService firewallService = createFirewallService(firewallRules);
-      NatService natService = createNatService();
-      IpScope ipScope = createNewIpScope();      
+      FirewallService firewallService = addFirewallService(firewallRules);
+      NatService natService = addNatService();
+      IpScope ipScope = addNewIpScope();      
       NetworkConfiguration newConfiguration = NetworkConfiguration.builder()
                .ipScope(ipScope)
-               .parentNetwork(parentNetworkRef)
+               .parentNetwork(Reference.builder().fromEntity(network).build())
                .fenceMode(FenceMode.NAT_ROUTED)
                .retainNetInfoAcrossDeployments(false)
-               .features(createNetworkFeatures(ImmutableSet.of(firewallService, natService)))
+               .features(toNetworkFeatures(ImmutableSet.of(firewallService, natService)))
                .build();
       
       VAppNetworkConfiguration newVAppNetworkConfiguration = VAppNetworkConfiguration.builder().networkName(newVAppNetworkName).configuration(newConfiguration).build();
@@ -199,7 +190,7 @@
    }
 
    private void attachVmToVAppNetwork(Vm vm, String vAppNetworkName) {
-      Set<NetworkConnection> networkConnections = vmApi.getNetworkConnectionSection(vm.getHref())
+      Set<NetworkConnection> networkConnections = vmApi.getNetworkConnectionSection(vm.getId())
                .getNetworkConnections();
 
       NetworkConnectionSection section = NetworkConnectionSection.builder()
@@ -217,12 +208,12 @@
          
          section = section.toBuilder().networkConnection(newNetworkConnection).build();
       }
-      Task configureNetwork = vmApi.modifyNetworkConnectionSection(vm.getHref(), section);
+      Task configureNetwork = vmApi.editNetworkConnectionSection(vm.getId(), section);
       assertTaskSucceedsLong(configureNetwork);
    }
 
-   private IpScope createNewIpScope() {
-      IpRange newIpRange = createIpRange();
+   private IpScope addNewIpScope() {
+      IpRange newIpRange = addIpRange();
       IpRanges newIpRanges = IpRanges.builder()
                .ipRange(newIpRange)
                .build();
@@ -233,7 +224,7 @@
                .ipRanges(newIpRanges).build();
    }
 
-   private IpRange createIpRange() {
+   private IpRange addIpRange() {
       IpRange newIpRange = IpRange.builder()
                .startAddress("192.168.2.100")
                .endAddress("192.168.2.199")
@@ -241,25 +232,6 @@
       return newIpRange;
    }
 
-   private Reference lookUpNewtorkInVdc(final URI networkURI) {
-      Vdc vdc = context.getApi().getVdcApi().getVdc(vdcURI);
-      assertNotNull(vdc, String.format(ENTITY_NON_NULL, VDC));
-
-      Set<Reference> networks = vdc.getAvailableNetworks();
-
-      // Look up the network in the Vdc with the id configured for the tests
-      Optional<Reference> parentNetwork = Iterables.tryFind(networks, new Predicate<Reference>() {
-         @Override
-         public boolean apply(Reference reference) {
-            return reference.getHref().equals(networkURI);
-         }
-      });
-      if (!parentNetwork.isPresent()) {
-         fail(String.format("Could not find network %s in vdc", networkURI.toASCIIString()));
-      }
-      return parentNetwork.get();
-   }
-
    private Set<FirewallRule> retrieveAllFirewallRules(NetworkFeatures networkFeatures) {
       Set<FirewallRule> firewallRules = Sets.newLinkedHashSet();
       for (NetworkServiceType<?> networkServiceType : networkFeatures.getNetworkServices()) {
@@ -270,7 +242,7 @@
       return firewallRules;
    }
 
-   private NetworkFeatures createNetworkFeatures(Set<? extends NetworkServiceType<?>> networkServices) {
+   private NetworkFeatures toNetworkFeatures(Set<? extends NetworkServiceType<?>> networkServices) {
       NetworkFeatures networkFeatures = NetworkFeatures.builder()
                .services(networkServices)
                .build();
@@ -278,23 +250,23 @@
    }
 
 
-   private Set<FirewallRule> createDefaultFirewallRules() {
+   private Set<FirewallRule> defaultFirewallRules() {
       FirewallRuleProtocols protocols = FirewallRuleProtocols.builder()
                .any(true)
                .build();
-      FirewallRule egressAll = createFirewallRule(FirewallRuleProtocols.builder().tcp(true).build(), "allow ssh ingoing traffic", -1, 22, "in");
-      FirewallRule sshIngoing = createFirewallRule(protocols, "allow all outgoing traffic", -1, -1, "out");
+      FirewallRule egressAll = addFirewallRule(FirewallRuleProtocols.builder().tcp(true).build(), "allow ssh ingoing traffic", -1, 22, "in");
+      FirewallRule sshIngoing = addFirewallRule(protocols, "allow all outgoing traffic", -1, -1, "out");
       return ImmutableSet.of(egressAll, sshIngoing);
    }
 
-   private Set<FirewallRule> createHttpIngoingFirewallRule() {
+   private Set<FirewallRule> httpIngressFirewallRules() {
       FirewallRuleProtocols protocols = FirewallRuleProtocols.builder().tcp(true).build();
-      FirewallRule httpIngoing = createFirewallRule(protocols , "allow http ingoing traffic", 80, 80, "in");
-      FirewallRule httpsIngoing = createFirewallRule(protocols , "allow https ingoing traffic", 443, 443, "in");
+      FirewallRule httpIngoing = addFirewallRule(protocols , "allow http ingoing traffic", 80, 80, "in");
+      FirewallRule httpsIngoing = addFirewallRule(protocols , "allow https ingoing traffic", 443, 443, "in");
       return ImmutableSet.of(httpIngoing, httpsIngoing);
    }
    
-   private FirewallRule createFirewallRule(FirewallRuleProtocols protocols, String description, int sourcePort, int outPort, String direction) {
+   private FirewallRule addFirewallRule(FirewallRuleProtocols protocols, String description, int sourcePort, int outPort, String direction) {
       return FirewallRule.builder()
                .isEnabled(true)
                .description(description)
@@ -309,7 +281,7 @@
                .build();
    }
    
-   private FirewallService createFirewallService(Set<FirewallRule> firewallRules) {
+   private FirewallService addFirewallService(Set<FirewallRule> firewallRules) {
       FirewallService firewallService = FirewallService.builder()
                .enabled(true)
                .defaultAction("drop")
@@ -319,7 +291,7 @@
       return firewallService;
    }
    
-   private NatService createNatService() {
+   private NatService addNatService() {
       NatService natService = NatService.builder()
                .enabled(true)
                .natType("ipTranslation")
@@ -328,28 +300,28 @@
       return natService;
    }
    
-   private Map<String, NetworkConfiguration> createSecurityGroupToNetworkConfiguration(Reference parentNetworkRef) {
-      Set<FirewallRule> defaultFirewallRules = createDefaultFirewallRules();
-      Set<FirewallRule> httpFirewallRules = createHttpIngoingFirewallRule();
+   private Map<String, NetworkConfiguration> addSecurityGroupToNetworkConfiguration(Reference parentNetworkRef) {
+      Set<FirewallRule> defaultFirewallRules = defaultFirewallRules();
+      Set<FirewallRule> httpFirewallRules = httpIngressFirewallRules();
 
       Map<String, NetworkConfiguration> securityGroupToNetworkConfigurations = Maps.newHashMap();
-      securityGroupToNetworkConfigurations.put(DEFAULT_SECURITY_GROUP, createNetworkConfiguration(parentNetworkRef, defaultFirewallRules));
-      securityGroupToNetworkConfigurations.put(HTTP_SECURITY_GROUP, createNetworkConfiguration(parentNetworkRef, httpFirewallRules));
+      securityGroupToNetworkConfigurations.put(DEFAULT_SECURITY_GROUP, addNetworkConfiguration(parentNetworkRef, defaultFirewallRules));
+      securityGroupToNetworkConfigurations.put(HTTP_SECURITY_GROUP, addNetworkConfiguration(parentNetworkRef, httpFirewallRules));
       
       return securityGroupToNetworkConfigurations;
    }
 
-   private NetworkConfiguration createNetworkConfiguration(Reference parentNetworkRef, Set<FirewallRule> newFirewallRules) {
-      FirewallService firewallService = createFirewallService(newFirewallRules);
+   private NetworkConfiguration addNetworkConfiguration(Reference parentNetworkRef, Set<FirewallRule> newFirewallRules) {
+      FirewallService firewallService = addFirewallService(newFirewallRules);
 
-      IpScope ipScope = createNewIpScope();      
+      IpScope ipScope = addNewIpScope();      
 
       NetworkConfiguration newConfiguration = NetworkConfiguration.builder()
                .ipScope(ipScope)
                .parentNetwork(parentNetworkRef)
                .fenceMode(FenceMode.NAT_ROUTED)
                .retainNetInfoAcrossDeployments(false)
-               .features(createNetworkFeatures(ImmutableSet.of(firewallService)))
+               .features(toNetworkFeatures(ImmutableSet.of(firewallService)))
                .build();
       return newConfiguration;
    }
@@ -360,7 +332,7 @@
 
    private void disconnectVmFromVAppNetwork(Vm vm) {
       
-      Set<NetworkConnection> networkConnections = vmApi.getNetworkConnectionSection(vm.getHref())
+      Set<NetworkConnection> networkConnections = vmApi.getNetworkConnectionSection(vm.getId())
                .getNetworkConnections();
 
       NetworkConnectionSection section = NetworkConnectionSection.builder()
@@ -377,7 +349,7 @@
                            .build())
                   .build();
       } 
-      Task cleanUpNetworks = vmApi.modifyNetworkConnectionSection(vm.getHref(), section);
+      Task cleanUpNetworks = vmApi.editNetworkConnectionSection(vm.getId(), section);
       assertTaskSucceedsLong(cleanUpNetworks);
    }
 
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateApiExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateApiExpectTest.java
index 1fc5387..7bf687b 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateApiExpectTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateApiExpectTest.java
@@ -21,12 +21,10 @@
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ANY;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.CUSTOMIZATION_SECTION;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ERROR;
-import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.GUEST_CUSTOMIZATION_SECTION;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.LEASE_SETTINGS_SECTION;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.METADATA;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.METADATA_ENTRY;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.NETWORK_CONFIG_SECTION;
-import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.RELOCATE_TEMPLATE;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.TASK;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.VAPP_TEMPLATE;
 import static org.testng.Assert.assertEquals;
@@ -50,7 +48,6 @@
 import org.jclouds.vcloud.director.v1_5.domain.Task;
 import org.jclouds.vcloud.director.v1_5.domain.VAppTemplate;
 import org.jclouds.vcloud.director.v1_5.domain.Vm;
-import org.jclouds.vcloud.director.v1_5.domain.params.RelocateParams;
 import org.jclouds.vcloud.director.v1_5.domain.section.CustomizationSection;
 import org.jclouds.vcloud.director.v1_5.domain.section.GuestCustomizationSection;
 import org.jclouds.vcloud.director.v1_5.domain.section.LeaseSettingsSection;
@@ -86,14 +83,14 @@
       ).getVAppTemplateApi();
 
       assertNotNull(api);
-      VAppTemplate template = api.getVAppTemplate(uri);
+      VAppTemplate template = api.get(uri);
 
       assertEquals(template, exampleTemplate());
 
-      Task task = api.modifyVAppTemplate(uri, exampleTemplate());
+      Task task = api.edit(uri, exampleTemplate());
       assertNotNull(task);
 
-      task = api.deleteVappTemplate(uri);
+      task = api.remove(uri);
       assertNotNull(task);
    }
 
@@ -106,7 +103,7 @@
             new VcloudHttpRequestPrimer().apiCommand("GET", templateId).acceptMedia(VAPP_TEMPLATE).httpRequestBuilder().build(),
             new VcloudHttpResponsePrimer().xmlFilePayload("/vapptemplate/error400.xml", ERROR).httpResponseBuilder().statusCode(400).build()).getVAppTemplateApi();
 
-      api.getVAppTemplate(uri);
+      api.get(uri);
    }
 
    @Test(expectedExceptions = ResourceNotFoundException.class)
@@ -118,11 +115,11 @@
             new VcloudHttpRequestPrimer().apiCommand("PUT", templateId).xmlFilePayload("/vapptemplate/vAppTemplate.xml", VAPP_TEMPLATE).acceptMedia(TASK).httpRequestBuilder().build(),
             new VcloudHttpResponsePrimer().xmlFilePayload("/vapptemplate/error403.xml", ERROR).httpResponseBuilder().statusCode(403).build()).getVAppTemplateApi();
 
-      api.modifyVAppTemplate(uri, exampleTemplate());
+      api.edit(uri, exampleTemplate());
    }
 
    @Test(expectedExceptions = VCloudDirectorException.class)
-   public void testDeleteMissingVAppTemplate() {
+   public void testRemoveMissingVAppTemplate() {
       final String templateId = "/vAppTemplate/vappTemplate-ef4415e6-d413-4cbb-9262-f9bbec5f2ea9";
       URI uri = URI.create(endpoint + templateId);
 
@@ -130,33 +127,7 @@
             new VcloudHttpRequestPrimer().apiCommand("DELETE", templateId).acceptMedia(TASK).httpRequestBuilder().build(),
             new VcloudHttpResponsePrimer().xmlFilePayload("/vapptemplate/error400.xml", ERROR).httpResponseBuilder().statusCode(400).build()).getVAppTemplateApi();
       
-      api.deleteVappTemplate(uri);
-   }
-   
-   public void testConsolidateVAppTemplate() {
-      final String templateId = "/vAppTemplate/vappTemplate-ef4415e6-d413-4cbb-9262-f9bbec5f2ea9";
-      URI uri = URI.create(endpoint + templateId);
-
-      VAppTemplateApi api = requestsSendResponses(loginRequest, sessionResponse,
-            new VcloudHttpRequestPrimer().apiCommand("POST", templateId + "/action/consolidate").acceptMedia(TASK).httpRequestBuilder().build(),
-            new VcloudHttpResponsePrimer().xmlFilePayload("/task/task.xml", TASK).httpResponseBuilder().build()
-      ).getVAppTemplateApi();
-
-      assertNotNull(api);
-      Task task = api.consolidateVm(uri);
-      assertNotNull(task);
-   }
-
-   @Test(expectedExceptions = ResourceNotFoundException.class)
-   public void testConsolidateMissingVAppTemplate() {
-      final String templateId = "/vAppTemplate/vappTemplate-ef4415e6-d413-4cbb-9262-f9bbec5f2ea9";
-      URI uri = URI.create(endpoint + templateId);
-
-      VAppTemplateApi api = orderedRequestsSendResponses(loginRequest, sessionResponse,
-            new VcloudHttpRequestPrimer().apiCommand("POST", templateId + "/action/consolidate").acceptMedia(TASK).httpRequestBuilder().build(),
-            new VcloudHttpResponsePrimer().xmlFilePayload("/vapptemplate/error403.xml", ERROR).httpResponseBuilder().statusCode(403).build()).getVAppTemplateApi();
-
-      api.consolidateVm(uri);
+      api.remove(uri);
    }
 
    public void testDisableDownloadVAppTemplate() {
@@ -209,39 +180,6 @@
 
       api.enableDownload(uri);
    }
-   
-   public void testRelocateVAppTemplate() {
-      final String templateId = "/vAppTemplate/vappTemplate-ef4415e6-d413-4cbb-9262-f9bbec5f2ea9";
-      URI uri = URI.create(endpoint + templateId);
-
-      VAppTemplateApi api = requestsSendResponses(loginRequest, sessionResponse,
-            new VcloudHttpRequestPrimer().apiCommand("POST", templateId + "/action/relocate").xmlFilePayload("/vapptemplate/relocateParams.xml", RELOCATE_TEMPLATE).acceptMedia(TASK).httpRequestBuilder().build(),
-            new VcloudHttpResponsePrimer().xmlFilePayload("/task/task.xml", TASK).httpResponseBuilder().build()
-      ).getVAppTemplateApi();
-
-      assertNotNull(api);
-
-      Reference datastore = Reference.builder().href(URI.create("https://vcloud.example.com/api/admin/extension/datastore/607")).build();
-      RelocateParams params = RelocateParams.builder().datastore(datastore).build();
-
-      Task task = api.relocateVm(uri, params);
-      assertNotNull(task);
-   }
-
-   @Test(expectedExceptions = VCloudDirectorException.class)
-   public void testRelocateMissingVAppTemplate() {
-      final String templateId = "/vAppTemplate/vappTemplate-ef4415e6-d413-4cbb-9262-f9bbec5f2ea9";
-      URI uri = URI.create(endpoint + templateId);
-
-      VAppTemplateApi api = orderedRequestsSendResponses(loginRequest, sessionResponse,
-            new VcloudHttpRequestPrimer().apiCommand("POST", templateId + "/action/relocate").xmlFilePayload("/vapptemplate/relocateParams.xml", RELOCATE_TEMPLATE).acceptMedia(TASK).httpRequestBuilder().build(),
-            new VcloudHttpResponsePrimer().xmlFilePayload("/vapptemplate/error400.xml", ERROR).httpResponseBuilder().statusCode(400).build()).getVAppTemplateApi();
-
-      Reference datastore = Reference.builder().href(URI.create("https://vcloud.example.com/api/admin/extension/datastore/607")).build();
-      RelocateParams params = RelocateParams.builder().datastore(datastore).build();
-
-      api.relocateVm(uri, params);
-   }
 
    public void testErrorGetCustomizationSection() {
       final String templateId = "/vAppTemplate/vappTemplate-ef4415e6-d413-4cbb-9262-f9bbec5f2ea9";
@@ -254,50 +192,6 @@
       assertNull(api.getCustomizationSection(uri));
    }
    
-   public void testGuestCustomizationSection() {
-      final String templateId = "/vAppTemplate/vappTemplate-ef4415e6-d413-4cbb-9262-f9bbec5f2ea9";
-      URI uri = URI.create(endpoint + templateId);
-
-      VAppTemplateApi api = orderedRequestsSendResponses(loginRequest, sessionResponse,
-            new VcloudHttpRequestPrimer().apiCommand("GET", templateId + "/guestCustomizationSection").acceptMedia(GUEST_CUSTOMIZATION_SECTION).httpRequestBuilder().build(),
-            new VcloudHttpResponsePrimer().xmlFilePayload("/vapptemplate/guestCustomizationSection.xml", GUEST_CUSTOMIZATION_SECTION).httpResponseBuilder().build(),
-            new VcloudHttpRequestPrimer().apiCommand("PUT", templateId + "/guestCustomizationSection").xmlFilePayload("/vapptemplate/guestCustomizationSection.xml", GUEST_CUSTOMIZATION_SECTION).acceptMedia(TASK).httpRequestBuilder().build(),
-            new VcloudHttpResponsePrimer().xmlFilePayload("/task/task.xml", TASK).httpResponseBuilder().build()
-      ).getVAppTemplateApi();
-
-      assertNotNull(api);
-      GuestCustomizationSection section = api.getGuestCustomizationSection(uri);
-
-      assertEquals(section, exampleGuestCustomizationSection());
-
-      Task task = api.modifyGuestCustomizationSection(uri, exampleGuestCustomizationSection());
-      assertNotNull(task);
-   }
-
-   @Test(expectedExceptions = VCloudDirectorException.class)
-   public void testErrorGetGuestCustomizationSection() {
-      final String templateId = "/vAppTemplate/vappTemplate-ef4415e6-d413-4cbb-9262-f9bbec5f2ea9";
-      URI uri = URI.create(endpoint + templateId);
-
-      VAppTemplateApi api = orderedRequestsSendResponses(loginRequest, sessionResponse,
-            new VcloudHttpRequestPrimer().apiCommand("GET", templateId + "/guestCustomizationSection").acceptMedia(GUEST_CUSTOMIZATION_SECTION).httpRequestBuilder().build(),
-            new VcloudHttpResponsePrimer().xmlFilePayload("/vapptemplate/error400.xml", ERROR).httpResponseBuilder().statusCode(400).build()).getVAppTemplateApi();
-
-      api.getGuestCustomizationSection(uri);
-   }
-   
-   @Test(expectedExceptions = VCloudDirectorException.class)
-   public void testErrorEditGuestCustomizationSection() {
-      final String templateId = "/vAppTemplate/vappTemplate-ef4415e6-d413-4cbb-9262-f9bbec5f2ea9";
-      URI uri = URI.create(endpoint + templateId);
-
-      VAppTemplateApi api = orderedRequestsSendResponses(loginRequest, sessionResponse,
-            new VcloudHttpRequestPrimer().apiCommand("PUT", templateId + "/guestCustomizationSection").xmlFilePayload("/vapptemplate/guestCustomizationSection.xml", GUEST_CUSTOMIZATION_SECTION).acceptMedia(TASK).httpRequestBuilder().build(),
-            new VcloudHttpResponsePrimer().xmlFilePayload("/vapptemplate/error400.xml", ERROR).httpResponseBuilder().statusCode(400).build()).getVAppTemplateApi();
-
-      api.modifyGuestCustomizationSection(uri, exampleGuestCustomizationSection());
-   }
-
    public void testLeaseSettingsSection() throws ParseException {
       final String templateId = "/vAppTemplate/vappTemplate-ef4415e6-d413-4cbb-9262-f9bbec5f2ea9";
       URI uri = URI.create(endpoint + templateId);
@@ -314,7 +208,7 @@
 
       assertEquals(section, exampleLeaseSettingsSection());
 
-      Task task = api.modifyLeaseSettingsSection(uri, exampleLeaseSettingsSection());
+      Task task = api.editLeaseSettingsSection(uri, exampleLeaseSettingsSection());
       assertNotNull(task);
    }
 
@@ -338,7 +232,7 @@
             new VcloudHttpRequestPrimer().apiCommand("PUT", templateId + "/leaseSettingsSection").xmlFilePayload("/vapptemplate/leaseSettingsSection.xml", LEASE_SETTINGS_SECTION).acceptMedia(TASK).httpRequestBuilder().build(),
             new VcloudHttpResponsePrimer().xmlFilePayload("/vapptemplate/error403.xml", ERROR).httpResponseBuilder().statusCode(403).build()).getVAppTemplateApi();
 
-      api.modifyLeaseSettingsSection(uri, exampleLeaseSettingsSection());
+      api.editLeaseSettingsSection(uri, exampleLeaseSettingsSection());
    }
 
    public void testVappTemplateMetadata() {
@@ -353,11 +247,11 @@
       ).getVAppTemplateApi();
 
       assertNotNull(api);
-      Metadata metadata = api.getMetadataApi().getMetadata(uri);
+      Metadata metadata = api.getMetadataApi(uri).get();
 
       assertEquals(metadata, exampleMetadata());
 
-      Task task = api.getMetadataApi().mergeMetadata(uri, exampleMetadata());
+      Task task = api.getMetadataApi(uri).merge(exampleMetadata());
       assertNotNull(task);
    }
 
@@ -370,7 +264,7 @@
             new VcloudHttpRequestPrimer().apiCommand("GET", templateId + "/metadata").acceptMedia(ANY).httpRequestBuilder().build(),
             new VcloudHttpResponsePrimer().xmlFilePayload("/vapptemplate/error400.xml", ERROR).httpResponseBuilder().statusCode(400).build()).getVAppTemplateApi();
 
-      api.getMetadataApi().getMetadata(uri);
+      api.getMetadataApi(uri).get();
    }
 
    @Test(expectedExceptions = VCloudDirectorException.class)
@@ -382,7 +276,7 @@
             new VcloudHttpRequestPrimer().apiCommand("POST", templateId + "/metadata").xmlFilePayload("/vapptemplate/metadata.xml", METADATA).acceptMedia(TASK).httpRequestBuilder().build(),
             new VcloudHttpResponsePrimer().xmlFilePayload("/vapptemplate/error400.xml", ERROR).httpResponseBuilder().statusCode(400).build()).getVAppTemplateApi();
 
-      api.getMetadataApi().mergeMetadata(uri, exampleMetadata());
+      api.getMetadataApi(uri).merge(exampleMetadata());
    }
    
    public void testVappTemplateMetadataValue() {
@@ -399,14 +293,14 @@
       ).getVAppTemplateApi();
 
       assertNotNull(api);
-      MetadataValue metadata = api.getMetadataApi().getMetadataValue(uri, "12345");
+      MetadataValue metadata = api.getMetadataApi(uri).getValue("12345");
 
       assertEquals(metadata, exampleMetadataValue());
 
-      Task task = api.getMetadataApi().setMetadata(uri, "12345", exampleMetadataValue());
+      Task task = api.getMetadataApi(uri).putEntry("12345", exampleMetadataValue());
       assertNotNull(task);
 
-      task = api.getMetadataApi().deleteMetadataEntry(uri, "12345");
+      task = api.getMetadataApi(uri).removeEntry("12345");
       assertNotNull(task);
    }
 
@@ -418,7 +312,7 @@
             new VcloudHttpRequestPrimer().apiCommand("GET", templateId + "/metadata/12345").acceptMedia(METADATA_ENTRY).httpRequestBuilder().build(),
             new VcloudHttpResponsePrimer().xmlFilePayload("/vapptemplate/error403.xml", ERROR).httpResponseBuilder().statusCode(403).build()).getVAppTemplateApi();
 
-      assertNull(api.getMetadataApi().getMetadataValue(uri, "12345"));
+      assertNull(api.getMetadataApi(uri).getValue("12345"));
    }
    
    @Test(expectedExceptions = VCloudDirectorException.class)
@@ -430,11 +324,11 @@
             new VcloudHttpRequestPrimer().apiCommand("PUT", templateId + "/metadata/12345").xmlFilePayload("/vapptemplate/metadataValue.xml", METADATA_ENTRY).acceptMedia(TASK).httpRequestBuilder().build(),
             new VcloudHttpResponsePrimer().xmlFilePayload("/vapptemplate/error400.xml", ERROR).httpResponseBuilder().statusCode(400).build()).getVAppTemplateApi();
 
-      api.getMetadataApi().setMetadata(uri, "12345", exampleMetadataValue());
+      api.getMetadataApi(uri).putEntry("12345", exampleMetadataValue());
    }
 
    @Test(expectedExceptions = ResourceNotFoundException.class)
-   public void testDeleteMissingMetadataValue() {
+   public void testRemoveMissingMetadataValue() {
       final String templateId = "/vAppTemplate/vappTemplate-ef4415e6-d413-4cbb-9262-f9bbec5f2ea9";
       URI uri = URI.create(endpoint + templateId);
 
@@ -442,7 +336,7 @@
             new VcloudHttpRequestPrimer().apiCommand("DELETE", templateId + "/metadata/12345").acceptMedia(TASK).httpRequestBuilder().build(),
             new VcloudHttpResponsePrimer().xmlFilePayload("/vapptemplate/error403.xml", ERROR).httpResponseBuilder().statusCode(403).build()).getVAppTemplateApi();
 
-      api.getMetadataApi().deleteMetadataEntry(uri, "12345");
+      api.getMetadataApi(uri).removeEntry("12345");
    }
 
    @Test(expectedExceptions = VCloudDirectorException.class)
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateApiLiveTest.java
index 40cf401..341c38e 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateApiLiveTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VAppTemplateApiLiveTest.java
@@ -19,7 +19,6 @@
 package org.jclouds.vcloud.director.v1_5.features;
 
 import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkCustomizationSection;
-import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkGuestCustomizationSection;
 import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkLeaseSettingsSection;
 import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadata;
 import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkMetadataFor;
@@ -38,7 +37,6 @@
 import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 
-import java.net.URI;
 import java.util.EnumSet;
 import java.util.List;
 import java.util.Map;
@@ -46,7 +44,6 @@
 
 import org.jclouds.dmtf.ovf.NetworkSection;
 import org.jclouds.vcloud.director.v1_5.AbstractVAppApiLiveTest;
-import org.jclouds.vcloud.director.v1_5.domain.Checks;
 import org.jclouds.vcloud.director.v1_5.domain.Link;
 import org.jclouds.vcloud.director.v1_5.domain.Link.Rel;
 import org.jclouds.vcloud.director.v1_5.domain.Metadata;
@@ -55,17 +52,13 @@
 import org.jclouds.vcloud.director.v1_5.domain.Owner;
 import org.jclouds.vcloud.director.v1_5.domain.ProductSectionList;
 import org.jclouds.vcloud.director.v1_5.domain.Reference;
-import org.jclouds.vcloud.director.v1_5.domain.References;
 import org.jclouds.vcloud.director.v1_5.domain.Task;
 import org.jclouds.vcloud.director.v1_5.domain.VAppTemplate;
 import org.jclouds.vcloud.director.v1_5.domain.dmtf.Envelope;
 import org.jclouds.vcloud.director.v1_5.domain.params.CloneVAppTemplateParams;
-import org.jclouds.vcloud.director.v1_5.domain.params.RelocateParams;
 import org.jclouds.vcloud.director.v1_5.domain.section.CustomizationSection;
-import org.jclouds.vcloud.director.v1_5.domain.section.GuestCustomizationSection;
 import org.jclouds.vcloud.director.v1_5.domain.section.LeaseSettingsSection;
 import org.jclouds.vcloud.director.v1_5.domain.section.NetworkConfigSection;
-import org.jclouds.vcloud.director.v1_5.domain.section.NetworkConnectionSection;
 import org.testng.annotations.AfterClass;
 import org.testng.annotations.Test;
 
@@ -78,7 +71,7 @@
  * Tests the request/response behavior of {@link VAppTemplateApi}
  * 
  * NOTE The environment MUST have at least one template configured
- *
+ * 
  * @author Aled Sage
  */
 @Test(groups = { "live", "user" }, singleThreaded = true, testName = "VAppTemplateApiLiveTest")
@@ -91,22 +84,20 @@
    protected void tidyUp() {
       if (key != null) {
          try {
-	         Task delete = vAppTemplateApi.getMetadataApi().deleteMetadataEntry(vAppTemplateURI, key);
-	         taskDoneEventually(delete);
+            Task remove = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).removeEntry(key);
+            taskDoneEventually(remove);
          } catch (Exception e) {
             logger.warn(e, "Error when deleting metadata entry '%s'", key);
          }
       }
    }
-   
+
    private VAppTemplate cloneVAppTemplate(boolean waitForTask) throws Exception {
       CloneVAppTemplateParams cloneVAppTemplateParams = CloneVAppTemplateParams.builder()
-               .source(Reference.builder().href(vAppTemplateURI).build())
-               .isSourceDelete(false)
-               .name("clone")
-               .build();
-      VAppTemplate clonedVappTemplate = vdcApi.cloneVAppTemplate(vdcURI, cloneVAppTemplateParams);
-      
+               .source(Reference.builder().href(lazyGetVAppTemplate().getHref()).build()).isSourceDelete(false)
+               .name("clone").build();
+      VAppTemplate clonedVappTemplate = vdcApi.cloneVAppTemplate(vdcUrn, cloneVAppTemplateParams);
+
       if (waitForTask) {
          Task cloneTask = Iterables.getFirst(clonedVappTemplate.getTasks(), null);
          assertNotNull(cloneTask, "vdcApi.cloneVAppTemplate returned VAppTemplate that did not contain any tasks");
@@ -117,112 +108,93 @@
 
    @Test(description = "GET /vAppTemplate/{id}")
    public void testGetVAppTemplate() {
-      vAppTemplate = vAppTemplateApi.getVAppTemplate(vAppTemplateURI);
-      
+      vAppTemplate = vAppTemplateApi.get(vAppTemplateUrn);
+
       checkVAppTemplate(vAppTemplate);
-      assertEquals(vAppTemplate.getHref(), vAppTemplateURI);
+      assertEquals(vAppTemplate.getId(), vAppTemplateUrn);
    }
-   
+
    @Test(description = "GET /vAppTemplate/{id}/owner")
    public void testGetVAppTemplateOwner() {
-      Owner owner = vAppTemplateApi.getOwner(vAppTemplateURI);
-      
+      Owner owner = vAppTemplateApi.getOwner(vAppTemplateUrn);
+
       checkOwner(owner);
-      assertEquals(owner.getUser(), vAppTemplateApi.getVAppTemplate(vAppTemplateURI).getOwner().getUser());
+      assertEquals(owner.getUser(), vAppTemplateApi.get(vAppTemplateUrn).getOwner().getUser());
    }
-   
+
    @Test(description = "GET /vAppTemplate/{id}/customizationSection")
    public void testGetCustomizationSection() {
-      CustomizationSection customizationSection = vAppTemplateApi.getCustomizationSection(vAppTemplateURI);
-      
+      CustomizationSection customizationSection = vAppTemplateApi.getCustomizationSection(vAppTemplateUrn);
+
       checkCustomizationSection(customizationSection);
    }
-   
+
    @Test(description = "GET /vAppTemplate/{id}/productSections")
    public void testGetProductSections() {
-      ProductSectionList productSectionList = vAppTemplateApi.getProductSections(vAppTemplateURI);
-      
+      ProductSectionList productSectionList = vAppTemplateApi.getProductSections(vAppTemplateUrn);
+
       checkProductSectionList(productSectionList);
    }
-   
+
    @Test(description = "PUT /vAppTemplate/{id}/productSections")
    public void testEditProductSections() {
       // TODO make a real modification
-      
-      ProductSectionList origSections = vAppTemplateApi.getProductSections(vApp.getHref());
+
+      ProductSectionList origSections = vAppTemplateApi.getProductSections(vApp.getId());
       ProductSectionList newSections = origSections.toBuilder().build();
-      
-      Task task = vAppTemplateApi.modifyProductSections(vApp.getHref(), newSections);
+
+      Task task = vAppTemplateApi.editProductSections(vApp.getId(), newSections);
       assertTaskSucceeds(task);
 
-      ProductSectionList modified = vAppTemplateApi.getProductSections(vApp.getHref());
+      ProductSectionList modified = vAppTemplateApi.getProductSections(vApp.getId());
       checkProductSectionList(modified);
    }
    
-   @Test(description = "GET /vAppTemplate/{id}/guestCustomizationSection")
-   public void testGetGuestCustomizationSection() {
-      getGuestCustomizationSection(new Function<URI, GuestCustomizationSection>() {
-         @Override
-         public GuestCustomizationSection apply(URI uri) {
-            return vAppTemplateApi.getGuestCustomizationSection(uri);
-         }
-      });
-   }
-   
    @Test(description = "GET /vAppTemplate/{id}/leaseSettingsSection")
    public void testGetLeaseSettingsSection() {
-      LeaseSettingsSection leaseSettingsSection = vAppTemplateApi.getLeaseSettingsSection(vAppTemplateURI);
-      
+      LeaseSettingsSection leaseSettingsSection = vAppTemplateApi.getLeaseSettingsSection(vAppTemplateUrn);
+
       checkLeaseSettingsSection(leaseSettingsSection);
    }
-   
+
    @Test(description = "GET /vAppTemplate/{id}/metadata", dependsOnMethods = { "testEditMetadataValue" })
    public void testGetVAppTemplateMetadata() {
-      Metadata metadata = vAppTemplateApi.getMetadataApi().getMetadata(vAppTemplateURI);
-      
+      Metadata metadata = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).get();
+
       checkMetadata(metadata);
    }
 
-   // implicitly tested by testEditVAppTemplateMetadataValue, which first creates the metadata entry; otherwise no entry may exist
+   // implicitly tested by testEditVAppTemplateMetadataValue, which first adds the metadata entry;
+   // otherwise no entry may exist
    @Test(description = "GET /vAppTemplate/{id}/metadata/{key}", dependsOnMethods = { "testGetVAppTemplateMetadata" })
    public void testGetMetadataValue() {
-      Metadata metadata = vAppTemplateApi.getMetadataApi().getMetadata(vAppTemplateURI);
+      Metadata metadata = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).get();
       MetadataEntry entry = Iterables.get(metadata.getMetadataEntries(), 0);
-      
-      MetadataValue val = vAppTemplateApi.getMetadataApi().getMetadataValue(vAppTemplateURI, entry.getKey());
-      
+
+      MetadataValue val = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).getValue(entry.getKey());
+
       checkMetadataValue(val);
       assertEquals(val.getValue(), entry.getValue());
    }
-   
+
    @Test(description = "GET /vAppTemplate/{id}/networkConfigSection")
    public void testGetVAppTemplateNetworkConfigSection() {
-      NetworkConfigSection networkConfigSection = vAppTemplateApi.getNetworkConfigSection(vAppTemplateURI);
-      
+      NetworkConfigSection networkConfigSection = vAppTemplateApi.getNetworkConfigSection(vAppTemplateUrn);
+
       checkNetworkConfigSection(networkConfigSection);
    }
-   
-   @Test(description = "GET /vAppTemplate/{id}/networkConnectionSection")
-   public void testGetNetworkConnectionSection() {
-      getNetworkConnectionSection(new Function<URI, NetworkConnectionSection>() {
-         @Override
-         public NetworkConnectionSection apply(URI uri) {
-            return vAppTemplateApi.getNetworkConnectionSection(uri);
-         }
-      });
-   }
 
    @Test(description = "GET /vAppTemplate/{id}/networkSection")
    public void testGetVAppTemplateNetworkSection() {
-      NetworkSection networkSection = vAppTemplateApi.getNetworkSection(vAppTemplateURI);
+      NetworkSection networkSection = vAppTemplateApi.getNetworkSection(vAppTemplateUrn);
 
       checkOvfNetworkSection(networkSection);
    }
 
    @Test(description = "GET /vAppTemplate/{id}/ovf")
    public void testGetVAppTemplateOvf() {
-      Envelope envelope = vAppTemplateApi.getOvf(vAppTemplateURI);
-      
+      Envelope envelope = vAppTemplateApi.getOvf(vAppTemplateUrn);
+
       checkOvfEnvelope(envelope);
    }
 
@@ -230,197 +202,146 @@
    public void testEditVAppTemplate() {
       String name = name("myname-");
       String description = name("Description ");
-      VAppTemplate template = VAppTemplate.builder()
-               .name(name)
-               .description(description)
-               .build();
-      
-      final Task task = vAppTemplateApi.modifyVAppTemplate(vAppTemplateURI, template);
+      VAppTemplate template = VAppTemplate.builder().name(name).description(description).build();
+
+      final Task task = vAppTemplateApi.edit(vAppTemplateUrn, template);
       assertTaskSucceeds(task);
 
-      VAppTemplate newTemplate = vAppTemplateApi.getVAppTemplate(vAppTemplateURI);
+      VAppTemplate newTemplate = vAppTemplateApi.get(vAppTemplateUrn);
       assertEquals(newTemplate.getName(), name);
       assertEquals(newTemplate.getDescription(), description);
    }
 
    @Test(description = "POST /vAppTemplate/{id}/metadata", dependsOnMethods = { "testGetVAppTemplate" })
    public void testEditMetadata() {
-      Metadata oldMetadata = vAppTemplateApi.getMetadataApi().getMetadata(vAppTemplateURI);
-      Map<String,String> oldMetadataMap = metadataToMap(oldMetadata);
+      Metadata oldMetadata = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).get();
+      Map<String, String> oldMetadataMap = metadataToMap(oldMetadata);
 
       key = name("key-");
       val = name("value-");
       MetadataEntry metadataEntry = MetadataEntry.builder().entry(key, val).build();
       Metadata metadata = Metadata.builder().fromMetadata(oldMetadata).entry(metadataEntry).build();
-      
-      final Task task = vAppTemplateApi.getMetadataApi().mergeMetadata(vAppTemplateURI, metadata);
+
+      final Task task = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).merge(metadata);
       assertTaskSucceeds(task);
 
-      Metadata newMetadata = vAppTemplateApi.getMetadataApi().getMetadata(vAppTemplateURI);
-      Map<String,String> expectedMetadataMap = ImmutableMap.<String,String>builder()
-               .putAll(oldMetadataMap)
-               .put(key, val)
-               .build();
+      Metadata newMetadata = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).get();
+      Map<String, String> expectedMetadataMap = ImmutableMap.<String, String> builder().putAll(oldMetadataMap)
+               .put(key, val).build();
       checkMetadataFor("vAppTemplate", newMetadata, expectedMetadataMap);
    }
-   
+
    @Test(description = "PUT /vAppTemplate/{id}/metadata/{key}", dependsOnMethods = { "testEditMetadata" })
    public void testEditMetadataValue() {
-      val = "new"+val;
+      val = "new" + val;
       MetadataValue metadataValue = MetadataValue.builder().value(val).build();
-      
-      final Task task = vAppTemplateApi.getMetadataApi().setMetadata(vAppTemplateURI, key, metadataValue);
+
+      final Task task = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).putEntry(key, metadataValue);
       retryTaskSuccess.apply(task);
 
-      MetadataValue newMetadataValue = vAppTemplateApi.getMetadataApi().getMetadataValue(vAppTemplateURI, key);
+      MetadataValue newMetadataValue = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).getValue(key);
       assertEquals(newMetadataValue.getValue(), metadataValue.getValue());
    }
 
    @Test(description = "DELETE /vAppTemplate/{id}/metadata/{key}", dependsOnMethods = { "testGetMetadataValue" })
-   public void testDeleteVAppTemplateMetadataValue() {
-      final Task deletionTask = vAppTemplateApi.getMetadataApi().deleteMetadataEntry(vAppTemplateURI, key);
+   public void testRemoveVAppTemplateMetadataValue() {
+      final Task deletionTask = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).removeEntry(key);
       assertTaskSucceeds(deletionTask);
 
-      Metadata newMetadata = vAppTemplateApi.getMetadataApi().getMetadata(vAppTemplateURI);
+      Metadata newMetadata = vAppTemplateApi.getMetadataApi(vAppTemplateUrn).get();
       checkMetadataKeyAbsentFor("vAppTemplate", newMetadata, key);
       key = null;
    }
 
-   @Test(description = "PUT /vAppTemplate/{id}/guestCustomizationSection")
-   public void testEditGuestCustomizationSection() {
-      String computerName = name("n");
-      GuestCustomizationSection newSection = GuestCustomizationSection.builder()
-               .info("")
-               .computerName(computerName)
-               .build();
-      
-      final Task task = vAppTemplateApi.modifyGuestCustomizationSection(vm.getHref(), newSection);
-      assertTaskSucceeds(task);
-
-      GuestCustomizationSection modified = vAppTemplateApi.getGuestCustomizationSection(vm.getHref());
-      
-      checkGuestCustomizationSection(modified);
-      assertEquals(modified.getComputerName(), computerName);
-   }
-   
    // NOTE vAppTemplate supports only storageLease (deployment lease applies to vApp too)
    @Test(description = "PUT /vAppTemplate/{id}/leaseSettingsSection")
    public void testEditLeaseSettingsSection() throws Exception {
       // NOTE use smallish number for storageLeaseInSeconds; it seems to be capped at 5184000?
-      int storageLeaseInSeconds = random.nextInt(10000)+1;
+      int storageLeaseInSeconds = random.nextInt(10000) + 1;
 
-      LeaseSettingsSection leaseSettingSection = LeaseSettingsSection.builder()
-               .info("my info")
-               .storageLeaseInSeconds(storageLeaseInSeconds)
-               .build();
-      
-      final Task task = vAppTemplateApi.modifyLeaseSettingsSection(vAppTemplateURI, leaseSettingSection);
+      LeaseSettingsSection leaseSettingSection = LeaseSettingsSection.builder().info("my info")
+               .storageLeaseInSeconds(storageLeaseInSeconds).build();
+
+      final Task task = vAppTemplateApi.editLeaseSettingsSection(vAppTemplateUrn, leaseSettingSection);
       assertTaskSucceeds(task);
-      
-      LeaseSettingsSection newLeaseSettingsSection = vAppTemplateApi.getLeaseSettingsSection(vAppTemplateURI);
+
+      LeaseSettingsSection newLeaseSettingsSection = vAppTemplateApi.getLeaseSettingsSection(vAppTemplateUrn);
       assertEquals(newLeaseSettingsSection.getStorageLeaseInSeconds(), (Integer) storageLeaseInSeconds);
    }
 
-   @Test(description = "DELETE /vAppTemplate/{id}", dependsOnMethods = { "testGetVAppTemplate" }) 
-   public void testDeleteVAppTemplate() throws Exception {
+   @Test(description = "DELETE /vAppTemplate/{id}", dependsOnMethods = { "testGetVAppTemplate" })
+   public void testRemoveVAppTemplate() throws Exception {
       VAppTemplate clonedVappTemplate = cloneVAppTemplate(true);
 
-      // Confirm that "get" works pre-delete
-      VAppTemplate vAppTemplatePreDelete = vAppTemplateApi.getVAppTemplate(clonedVappTemplate.getHref());
+      // Confirm that "get" works pre-remove
+      VAppTemplate vAppTemplatePreDelete = vAppTemplateApi.get(clonedVappTemplate.getId());
       checkVAppTemplate(vAppTemplatePreDelete);
-      
+
       // Delete the template
-      final Task task = vAppTemplateApi.deleteVappTemplate(clonedVappTemplate.getHref());
+      final Task task = vAppTemplateApi.remove(clonedVappTemplate.getId());
       assertTaskSucceeds(task);
 
-      // Confirm that can't access post-delete, i.e. template has been deleted
-      VAppTemplate deleted = vAppTemplateApi.getVAppTemplate(clonedVappTemplate.getHref());
-      assertNull(deleted);
+      // Confirm that can't access post-remove, i.e. template has been removed
+      VAppTemplate removed = vAppTemplateApi.get(clonedVappTemplate.getId());
+      assertNull(removed);
    }
 
    @Test(description = "POST /vAppTemplate/{id}/action/disableDownload")
    public void testDisableVAppTemplateDownload() throws Exception {
-      vAppTemplateApi.disableDownload(vAppTemplateURI);
-      
-      // TODO Check that it really is disabled. The only thing I can see for determining this 
+      vAppTemplateApi.disableDownload(vAppTemplateUrn);
+
+      // TODO Check that it really is disabled. The only thing I can see for determining this
       // is the undocumented "download" link in the VAppTemplate. But that is brittle and we
       // don't know what timing guarantees there are for adding/removing the link.
-      VAppTemplate vAppTemplate = vAppTemplateApi.getVAppTemplate(vAppTemplateURI);
+      VAppTemplate vAppTemplate = vAppTemplateApi.get(vAppTemplateUrn);
       Set<Link> links = vAppTemplate.getLinks();
-      assertTrue(Iterables.all(Iterables.transform(links, rel), Predicates.not(Predicates.in(EnumSet.of(Link.Rel.DOWNLOAD_DEFAULT, Link.Rel.DOWNLOAD_ALTERNATE)))),
-            "Should not offer download link after disabling download: "+vAppTemplate);
+      assertTrue(Iterables.all(Iterables.transform(links, rel),
+               Predicates.not(Predicates.in(EnumSet.of(Link.Rel.DOWNLOAD_DEFAULT, Link.Rel.DOWNLOAD_ALTERNATE)))),
+               "Should not offer download link after disabling download: " + vAppTemplate);
    }
-   
+
    @Test(description = "POST /vAppTemplate/{id}/action/enableDownload")
    public void testEnableVAppTemplateDownload() throws Exception {
       // First disable so that enable really has some work to do...
-      vAppTemplateApi.disableDownload(vAppTemplateURI);
-      final Task task = vAppTemplateApi.enableDownload(vAppTemplateURI);
+      vAppTemplateApi.disableDownload(vAppTemplateUrn);
+      final Task task = vAppTemplateApi.enableDownload(vAppTemplateUrn);
       assertTaskSucceeds(task);
-      
-      // TODO Check that it really is enabled. The only thing I can see for determining this 
+
+      // TODO Check that it really is enabled. The only thing I can see for determining this
       // is the undocumented "download" link in the VAppTemplate. But that is brittle and we
       // don't know what timing guarantees there are for adding/removing the link.
-      VAppTemplate vAppTemplate = vAppTemplateApi.getVAppTemplate(vAppTemplateURI);
+      VAppTemplate vAppTemplate = vAppTemplateApi.get(vAppTemplateUrn);
       Set<Link> links = vAppTemplate.getLinks();
-      assertTrue(Iterables.any(Iterables.transform(links, rel), Predicates.in(EnumSet.of(Link.Rel.DOWNLOAD_DEFAULT, Link.Rel.DOWNLOAD_ALTERNATE))),
-            "Should offer download link after enabling download: "+vAppTemplate);
+      assertTrue(
+               Iterables.any(Iterables.transform(links, rel),
+                        Predicates.in(EnumSet.of(Link.Rel.DOWNLOAD_DEFAULT, Link.Rel.DOWNLOAD_ALTERNATE))),
+               "Should offer download link after enabling download: " + vAppTemplate);
    }
-   
+
    private Function<Link, Link.Rel> rel = new Function<Link, Link.Rel>() {
       @Override
       public Rel apply(Link input) {
          return input.getRel();
       }
    };
-   
-   @Test(description = "POST /vAppTemplate/{id}/action/consolidate")
-   public void testConsolidateVAppTemplate() throws Exception {
-      final Task task = vAppTemplateApi.consolidateVm(vm.getHref());
-      assertTaskSucceedsLong(task);
-      
-      // TODO Need assertion that command had effect
-   }
-   
-   // TODO How to obtain a datastore reference?
-   @Test(description = "POST /vAppTemplate/{id}/action/relocate")
-   public void testRelocateVAppTemplate() throws Exception {
-      Reference dataStore = null; // FIXME
-      RelocateParams relocateParams = RelocateParams.builder()
-               .datastore(dataStore)
-               .build();
-      
-      final Task task = vAppTemplateApi.relocateVm(vAppTemplateURI, relocateParams);
-      assertTaskSucceedsLong(task);
 
-      // TODO Need assertion that command had effect
-   }
-   
-   // NOTE This will fail unless we can relocate a template to another datastore
-   @Test(description = "GET /vAppTemplate/{id}/shadowVms", dependsOnMethods = { "testRelocateVAppTemplate" })
-   public void testGetShadowVms() {
-      References references = vAppTemplateApi.getShadowVms(vAppTemplateURI);
-      
-      Checks.checkReferences(references);
-   }
-   
-   // This failed previously, but is passing now. 
+   // This failed previously, but is passing now.
    // However, it's not part of the official API so not necessary to assert it.
-   @Test(description = "test completed task not included in vAppTemplate") 
+   @Test(description = "test completed task not included in vAppTemplate")
    public void testCompletedTaskNotIncludedInVAppTemplate() throws Exception {
       // Kick off a task, and wait for it to complete
-      vAppTemplateApi.disableDownload(vAppTemplateURI);
-      final Task task = vAppTemplateApi.enableDownload(vAppTemplateURI);
+      vAppTemplateApi.disableDownload(vAppTemplateUrn);
+      final Task task = vAppTemplateApi.enableDownload(vAppTemplateUrn);
       assertTaskDoneEventually(task);
 
       // Ask the VAppTemplate for its tasks, and the status of the matching task if it exists
-      VAppTemplate vAppTemplate = vAppTemplateApi.getVAppTemplate(vAppTemplateURI);
+      VAppTemplate vAppTemplate = vAppTemplateApi.get(vAppTemplateUrn);
       List<Task> tasks = vAppTemplate.getTasks();
       for (Task contender : tasks) {
          if (task.getId().equals(contender.getId())) {
             Task.Status status = contender.getStatus();
             if (EnumSet.of(Task.Status.QUEUED, Task.Status.PRE_RUNNING, Task.Status.RUNNING).contains(status)) {
-               fail("Task "+contender+" reported complete, but is included in VAppTemplate in status "+status);
+               fail("Task " + contender + " reported complete, but is included in VAppTemplate in status " + status);
             }
          }
       }
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VdcApiExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VdcApiExpectTest.java
index 8ba976f..c5d02f6 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VdcApiExpectTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VdcApiExpectTest.java
@@ -24,8 +24,6 @@
 
 import java.net.URI;
 import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Locale;
 
 import org.jclouds.vcloud.director.v1_5.VCloudDirectorException;
 import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
@@ -35,17 +33,15 @@
 import org.jclouds.vcloud.director.v1_5.domain.Error;
 import org.jclouds.vcloud.director.v1_5.domain.Link;
 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.User;
 import org.jclouds.vcloud.director.v1_5.domain.Media.ImageType;
 import org.jclouds.vcloud.director.v1_5.domain.Metadata;
 import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
+import org.jclouds.vcloud.director.v1_5.domain.Owner;
 import org.jclouds.vcloud.director.v1_5.domain.Reference;
+import org.jclouds.vcloud.director.v1_5.domain.User;
 import org.jclouds.vcloud.director.v1_5.domain.VApp;
 import org.jclouds.vcloud.director.v1_5.domain.VAppTemplate;
 import org.jclouds.vcloud.director.v1_5.domain.Vdc;
-import org.jclouds.vcloud.director.v1_5.domain.org.Org;
 import org.jclouds.vcloud.director.v1_5.domain.params.CaptureVAppParams;
 import org.jclouds.vcloud.director.v1_5.domain.params.CloneMediaParams;
 import org.jclouds.vcloud.director.v1_5.domain.params.CloneVAppParams;
@@ -87,7 +83,7 @@
       
       Vdc expected = getVdc();
 
-      assertEquals(api.getVdcApi().getVdc(vdcURI), expected);
+      assertEquals(api.getVdcApi().get(vdcURI), expected);
    }
 
    @Test
@@ -109,7 +105,7 @@
             .build();
 
       try {
-         api.getVdcApi().getVdc(URI.create(endpoint + "/vdc/NOTAUUID"));
+         api.getVdcApi().get(URI.create(endpoint + "/vdc/NOTAUUID"));
          fail("Should give HTTP 400 error");
       } catch (VCloudDirectorException vde) {
          assertEquals(vde.getError(), expected);
@@ -128,7 +124,7 @@
                .xmlFilePayload("/vdc/error403-fake.xml", VCloudDirectorMediaType.ERROR)
                .httpResponseBuilder().statusCode(403).build());
 
-      assertNull(api.getVdcApi().getVdc(URI.create(endpoint + "/vdc/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")));
+      assertNull(api.getVdcApi().get(URI.create(endpoint + "/vdc/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee")));
    }
    
    @Test(enabled = false)
@@ -290,17 +286,17 @@
    }
 
    @Test
-   public void testCreateMedia() {
+   public void testAddMedia() {
       URI vdcUri = URI.create(endpoint + "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f");
 
       VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
             new VcloudHttpRequestPrimer()
                .apiCommand("POST", "/vdc/e9cd3387-ac57-4d27-a481-9bee75e0690f/media")
                .acceptMedia(VCloudDirectorMediaType.MEDIA)
-               .xmlFilePayload("/media/createMediaSource.xml", VCloudDirectorMediaType.MEDIA)
+               .xmlFilePayload("/media/addMediaSource.xml", VCloudDirectorMediaType.MEDIA)
                .httpRequestBuilder().build(), 
             new VcloudHttpResponsePrimer()
-               .xmlFilePayload("/media/createMedia.xml", VCloudDirectorMediaType.MEDIA)
+               .xmlFilePayload("/media/addMedia.xml", VCloudDirectorMediaType.MEDIA)
                .httpResponseBuilder().statusCode(201).build());
       
       Media source = Media.builder()
@@ -310,9 +306,9 @@
          .type("application/vnd.vmware.vcloud.media+xml")
          .description("Test media generated by testCreateMedia()")
          .build();
-      Media expected = MediaApiExpectTest.createMedia();
+      Media expected = MediaApiExpectTest.addMedia();
       
-      assertEquals(api.getVdcApi().createMedia(vdcUri, source), expected);
+      assertEquals(api.getVdcApi().addMedia(vdcUri, source), expected);
    }
    
    @Test
@@ -335,7 +331,6 @@
          .source(Reference.builder()
                .type("application/vnd.vmware.vcloud.media+xml")
                .name("copied test media")
-               .id("urn:vcloud:media:da8361af-cccd-4103-a71c-493513c49094")
                .href(URI.create("https://mycloud.greenhousedata.com/api/media/da8361af-cccd-4103-a71c-493513c49094"))
                .build())
          .isSourceDelete(false)
@@ -360,7 +355,7 @@
             
       Metadata expected = metadata();
 
-      assertEquals(api.getVdcApi().getMetadataApi().getMetadata(vdcUri), expected);
+      assertEquals(api.getVdcApi().getMetadataApi(vdcUri).get(), expected);
    }
    
    @Test(enabled = false)
@@ -378,7 +373,7 @@
       
       MetadataValue expected = metadataValue();
      
-      assertEquals(api.getVdcApi().getMetadataApi().getMetadataValue(vdcUri, "key"), expected);
+      assertEquals(api.getVdcApi().getMetadataApi(vdcUri).getValue("key"), expected);
    }
 
    public static Vdc getVdc() {
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VdcApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VdcApiLiveTest.java
index cd0f14e..a03552a 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VdcApiLiveTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VdcApiLiveTest.java
@@ -21,11 +21,10 @@
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_EQ;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_REQ_LIVE;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_REQ_LIVE;
-import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.REF_REQ_LIVE;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.URN_REQ_LIVE;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
-import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 
 import java.util.Map;
@@ -40,6 +39,7 @@
 import org.jclouds.vcloud.director.v1_5.domain.VApp;
 import org.jclouds.vcloud.director.v1_5.domain.VAppTemplate;
 import org.jclouds.vcloud.director.v1_5.domain.Vdc;
+import org.jclouds.vcloud.director.v1_5.domain.network.Network;
 import org.jclouds.vcloud.director.v1_5.domain.network.Network.FenceMode;
 import org.jclouds.vcloud.director.v1_5.domain.network.NetworkConfiguration;
 import org.jclouds.vcloud.director.v1_5.domain.network.VAppNetworkConfiguration;
@@ -64,11 +64,11 @@
 /**
  * Tests behavior of {@link VdcApi}
  * 
- * @author danikov
+ * @author danikov, Adrian Cole
  */
 @Test(groups = { "live", "user" }, singleThreaded = true, testName = "VdcApiLiveTest")
 public class VdcApiLiveTest extends BaseVCloudDirectorApiLiveTest {
-   
+
    public static final String VDC = "vdc";
 
    /*
@@ -77,7 +77,7 @@
    protected VdcApi vdcApi;
    protected VAppTemplateApi vappTemplateApi;
    protected VAppApi vappApi;
-   
+
    private VApp instantiatedVApp;
    private VApp clonedVApp;
    private VApp composedVApp;
@@ -85,17 +85,19 @@
    private VAppTemplate capturedVAppTemplate;
    private VAppTemplate uploadedVAppTemplate;
    private boolean metadataSet = false;
-   
+   private Network network;
+
    @Override
    @BeforeClass(alwaysRun = true)
    public void setupRequiredApis() {
       vdcApi = context.getApi().getVdcApi();
       vappTemplateApi = context.getApi().getVAppTemplateApi();
       vappApi = context.getApi().getVAppApi();
-      
-      assertNotNull(vdcURI, String.format(REF_REQ_LIVE, VDC));
+
+      assertNotNull(vdcUrn, String.format(URN_REQ_LIVE, VDC));
+      network = lazyGetNetwork();
    }
-   
+
    @AfterClass(alwaysRun = true)
    public void cleanUp() throws Exception {
       if (clonedVAppTemplate != null) {
@@ -116,236 +118,218 @@
       if (composedVApp != null) {
          cleanUpVApp(composedVApp);
       }
-      
+
       if (metadataSet) {
          try {
-	         Task delete = adminContext.getApi().getVdcApi().getMetadataApi().deleteMetadataEntry(toAdminUri(vdcURI), "key");
-	         taskDoneEventually(delete);
+            Task remove = adminContext.getApi().getVdcApi().getMetadataApi(vdcUrn).removeEntry("key");
+            taskDoneEventually(remove);
          } catch (Exception e) {
             logger.warn(e, "Error deleting metadata entry");
          }
       }
    }
-   
+
    @Test(description = "GET /vdc/{id}")
    public void testGetVdc() {
-      Vdc vdc = vdcApi.getVdc(vdcURI);
+      Vdc vdc = lazyGetVdc();
       assertNotNull(vdc, String.format(OBJ_REQ_LIVE, VDC));
-      assertTrue(!vdc.getDescription().equals("DO NOT USE"), "vDC isn't to be used for testing");
-       
+      assertFalse("DO NOT USE".equals(vdc.getDescription()), "vDC isn't to be used for testing");
       Checks.checkVdc(vdc);
    }
-   
-   @Test(description = "POST /vdc/{id}/action/captureVApp", dependsOnMethods = { "testInstantiateVAppTemplate" } )
+
+   @Test(description = "POST /vdc/{id}/action/captureVApp", dependsOnMethods = { "testInstantiateVAppTemplate" })
    public void testCaptureVApp() {
       String name = name("captured-");
-      
-      CaptureVAppParams captureVappParams = CaptureVAppParams.builder()
-               .name(name)
-               .source(instantiatedVApp.getHref())
-               // TODO: test optional params
-               //.description("")
-               //.sections(sections) // TODO: ovf sections
+
+      CaptureVAppParams captureVappParams = CaptureVAppParams.builder().name(name).source(instantiatedVApp.getHref())
+      // TODO: test optional params
+      // .description("")
+      // .sections(sections) // TODO: ovf sections
                .build();
-      
-      capturedVAppTemplate = vdcApi.captureVApp(vdcURI, captureVappParams);
+
+      capturedVAppTemplate = vdcApi.captureVApp(vdcUrn, captureVappParams);
 
       Task task = Iterables.getFirst(capturedVAppTemplate.getTasks(), null);
       assertTaskSucceedsLong(task);
 
       Checks.checkVAppTemplate(capturedVAppTemplate);
-      
-      assertEquals(capturedVAppTemplate.getName(), name, 
+
+      assertEquals(capturedVAppTemplate.getName(), name,
                String.format(OBJ_FIELD_EQ, "VAppTemplate", "name", name, capturedVAppTemplate.getName()));
    }
-   
-   @Test(description = "POST /vdc/{id}/action/cloneVApp", dependsOnMethods = { "testInstantiateVAppTemplate" } )
+
+   @Test(description = "POST /vdc/{id}/action/cloneVApp", dependsOnMethods = { "testInstantiateVAppTemplate" })
    public void testCloneVApp() {
-      CloneVAppParams cloneVappParams = CloneVAppParams.builder()
-               .source(instantiatedVApp.getHref())
-               // TODO: test optional params
-               //.name("") 
-               //.description("")
-               //.deploy(true)
-               //.isSourceDelete(true)
-               //.powerOn(true)
-               //.instantiationParams(InstantiationParams.builder()
-               //      .sections(sections) // TODO: ovf sections? various tests?
-               //      .build())
-   
+      CloneVAppParams cloneVappParams = CloneVAppParams.builder().source(instantiatedVApp.getHref())
+      // TODO: test optional params
+      // .name("")
+      // .description("")
+      // .deploy(true)
+      // .isSourceDelete(true)
+      // .powerOn(true)
+      // .instantiationParams(InstantiationParams.builder()
+      // .sections(sections) // TODO: ovf sections? various tests?
+      // .build())
+
                // Reserved. Unimplemented params; may test eventually when implemented
-               //.vAppParent(vAppParentRef)
-               //.linkedClone(true)
+               // .vAppParent(vAppParentRef)
+               // .linkedClone(true)
                .build();
-      
-      clonedVApp = vdcApi.cloneVApp(vdcURI, cloneVappParams);
-      
+
+      clonedVApp = vdcApi.cloneVApp(vdcUrn, cloneVappParams);
+
       Task task = Iterables.getFirst(clonedVApp.getTasks(), null);
       assertNotNull(task, "vdcApi.cloneVApp returned VApp that did not contain any tasks");
       assertTaskSucceedsLong(task);
 
       Checks.checkVApp(clonedVApp);
    }
-   
+
    @Test(description = "POST /vdc/{id}/action/cloneVAppTemplate")
    public void testCloneVAppTemplate() {
-      clonedVAppTemplate = vdcApi.cloneVAppTemplate(vdcURI, CloneVAppTemplateParams.builder()
-               .source(vAppTemplateURI)
-               .build());
-      
+      clonedVAppTemplate = vdcApi.cloneVAppTemplate(vdcUrn,
+               CloneVAppTemplateParams.builder().source(lazyGetVAppTemplate().getHref()).build());
+
       Task task = Iterables.getFirst(clonedVAppTemplate.getTasks(), null);
       assertNotNull(task, "vdcApi.cloneVAppTemplate returned VAppTemplate that did not contain any tasks");
       assertTaskSucceedsLong(task);
-      
+
       Checks.checkVAppTemplate(clonedVAppTemplate);
    }
-   
+
    @Test(description = "POST /vdc/{id}/action/composeVApp")
    public void testComposeVApp() {
       String name = name("composed-");
-      
-      composedVApp = vdcApi.composeVApp(vdcURI, ComposeVAppParams.builder()
-            .name(name)
-            // TODO: test optional params
-            //.sourcedItem(SourcedCompositionItemParam.builder()
-                        //.sourcedItem(vAppTemplateURI)
-                        //.build())
-            //.description("")
-            //.deploy(true)
-            //.isSourceDelete(false)
-            //.powerOn(true)
-            //.instantiationParams(InstantiationParams.builder()
-            //      .sections(sections) // TODO: ovf sections? various tests?
-            //      .build())
 
-            // Reserved. Unimplemented params; may test eventually when implemented
-            //.linkedClone()
-            .build());
+      composedVApp = vdcApi.composeVApp(vdcUrn, ComposeVAppParams.builder().name(name)
+      // TODO: test optional params
+      // .sourcedItem(SourcedCompositionItemParam.builder()
+      // .sourcedItem(vAppTemplateURI)
+      // .build())
+      // .description("")
+      // .deploy(true)
+      // .isSourceDelete(false)
+      // .powerOn(true)
+      // .instantiationParams(InstantiationParams.builder()
+      // .sections(sections) // TODO: ovf sections? various tests?
+      // .build())
+
+               // Reserved. Unimplemented params; may test eventually when implemented
+               // .linkedClone()
+               .build());
 
       Task task = Iterables.getFirst(composedVApp.getTasks(), null);
       assertNotNull(task, "vdcApi.composeVApp returned VApp that did not contain any tasks");
       assertTaskSucceedsLong(task);
 
       Checks.checkVApp(composedVApp);
-      assertEquals(composedVApp.getName(), name, 
+      assertEquals(composedVApp.getName(), name,
                String.format(OBJ_FIELD_EQ, "VApp", "name", name, composedVApp.getName()));
    }
-   
+
    // TODO Duplicates code in VAppApiLiveTest
    @Test(description = "POST /vdc/{id}/action/instantiateVAppTemplate")
    public void testInstantiateVAppTemplate() {
-      Vdc vdc = vdcApi.getVdc(vdcURI);
+      Vdc vdc = vdcApi.get(vdcUrn);
 
       Set<Reference> networks = vdc.getAvailableNetworks();
-      Optional<Reference> parentNetwork = Iterables.tryFind(
-            networks, new Predicate<Reference>() {
-                  @Override
-                  public boolean apply(Reference reference) {
-                     return reference.getHref().equals(networkURI);
-                  }
-            });
+      Optional<Reference> parentNetwork = Iterables.tryFind(networks, new Predicate<Reference>() {
+         @Override
+         public boolean apply(Reference reference) {
+            return reference.getHref().equals(network.getHref());
+         }
+      });
 
       if (!parentNetwork.isPresent()) {
-         fail(String.format("Could not find network %s in vdc", networkURI.toASCIIString()));
+         fail(String.format("Could not find network %s in vdc", network.getHref().toASCIIString()));
       }
 
-      NetworkConfiguration networkConfiguration = NetworkConfiguration.builder()
-            .parentNetwork(parentNetwork.get())
-            .fenceMode(FenceMode.BRIDGED)
-            .build();
-      
-      NetworkConfigSection networkConfigSection = NetworkConfigSection.builder()
+      NetworkConfiguration networkConfiguration = NetworkConfiguration.builder().parentNetwork(parentNetwork.get())
+               .fenceMode(FenceMode.BRIDGED).build();
+
+      NetworkConfigSection networkConfigSection = NetworkConfigSection
+               .builder()
                .info("Configuration parameters for logical networks")
                .networkConfigs(
-                     ImmutableSet.of(VAppNetworkConfiguration.builder()
-                           .networkName("vAppNetwork")
-                           .configuration(networkConfiguration)
-                           .build()))
-               .build();
+                        ImmutableSet.of(VAppNetworkConfiguration.builder().networkName("vAppNetwork")
+                                 .configuration(networkConfiguration).build())).build();
 
       InstantiationParams instantiationParams = InstantiationParams.builder()
-                              .sections(ImmutableSet.of(networkConfigSection))
-                              .build();
-                     
-      InstantiateVAppTemplateParams instantiate = InstantiateVAppTemplateParams.builder()
-            .name(name("test-vapp-"))
-            .notDeploy()
-            .notPowerOn()
-            .description("Test VApp")
-            .instantiationParams(instantiationParams)
-            .source(vAppTemplateURI)
-            .build();
+               .sections(ImmutableSet.of(networkConfigSection)).build();
 
-      instantiatedVApp = vdcApi.instantiateVApp(vdcURI, instantiate);
+      InstantiateVAppTemplateParams instantiate = InstantiateVAppTemplateParams.builder().name(name("test-vapp-"))
+               .notDeploy().notPowerOn().description("Test VApp").instantiationParams(instantiationParams)
+               .source(lazyGetVAppTemplate().getHref()).build();
+
+      instantiatedVApp = vdcApi.instantiateVApp(vdcUrn, instantiate);
       Task instantiationTask = Iterables.getFirst(instantiatedVApp.getTasks(), null);
       assertTaskSucceedsLong(instantiationTask);
-      
+
       Checks.checkVApp(instantiatedVApp);
    }
-   
+
    @Test(description = "POST /vdc/{id}/action/uploadVAppTemplate")
    public void testUploadVAppTemplate() {
       // TODO Should test all 4 stages of upload; currently doing only stage 1 here.
-      //  1. creating empty vApp template entity 
-      //  2. uploading an OVF of vApp template 
-      //  3. uploading disks described from the OVF 
-      //  4. finishing task for uploading
-      
+      // 1. creating empty vApp template entity
+      // 2. uploading an OVF of vApp template
+      // 3. uploading disks described from the OVF
+      // 4. finishing task for uploading
+
       String name = name("uploaded-");
-      
-      UploadVAppTemplateParams uploadVAppTemplateParams = UploadVAppTemplateParams.builder()
-               .name(name)
-               // TODO: test optional params
-               //.description("")
-               //.transferFormat("")
-               //.manifestRequired(true)
+
+      UploadVAppTemplateParams uploadVAppTemplateParams = UploadVAppTemplateParams.builder().name(name)
+      // TODO: test optional params
+      // .description("")
+      // .transferFormat("")
+      // .manifestRequired(true)
                .build();
-      
-      uploadedVAppTemplate = vdcApi.uploadVAppTemplate(vdcURI, uploadVAppTemplateParams);
-      
+
+      uploadedVAppTemplate = vdcApi.uploadVAppTemplate(vdcUrn, uploadVAppTemplateParams);
+
       Checks.checkVAppTemplateWhenNotReady(uploadedVAppTemplate);
-      
-      assertEquals(uploadedVAppTemplate.getName(), name, 
+
+      assertEquals(uploadedVAppTemplate.getName(), name,
                String.format(OBJ_FIELD_EQ, "VAppTemplate", "name", name, uploadedVAppTemplate.getName()));
-      
+
       ResourceEntity.Status expectedStatus = ResourceEntity.Status.UNRESOLVED;
       ResourceEntity.Status actualStatus = uploadedVAppTemplate.getStatus();
       assertEquals(actualStatus, expectedStatus,
                String.format(OBJ_FIELD_EQ, "VAppTemplate", "status", expectedStatus, actualStatus));
-      
+
    }
-   
+
    private void setupMetadata() {
-      adminContext.getApi().getVdcApi().getMetadataApi().setMetadata(toAdminUri(vdcURI), 
-            "key", MetadataValue.builder().value("value").build());
+      adminContext.getApi().getVdcApi().getMetadataApi(vdcUrn)
+               .putEntry("key", MetadataValue.builder().value("value").build());
       metadataSet = true;
    }
-   
-   @Test(description = "GET /vdc/{id}/metadata", dependsOnMethods = { "testGetVdc" } )
+
+   @Test(description = "GET /vdc/{id}/metadata", dependsOnMethods = { "testGetVdc" })
    public void testGetMetadata() {
-      if(adminContext != null) {
+      if (adminContext != null) {
          setupMetadata();
       }
-      
-      Metadata metadata = vdcApi.getMetadataApi().getMetadata(vdcURI);
-      
+
+      Metadata metadata = vdcApi.getMetadataApi(vdcUrn).get();
+
       // required for testing
-      assertFalse(Iterables.isEmpty(metadata.getMetadataEntries()), 
-            String.format(OBJ_FIELD_REQ_LIVE, VDC, "metadata.entries"));
-      
+      assertFalse(Iterables.isEmpty(metadata.getMetadataEntries()),
+               String.format(OBJ_FIELD_REQ_LIVE, VDC, "metadata.entries"));
+
       Checks.checkMetadataFor(VDC, metadata);
    }
-   
-   @Test(description = "GET /vdc/{id}/metadata/{key}", dependsOnMethods = { "testGetMetadata" } )
+
+   @Test(description = "GET /vdc/{id}/metadata/{key}", dependsOnMethods = { "testGetMetadata" })
    public void testGetMetadataValue() {
       // First find a key
-      Metadata metadata = vdcApi.getMetadataApi().getMetadata(vdcURI);
+      Metadata metadata = vdcApi.getMetadataApi(vdcUrn).get();
       Map<String, String> metadataMap = Checks.metadataToMap(metadata);
       String key = Iterables.getFirst(metadataMap.keySet(), "MadeUpKey!");
       String value = metadataMap.get(key);
-      
-      MetadataValue metadataValue = vdcApi.getMetadataApi().getMetadataValue(vdcURI, key);
-      
+
+      MetadataValue metadataValue = vdcApi.getMetadataApi(vdcUrn).getValue(key);
+
       Checks.checkMetadataValueFor(VDC, metadataValue, value);
    }
 }
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VmApiExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VmApiExpectTest.java
index fc922f4..f243c59 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VmApiExpectTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VmApiExpectTest.java
@@ -86,15 +86,15 @@
       
       Vm expected = getVm();
 
-      assertEquals(api.getVmApi().getVm(vmURI), expected);
+      assertEquals(api.getVmApi().get(vmURI), expected);
    }
 
    @Test(enabled = false)
-   public void testModifyVm() {
+   public void testEditVm() {
       VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
          new VcloudHttpRequestPrimer()
             .apiCommand("PUT", vmId)
-            .xmlFilePayload("/vm/modifyVm.xml", VCloudDirectorMediaType.VM)
+            .xmlFilePayload("/vm/editVm.xml", VCloudDirectorMediaType.VM)
             .acceptAnyMedia()
             .httpRequestBuilder().build(), 
          new VcloudHttpResponsePrimer()
@@ -105,25 +105,25 @@
 		modified.setName("new-name");
 		modified.setDescription("New Description");
 		
-		Task expected = modifyVmTask();
+		Task expected = editVmTask();
 		
-		assertEquals(api.getVmApi().modifyVm(vmURI, modified), expected);
+		assertEquals(api.getVmApi().edit(vmURI, modified), expected);
    }
 
    @Test(enabled = false)
-   public void testDeleteVm() {
+   public void testRemoveVm() {
       VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
          new VcloudHttpRequestPrimer()
             .apiCommand("DELETE", vmId)
             .acceptAnyMedia()
             .httpRequestBuilder().build(), 
          new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/vm/deleteVmTask.xml", VCloudDirectorMediaType.TASK)
+            .xmlFilePayload("/vm/removeVmTask.xml", VCloudDirectorMediaType.TASK)
             .httpResponseBuilder().build());
 		
-		Task expected = deleteVmTask();
+		Task expected = removeVmTask();
 		
-		assertEquals(api.getVmApi().deleteVm(vmURI), expected);
+		assertEquals(api.getVmApi().remove(vmURI), expected);
    }
 
    @Test(enabled = false)
@@ -139,7 +139,7 @@
 		
 		Task expected = consolidateVmTask();
 		
-		assertEquals(api.getVmApi().consolidateVm(vmURI), expected);
+		assertEquals(api.getVmApi().consolidate(vmURI), expected);
    }
 
    @Test(enabled = false)
@@ -211,7 +211,7 @@
 		
 		Task expected = relocateTask();
 		
-		assertEquals(api.getVmApi().relocateVm(vmURI, params), expected);
+		assertEquals(api.getVmApi().relocate(vmURI, params), expected);
    }
 
    @Test(enabled = false)
@@ -363,23 +363,23 @@
    }
 
    @Test(enabled = false)
-   public void testModifyGuestCustomizationSection() {
+   public void testEditGuestCustomizationSection() {
       VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
          new VcloudHttpRequestPrimer()
             .apiCommand("PUT", vmId + "/guestCustomizationSection")
-            .xmlFilePayload("/vApp/modifyGuestCustomizationSection.xml", VCloudDirectorMediaType.GUEST_CUSTOMIZATION_SECTION)
+            .xmlFilePayload("/vApp/editGuestCustomizationSection.xml", VCloudDirectorMediaType.GUEST_CUSTOMIZATION_SECTION)
             .acceptAnyMedia()
             .httpRequestBuilder().build(), 
          new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/vApp/modifyGuestCustomizationSectionTask.xml", VCloudDirectorMediaType.TASK)
+            .xmlFilePayload("/vApp/editGuestCustomizationSectionTask.xml", VCloudDirectorMediaType.TASK)
             .httpResponseBuilder().build());
       
       GuestCustomizationSection section = getGuestCustomizationSection().toBuilder()
             .build();
 
-      Task expected = modifyGuestCustomizationSectionTask();
+      Task expected = editGuestCustomizationSectionTask();
 
-      assertEquals(api.getVmApi().modifyGuestCustomizationSection(vmURI, section), expected);
+      assertEquals(api.getVmApi().editGuestCustomizationSection(vmURI, section), expected);
    }
 
    @Test(enabled = false)
@@ -439,23 +439,23 @@
    }
 
    @Test(enabled = false)
-   public void testModifyNetworkConnectionSection() {
+   public void testEditNetworkConnectionSection() {
       VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
          new VcloudHttpRequestPrimer()
             .apiCommand("PUT", vmId + "/networkConnectionSection")
-            .xmlFilePayload("/vApp/modifyNetworkConnectionSection.xml", VCloudDirectorMediaType.NETWORK_CONNECTION_SECTION)
+            .xmlFilePayload("/vApp/editNetworkConnectionSection.xml", VCloudDirectorMediaType.NETWORK_CONNECTION_SECTION)
             .acceptAnyMedia()
             .httpRequestBuilder().build(), 
          new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/vApp/modifyNetworkConnectionSectionTask.xml", VCloudDirectorMediaType.TASK)
+            .xmlFilePayload("/vApp/editNetworkConnectionSectionTask.xml", VCloudDirectorMediaType.TASK)
             .httpResponseBuilder().build());
 		      
 		NetworkConnectionSection section = getNetworkConnectionSection().toBuilder()
 		      .build();
 		
-		Task expected = modifyNetworkConnectionSectionTask();
+		Task expected = editNetworkConnectionSectionTask();
 		
-		assertEquals(api.getVmApi().modifyNetworkConnectionSection(vmURI, section), expected);
+		assertEquals(api.getVmApi().editNetworkConnectionSection(vmURI, section), expected);
    }
 
    @Test(enabled = false)
@@ -475,23 +475,23 @@
    }
 
    @Test(enabled = false)
-   public void testModifyOperatingSystemSection() {
+   public void testEditOperatingSystemSection() {
       VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
          new VcloudHttpRequestPrimer()
             .apiCommand("PUT", vmId + "/operatingSystemSection")
-            .xmlFilePayload("/vApp/modifyOperatingSystemSection.xml", VCloudDirectorMediaType.OPERATING_SYSTEM_SECTION)
+            .xmlFilePayload("/vApp/editOperatingSystemSection.xml", VCloudDirectorMediaType.OPERATING_SYSTEM_SECTION)
             .acceptAnyMedia()
             .httpRequestBuilder().build(), 
          new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/vApp/modifyOperatingSystemSectionTask.xml", VCloudDirectorMediaType.TASK)
+            .xmlFilePayload("/vApp/editOperatingSystemSectionTask.xml", VCloudDirectorMediaType.TASK)
             .httpResponseBuilder().build());
 		      
       OperatingSystemSection section = getOperatingSystemSection().toBuilder()
 		      .build();
 		
-		Task expected = modifyOperatingSystemSectionTask();
+		Task expected = editOperatingSystemSectionTask();
 		
-		assertEquals(api.getVmApi().modifyOperatingSystemSection(vmURI, section), expected);
+		assertEquals(api.getVmApi().editOperatingSystemSection(vmURI, section), expected);
    }
 
    @Test(enabled = false)
@@ -511,20 +511,20 @@
    }
 
    @Test(enabled = false)
-   public void testModifyProductSections() {
+   public void testEditProductSections() {
       VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
          new VcloudHttpRequestPrimer()
             .apiCommand("PUT", vmId + "/productSections")
-            .xmlFilePayload("/vApp/modifyProductSections.xml", VCloudDirectorMediaType.PRODUCT_SECTION_LIST)
+            .xmlFilePayload("/vApp/editProductSections.xml", VCloudDirectorMediaType.PRODUCT_SECTION_LIST)
             .acceptAnyMedia()
             .httpRequestBuilder().build(), 
          new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/vApp/modifyProductSections.xml", VCloudDirectorMediaType.VAPP)
+            .xmlFilePayload("/vApp/editProductSections.xml", VCloudDirectorMediaType.VAPP)
             .httpResponseBuilder().build());
 
-         Task expected = modifyProductSectionsTask();
+         Task expected = editProductSectionsTask();
 
-         assertEquals(api.getVmApi().modifyProductSections(vmURI, null), expected);
+         assertEquals(api.getVmApi().editProductSections(vmURI, null), expected);
    }
 
    @Test(enabled = false)
@@ -627,23 +627,23 @@
    }
 
    @Test(enabled = false)
-   public void testModifyVirtualHardwareSection() {
+   public void testEditVirtualHardwareSection() {
       VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
          new VcloudHttpRequestPrimer()
             .apiCommand("PUT", vmId + "/virtualHardwareSection")
-            .xmlFilePayload("/vApp/modifyVirtualHardwareSection.xml", VCloudDirectorMediaType.VIRTUAL_HARDWARE_SECTION)
+            .xmlFilePayload("/vApp/editVirtualHardwareSection.xml", VCloudDirectorMediaType.VIRTUAL_HARDWARE_SECTION)
             .acceptAnyMedia()
             .httpRequestBuilder().build(), 
          new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/vApp/modifyVirtualHardwareSectionTask.xml", VCloudDirectorMediaType.TASK)
+            .xmlFilePayload("/vApp/editVirtualHardwareSectionTask.xml", VCloudDirectorMediaType.TASK)
             .httpResponseBuilder().build());
 
       VirtualHardwareSection section = getVirtualHardwareSection().toBuilder()
             .build();
 
-		Task expected = modifyVirtualHardwareSectionTask();
+		Task expected = editVirtualHardwareSectionTask();
 		
-		assertEquals(api.getVmApi().modifyVirtualHardwareSection(vmURI, section), expected);
+		assertEquals(api.getVmApi().editVirtualHardwareSection(vmURI, section), expected);
    }
 
    @Test(enabled = false)
@@ -663,23 +663,23 @@
    }
 
    @Test(enabled = false)
-   public void testModifyVirtualHardwareSectionCpu() {
+   public void testEditVirtualHardwareSectionCpu() {
       VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
          new VcloudHttpRequestPrimer()
             .apiCommand("", vmId + "/virtualHardwareSection/cpu")
-            .xmlFilePayload("/vApp/modifyVirtualHardwareSectionCpu.xml", VCloudDirectorMediaType.OVF_RASD_ITEM)
+            .xmlFilePayload("/vApp/editVirtualHardwareSectionCpu.xml", VCloudDirectorMediaType.OVF_RASD_ITEM)
             .acceptAnyMedia()
             .httpRequestBuilder().build(), 
          new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/vApp/modifyVirtualHardwareSectionCpuTask.xml", VCloudDirectorMediaType.TASK)
+            .xmlFilePayload("/vApp/editVirtualHardwareSectionCpuTask.xml", VCloudDirectorMediaType.TASK)
             .httpResponseBuilder().build());
 
       RasdItem cpu = getVirtualHardwareSectionCpu(); // .toBuilder();
 //               .build();
 
-         Task expected = modifyVirtualHardwareSectionCpuTask();
+         Task expected = editVirtualHardwareSectionCpuTask();
 
-         assertEquals(api.getVmApi().modifyVirtualHardwareSectionCpu(vmURI, cpu), expected);
+         assertEquals(api.getVmApi().editVirtualHardwareSectionCpu(vmURI, cpu), expected);
    }
 
    @Test(enabled = false)
@@ -699,23 +699,23 @@
    }
 
    @Test(enabled = false)
-   public void testModifyVirtualHardwareSectionDisks() {
+   public void testEditVirtualHardwareSectionDisks() {
       VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
          new VcloudHttpRequestPrimer()
             .apiCommand("PUT", vmId + "/virtualHardwareSection/disks")
-            .xmlFilePayload("/vApp/modifyVirtualHardwareSectionDisks.xml", VCloudDirectorMediaType.OVF_RASD_ITEMS_LIST)
+            .xmlFilePayload("/vApp/editVirtualHardwareSectionDisks.xml", VCloudDirectorMediaType.OVF_RASD_ITEMS_LIST)
             .acceptAnyMedia()
             .httpRequestBuilder().build(), 
          new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/vApp/modifyVirtualHardwareSectionDisksTask.xml", VCloudDirectorMediaType.TASK)
+            .xmlFilePayload("/vApp/editVirtualHardwareSectionDisksTask.xml", VCloudDirectorMediaType.TASK)
             .httpResponseBuilder().build());
 
          RasdItemsList disks = getVirtualHardwareSectionDisks().toBuilder()
                .build();
 
-         Task expected = modifyVirtualHardwareSectionDisksTask();
+         Task expected = editVirtualHardwareSectionDisksTask();
 
-         assertEquals(api.getVmApi().modifyVirtualHardwareSectionDisks(vmURI, disks), expected);
+         assertEquals(api.getVmApi().editVirtualHardwareSectionDisks(vmURI, disks), expected);
    }
 
    @Test(enabled = false)
@@ -751,23 +751,23 @@
    }
 
    @Test(enabled = false)
-   public void testModifyVirtualHardwareSectionMemory() {
+   public void testEditVirtualHardwareSectionMemory() {
       VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
          new VcloudHttpRequestPrimer()
             .apiCommand("PUT", vmId + "/virtualHardwareSection/memory")
-            .xmlFilePayload("/vApp/modifyVirtualHardwareSectionMemory.xml", VCloudDirectorMediaType.VAPP)
+            .xmlFilePayload("/vApp/editVirtualHardwareSectionMemory.xml", VCloudDirectorMediaType.VAPP)
             .acceptAnyMedia()
             .httpRequestBuilder().build(), 
          new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/vApp/modifyVirtualHardwareSectionMemoryTask.xml", VCloudDirectorMediaType.TASK)
+            .xmlFilePayload("/vApp/editVirtualHardwareSectionMemoryTask.xml", VCloudDirectorMediaType.TASK)
             .httpResponseBuilder().build());
 
       RasdItem memory = getVirtualHardwareSectionCpu(); // .toBuilder();
 //               .build();
 
-         Task expected = modifyVirtualHardwareSectionMemoryTask();
+         Task expected = editVirtualHardwareSectionMemoryTask();
 
-         assertEquals(api.getVmApi().modifyVirtualHardwareSectionMemory(vmURI, memory), expected);
+         assertEquals(api.getVmApi().editVirtualHardwareSectionMemory(vmURI, memory), expected);
    }
 
    @Test(enabled = false)
@@ -787,23 +787,23 @@
    }
 
    @Test(enabled = false)
-   public void testModifyVirtualHardwareSectionNetworkCards() {
+   public void testEditVirtualHardwareSectionNetworkCards() {
       VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
          new VcloudHttpRequestPrimer()
             .apiCommand("PUT", vmId + "/virtualHardwareSection/networkCards")
-            .xmlFilePayload("/vApp/modifyVirtualHardwareSectionNetworkCards.xml", VCloudDirectorMediaType.OVF_RASD_ITEMS_LIST)
+            .xmlFilePayload("/vApp/editVirtualHardwareSectionNetworkCards.xml", VCloudDirectorMediaType.OVF_RASD_ITEMS_LIST)
             .acceptAnyMedia()
             .httpRequestBuilder().build(), 
          new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/vApp/modifyVirtualHardwareSectionNetworkCardsTask.xml", VCloudDirectorMediaType.TASK)
+            .xmlFilePayload("/vApp/editVirtualHardwareSectionNetworkCardsTask.xml", VCloudDirectorMediaType.TASK)
             .httpResponseBuilder().build());
 
          RasdItemsList networkCards = getVirtualHardwareSectionNetworkCards().toBuilder()
                .build();
 
-         Task expected = modifyVirtualHardwareSectionNetworkCardsTask();
+         Task expected = editVirtualHardwareSectionNetworkCardsTask();
 
-         assertEquals(api.getVmApi().modifyVirtualHardwareSectionNetworkCards(vmURI, networkCards), expected);
+         assertEquals(api.getVmApi().editVirtualHardwareSectionNetworkCards(vmURI, networkCards), expected);
    }
 
    @Test(enabled = false)
@@ -823,23 +823,23 @@
    }
 
    @Test(enabled = false)
-   public void testModifyVirtualHardwareSectionSerialPorts() {
+   public void testEditVirtualHardwareSectionSerialPorts() {
       VCloudDirectorApi api = requestsSendResponses(loginRequest, sessionResponse, 
          new VcloudHttpRequestPrimer()
             .apiCommand("PUT", vmId + "/virtualHardwareSection/serialPorts")
-            .xmlFilePayload("/vApp/modifyVirtualHardwareSectionSerialPorts.xml", VCloudDirectorMediaType.OVF_RASD_ITEMS_LIST)
+            .xmlFilePayload("/vApp/editVirtualHardwareSectionSerialPorts.xml", VCloudDirectorMediaType.OVF_RASD_ITEMS_LIST)
             .acceptAnyMedia()
             .httpRequestBuilder().build(), 
          new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/vApp/modifyVirtualHardwareSectionSerialPortsTask.xml", VCloudDirectorMediaType.TASK)
+            .xmlFilePayload("/vApp/editVirtualHardwareSectionSerialPortsTask.xml", VCloudDirectorMediaType.TASK)
             .httpResponseBuilder().build());
 
          RasdItemsList serialPorts = getVirtualHardwareSectionSerialPorts().toBuilder()
                .build();
 
-         Task expected = modifyVirtualHardwareSectionSerialPortsTask();
+         Task expected = editVirtualHardwareSectionSerialPortsTask();
 
-         assertEquals(api.getVmApi().modifyVirtualHardwareSectionSerialPorts(vmURI, serialPorts), expected);
+         assertEquals(api.getVmApi().editVirtualHardwareSectionSerialPorts(vmURI, serialPorts), expected);
    }
 
    public static Vm getVm() {
@@ -866,14 +866,14 @@
       return vm;
    }
 
-   public static Task modifyVmTask() {
+   public static Task editVmTask() {
       Task task = Task.builder()
             .build();
 
       return task;
    }
 
-   public static Task deleteVmTask() {
+   public static Task removeVmTask() {
       Task task = Task.builder()
             .build();
 
@@ -985,7 +985,7 @@
       return task;
    }
 
-   public static ControlAccessParams getControlAccessParams() {
+   public static ControlAccessParams getAccessControlParams() {
       ControlAccessParams params = ControlAccessParams.builder()
             .build();
 
@@ -999,7 +999,7 @@
       return section;
    }
 
-   public static Task modifyGuestCustomizationSectionTask() {
+   public static Task editGuestCustomizationSectionTask() {
       Task task = Task.builder()
             .build();
 
@@ -1013,7 +1013,7 @@
       return section;
    }
 
-   public static Task modifyLeaseSettingsSectionTask() {
+   public static Task editLeaseSettingsSectionTask() {
       Task task = Task.builder()
             .build();
 
@@ -1041,7 +1041,7 @@
       return section;
    }
 
-   public static Task modifyNetworkConfigSectionTask() {
+   public static Task editNetworkConfigSectionTask() {
       Task task = Task.builder()
             .build();
 
@@ -1055,7 +1055,7 @@
       return section;
    }
 
-   public static Task modifyNetworkConnectionSectionTask() {
+   public static Task editNetworkConnectionSectionTask() {
       Task task = Task.builder()
             .build();
 
@@ -1076,7 +1076,7 @@
       return section;
    }
 
-   public static Task modifyOperatingSystemSectionTask() {
+   public static Task editOperatingSystemSectionTask() {
       Task task = Task.builder()
             .build();
 
@@ -1090,7 +1090,7 @@
       return owner;
    }
 
-   public static Task modifyOwnerTask() {
+   public static Task editOwnerTask() {
       Task task = Task.builder()
             .build();
 
@@ -1104,7 +1104,7 @@
       return sectionItems;
    }
 
-   public static Task modifyProductSectionsTask() {
+   public static Task editProductSectionsTask() {
       Task task = Task.builder()
             .build();
 
@@ -1152,7 +1152,7 @@
       return section;
    }
 
-   public static Task modifyStartupSectionTask() {
+   public static Task editStartupSectionTask() {
       Task task = Task.builder()
             .build();
 
@@ -1166,7 +1166,7 @@
       return section;
    }
 
-   public static Task modifyVirtualHardwareSectionTask() {
+   public static Task editVirtualHardwareSectionTask() {
       Task task = Task.builder()
             .build();
 
@@ -1180,7 +1180,7 @@
       return cpu;
    }
 
-   public static Task modifyVirtualHardwareSectionCpuTask() {
+   public static Task editVirtualHardwareSectionCpuTask() {
       Task task = Task.builder()
             .build();
 
@@ -1194,7 +1194,7 @@
       return disks;
    }
 
-   public static Task modifyVirtualHardwareSectionDisksTask() {
+   public static Task editVirtualHardwareSectionDisksTask() {
       Task task = Task.builder()
             .build();
 
@@ -1215,7 +1215,7 @@
       return memory;
    }
 
-   public static Task modifyVirtualHardwareSectionMemoryTask() {
+   public static Task editVirtualHardwareSectionMemoryTask() {
       Task task = Task.builder()
             .build();
 
@@ -1229,7 +1229,7 @@
       return networkCards;
    }
 
-   public static Task modifyVirtualHardwareSectionNetworkCardsTask() {
+   public static Task editVirtualHardwareSectionNetworkCardsTask() {
       Task task = Task.builder()
             .build();
 
@@ -1243,11 +1243,11 @@
       return serialPorts;
    }
 
-   public static Task modifyVirtualHardwareSectionSerialPortsTask() {
+   public static Task editVirtualHardwareSectionSerialPortsTask() {
       return task("id", "name", "description", "status", "operation", "operationName", "startTime");
    }
 
-   /** Used by other methods to create a custom {@link Task} object. */
+   /** Used by other methods to add a custom {@link Task} object. */
    private static Task task(String taskId, String name, String description, String status, String operation, String operationName, String startTime) {
       Task task = Task.builder()
             .error(Error.builder().build())
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VmApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VmApiLiveTest.java
index 0e65613..a2bfbce 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VmApiLiveTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/VmApiLiveTest.java
@@ -18,10 +18,6 @@
  */
 package org.jclouds.vcloud.director.v1_5.features;
 
-import static com.google.common.base.Predicates.and;
-import static com.google.common.collect.Iterables.contains;
-import static com.google.common.collect.Iterables.find;
-import static com.google.common.collect.Iterables.getFirst;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.CORRECT_VALUE_OBJECT_FMT;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.ENTITY_EQUAL;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.NOT_EMPTY_OBJECT_FMT;
@@ -44,8 +40,6 @@
 import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkVirtualHardwareSection;
 import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkVm;
 import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkVmPendingQuestion;
-import static org.jclouds.vcloud.director.v1_5.predicates.LinkPredicates.relEquals;
-import static org.jclouds.vcloud.director.v1_5.predicates.LinkPredicates.typeEquals;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertFalse;
 import static org.testng.Assert.assertNotNull;
@@ -53,7 +47,6 @@
 import static org.testng.Assert.assertTrue;
 
 import java.math.BigInteger;
-import java.net.URI;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -63,12 +56,8 @@
 import org.jclouds.dmtf.cim.ResourceAllocationSettingData;
 import org.jclouds.dmtf.ovf.MsgType;
 import org.jclouds.dmtf.ovf.ProductSection;
-import org.jclouds.io.Payloads;
 import org.jclouds.vcloud.director.v1_5.AbstractVAppApiLiveTest;
-import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
 import org.jclouds.vcloud.director.v1_5.domain.Checks;
-import org.jclouds.vcloud.director.v1_5.domain.Link;
-import org.jclouds.vcloud.director.v1_5.domain.Media;
 import org.jclouds.vcloud.director.v1_5.domain.Metadata;
 import org.jclouds.vcloud.director.v1_5.domain.MetadataEntry;
 import org.jclouds.vcloud.director.v1_5.domain.MetadataValue;
@@ -109,7 +98,7 @@
 
 /**
  * Tests behavior of the {@link VmApi}.
- *
+ * 
  * @author grkvlt@apache.org
  */
 @Test(groups = { "live", "user" }, singleThreaded = true, testName = "VmApiLiveTest")
@@ -117,69 +106,30 @@
 
    private MetadataValue metadataValue;
    private String key;
-   private URI testUserURI;
-   private boolean mediaCreated = false;
    private boolean testUserCreated = false;
-   
+
    @BeforeClass(alwaysRun = true)
    protected void setupRequiredEntities() {
-      Set<Link> links = vdcApi.getVdc(vdcURI).getLinks();
 
-      if (mediaURI == null) {
-         Predicate<Link> addMediaLink = and(relEquals(Link.Rel.ADD), typeEquals(VCloudDirectorMediaType.MEDIA));
-         
-         if (contains(links, addMediaLink)) {
-            Link addMedia = find(links, addMediaLink);
-            byte[] iso = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
-            
-            Media sourceMedia = Media.builder()
-                  .type(VCloudDirectorMediaType.MEDIA)
-                  .name(name("media"))
-                  .size(iso.length)
-                  .imageType(Media.ImageType.ISO)
-                  .description("Test media generated by VmApiLiveTest")
-                  .build();
-            Media media = context.getApi().getMediaApi().createMedia(addMedia.getHref(), sourceMedia);
-            
-            Link uploadLink = getFirst(getFirst(media.getFiles(), null).getLinks(), null);
-            context.getApi().getUploadApi().upload(uploadLink.getHref(), Payloads.newByteArrayPayload(iso));
-            
-            media = context.getApi().getMediaApi().getMedia(media.getHref());
-            
-            if (media.getTasks().size() == 1) {
-               Task uploadTask = Iterables.getOnlyElement(media.getTasks());
-               Checks.checkTask(uploadTask);
-               assertEquals(uploadTask.getStatus(), Task.Status.RUNNING);
-               assertTrue(retryTaskSuccess.apply(uploadTask), String.format(TASK_COMPLETE_TIMELY, "uploadTask"));
-               media = context.getApi().getMediaApi().getMedia(media.getHref());
-            }
-            
-            mediaURI = media.getHref();
-            mediaCreated = true;
-         }
-      }
-      
       if (adminContext != null) {
-         Link orgLink = find(links, and(relEquals("up"), typeEquals(VCloudDirectorMediaType.ORG)));
-         testUserURI = adminContext.getApi().getUserApi().createUser(toAdminUri(orgLink), randomTestUser("VAppAccessTest")).getHref();
-      } else {
-         testUserURI = userURI;
+         userUrn = adminContext.getApi().getUserApi().addUserToOrg(randomTestUser("VAppAccessTest"), org.getId())
+                  .getId();
       }
    }
-   
+
    @AfterClass(alwaysRun = true, dependsOnMethods = { "cleanUpEnvironment" })
    public void cleanUp() {
-      if (adminContext != null && mediaCreated && mediaURI != null) {
+      if (adminContext != null && mediaUrn != null) {
          try {
-	         Task delete = context.getApi().getMediaApi().deleteMedia(mediaURI);
-	         taskDoneEventually(delete);
+            Task remove = context.getApi().getMediaApi().remove(mediaUrn);
+            taskDoneEventually(remove);
          } catch (Exception e) {
             logger.warn("Error when deleting media: %s", e.getMessage());
          }
       }
-      if (adminContext != null && testUserCreated && testUserURI != null) {
+      if (adminContext != null && testUserCreated && userUrn != null) {
          try {
-	         adminContext.getApi().getUserApi().deleteUser(testUserURI);
+            adminContext.getApi().getUserApi().remove(userUrn);
          } catch (Exception e) {
             logger.warn("Error when deleting user: %s", e.getMessage());
          }
@@ -187,213 +137,212 @@
    }
 
    /**
-    * @see VmApi#getVm(URI)
+    * @see VmApi#get(String)
     */
    @Test(description = "GET /vApp/{id}")
    public void testGetVm() {
       // The method under test
-      vm = vmApi.getVm(vmURI);
+      vm = vmApi.get(vmUrn);
 
       // Check the retrieved object is well formed
       checkVm(vm);
 
       // Check the required fields are set
-      assertEquals(vm.isDeployed(), Boolean.FALSE, String.format(OBJ_FIELD_EQ, VM, "deployed", "FALSE", vm.isDeployed().toString()));
+      assertEquals(vm.isDeployed(), Boolean.FALSE,
+               String.format(OBJ_FIELD_EQ, VM, "deployed", "FALSE", vm.isDeployed().toString()));
 
       // Check status
-      assertVmStatus(vm.getHref(), Status.POWERED_OFF);
+      assertVmStatus(vmUrn, Status.POWERED_OFF);
    }
 
    /**
-    * @see VmApi#modifyVm(URI, Vm)
+    * @see VmApi#edit(String, Vm)
     */
    @Test(description = "PUT /vApp/{id}", dependsOnMethods = { "testGetVm" })
-   public void testModifyVm() {
-      Vm newVm = Vm.builder()
-            .name(name("new-name-"))
-            .description("New Description")
-            .build();
+   public void testEditVm() {
+      Vm newVm = Vm.builder().name(name("new-name-")).description("New Description").build();
 
       // The method under test
-      Task modifyVm = vmApi.modifyVm(vm.getHref(), newVm);
-      assertTrue(retryTaskSuccess.apply(modifyVm), String.format(TASK_COMPLETE_TIMELY, "modifyVm"));
+      Task editVm = vmApi.edit(vmUrn, newVm);
+      assertTrue(retryTaskSuccess.apply(editVm), String.format(TASK_COMPLETE_TIMELY, "editVm"));
 
-      // Get the updated Vm
-      vm = vmApi.getVm(vm.getHref());
+      // Get the edited Vm
+      vm = vmApi.get(vmUrn);
 
       // Check the required fields are set
-      assertEquals(vm.getName(), newVm.getName(), String.format(OBJ_FIELD_EQ, VM, "Name", newVm.getName(), vm.getName()));
-      assertEquals(vm.getDescription(), newVm.getDescription(), String.format(OBJ_FIELD_EQ, VM, "Description", newVm.getDescription(), vm.getDescription()));
+      assertEquals(vm.getName(), newVm.getName(),
+               String.format(OBJ_FIELD_EQ, VM, "Name", newVm.getName(), vm.getName()));
+      assertEquals(vm.getDescription(), newVm.getDescription(),
+               String.format(OBJ_FIELD_EQ, VM, "Description", newVm.getDescription(), vm.getDescription()));
    }
 
    @Test(description = "POST /vApp/{id}/action/deploy", dependsOnMethods = { "testGetVm" })
    public void testDeployVm() {
       DeployVAppParams params = DeployVAppParams.builder()
-            .deploymentLeaseSeconds((int) TimeUnit.SECONDS.convert(1L, TimeUnit.HOURS))
-            .notForceCustomization()
-            .notPowerOn()
-            .build();
+               .deploymentLeaseSeconds((int) TimeUnit.SECONDS.convert(1L, TimeUnit.HOURS)).notForceCustomization()
+               .notPowerOn().build();
 
       // The method under test
-      Task deployVm = vmApi.deploy(vm.getHref(), params);
+      Task deployVm = vmApi.deploy(vmUrn, params);
       assertTrue(retryTaskSuccessLong.apply(deployVm), String.format(TASK_COMPLETE_TIMELY, "deployVm"));
 
-      // Get the updated Vm
-      vm = vmApi.getVm(vm.getHref());
+      // Get the edited Vm
+      vm = vmApi.get(vmUrn);
 
       // Check the required fields are set
       assertTrue(vm.isDeployed(), String.format(OBJ_FIELD_EQ, VM, "deployed", "TRUE", vm.isDeployed().toString()));
 
       // Check status
-      assertVmStatus(vmURI, Status.POWERED_OFF);
+      assertVmStatus(vmUrn, Status.POWERED_OFF);
    }
 
    @Test(description = "POST /vApp/{id}/power/action/powerOn", dependsOnMethods = { "testDeployVm" })
    public void testPowerOnVm() {
       // Power off Vm
-      vm = powerOffVm(vm.getHref());
+      vm = powerOffVm(vmUrn);
 
       // The method under test
-      Task powerOnVm = vmApi.powerOn(vm.getHref());
+      Task powerOnVm = vmApi.powerOn(vmUrn);
       assertTaskSucceedsLong(powerOnVm);
 
-      // Get the updated Vm
-      vm = vmApi.getVm(vm.getHref());
+      // Get the edited Vm
+      vm = vmApi.get(vmUrn);
 
       // Check status
-      assertVmStatus(vm.getHref(), Status.POWERED_ON);
+      assertVmStatus(vmUrn, Status.POWERED_ON);
    }
 
    @Test(description = "POST /vApp/{id}/power/action/reboot", dependsOnMethods = { "testDeployVm" })
    public void testReboot() {
       // Power on Vm
-      vm = powerOnVm(vm.getHref());
- 
+      vm = powerOnVm(vmUrn);
+
       // The method under test
-      Task reboot = vmApi.reboot(vm.getHref());
+      Task reboot = vmApi.reboot(vmUrn);
       assertTaskSucceedsLong(reboot);
 
-      // Get the updated Vm
-      vm = vmApi.getVm(vm.getHref());
+      // Get the edited Vm
+      vm = vmApi.get(vmUrn);
 
       // Check status
-      assertVmStatus(vmURI, Status.POWERED_OFF);
+      assertVmStatus(vmUrn, Status.POWERED_OFF);
    }
 
    @Test(description = "POST /vApp/{id}/power/action/shutdown", dependsOnMethods = { "testInstallVMwareTools" })
    public void testShutdown() {
       // Power on Vm
-      vm = powerOnVm(vm.getHref());
+      vm = powerOnVm(vmUrn);
 
       // The method under test
-      Task shutdown = vmApi.shutdown(vm.getHref());
+      Task shutdown = vmApi.shutdown(vmUrn);
       assertTaskSucceedsLong(shutdown);
 
-      // Get the updated Vm
-      vm = vmApi.getVm(vm.getHref());
+      // Get the edited Vm
+      vm = vmApi.get(vmUrn);
 
       // Check status
-      assertVmStatus(vm.getHref(), Status.POWERED_OFF);
+      assertVmStatus(vmUrn, Status.POWERED_OFF);
    }
 
    @Test(description = "POST /vApp/{id}/power/action/suspend", dependsOnMethods = { "testDeployVm" })
    public void testSuspend() {
       // Power on Vm
-      vm = powerOnVm(vm.getHref());
+      vm = powerOnVm(vmUrn);
 
       // The method under test
-      Task suspend = vmApi.suspend(vmURI);
+      Task suspend = vmApi.suspend(vmUrn);
       assertTaskSucceedsLong(suspend);
 
-      // Get the updated Vm
-      vm = vmApi.getVm(vm.getHref());
+      // Get the edited Vm
+      vm = vmApi.get(vmUrn);
 
       // Check status
-      assertVmStatus(vmURI, Status.SUSPENDED);
+      assertVmStatus(vmUrn, Status.SUSPENDED);
 
       // Power on the Vm again
-      vm = powerOnVm(vm.getHref());
+      vm = powerOnVm(vmUrn);
    }
 
    @Test(description = "POST /vApp/{id}/power/action/reset", dependsOnMethods = { "testDeployVm" })
    public void testReset() {
       // Power on Vm
-      vm = powerOnVm(vm.getHref());
+      vm = powerOnVm(vmUrn);
 
       // The method under test
-      Task reset = vmApi.reset(vmURI);
+      Task reset = vmApi.reset(vmUrn);
       assertTaskSucceedsLong(reset);
 
-      // Get the updated Vm
-      vm = vmApi.getVm(vm.getHref());
+      // Get the edited Vm
+      vm = vmApi.get(vmUrn);
 
       // Check status
-      assertVmStatus(vmURI, Status.POWERED_ON);
+      assertVmStatus(vmUrn, Status.POWERED_ON);
    }
 
    @Test(description = "POST /vApp/{id}/action/undeploy", dependsOnMethods = { "testDeployVm" })
    public void testUndeployVm() {
       // Power on Vm
-      vm = powerOnVm(vm.getHref());
+      vm = powerOnVm(vmUrn);
 
       UndeployVAppParams params = UndeployVAppParams.builder().build();
 
       // The method under test
-      Task undeploy = vmApi.undeploy(vm.getHref(), params);
+      Task undeploy = vmApi.undeploy(vmUrn, params);
       assertTrue(retryTaskSuccess.apply(undeploy), String.format(TASK_COMPLETE_TIMELY, "undeploy"));
 
-      // Get the updated Vm
-      vm = vmApi.getVm(vm.getHref());
+      // Get the edited Vm
+      vm = vmApi.get(vmUrn);
 
       // Check status
       assertFalse(vm.isDeployed(), String.format(OBJ_FIELD_EQ, VM, "deployed", "FALSE", vm.isDeployed().toString()));
-      assertVmStatus(vmURI, Status.POWERED_OFF);
+      assertVmStatus(vmUrn, Status.POWERED_OFF);
    }
 
    @Test(description = "POST /vApp/{id}/power/action/powerOff", dependsOnMethods = { "testUndeployVm" })
    public void testPowerOffVm() {
       // Power on Vm
-      vm = powerOnVm(vm.getHref());
-      
+      vm = powerOnVm(vmUrn);
+
       // The method under test
       // NB this will put the vm in partially powered off state
-      Task powerOffVm = vmApi.powerOff(vm.getHref());
+      Task powerOffVm = vmApi.powerOff(vmUrn);
       assertTrue(retryTaskSuccess.apply(powerOffVm), String.format(TASK_COMPLETE_TIMELY, "powerOffVm"));
 
-      // Get the updated Vm
-      vm = vmApi.getVm(vmURI);
+      // Get the edited Vm
+      vm = vmApi.get(vmUrn);
 
       // Check status
-      assertVmStatus(vmURI, Status.POWERED_OFF);
+      assertVmStatus(vmUrn, Status.POWERED_OFF);
    }
 
    @Test(description = "POST /vApp/{id}/action/consolidate", dependsOnMethods = { "testDeployVm" })
    public void testConsolidateVm() {
       // Power on Vm
-      vm = powerOnVm(vm.getHref());
+      vm = powerOnVm(vmUrn);
 
       // The method under test
-      Task consolidateVm = vmApi.consolidateVm(vm.getHref());
+      Task consolidateVm = vmApi.consolidate(vmUrn);
       assertTrue(retryTaskSuccess.apply(consolidateVm), String.format(TASK_COMPLETE_TIMELY, "consolidateVm"));
    }
 
    @Test(description = "POST /vApp/{id}/action/discardSuspendedState", dependsOnMethods = { "testDeployVm" })
    public void testDiscardSuspendedState() {
       // Suspend the Vm
-      vm = suspendVm(vm.getHref());
-      
+      vm = suspendVm(vmUrn);
+
       // The method under test
-      Task discardSuspendedState = vmApi.discardSuspendedState(vm.getHref());
-      assertTrue(retryTaskSuccess.apply(discardSuspendedState), String.format(TASK_COMPLETE_TIMELY, "discardSuspendedState"));
+      Task discardSuspendedState = vmApi.discardSuspendedState(vmUrn);
+      assertTrue(retryTaskSuccess.apply(discardSuspendedState),
+               String.format(TASK_COMPLETE_TIMELY, "discardSuspendedState"));
    }
 
    @Test(description = "POST /vApp/{id}/action/installVMwareTools", dependsOnMethods = { "testDeployVm" })
    public void testInstallVMwareTools() {
       // First ensure the vApp is powered on
-     vm = powerOnVm(vm.getHref());
+      vm = powerOnVm(vmUrn);
 
       // The method under test
-      Task installVMwareTools = vmApi.installVMwareTools(vm.getHref());
+      Task installVMwareTools = vmApi.installVMwareTools(vmUrn);
       assertTrue(retryTaskSuccess.apply(installVMwareTools), String.format(TASK_COMPLETE_TIMELY, "installVMwareTools"));
    }
 
@@ -403,52 +352,53 @@
       // Relocate to the last of the available datastores
       QueryResultRecords records = context.getApi().getQueryApi().queryAll("datastore");
       QueryResultRecordType datastore = Iterables.getLast(records.getRecords());
-      RelocateParams params = RelocateParams.builder().datastore(Reference.builder().href(datastore.getHref()).build()).build();
+      RelocateParams params = RelocateParams.builder().datastore(Reference.builder().href(datastore.getHref()).build())
+               .build();
 
       // The method under test
-      Task relocate = vmApi.relocateVm(vm.getHref(), params);
+      Task relocate = vmApi.relocate(vmUrn, params);
       assertTrue(retryTaskSuccess.apply(relocate), String.format(TASK_COMPLETE_TIMELY, "relocate"));
    }
 
    @Test(description = "POST /vApp/{id}/action/upgradeHardwareVersion", dependsOnMethods = { "testGetVm" })
    public void testUpgradeHardwareVersion() {
       // Power off Vm
-      vm = powerOffVm(vm.getHref());
+      vm = powerOffVm(vmUrn);
 
       // The method under test
-      Task upgradeHardwareVersion = vmApi.upgradeHardwareVersion(vm.getHref());
-      assertTrue(retryTaskSuccess.apply(upgradeHardwareVersion), String.format(TASK_COMPLETE_TIMELY, "upgradeHardwareVersion"));
-      
+      Task upgradeHardwareVersion = vmApi.upgradeHardwareVersion(vmUrn);
+      assertTrue(retryTaskSuccess.apply(upgradeHardwareVersion),
+               String.format(TASK_COMPLETE_TIMELY, "upgradeHardwareVersion"));
+
       // Power on the Vm again
-      vm = powerOnVm(vm.getHref());
+      vm = powerOnVm(vmUrn);
    }
 
    @Test(description = "GET /vApp/{id}/guestCustomizationSection", dependsOnMethods = { "testGetVm" })
    public void testGetGuestCustomizationSection() {
-      getGuestCustomizationSection(new Function<URI, GuestCustomizationSection>() {
+      getGuestCustomizationSection(new Function<String, GuestCustomizationSection>() {
          @Override
-         public GuestCustomizationSection apply(URI uri) {
+         public GuestCustomizationSection apply(String uri) {
             return vmApi.getGuestCustomizationSection(uri);
          }
       });
    }
 
    @Test(description = "PUT /vApp/{id}/guestCustomizationSection", dependsOnMethods = { "testGetGuestCustomizationSection" })
-   public void testModifyGuestCustomizationSection() {
-      // Copy existing section and update fields
-      GuestCustomizationSection oldSection = vmApi.getGuestCustomizationSection(vm.getHref());
-      GuestCustomizationSection newSection = oldSection.toBuilder()
-            .computerName(name("n"))
-            .enabled(Boolean.TRUE)
-            .adminPassword(null) // Not allowed
-            .build();
+   public void testEditGuestCustomizationSection() {
+      // Copy existing section and edit fields
+      GuestCustomizationSection oldSection = vmApi.getGuestCustomizationSection(vmUrn);
+      GuestCustomizationSection newSection = oldSection.toBuilder().computerName(name("n")).enabled(Boolean.TRUE)
+               .adminPassword(null) // Not allowed
+               .build();
 
       // The method under test
-      Task modifyGuestCustomizationSection = vmApi.modifyGuestCustomizationSection(vm.getHref(), newSection);
-      assertTrue(retryTaskSuccess.apply(modifyGuestCustomizationSection), String.format(TASK_COMPLETE_TIMELY, "modifyGuestCustomizationSection"));
+      Task editGuestCustomizationSection = vmApi.editGuestCustomizationSection(vmUrn, newSection);
+      assertTrue(retryTaskSuccess.apply(editGuestCustomizationSection),
+               String.format(TASK_COMPLETE_TIMELY, "editGuestCustomizationSection"));
 
       // Retrieve the modified section
-      GuestCustomizationSection modified = vmApi.getGuestCustomizationSection(vm.getHref());
+      GuestCustomizationSection modified = vmApi.getGuestCustomizationSection(vmUrn);
 
       // Check the retrieved object is well formed
       checkGuestCustomizationSection(modified);
@@ -464,16 +414,16 @@
       assertEquals(modified, newSection, String.format(ENTITY_EQUAL, "GuestCustomizationSection"));
    }
 
-   // FIXME "Error: The requested operation on media "com.vmware.vcloud.entity.media:abfcb4b7-809f-4b50-a0aa-8c97bf09a5b0" is not supported in the current state."
+   // FIXME
+   // "Error: The requested operation on media "com.vmware.vcloud.entity.media:abfcb4b7-809f-4b50-a0aa-8c97bf09a5b0" is not supported in the current state."
    @Test(description = "PUT /vApp/{id}/media/action/insertMedia", dependsOnMethods = { "testGetVm" })
    public void testInsertMedia() {
       // Setup media params from configured media id
       MediaInsertOrEjectParams params = MediaInsertOrEjectParams.builder()
-            .media(Reference.builder().href(mediaURI).type(MEDIA).build())
-            .build();
+               .media(Reference.builder().href(lazyGetMedia().getHref()).type(MEDIA).build()).build();
 
       // The method under test
-      Task insertMedia = vmApi.insertMedia(vm.getHref(), params);
+      Task insertMedia = vmApi.insertMedia(vmUrn, params);
       assertTrue(retryTaskSuccess.apply(insertMedia), String.format(TASK_COMPLETE_TIMELY, "insertMedia"));
    }
 
@@ -481,47 +431,46 @@
    public void testEjectMedia() {
       // Setup media params from configured media id
       MediaInsertOrEjectParams params = MediaInsertOrEjectParams.builder()
-            .media(Reference.builder().href(mediaURI).type(MEDIA).build())
-            .build();
+               .media(Reference.builder().href(lazyGetMedia().getHref()).type(MEDIA).build()).build();
 
       // The method under test
-      Task ejectMedia = vmApi.ejectMedia(vm.getHref(), params);
+      Task ejectMedia = vmApi.ejectMedia(vmUrn, params);
       assertTrue(retryTaskSuccess.apply(ejectMedia), String.format(TASK_COMPLETE_TIMELY, "ejectMedia"));
    }
 
    @Test(description = "GET /vApp/{id}/networkConnectionSection", dependsOnMethods = { "testGetVm" })
    public void testGetNetworkConnectionSection() {
-      getNetworkConnectionSection(new Function<URI, NetworkConnectionSection>() {
+      getNetworkConnectionSection(new Function<String, NetworkConnectionSection>() {
          @Override
-         public NetworkConnectionSection apply(URI uri) {
+         public NetworkConnectionSection apply(String uri) {
             return vmApi.getNetworkConnectionSection(uri);
          }
       });
    }
 
    // FIXME "Task error: Unable to perform this action. Contact your cloud administrator."
-   @Test(description = "PUT /vApp/{id}/networkConnectionSection", dependsOnMethods = { "testModifyGuestCustomizationSection" })
-   public void testModifyNetworkConnectionSection() {
-      powerOffVm(vm.getHref());
+   @Test(description = "PUT /vApp/{id}/networkConnectionSection", dependsOnMethods = { "testEditGuestCustomizationSection" })
+   public void testEditNetworkConnectionSection() {
+      powerOffVm(vmUrn);
       // Look up a network in the Vdc
       Set<Reference> networks = vdc.getAvailableNetworks();
       Reference network = Iterables.getLast(networks);
 
-      // Copy existing section and update fields
-      NetworkConnectionSection oldSection = vmApi.getNetworkConnectionSection(vm.getHref());
-      NetworkConnectionSection newSection = oldSection.toBuilder()
-            .networkConnection(NetworkConnection.builder()
-                  .ipAddressAllocationMode(IpAddressAllocationMode.DHCP.toString())
-                  .network(network.getName())
-                  .build())
-            .build();
+      // Copy existing section and edit fields
+      NetworkConnectionSection oldSection = vmApi.getNetworkConnectionSection(vmUrn);
+      NetworkConnectionSection newSection = oldSection
+               .toBuilder()
+               .networkConnection(
+                        NetworkConnection.builder().ipAddressAllocationMode(IpAddressAllocationMode.DHCP.toString())
+                                 .network(network.getName()).build()).build();
 
       // The method under test
-      Task modifyNetworkConnectionSection = vmApi.modifyNetworkConnectionSection(vm.getHref(), newSection);
-      assertTrue(retryTaskSuccess.apply(modifyNetworkConnectionSection), String.format(TASK_COMPLETE_TIMELY, "modifyNetworkConnectionSection"));
+      Task editNetworkConnectionSection = vmApi.editNetworkConnectionSection(vmUrn, newSection);
+      assertTrue(retryTaskSuccess.apply(editNetworkConnectionSection),
+               String.format(TASK_COMPLETE_TIMELY, "editNetworkConnectionSection"));
 
       // Retrieve the modified section
-      NetworkConnectionSection modified = vmApi.getNetworkConnectionSection(vm.getHref());
+      NetworkConnectionSection modified = vmApi.getNetworkConnectionSection(vmUrn);
 
       // Check the retrieved object is well formed
       checkNetworkConnectionSection(modified);
@@ -536,27 +485,28 @@
    @Test(description = "GET /vApp/{id}/operatingSystemSection", dependsOnMethods = { "testGetVm" })
    public void testGetOperatingSystemSection() {
       // The method under test
-      OperatingSystemSection section = vmApi.getOperatingSystemSection(vm.getHref());
+      OperatingSystemSection section = vmApi.getOperatingSystemSection(vmUrn);
 
       // Check the retrieved object is well formed
       checkOperatingSystemSection(section);
    }
 
-   @Test(description = "PUT /vApp/{id}/operatingSystemSection", dependsOnMethods = { "testGetOperatingSystemSection", "testModifyVirtualHardwareSection" })
-   public void testModifyOperatingSystemSection() {
+   @Test(description = "PUT /vApp/{id}/operatingSystemSection", dependsOnMethods = { "testGetOperatingSystemSection",
+            "testEditVirtualHardwareSection" })
+   public void testEditOperatingSystemSection() {
       // Create new OperatingSystemSection
-      OperatingSystemSection newSection = OperatingSystemSection.builder()
-            .info("") // NOTE Required OVF field, ignored
-            .id(OSType.RHEL_64.getCode())
-            .osType("rhel5_64Guest")
-            .build();
+      OperatingSystemSection newSection = OperatingSystemSection.builder().info("") // NOTE Required
+                                                                                    // OVF field,
+                                                                                    // ignored
+               .id(OSType.RHEL_64.getCode()).osType("rhel5_64Guest").build();
 
       // The method under test
-      Task modifyOperatingSystemSection = vmApi.modifyOperatingSystemSection(vm.getHref(), newSection);
-      assertTrue(retryTaskSuccess.apply(modifyOperatingSystemSection), String.format(TASK_COMPLETE_TIMELY, "modifyOperatingSystemSection"));
+      Task editOperatingSystemSection = vmApi.editOperatingSystemSection(vmUrn, newSection);
+      assertTrue(retryTaskSuccess.apply(editOperatingSystemSection),
+               String.format(TASK_COMPLETE_TIMELY, "editOperatingSystemSection"));
 
       // Retrieve the modified section
-      OperatingSystemSection modified = vmApi.getOperatingSystemSection(vm.getHref());
+      OperatingSystemSection modified = vmApi.getOperatingSystemSection(vmUrn);
 
       // Check the retrieved object is well formed
       checkOperatingSystemSection(modified);
@@ -568,33 +518,34 @@
    @Test(description = "GET /vApp/{id}/productSections", dependsOnMethods = { "testGetVm" })
    public void testGetProductSections() {
       // The method under test
-      ProductSectionList sectionList = vmApi.getProductSections(vm.getHref());
+      ProductSectionList sectionList = vmApi.getProductSections(vmUrn);
 
       // Check the retrieved object is well formed
       checkProductSectionList(sectionList);
    }
 
    @Test(description = "PUT /vApp/{id}/productSections", dependsOnMethods = { "testGetProductSections" })
-   public void testModifyProductSections() {
-      powerOffVm(vm.getHref());
-      // Copy existing section and update fields
-      ProductSectionList oldSections = vmApi.getProductSections(vm.getHref());
-      ProductSectionList newSections = oldSections.toBuilder()
-            .productSection(ProductSection.builder()
-                  .info("Information about the installed software") // Default ovf:Info text
-                  .required()
-                  .product(MsgType.builder().value("jclouds").build())
-                  .vendor(MsgType.builder().value("jclouds Inc.").build())
-                  // NOTE other ProductSection elements not returned by vCloud
-                  .build())
-            .build();
+   public void testEditProductSections() {
+      powerOffVm(vmUrn);
+      // Copy existing section and edit fields
+      ProductSectionList oldSections = vmApi.getProductSections(vmUrn);
+      ProductSectionList newSections = oldSections
+               .toBuilder()
+               .productSection(
+                        ProductSection.builder().info("Information about the installed software")
+                                 // Default ovf:Info text
+                                 .required().product(MsgType.builder().value("jclouds").build())
+                                 .vendor(MsgType.builder().value("jclouds Inc.").build())
+                                 // NOTE other ProductSection elements not returned by vCloud
+                                 .build()).build();
 
       // The method under test
-      Task modifyProductSections = vmApi.modifyProductSections(vm.getHref(), newSections);
-      assertTrue(retryTaskSuccess.apply(modifyProductSections), String.format(TASK_COMPLETE_TIMELY, "modifyProductSections"));
+      Task editProductSections = vmApi.editProductSections(vmUrn, newSections);
+      assertTrue(retryTaskSuccess.apply(editProductSections),
+               String.format(TASK_COMPLETE_TIMELY, "editProductSections"));
 
       // Retrieve the modified section
-      ProductSectionList modified = vmApi.getProductSections(vm.getHref());
+      ProductSectionList modified = vmApi.getProductSections(vmUrn);
 
       // Check the retrieved object is well formed
       checkProductSectionList(modified);
@@ -610,12 +561,12 @@
    @Test(description = "GET /vApp/{id}/question", dependsOnMethods = { "testDeployVm" })
    public void testGetPendingQuestion() {
       // Power on Vm
-      vm = powerOnVm(vm.getHref());
+      vm = powerOnVm(vmUrn);
 
       // TODO how to test?
 
       // The method under test
-      VmPendingQuestion question = vmApi.getPendingQuestion(vm.getHref());
+      VmPendingQuestion question = vmApi.getPendingQuestion(vmUrn);
 
       // Check the retrieved object is well formed
       checkVmPendingQuestion(question);
@@ -626,23 +577,21 @@
       // TODO check that the question has been answered (e.g. asking for getPendingQuestion does not
       // include our answered question).
 
-      VmPendingQuestion question = vmApi.getPendingQuestion(vm.getHref());
+      VmPendingQuestion question = vmApi.getPendingQuestion(vmUrn);
       List<VmQuestionAnswerChoice> answerChoices = question.getChoices();
       VmQuestionAnswerChoice answerChoice = Iterables.getFirst(answerChoices, null);
-      assertNotNull(answerChoice, "Question "+question+" must have at least once answer-choice");
-      
-      VmQuestionAnswer answer = VmQuestionAnswer.builder()
-               .choiceId(answerChoice.getId())
-               .questionId(question.getQuestionId())
-               .build();
-      
-      vmApi.answerQuestion(vm.getHref(), answer);
+      assertNotNull(answerChoice, "Question " + question + " must have at least once answer-choice");
+
+      VmQuestionAnswer answer = VmQuestionAnswer.builder().choiceId(answerChoice.getId())
+               .questionId(question.getQuestionId()).build();
+
+      vmApi.answerQuestion(vmUrn, answer);
    }
 
    @Test(description = "GET /vApp/{id}/runtimeInfoSection", dependsOnMethods = { "testGetVm" })
    public void testGetRuntimeInfoSection() {
       // The method under test
-      RuntimeInfoSection section = vmApi.getRuntimeInfoSection(vm.getHref());
+      RuntimeInfoSection section = vmApi.getRuntimeInfoSection(vmUrn);
 
       // Check the retrieved object is well formed
       checkRuntimeInfoSection(section);
@@ -652,27 +601,28 @@
    @Test(description = "GET /vApp/{id}/screen", dependsOnMethods = { "testInstallVMwareTools" })
    public void testGetScreenImage() {
       // Power on Vm
-      vm = powerOnVm(vm.getHref());
-      
+      vm = powerOnVm(vmUrn);
+
       // The method under test
-      byte[] image = vmApi.getScreenImage(vm.getHref());
+      byte[] image = vmApi.getScreenImage(vmUrn);
 
       // Check returned bytes against PNG header magic number
       byte[] pngHeaderBytes = new byte[] { (byte) 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A };
       assertNotNull(image);
       assertTrue(image.length > pngHeaderBytes.length);
       for (int i = 0; i < pngHeaderBytes.length; i++) {
-         assertEquals(image[i], pngHeaderBytes[i], String.format("Image differs from PNG format at byte %d of header", i));
+         assertEquals(image[i], pngHeaderBytes[i],
+                  String.format("Image differs from PNG format at byte %d of header", i));
       }
    }
 
    @Test(description = "POST /vApp/{id}/screen/action/acquireTicket", dependsOnMethods = { "testDeployVm" })
    public void testGetScreenTicket() {
       // Power on Vm
-      vm = powerOnVm(vm.getHref());
-      
+      vm = powerOnVm(vmUrn);
+
       // The method under test
-      ScreenTicket ticket = vmApi.getScreenTicket(vm.getHref());
+      ScreenTicket ticket = vmApi.getScreenTicket(vmUrn);
 
       // Check the retrieved object is well formed
       checkScreenTicket(ticket);
@@ -681,55 +631,53 @@
    @Test(description = "GET /vApp/{id}/virtualHardwareSection", dependsOnMethods = { "testGetVm" })
    public void testGetVirtualHardwareSection() {
       // Method under test
-      VirtualHardwareSection hardware = vmApi.getVirtualHardwareSection(vm.getHref());
+      VirtualHardwareSection hardware = vmApi.getVirtualHardwareSection(vmUrn);
 
       // Check the retrieved object is well formed
       checkVirtualHardwareSection(hardware);
    }
 
    @Test(description = "PUT /vApp/{id}/virtualHardwareSection", dependsOnMethods = { "testGetVirtualHardwareSection" })
-   public void testModifyVirtualHardwareSection() {
+   public void testEditVirtualHardwareSection() {
       // Power off Vm
-      vm = powerOffVm(vm.getHref());
+      vm = powerOffVm(vmUrn);
 
-      // Copy existing section and update fields
-      VirtualHardwareSection oldSection = vmApi.getVirtualHardwareSection(vm.getHref());
+      // Copy existing section and edit fields
+      VirtualHardwareSection oldSection = vmApi.getVirtualHardwareSection(vmUrn);
       Set<? extends ResourceAllocationSettingData> oldItems = oldSection.getItems();
       Set<ResourceAllocationSettingData> newItems = Sets.newLinkedHashSet(oldItems);
-      ResourceAllocationSettingData oldMemory = Iterables.find(oldItems, new Predicate<ResourceAllocationSettingData>() {
-         @Override
-         public boolean apply(ResourceAllocationSettingData rasd) {
-            return rasd.getResourceType() == ResourceAllocationSettingData.ResourceType.MEMORY;
-         }
-      });
-      ResourceAllocationSettingData newMemory = oldMemory.toBuilder()
-            .elementName("1024 MB of memory")
-            .virtualQuantity(new BigInteger("1024"))
-            .build();
+      ResourceAllocationSettingData oldMemory = Iterables.find(oldItems,
+               new Predicate<ResourceAllocationSettingData>() {
+                  @Override
+                  public boolean apply(ResourceAllocationSettingData rasd) {
+                     return rasd.getResourceType() == ResourceAllocationSettingData.ResourceType.MEMORY;
+                  }
+               });
+      ResourceAllocationSettingData newMemory = oldMemory.toBuilder().elementName("1024 MB of memory")
+               .virtualQuantity(new BigInteger("1024")).build();
       newItems.remove(oldMemory);
       newItems.add(newMemory);
-      VirtualHardwareSection newSection = oldSection.toBuilder()
-            .items(newItems)
-            .build();
+      VirtualHardwareSection newSection = oldSection.toBuilder().items(newItems).build();
 
       // The method under test
-      Task modifyVirtualHardwareSection = vmApi.modifyVirtualHardwareSection(vm.getHref(), newSection);
-      assertTrue(retryTaskSuccess.apply(modifyVirtualHardwareSection), String.format(TASK_COMPLETE_TIMELY, "modifyVirtualHardwareSection"));
+      Task editVirtualHardwareSection = vmApi.editVirtualHardwareSection(vmUrn, newSection);
+      assertTrue(retryTaskSuccess.apply(editVirtualHardwareSection),
+               String.format(TASK_COMPLETE_TIMELY, "editVirtualHardwareSection"));
 
       // Retrieve the modified section
-      VirtualHardwareSection modifiedSection = vmApi.getVirtualHardwareSection(vm.getHref());
+      VirtualHardwareSection modifiedSection = vmApi.getVirtualHardwareSection(vmUrn);
 
       // Check the retrieved object is well formed
       checkVirtualHardwareSection(modifiedSection);
 
       // Check the modified section fields are set correctly
       ResourceAllocationSettingData modifiedMemory = Iterables.find(modifiedSection.getItems(),
-            new Predicate<ResourceAllocationSettingData>() {
-		         @Override
-		         public boolean apply(ResourceAllocationSettingData rasd) {
-		            return rasd.getResourceType() == ResourceAllocationSettingData.ResourceType.MEMORY;
-		         }
-		      });
+               new Predicate<ResourceAllocationSettingData>() {
+                  @Override
+                  public boolean apply(ResourceAllocationSettingData rasd) {
+                     return rasd.getResourceType() == ResourceAllocationSettingData.ResourceType.MEMORY;
+                  }
+               });
       assertEquals(modifiedMemory.getVirtualQuantity(), new BigInteger("1024"));
       assertEquals(modifiedMemory, newMemory);
       assertEquals(modifiedSection, newSection);
@@ -738,86 +686,90 @@
    @Test(description = "GET /vApp/{id}/virtualHardwareSection/cpu", dependsOnMethods = { "testGetVirtualHardwareSection" })
    public void testGetVirtualHardwareSectionCpu() {
       // Method under test
-      RasdItem rasd = vmApi.getVirtualHardwareSectionCpu(vm.getHref());
+      RasdItem rasd = vmApi.getVirtualHardwareSectionCpu(vmUrn);
 
       // Check the retrieved object is well formed
       checkResourceAllocationSettingData(rasd);
    }
 
    @Test(description = "PUT /vApp/{id}/virtualHardwareSection/cpu", dependsOnMethods = { "testGetVirtualHardwareSectionCpu" })
-   public void testModifyVirtualHardwareSectionCpu() {
-      // Copy existing section and update fields
-      RasdItem oldItem = vmApi.getVirtualHardwareSectionCpu(vm.getHref());
-      RasdItem newItem = oldItem.toBuilder()
-            .elementName("2 virtual CPU(s)")
-            .virtualQuantity(new BigInteger("2"))
-            .build();
-      
+   public void testEditVirtualHardwareSectionCpu() {
+      // Copy existing section and edit fields
+      RasdItem oldItem = vmApi.getVirtualHardwareSectionCpu(vmUrn);
+      RasdItem newItem = oldItem.toBuilder().elementName("2 virtual CPU(s)").virtualQuantity(new BigInteger("2"))
+               .build();
+
       // Method under test
-      Task modifyVirtualHardwareSectionCpu = vmApi.modifyVirtualHardwareSectionCpu(vm.getHref(), newItem);
-      assertTrue(retryTaskSuccess.apply(modifyVirtualHardwareSectionCpu), String.format(TASK_COMPLETE_TIMELY, "modifyVirtualHardwareSectionCpu"));
+      Task editVirtualHardwareSectionCpu = vmApi.editVirtualHardwareSectionCpu(vmUrn, newItem);
+      assertTrue(retryTaskSuccess.apply(editVirtualHardwareSectionCpu),
+               String.format(TASK_COMPLETE_TIMELY, "editVirtualHardwareSectionCpu"));
 
       // Retrieve the modified section
-      RasdItem modified = vmApi.getVirtualHardwareSectionCpu(vm.getHref());
-      
+      RasdItem modified = vmApi.getVirtualHardwareSectionCpu(vmUrn);
+
       // Check the retrieved object
       checkResourceAllocationSettingData(modified);
-      
+
       // Check modified item
-      assertEquals(modified.getVirtualQuantity(), new BigInteger("2"),
-            String.format(OBJ_FIELD_EQ, "ResourceAllocationSettingData", "VirtualQuantity", "2", modified.getVirtualQuantity().toString()));
+      assertEquals(modified.getVirtualQuantity(), new BigInteger("2"), String.format(OBJ_FIELD_EQ,
+               "ResourceAllocationSettingData", "VirtualQuantity", "2", modified.getVirtualQuantity().toString()));
       assertEquals(modified, newItem);
    }
 
    @Test(description = "GET /vApp/{id}/virtualHardwareSection/disks", dependsOnMethods = { "testGetVirtualHardwareSection" })
    public void testGetVirtualHardwareSectionDisks() {
       // Method under test
-      RasdItemsList rasdItems = vmApi.getVirtualHardwareSectionDisks(vm.getHref());
+      RasdItemsList rasdItems = vmApi.getVirtualHardwareSectionDisks(vmUrn);
 
       // Check the retrieved object is well formed
       checkRasdItemsList(rasdItems);
    }
 
    @Test(description = "PUT /vApp/{id}/virtualHardwareSection/disks", dependsOnMethods = { "testGetVirtualHardwareSectionDisks" })
-   public void testModifyVirtualHardwareSectionDisks() {
-      // Copy the existing items list and modify the name of an item
-      RasdItemsList oldSection = vmApi.getVirtualHardwareSectionDisks(vm.getHref());
+   public void testEditVirtualHardwareSectionDisks() {
+      // Copy the existing items list and edit the name of an item
+      RasdItemsList oldSection = vmApi.getVirtualHardwareSectionDisks(vmUrn);
       RasdItemsList newSection = oldSection.toBuilder().build();
 
       // Method under test
-      Task modifyVirtualHardwareSectionDisks = vmApi.modifyVirtualHardwareSectionDisks(vm.getHref(), newSection);
-      assertTrue(retryTaskSuccess.apply(modifyVirtualHardwareSectionDisks), String.format(TASK_COMPLETE_TIMELY, "modifyVirtualHardwareSectionDisks"));
+      Task editVirtualHardwareSectionDisks = vmApi.editVirtualHardwareSectionDisks(vmUrn, newSection);
+      assertTrue(retryTaskSuccess.apply(editVirtualHardwareSectionDisks),
+               String.format(TASK_COMPLETE_TIMELY, "editVirtualHardwareSectionDisks"));
 
       // Retrieve the modified section
-      RasdItemsList modified = vmApi.getVirtualHardwareSectionDisks(vm.getHref());
+      RasdItemsList modified = vmApi.getVirtualHardwareSectionDisks(vmUrn);
 
       // Check the retrieved object is well formed
       checkRasdItemsList(modified);
-      
-      // TODO What is modifiable? What can we change, so we can assert the change took effect? 
-      // I tried changing "elementName" of one of the items, but it continued to have the old value when looked up post-modify.
+
+      // TODO What is modifiable? What can we change, so we can assert the change took effect?
+      // I tried changing "elementName" of one of the items, but it continued to have the old value
+      // when looked up post-edit.
       //
-      // List<ResourceAllocationSettingData> newItems = new ArrayList<ResourceAllocationSettingData>(oldSection.getItems());
+      // List<ResourceAllocationSettingData> newItems = new
+      // ArrayList<ResourceAllocationSettingData>(oldSection.getItems());
       // ResourceAllocationSettingData item0 = newItems.get(0);
       // String item0InstanceId = item0.getInstanceID().getValue();
-      // String item0ElementName = item0.getElementName().getValue()+"-"+random.nextInt(Integer.MAX_VALUE);
+      // String item0ElementName =
+      // item0.getElementName().getValue()+"-"+random.nextInt(Integer.MAX_VALUE);
       // newItems.set(0, item0.toBuilder().elementName(newCimString(item0ElementName)).build());
       // RasdItemsList newSection = oldSection.toBuilder()
-      //       .items(newItems)
-      //       .build();
+      // .items(newItems)
+      // .build();
       // ...
       // long weight = random.nextInt(Integer.MAX_VALUE);
       // ResourceAllocationSettingData newSection = origSection.toBuilder()
-      //         .weight(newCimUnsignedInt(weight))
-      //         .build();
+      // .weight(newCimUnsignedInt(weight))
+      // .build();
       // ...
-      // checkHasMatchingItem("virtualHardwareSection/disk", modified, item0InstanceId, item0ElementName);
+      // checkHasMatchingItem("virtualHardwareSection/disk", modified, item0InstanceId,
+      // item0ElementName);
    }
 
    @Test(description = "GET /vApp/{id}/virtualHardwareSection/media", dependsOnMethods = { "testGetVirtualHardwareSection" })
    public void testGetVirtualHardwareSectionMedia() {
       // Method under test
-      RasdItemsList rasdItems = vmApi.getVirtualHardwareSectionMedia(vm.getHref());
+      RasdItemsList rasdItems = vmApi.getVirtualHardwareSectionMedia(vmUrn);
 
       // Check the retrieved object is well formed
       checkRasdItemsList(rasdItems);
@@ -826,92 +778,95 @@
    @Test(description = "GET /vApp/{id}/virtualHardwareSection/memory", dependsOnMethods = { "testGetVirtualHardwareSection" })
    public void testGetVirtualHardwareSectionMemory() {
       // Method under test
-      RasdItem rasd = vmApi.getVirtualHardwareSectionCpu(vm.getHref());
+      RasdItem rasd = vmApi.getVirtualHardwareSectionCpu(vmUrn);
 
       // Check the retrieved object is well formed
       checkResourceAllocationSettingData(rasd);
    }
 
    @Test(description = "PUT /vApp/{id}/virtualHardwareSection/memory", dependsOnMethods = { "testGetVirtualHardwareSectionMemory" })
-   public void testModifyVirtualHardwareSectionMemory() {
-      RasdItem origItem = vmApi.getVirtualHardwareSectionMemory(vm.getHref());
-      RasdItem newItem = origItem.toBuilder()
-            .elementName("1024 MB of memory")
-            .virtualQuantity(new BigInteger("1024"))
-            .build();
-      
+   public void testEditVirtualHardwareSectionMemory() {
+      RasdItem origItem = vmApi.getVirtualHardwareSectionMemory(vmUrn);
+      RasdItem newItem = origItem.toBuilder().elementName("1024 MB of memory").virtualQuantity(new BigInteger("1024"))
+               .build();
+
       // Method under test
-      Task modifyVirtualHardwareSectionMemory = vmApi.modifyVirtualHardwareSectionMemory(vm.getHref(), newItem);
-      assertTrue(retryTaskSuccess.apply(modifyVirtualHardwareSectionMemory), String.format(TASK_COMPLETE_TIMELY, "modifyVirtualHardwareSectionMemory"));
+      Task editVirtualHardwareSectionMemory = vmApi.editVirtualHardwareSectionMemory(vmUrn, newItem);
+      assertTrue(retryTaskSuccess.apply(editVirtualHardwareSectionMemory),
+               String.format(TASK_COMPLETE_TIMELY, "editVirtualHardwareSectionMemory"));
 
       // Retrieve the modified section
-      RasdItem modified = vmApi.getVirtualHardwareSectionMemory(vm.getHref());
-      
+      RasdItem modified = vmApi.getVirtualHardwareSectionMemory(vmUrn);
+
       // Check the retrieved object
       checkResourceAllocationSettingData(modified);
-      
+
       // Check modified item
-      assertEquals(modified.getVirtualQuantity(), new BigInteger("1024"),
-            String.format(OBJ_FIELD_EQ, "ResourceAllocationSettingData", "VirtualQuantity", "1024", modified.getVirtualQuantity().toString()));
+      assertEquals(modified.getVirtualQuantity(), new BigInteger("1024"), String.format(OBJ_FIELD_EQ,
+               "ResourceAllocationSettingData", "VirtualQuantity", "1024", modified.getVirtualQuantity().toString()));
       assertEquals(modified, newItem);
    }
 
    @Test(description = "GET /vApp/{id}/virtualHardwareSection/networkCards", dependsOnMethods = { "testGetVirtualHardwareSection" })
    public void testGetVirtualHardwareSectionNetworkCards() {
       // Method under test
-      RasdItemsList rasdItems = vmApi.getVirtualHardwareSectionNetworkCards(vm.getHref());
+      RasdItemsList rasdItems = vmApi.getVirtualHardwareSectionNetworkCards(vmUrn);
 
       // Check the retrieved object is well formed
       checkRasdItemsList(rasdItems);
    }
 
    @Test(description = "PUT /vApp/{id}/virtualHardwareSection/networkCards", dependsOnMethods = { "testGetVirtualHardwareSectionNetworkCards" })
-   public void testModifyVirtualHardwareSectionNetworkCards() {
-      RasdItemsList oldSection = vmApi.getVirtualHardwareSectionNetworkCards(vm.getHref());
+   public void testEditVirtualHardwareSectionNetworkCards() {
+      RasdItemsList oldSection = vmApi.getVirtualHardwareSectionNetworkCards(vmUrn);
       RasdItemsList newSection = oldSection.toBuilder().build();
 
       // Method under test
-      Task modifyVirtualHardwareSectionNetworkCards = vmApi.modifyVirtualHardwareSectionNetworkCards(vm.getHref(), newSection);
-      assertTrue(retryTaskSuccess.apply(modifyVirtualHardwareSectionNetworkCards), String.format(TASK_COMPLETE_TIMELY, "modifyVirtualHardwareSectionNetworkCards"));
+      Task editVirtualHardwareSectionNetworkCards = vmApi.editVirtualHardwareSectionNetworkCards(vmUrn, newSection);
+      assertTrue(retryTaskSuccess.apply(editVirtualHardwareSectionNetworkCards),
+               String.format(TASK_COMPLETE_TIMELY, "editVirtualHardwareSectionNetworkCards"));
 
       // Retrieve the modified section
-      RasdItemsList modified = vmApi.getVirtualHardwareSectionNetworkCards(vm.getHref());
+      RasdItemsList modified = vmApi.getVirtualHardwareSectionNetworkCards(vmUrn);
 
       // Check the retrieved object is well formed
       checkRasdItemsList(modified);
-      
-      // TODO What is modifiable? What can we change, so we can assert the change took effect? 
-      // I tried changing "elementName" of one of the items, but it continued to have the old value when looked up post-modify.
-      // See the description in testModifyVirtualHardwareSectionDisks
+
+      // TODO What is modifiable? What can we change, so we can assert the change took effect?
+      // I tried changing "elementName" of one of the items, but it continued to have the old value
+      // when looked up post-edit.
+      // See the description in testEditVirtualHardwareSectionDisks
    }
 
    @Test(description = "GET /vApp/{id}/virtualHardwareSection/serialPorts", dependsOnMethods = { "testGetVirtualHardwareSection" })
    public void testGetVirtualHardwareSectionSerialPorts() {
       // Method under test
-      RasdItemsList rasdItems = vmApi.getVirtualHardwareSectionSerialPorts(vm.getHref());
+      RasdItemsList rasdItems = vmApi.getVirtualHardwareSectionSerialPorts(vmUrn);
 
       // Check the retrieved object is well formed
       checkRasdItemsList(rasdItems);
    }
 
    @Test(description = "PUT /vApp/{id}/virtualHardwareSection/serialPorts", dependsOnMethods = { "testGetVirtualHardwareSectionSerialPorts" })
-   public void testModifyVirtualHardwareSectionSerialPorts() {
-      RasdItemsList oldSection = vmApi.getVirtualHardwareSectionSerialPorts(vm.getHref());
+   public void testEditVirtualHardwareSectionSerialPorts() {
+      RasdItemsList oldSection = vmApi.getVirtualHardwareSectionSerialPorts(vmUrn);
       RasdItemsList newSection = oldSection.toBuilder().build();
 
       // Method under test
-      Task modifyVirtualHardwareSectionSerialPorts = vmApi.modifyVirtualHardwareSectionSerialPorts(vm.getHref(), newSection);
-      assertTrue(retryTaskSuccess.apply(modifyVirtualHardwareSectionSerialPorts), String.format(TASK_COMPLETE_TIMELY, "modifyVirtualHardwareSectionSerialPorts"));
+      Task editVirtualHardwareSectionSerialPorts = vmApi.editVirtualHardwareSectionSerialPorts(vmUrn, newSection);
+      assertTrue(retryTaskSuccess.apply(editVirtualHardwareSectionSerialPorts),
+               String.format(TASK_COMPLETE_TIMELY, "editVirtualHardwareSectionSerialPorts"));
 
       // Retrieve the modified section
-      RasdItemsList modified = vmApi.getVirtualHardwareSectionSerialPorts(vm.getHref());
+      RasdItemsList modified = vmApi.getVirtualHardwareSectionSerialPorts(vmUrn);
 
       // Check the retrieved object is well formed
       checkRasdItemsList(modified);
-      
-      // TODO What is modifiable? What can we change, so we can assert the change took effect? 
-      // I tried changing "elementName" of one of the items, but it continued to have the old value when looked up post-modify.
-      // See the description in testModifyVirtualHardwareSectionDisks
+
+      // TODO What is modifiable? What can we change, so we can assert the change took effect?
+      // I tried changing "elementName" of one of the items, but it continued to have the old value
+      // when looked up post-edit.
+      // See the description in testEditVirtualHardwareSectionDisks
    }
 
    @Test(description = "PUT /vApp/{id}/metadata/{key}", dependsOnMethods = { "testGetVm" })
@@ -919,50 +874,52 @@
       key = name("key-");
       String value = name("value-");
       metadataValue = MetadataValue.builder().value(value).build();
-      vmApi.getMetadataApi().setMetadata(vm.getHref(), key, metadataValue);
+      vmApi.getMetadataApi(vmUrn).putEntry(key, metadataValue);
 
       // Retrieve the value, and assert it was set correctly
-      MetadataValue newMetadataValue = vmApi.getMetadataApi().getMetadataValue(vm.getHref(), key);
+      MetadataValue newMetadataValue = vmApi.getMetadataApi(vmUrn).getValue(key);
 
       // Check the retrieved object is well formed
       checkMetadataValueFor(VM, newMetadataValue, value);
    }
-   
+
    @Test(description = "GET /vApp/{id}/metadata", dependsOnMethods = { "testSetMetadataValue" })
    public void testGetMetadata() {
       // Call the method being tested
-      Metadata metadata = vmApi.getMetadataApi().getMetadata(vm.getHref());
-      
+      Metadata metadata = vmApi.getMetadataApi(vmUrn).get();
+
       checkMetadata(metadata);
-      
+
       // Check requirements for this test
-      assertTrue(Iterables.isEmpty(metadata.getMetadataEntries()), String.format(NOT_EMPTY_OBJECT_FMT, "MetadataEntry", "vm"));
+      assertTrue(Iterables.isEmpty(metadata.getMetadataEntries()),
+               String.format(NOT_EMPTY_OBJECT_FMT, "MetadataEntry", "vm"));
    }
-   
+
    @Test(description = "GET /vApp/{id}/metadata/{key}", dependsOnMethods = { "testGetMetadata" })
    public void testGetOrgMetadataValue() {
       key = name("key-");
       String value = name("value-");
       metadataValue = MetadataValue.builder().value(value).build();
-      vmApi.getMetadataApi().setMetadata(vm.getHref(), key, metadataValue);
-      
+      vmApi.getMetadataApi(vmUrn).putEntry(key, metadataValue);
+
       // Call the method being tested
-      MetadataValue metadataValue = vmApi.getMetadataApi().getMetadataValue(vm.getHref(), key);
-      
+      MetadataValue metadataValue = vmApi.getMetadataApi(vmUrn).getValue(key);
+
       String expected = metadataValue.getValue();
 
       checkMetadataValue(metadataValue);
-      assertEquals(metadataValue.getValue(), expected, String.format(CORRECT_VALUE_OBJECT_FMT, "Value", "MetadataValue", expected, metadataValue.getValue()));
+      assertEquals(metadataValue.getValue(), expected,
+               String.format(CORRECT_VALUE_OBJECT_FMT, "Value", "MetadataValue", expected, metadataValue.getValue()));
    }
 
    @Test(description = "DELETE /vApp/{id}/metadata/{key}", dependsOnMethods = { "testSetMetadataValue" })
-   public void testDeleteMetadataEntry() {
+   public void testRemoveMetadataEntry() {
       // Delete the entry
-      Task task = vmApi.getMetadataApi().deleteMetadataEntry(vm.getHref(), key);
+      Task task = vmApi.getMetadataApi(vmUrn).removeEntry(key);
       retryTaskSuccess.apply(task);
 
-      // Confirm the entry has been deleted
-      Metadata newMetadata = vmApi.getMetadataApi().getMetadata(vm.getHref());
+      // Confirm the entry has been removed
+      Metadata newMetadata = vmApi.getMetadataApi(vmUrn).get();
 
       // Check the retrieved object is well formed
       checkMetadataKeyAbsentFor(VM, newMetadata, key);
@@ -970,62 +927,56 @@
 
    @Test(description = "POST /vApp/{id}/metadata", dependsOnMethods = { "testGetMetadata" })
    public void testMergeMetadata() {
-      Metadata oldMetadata = vmApi.getMetadataApi().getMetadata(vm.getHref());
+      Metadata oldMetadata = vmApi.getMetadataApi(vmUrn).get();
       Map<String, String> oldMetadataMap = Checks.metadataToMap(oldMetadata);
 
-      // Store a value, to be deleted
+      // Store a value, to be removed
       String key = name("key-");
       String value = name("value-");
-      Metadata addedMetadata = Metadata.builder()
-            .entry(MetadataEntry.builder().key(key).value(value).build())
-            .build();
-      Task task = vmApi.getMetadataApi().mergeMetadata(vm.getHref(), addedMetadata);
+      Metadata addedMetadata = Metadata.builder().entry(MetadataEntry.builder().key(key).value(value).build()).build();
+      Task task = vmApi.getMetadataApi(vmUrn).merge(addedMetadata);
       retryTaskSuccess.apply(task);
 
       // Confirm the entry contains everything that was there, and everything that was being added
-      Metadata newMetadata = vmApi.getMetadataApi().getMetadata(vm.getHref());
-      Map<String, String> expectedMetadataMap = ImmutableMap.<String, String>builder()
-            .putAll(oldMetadataMap)
-            .put(key, value)
-            .build();
+      Metadata newMetadata = vmApi.getMetadataApi(vmUrn).get();
+      Map<String, String> expectedMetadataMap = ImmutableMap.<String, String> builder().putAll(oldMetadataMap)
+               .put(key, value).build();
 
       // Check the retrieved object is well formed
       checkMetadataFor(VM, newMetadata, expectedMetadataMap);
    }
 
    /**
-    * @see VmApi#deleteVm(URI)
+    * @see VmApi#remove(String)
     */
    @Test(description = "DELETE /vApp/{id}")
-   public void testDeleteVm() {
-      // Create a temporary VApp to delete
-      VApp delete = instantiateVApp();
+   public void testRemoveVm() {
+      // Create a temporary VApp to remove
+      VApp remove = instantiateVApp();
       DeployVAppParams params = DeployVAppParams.builder()
-            .deploymentLeaseSeconds((int)TimeUnit.SECONDS.convert(1L, TimeUnit.HOURS))
-            .notForceCustomization()
-            .powerOn()
-            .build();
-      Task deployVApp = vAppApi.deploy(delete.getHref(), params);
+               .deploymentLeaseSeconds((int) TimeUnit.SECONDS.convert(1L, TimeUnit.HOURS)).notForceCustomization()
+               .powerOn().build();
+      Task deployVApp = vAppApi.deploy(remove.getId(), params);
       assertTaskSucceedsLong(deployVApp);
 
-      // Get the updated VApp and the Vm
-      delete = vAppApi.getVApp(delete.getHref());
-      List<Vm> vms = delete.getChildren().getVms();
+      // Get the edited VApp and the Vm
+      remove = vAppApi.get(remove.getId());
+      List<Vm> vms = remove.getChildren().getVms();
       Vm temp = Iterables.get(vms, 0);
 
-      // otherwise it's impossible to stop a running vApp with no vms 
-      if(vms.size() == 1) {
+      // otherwise it's impossible to stop a running vApp with no vms
+      if (vms.size() == 1) {
          UndeployVAppParams undeployParams = UndeployVAppParams.builder().build();
-         Task shutdownVapp = vAppApi.undeploy(delete.getHref(), undeployParams);
+         Task shutdownVapp = vAppApi.undeploy(remove.getId(), undeployParams);
          assertTaskSucceedsLong(shutdownVapp);
       } else {
-         powerOffVm(temp.getHref());
+         powerOffVm(temp.getId());
       }
       // The method under test
-      Task deleteVm = vmApi.deleteVm(temp.getHref());
-      assertTrue(retryTaskSuccess.apply(deleteVm), String.format(TASK_COMPLETE_TIMELY, "deleteVm"));
+      Task removeVm = vmApi.remove(temp.getId());
+      assertTrue(retryTaskSuccess.apply(removeVm), String.format(TASK_COMPLETE_TIMELY, "removeVm"));
 
-      Vm deleted = vmApi.getVm(temp.getHref());
-      assertNull(deleted, "The Vm "+temp.getName()+" should have been deleted");
+      Vm removed = vmApi.get(temp.getId());
+      assertNull(removed, "The Vm " + temp.getName() + " should have been removed");
    }
 }
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminCatalogApiExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminCatalogApiExpectTest.java
index ff28dce..c6af0da 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminCatalogApiExpectTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminCatalogApiExpectTest.java
@@ -18,10 +18,19 @@
  */
 package org.jclouds.vcloud.director.v1_5.features.admin;
 
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ADMIN_CATALOG;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ADMIN_ORG;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.CATALOG;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ENTITY;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ORG;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.OWNER;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.PUBLISH_CATALOG_PARAMS;
 import static org.testng.Assert.assertEquals;
 
 import java.net.URI;
 
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
 import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
 import org.jclouds.vcloud.director.v1_5.admin.VCloudDirectorAdminApi;
 import org.jclouds.vcloud.director.v1_5.domain.AdminCatalog;
@@ -34,132 +43,197 @@
 import org.testng.annotations.Test;
 
 import com.google.common.collect.ImmutableSet;
+import com.google.common.net.HttpHeaders;
 
 /**
  * Test the {@link AdminCatalogApi} by observing its side effects.
  * 
- * @author grkvlt@apache.org
+ * @author grkvlt@apache.org, Adrian Cole
  */
 @Test(groups = { "unit", "admin" }, singleThreaded = true, testName = "CatalogApiExpectTest")
 public class AdminCatalogApiExpectTest extends VCloudDirectorAdminApiExpectTest {
    
-   private Reference catalogRef = Reference.builder()
-         .type("application/vnd.vmware.vcloud.catalog+xml")
-         .name("QunyingTestCatalog")
-         .href(URI.create(endpoint + "/admin/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4"))
-         .build();
+   static String catalog = "7212e451-76e1-4631-b2de-ba1dfd8080e4";
+   static String catalogUrn = "urn:vcloud:catalog:" + catalog;
+   static URI catalogAdminHref = URI.create(endpoint + "/admin/catalog/" + catalog);
+   static URI catalogHref = URI.create(endpoint + "/catalog/" + catalog);
+   
+   HttpRequest get = HttpRequest.builder()
+            .method("GET")
+            .endpoint(catalogAdminHref)
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+            .build();
+
+    HttpResponse getResponse = HttpResponse.builder()
+            .statusCode(200)
+            .payload(payloadFromResourceWithContentType("/catalog/admin/catalog.xml", ADMIN_CATALOG + ";version=1.5"))
+            .build();
+    
+   @Test
+   public void testGetCatalogHref() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, get, getResponse);
+      assertEquals(api.getCatalogApi().get(catalogAdminHref), catalog());
+   }
+   
+   HttpRequest resolveCatalog = HttpRequest.builder()
+            .method("GET")
+            .endpoint(endpoint + "/entity/" + catalogUrn)
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+            .build();
+   
+   String catalogEntity = asString(createXMLBuilder("Entity").a("xmlns", "http://www.vmware.com/vcloud/v1.5")
+                                                             .a("name", catalogUrn)
+                                                             .a("id", catalogUrn)
+                                                             .a("type", ENTITY)
+                                                             .a("href", endpoint + "/entity/" + catalogUrn)
+                                  .e("Link").a("rel", "alternate").a("type", CATALOG).a("href", catalogHref.toString()).up()
+                                  .e("Link").a("rel", "alternate").a("type", ADMIN_CATALOG).a("href", catalogAdminHref.toString()).up());
+   
+   HttpResponse resolveCatalogResponse = HttpResponse.builder()
+           .statusCode(200)
+           .payload(payloadFromStringWithContentType(catalogEntity, ENTITY + ";version=1.5"))
+           .build();
    
    @Test
-   public void testCreateCatalog() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("POST", "/admin/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4/catalogs")
-            .xmlFilePayload("/catalog/admin/createCatalogSource.xml", VCloudDirectorMediaType.ADMIN_CATALOG)
-            .acceptMedia(VCloudDirectorMediaType.ADMIN_CATALOG)
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/catalog/admin/createCatalog.xml", VCloudDirectorMediaType.ADMIN_CATALOG)
-            .httpResponseBuilder().build());
-
-      AdminCatalog source = createCatalogSource();
-      AdminCatalog expected = createCatalog();
-
-      assertEquals(api.getCatalogApi().createCatalog(catalogRef.getHref(), source), expected);
+   public void testGetCatalogUrn() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, resolveCatalog, resolveCatalogResponse, get, getResponse);
+      assertEquals(api.getCatalogApi().get(catalogUrn), catalog());
    }
+   
+   static String org = "7212e451-76e1-4631-b2de-asdasdasd";
+   static String orgUrn = "urn:vcloud:org:" + org;
+   static URI orgHref = URI.create(endpoint + "/org/" + org);
+   static URI orgAdminHref = URI.create(endpoint + "/admin/org/" + org);
+   
+   HttpRequest add = HttpRequest.builder()
+            .method("POST")
+            .endpoint(orgAdminHref + "/catalogs")
+            .addHeader("Accept", ADMIN_CATALOG)
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+            .payload(payloadFromResourceWithContentType("/catalog/admin/addCatalogSource.xml", VCloudDirectorMediaType.ADMIN_CATALOG))
+            .build();
 
-   // FIXME disabled due to intermittent JXB error: javax.xml.bind.UnmarshalException:
-   // unexpected element (uri:"http://www.vmware.com/vcloud/v1.5", local:"AdminCatalog").
-   // Expected elements are <{http://www.vmware.com/vcloud/v1.5}Catalog>, <{http://www.vmware.com/vcloud/v1.5}CatalogReference>,
-   // <{http://www.vmware.com/vcloud/v1.5}Error>,<{http://www.vmware.com/vcloud/v1.5}Link>,
-   // <{http://www.vmware.com/vcloud/v1.5}Owner>,<{http://www.vmware.com/vcloud/v1.5}Reference>,
-   // <{http://www.vmware.com/vcloud/v1.5}RoleReference>,<{http://www.vmware.com/vcloud/v1.5}Task>,
-   // <{http://www.vmware.com/vcloud/v1.5}VAppReference>
-   @Test(enabled = false)
-   public void testGetCatalog() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("GET", "/admin/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4")
-            .acceptAnyMedia()
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/catalog/admin/catalog.xml", VCloudDirectorMediaType.ADMIN_CATALOG)
-            .httpResponseBuilder().build());
+    HttpResponse addResponse = HttpResponse.builder()
+            .statusCode(200)
+            .payload(payloadFromResourceWithContentType("/catalog/admin/addCatalog.xml", ADMIN_CATALOG + ";version=1.5"))
+            .build();
+    
+   @Test
+   public void testAddCatalogHref() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, add, addResponse);
+      assertEquals(api.getCatalogApi().addCatalogToOrg(addCatalogToOrgSource(), orgAdminHref), addCatalogToOrg());
+   }
+   
+   HttpRequest resolveOrg = HttpRequest.builder()
+            .method("GET")
+            .endpoint(endpoint + "/entity/" + orgUrn)
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+            .build();
+   
+   String orgEntity = asString(createXMLBuilder("Entity").a("xmlns", "http://www.vmware.com/vcloud/v1.5")
+                                                             .a("name", orgUrn)
+                                                             .a("id", orgUrn)
+                                                             .a("type", ENTITY)
+                                                             .a("href", endpoint + "/entity/" + catalogUrn)
+                                  .e("Link").a("rel", "alternate").a("type", ORG).a("href", orgHref.toString()).up()
+                                  .e("Link").a("rel", "alternate").a("type", ADMIN_ORG).a("href", orgAdminHref.toString()).up());
+   
+   HttpResponse resolveOrgResponse = HttpResponse.builder()
+           .statusCode(200)
+           .payload(payloadFromStringWithContentType(orgEntity, ENTITY + ";version=1.5"))
+           .build();
+   
+   @Test
+   public void testAddCatalogUrn() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, resolveOrg, resolveOrgResponse, add, addResponse);
+      assertEquals(api.getCatalogApi().addCatalogToOrg(addCatalogToOrgSource(), orgUrn), addCatalogToOrg());
+   }
+   
+   HttpRequest edit = HttpRequest.builder()
+            .method("PUT")
+            .endpoint(catalogAdminHref)
+            .addHeader("Accept", ADMIN_CATALOG)
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+            .payload(payloadFromResourceWithContentType("/catalog/admin/editCatalogSource.xml", VCloudDirectorMediaType.ADMIN_CATALOG))
+            .build();
 
-      AdminCatalog expected = catalog();
+    HttpResponse editResponse = HttpResponse.builder()
+            .statusCode(200)
+            .payload(payloadFromResourceWithContentType("/catalog/admin/editCatalog.xml", ADMIN_CATALOG + ";version=1.5"))
+            .build();
+    
+   @Test
+   public void testEditCatalogHref() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, edit, editResponse);
+      assertEquals(api.getCatalogApi().edit(catalogAdminHref, editCatalog()), editCatalog());
+   }
+  
+   @Test
+   public void testEditCatalogUrn() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, resolveCatalog, resolveCatalogResponse, edit, editResponse);
+      assertEquals(api.getCatalogApi().edit(catalogUrn, editCatalog()), editCatalog());
+   }
+   
+   HttpRequest getOwner = HttpRequest.builder()
+            .method("GET")
+            .endpoint(catalogAdminHref + "/owner")
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+            .build();
 
-      AdminCatalog actual = api.getCatalogApi().getCatalog(catalogRef.getHref());
-      assertEquals(actual.getHref(), expected.getHref());
-      assertEquals(actual.getLinks(), expected.getLinks());
-      assertEquals(actual.getTasks(), expected.getTasks());
-      
-      System.out.println(actual.getOwner());
-      System.out.println(expected.getOwner());
-      
-      Reference actualUser = actual.getOwner().getUser();
-      Reference expectedUser = expected.getOwner().getUser();
-      assertEquals(actualUser, expectedUser);
-
-      assertEquals(actual.getOwner(), expected.getOwner());
-      
-      assertEquals(api.getCatalogApi().getCatalog(catalogRef.getHref()), expected);
+    HttpResponse getOwnerResponse = HttpResponse.builder()
+            .statusCode(200)
+            .payload(payloadFromResourceWithContentType("/catalog/admin/owner.xml", OWNER + ";version=1.5"))
+            .build();
+    
+    Owner expectedGetOwner = owner().toBuilder()
+             .link(Link.builder()
+                      .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4"))
+                      .type("application/vnd.vmware.vcloud.catalog+xml")
+                      .rel("up")
+                      .build())
+             .link(Link.builder()
+                      .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4/owner"))
+                      .type("application/vnd.vmware.vcloud.owner+xml")
+                      .rel("edit")
+                      .build())
+             .build();
+    
+   @Test
+   public void testGetCatalogOwnerHref() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, getOwner, getOwnerResponse);
+      assertEquals(api.getCatalogApi().getOwner(catalogAdminHref), expectedGetOwner);
    }
    
    @Test
-   public void testModifyCatalog() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("PUT", "/admin/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4")
-            .xmlFilePayload("/catalog/admin/updateCatalogSource.xml", VCloudDirectorMediaType.ADMIN_CATALOG)
-            .acceptMedia(VCloudDirectorMediaType.ADMIN_CATALOG)
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/catalog/admin/updateCatalog.xml", VCloudDirectorMediaType.ADMIN_CATALOG)
-            .httpResponseBuilder().build());
-
-      AdminCatalog expected = modifyCatalog();
-
-      assertEquals(api.getCatalogApi().updateCatalog(catalogRef.getHref(), expected), expected);
+   public void testGetCatalogOwnerUrn() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, resolveCatalog, resolveCatalogResponse, getOwner, getOwnerResponse);
+      assertEquals(api.getCatalogApi().getOwner(catalogUrn), expectedGetOwner);
    }
    
-   @Test
-   public void testGetOwner() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
-            new VcloudHttpRequestPrimer()
-               .apiCommand("GET", "/admin/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4/owner")
-               .acceptAnyMedia()
-               .httpRequestBuilder().build(), 
-            new VcloudHttpResponsePrimer()
-               .xmlFilePayload("/catalog/admin/owner.xml", VCloudDirectorMediaType.OWNER)
-               .httpResponseBuilder().build());
-      
-      Owner expected = owner().toBuilder()
-               .link(Link.builder()
-                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4"))
-                        .type("application/vnd.vmware.vcloud.catalog+xml")
-                        .rel("up")
-                        .build())
-               .link(Link.builder()
-                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4/owner"))
-                        .type("application/vnd.vmware.vcloud.owner+xml")
-                        .rel("edit")
-                        .build())
-               .build();
+   HttpRequest setOwner = HttpRequest.builder()
+            .method("PUT")
+            .endpoint(catalogAdminHref + "/owner")
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+            .payload(payloadFromResourceWithContentType("/catalog/admin/editOwnerSource.xml", OWNER + ";version=1.5"))
+            .build();
 
-      assertEquals(api.getCatalogApi().getOwner(catalogRef.getHref()), expected);
-   }
+   HttpResponse setOwnerResponse = HttpResponse.builder()
+            .statusCode(204)
+            .build();
    
-   @Test
-   public void testSetOwner() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
-            new VcloudHttpRequestPrimer()
-               .apiCommand("PUT", "/admin/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4/owner")
-               .xmlFilePayload("/catalog/admin/updateOwnerSource.xml", VCloudDirectorMediaType.OWNER)
-               .acceptAnyMedia()
-               .httpRequestBuilder().build(), 
-            new VcloudHttpResponsePrimer()
-               .httpResponseBuilder().statusCode(204).build());
-      
-      Owner newOwner = Owner.builder()
+   Owner ownerToSet = Owner.builder()
             .type("application/vnd.vmware.vcloud.owner+xml")
             .user(Reference.builder()
                   .type("application/vnd.vmware.admin.user+xml")
@@ -167,49 +241,83 @@
                   .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/user/e9eb1b29-0404-4c5e-8ef7-e584acc51da9"))
                   .build())
             .build();
-      
-      api.getCatalogApi().setOwner(catalogRef.getHref(), newOwner);
+   
+   @Test
+   public void testSetCatalogOwnerHref() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, setOwner, setOwnerResponse);
+      api.getCatalogApi().setOwner(catalogAdminHref, ownerToSet);
    }
    
    @Test
-   public void testPublishCatalog() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
-            new VcloudHttpRequestPrimer()
-               .apiCommand("POST", "/admin/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4/action/publish")
-               .xmlFilePayload("/catalog/admin/publishCatalogParams.xml", VCloudDirectorMediaType.PUBLISH_CATALOG_PARAMS)
-               .acceptAnyMedia()
-               .httpRequestBuilder().build(), 
-            new VcloudHttpResponsePrimer()
-               .httpResponseBuilder().statusCode(204).build());
-      
-      PublishCatalogParams params = PublishCatalogParams.builder()
-            .isPublished(true)
+   public void testSetCatalogOwnerUrn() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, resolveCatalog, resolveCatalogResponse, setOwner, setOwnerResponse);
+      api.getCatalogApi().setOwner(catalogUrn, ownerToSet);
+   }
+   
+   HttpRequest publishCatalog = HttpRequest.builder()
+            .method("POST")
+            .endpoint(catalogAdminHref + "/action/publish")
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+            .payload(payloadFromResourceWithContentType("/catalog/admin/publishCatalogParams.xml", PUBLISH_CATALOG_PARAMS + ";version=1.5"))
             .build();
-      
-      api.getCatalogApi().publishCatalog(catalogRef.getHref(), params);
-   }
+
+   HttpResponse publishCatalogResponse = HttpResponse.builder()
+            .statusCode(204)
+            .build();
    
    @Test
-   public void testDeleteCatalog() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
-            new VcloudHttpRequestPrimer()
-               .apiCommand("DELETE", "/admin/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4")
-               .acceptAnyMedia()
-               .httpRequestBuilder().build(), 
-            new VcloudHttpResponsePrimer()
-               .httpResponseBuilder().statusCode(204).build());
-      
-      api.getCatalogApi().deleteCatalog(catalogRef.getHref());
+   public void testPublishCatalogHref() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, publishCatalog,
+               publishCatalogResponse);
+      api.getCatalogApi().publish(catalogAdminHref, PublishCatalogParams.builder().isPublished(true).build());
    }
+
+   @Test
+   public void testPublishCatalogUrn() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, resolveCatalog,
+               resolveCatalogResponse, publishCatalog, publishCatalogResponse);
+      api.getCatalogApi().publish(catalogUrn, PublishCatalogParams.builder().isPublished(true).build());
+   }
+
    
-   public static final AdminCatalog createCatalogSource() {
+   HttpRequest removeCatalog = HttpRequest.builder()
+            .method("DELETE")
+            .endpoint(catalogAdminHref)
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+            .build();
+
+   HttpResponse removeCatalogResponse = HttpResponse.builder()
+            .statusCode(204)
+            .build();
+   
+   @Test
+   public void testRemoveCatalogHref() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, removeCatalog,
+               removeCatalogResponse);
+      api.getCatalogApi().remove(catalogAdminHref);
+   }
+
+   @Test
+   public void testRemoveCatalogUrn() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, resolveCatalog,
+               resolveCatalogResponse, removeCatalog, removeCatalogResponse);
+      api.getCatalogApi().remove(catalogUrn);
+   }
+
+   //TODO: tests for access control!
+   
+   public static final AdminCatalog addCatalogToOrgSource() {
       return AdminCatalog.builder()
          .name("Test Catalog")
          .description("created by testCreateCatalog()")
          .build();
    }
    
-   public static final AdminCatalog createCatalog() {
+   public static final AdminCatalog addCatalogToOrg() {
       return AdminCatalog.builder()
          .name("Test Catalog")
          .id("urn:vcloud:catalog:c56d9159-7838-446f-bb35-9ee12dfbbef3")
@@ -250,7 +358,6 @@
             .type("application/vnd.vmware.vcloud.metadata+xml")
             .href(URI.create("https://vcloudbeta.bluelock.com/api/catalog/c56d9159-7838-446f-bb35-9ee12dfbbef3/metadata"))
             .build())
-         .description("created by testCreateCatalog()")
          .tasks(ImmutableSet.<Task>builder()
             .add(Task.builder()
                .status("running")
@@ -364,7 +471,7 @@
          .build();
    }
    
-   public static final AdminCatalog modifyCatalog() {
+   public static final AdminCatalog editCatalog() {
       return catalog().toBuilder()
          .name("new QunyingTestCatalog")
          .description("new Testing")
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminCatalogApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminCatalogApiLiveTest.java
index e9f0a58..463d0bd 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminCatalogApiLiveTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminCatalogApiLiveTest.java
@@ -23,6 +23,7 @@
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_DEL;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_EQ;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_UPDATABLE;
+import static org.jclouds.vcloud.director.v1_5.domain.Checks.checkControlAccessParams;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertNull;
 import static org.testng.Assert.assertTrue;
@@ -35,6 +36,8 @@
 import org.jclouds.vcloud.director.v1_5.domain.Owner;
 import org.jclouds.vcloud.director.v1_5.domain.Reference;
 import org.jclouds.vcloud.director.v1_5.domain.User;
+import org.jclouds.vcloud.director.v1_5.domain.org.Org;
+import org.jclouds.vcloud.director.v1_5.domain.params.ControlAccessParams;
 import org.jclouds.vcloud.director.v1_5.domain.params.PublishCatalogParams;
 import org.jclouds.vcloud.director.v1_5.internal.BaseVCloudDirectorApiLiveTest;
 import org.testng.annotations.AfterClass;
@@ -50,7 +53,7 @@
  */
 @Test(groups = { "live", "admin" }, singleThreaded = true, testName = "CatalogApiLiveTest")
 public class AdminCatalogApiLiveTest extends BaseVCloudDirectorApiLiveTest {
-   
+
    public static final String CATALOG = "admin catalog";
 
    /*
@@ -63,7 +66,7 @@
     * Shared state between dependant tests.
     */
 
-   private Reference orgRef;
+   private Org org;
    private AdminCatalog catalog;
    private Owner owner;
 
@@ -71,141 +74,155 @@
    @BeforeClass(alwaysRun = true)
    protected void setupRequiredApis() {
       catalogApi = adminContext.getApi().getCatalogApi();
-      orgRef = Iterables.getFirst(context.getApi().getOrgApi().getOrgList().getOrgs(), null).toAdminReference(endpoint);
+      org = context.getApi().getOrgApi().get(Iterables.get(context.getApi().getOrgApi().list(), 0).getHref());
    }
-   
+
    @AfterClass(alwaysRun = true)
    protected void tidyUp() {
       if (catalog != null) {
          try {
-	         catalogApi.deleteCatalog(catalog.getHref());
+            catalogApi.remove(catalog.getId());
          } catch (Exception e) {
             logger.warn(e, "Error deleting admin catalog '%s'", catalog.getName());
          }
       }
    }
-   
+
    @Test(description = "POST /admin/org/{id}/catalogs")
-   public void testCreateCatalog() {
-      AdminCatalog newCatalog = AdminCatalog.builder()
-         .name(name("Test Catalog "))
-         .description("created by testCreateCatalog()")
-         .build();
-      catalog = catalogApi.createCatalog(orgRef.getHref(), newCatalog);
-      
+   public void testAddCatalog() {
+      AdminCatalog newCatalog = AdminCatalog.builder().name(name("Test Catalog "))
+               .description("created by testAddCatalog()").build();
+      catalog = catalogApi.addCatalogToOrg(newCatalog, org.getId());
+
       Checks.checkAdminCatalog(catalog);
-      
+
       // FIXME: documentation suggests we should wait for a task here
    }
 
-   @Test(description = "GET /admin/catalog/{id}", dependsOnMethods = { "testCreateCatalog" })
+   @Test(description = "GET /admin/catalog/{id}", dependsOnMethods = { "testAddCatalog" })
    public void testGetCatalog() {
-      catalog = catalogApi.getCatalog(catalog.getHref());
-      
+      catalog = catalogApi.get(catalog.getId());
+
       Checks.checkAdminCatalog(catalog);
    }
-   
+
    @Test(description = "GET /admin/catalog/{id}/owner", dependsOnMethods = { "testGetCatalog" })
    public void testGetCatalogOwner() {
-      owner = catalogApi.getOwner(catalog.getHref());
+      owner = catalogApi.getOwner(catalog.getId());
       Checks.checkOwner(owner);
    }
-   
+
    @Test(description = "PUT /admin/catalog/{id}/owner", dependsOnMethods = { "testGetCatalog" })
-   public void updateCatalogOwner() {
-      User newOwnerUser = randomTestUser("testUpdateCatalogOwner");
-      newOwnerUser = adminContext.getApi().getUserApi().createUser(orgRef.getHref(), newOwnerUser);
-      assertNotNull(newOwnerUser, "failed to create temp user to test updateCatalogOwner");
-      
+   public void editCatalogOwner() {
+      User newOwnerUser = randomTestUser("testEditCatalogOwner");
+      newOwnerUser = adminContext.getApi().getUserApi().addUserToOrg(newOwnerUser, org.getId());
+      assertNotNull(newOwnerUser, "failed to add temp user to test editCatalogOwner");
+
       Owner oldOwner = owner;
-      Owner newOwner = Owner.builder() 
-            .type("application/vnd.vmware.vcloud.owner+xml")
-            .user(Reference.builder().fromEntity(newOwnerUser).build())
-            .build();
-      
+      Owner newOwner = Owner.builder().type("application/vnd.vmware.vcloud.owner+xml")
+               .user(Reference.builder().fromEntity(newOwnerUser).build()).build();
+
       try {
-         catalogApi.setOwner(catalog.getHref(), newOwner);
-         owner = catalogApi.getOwner(catalog.getHref());
+         catalogApi.setOwner(catalog.getId(), newOwner);
+         owner = catalogApi.getOwner(catalog.getId());
          Checks.checkOwner(owner);
-         assertTrue(equal(owner.toBuilder().links(Collections.<Link>emptySet()).build(), 
-               newOwner.toBuilder().user(newOwner.getUser().toBuilder().id(null).build()).build()), 
-            String.format(OBJ_FIELD_UPDATABLE, CATALOG, "owner"));
+         assertTrue(
+                  equal(owner.toBuilder().links(Collections.<Link> emptySet()).build(),
+                           newOwner.toBuilder().user(newOwner.getUser()).build()),
+                  String.format(OBJ_FIELD_UPDATABLE, CATALOG, "owner"));
       } finally {
-         catalogApi.setOwner(catalog.getHref(), oldOwner);
-         owner = catalogApi.getOwner(catalog.getHref());
-         adminContext.getApi().getUserApi().deleteUser(newOwnerUser.getHref());
+         catalogApi.setOwner(catalog.getId(), oldOwner);
+         owner = catalogApi.getOwner(catalog.getId());
+         adminContext.getApi().getUserApi().remove(newOwnerUser.getHref());
       }
    }
-   
+
    @Test(description = "PUT /admin/catalog/{id}", dependsOnMethods = { "testGetCatalogOwner" })
-   public void testUpdateCatalog() {
+   public void testEditCatalog() {
       String oldName = catalog.getName();
-      String newName = "new "+oldName;
+      String newName = "new " + oldName;
       String oldDescription = catalog.getDescription();
-      String newDescription = "new "+oldDescription;
-      // TODO: can we update/manage catalogItems directly like this? or does it just do a merge (like metadata)
-//      CatalogItems oldCatalogItems = catalog.getCatalogItems();
-//      CatalogItems newCatalogItems = CatalogItems.builder().build();
-      
+      String newDescription = "new " + oldDescription;
+      // TODO: can we edit/manage catalogItems directly like this? or does it just do a merge
+      // (like metadata)
+      // CatalogItems oldCatalogItems = catalog.getCatalogItems();
+      // CatalogItems newCatalogItems = CatalogItems.builder().build();
+
       try {
-         catalog = catalog.toBuilder()
-               .name(newName)
-               .description(newDescription)
-//               .catalogItems(newCatalogItems)
-               .build();
-         
-         catalog = catalogApi.updateCatalog(catalog.getHref(), catalog);
-         
+         catalog = catalog.toBuilder().name(newName).description(newDescription)
+         // .catalogItems(newCatalogItems)
+                  .build();
+
+         catalog = catalogApi.edit(catalog.getId(), catalog);
+
          assertTrue(equal(catalog.getName(), newName), String.format(OBJ_FIELD_UPDATABLE, CATALOG, "name"));
          assertTrue(equal(catalog.getDescription(), newDescription),
-               String.format(OBJ_FIELD_UPDATABLE, CATALOG, "description"));
-//         assertTrue(equal(catalog.getCatalogItems(), newCatalogItems), String.format(OBJ_FIELD_UPDATABLE, CATALOG, "catalogItems"));
-         
-         //TODO negative tests?
-         
+                  String.format(OBJ_FIELD_UPDATABLE, CATALOG, "description"));
+         // assertTrue(equal(catalog.getCatalogItems(), newCatalogItems),
+         // String.format(OBJ_FIELD_UPDATABLE, CATALOG, "catalogItems"));
+
+         // TODO negative tests?
+
          Checks.checkAdminCatalog(catalog);
       } finally {
-         catalog = catalog.toBuilder()
-               .name(oldName)
-               .description(oldDescription)
-//               .catalogItems(oldCatalogItems)
-               .build();
-         
-         catalog = catalogApi.updateCatalog(catalog.getHref(), catalog);
+         catalog = catalog.toBuilder().name(oldName).description(oldDescription)
+         // .catalogItems(oldCatalogItems)
+                  .build();
+
+         catalog = catalogApi.edit(catalog.getId(), catalog);
       }
    }
-   
+
    // FIXME fails with a 403
-   @Test(description = "POST /admin/catalog/{id}/action/publish", dependsOnMethods = { "testUpdateCatalog" } )
+   @Test(description = "POST /admin/catalog/{id}/action/publish", dependsOnMethods = { "testEditCatalog" })
    public void testPublishCatalog() {
       assertNotNull(catalog, String.format(NOT_NULL_OBJ_FMT, "Catalog"));
-      assertTrue(!catalog.isPublished(), String.format(OBJ_FIELD_EQ, 
-            CATALOG, "isPublished", false, catalog.isPublished()));
-      
-      PublishCatalogParams params = PublishCatalogParams.builder()
-         .isPublished(true)
-         .build();
-      
-      catalogApi.publishCatalog(catalog.getHref(), params);
-      catalog = catalogApi.getCatalog(catalog.getHref());
-      
-      assertTrue(catalog.isPublished(), String.format(OBJ_FIELD_EQ, 
-            CATALOG, "isPublished", true, catalog.isPublished()));
+      assertTrue(!catalog.isPublished(),
+               String.format(OBJ_FIELD_EQ, CATALOG, "isPublished", false, catalog.isPublished()));
+
+      PublishCatalogParams params = PublishCatalogParams.builder().isPublished(true).build();
+
+      catalogApi.publish(catalog.getId(), params);
+      catalog = catalogApi.get(catalog.getId());
+
+      assertTrue(catalog.isPublished(),
+               String.format(OBJ_FIELD_EQ, CATALOG, "isPublished", true, catalog.isPublished()));
+   }
+
+   @Test(description = "GET /org/{id}/catalog/{catalogId}/controlAccess", dependsOnMethods = { "testAddCatalog" })
+   public void testGetControlAccessControl() {
+      // Call the method being tested
+      ControlAccessParams params = catalogApi.getAccessControl(catalog.getId());
+
+      // Check params are well formed
+      checkControlAccessParams(params);
+   }
+
+   @Test(description = "POST /org/{id}/catalog/{catalogId}/action/controlAccess", dependsOnMethods = { "testAddCatalog" })
+   public void testEditAccessControl() {
+      // Setup params
+      ControlAccessParams params = catalogApi.getAccessControl(catalog.getId());
+
+      // Call the method being tested
+      ControlAccessParams modified = catalogApi.editAccessControl(catalog.getId(), params);
+
+      // Check params are well formed
+      checkControlAccessParams(modified);
    }
    
-   @Test(description = "DELETE /admin/catalog/{id}", dependsOnMethods = { "testCreateCatalog" } )
-   public void testDeleteCatalog() {
-//      assertEquals(catalog.getCatalogItems().getCatalogItems().size(), 0, 
-//            String.format(OBJ_FIELD_EMPTY_TO_DELETE, "Catalog", "CatalogItems", 
-//                  catalog.getCatalogItems().getCatalogItems().toString()));
-      AdminCatalog deleteCatalog = AdminCatalog.builder()
-            .name(name("Test Catalog "))
-            .description("created by testCreateCatalog()")
-            .build();
-      deleteCatalog = catalogApi.createCatalog(orgRef.getHref(), deleteCatalog);
-      catalogApi.deleteCatalog(deleteCatalog.getHref());
-      
-      deleteCatalog = catalogApi.getCatalog(deleteCatalog.getHref());
-      assertNull(deleteCatalog, String.format(OBJ_DEL, CATALOG, deleteCatalog != null ? deleteCatalog.toString() : ""));
+   @Test(description = "DELETE /admin/catalog/{id}", dependsOnMethods = { "testAddCatalog" })
+   public void testRemoveCatalog() {
+      // assertEquals(catalog.getCatalogItems().getCatalogItems().size(), 0,
+      // String.format(OBJ_FIELD_EMPTY_TO_DELETE, "Catalog", "CatalogItems",
+      // catalog.getCatalogItems().getCatalogItems().toString()));
+      AdminCatalog removeCatalog = AdminCatalog.builder().name(name("Test Catalog "))
+               .description("created by testAddCatalog()").build();
+      removeCatalog = catalogApi.addCatalogToOrg(removeCatalog, org.getId());
+      catalogApi.remove(removeCatalog.getId());
+
+      removeCatalog = catalogApi.get(removeCatalog.getId());
+      assertNull(removeCatalog, String.format(OBJ_DEL, CATALOG, removeCatalog != null ? removeCatalog.toString() : ""));
    }
+   
+
 }
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminNetworkApiExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminNetworkApiExpectTest.java
index a030f08..c5af84b 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminNetworkApiExpectTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminNetworkApiExpectTest.java
@@ -18,133 +18,237 @@
  */
 package org.jclouds.vcloud.director.v1_5.features.admin;
 
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ADMIN_NETWORK;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ENTITY;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.NETWORK;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ORG;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ORG_NETWORK;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.TASK;
 import static org.testng.Assert.assertEquals;
 
 import java.net.URI;
 
-import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
 import org.jclouds.vcloud.director.v1_5.admin.VCloudDirectorAdminApi;
 import org.jclouds.vcloud.director.v1_5.domain.Link;
 import org.jclouds.vcloud.director.v1_5.domain.Reference;
 import org.jclouds.vcloud.director.v1_5.domain.Task;
+import org.jclouds.vcloud.director.v1_5.domain.network.DhcpService;
+import org.jclouds.vcloud.director.v1_5.domain.network.IpAddresses;
+import org.jclouds.vcloud.director.v1_5.domain.network.IpRange;
+import org.jclouds.vcloud.director.v1_5.domain.network.IpRanges;
+import org.jclouds.vcloud.director.v1_5.domain.network.IpScope;
+import org.jclouds.vcloud.director.v1_5.domain.network.Network.FenceMode;
+import org.jclouds.vcloud.director.v1_5.domain.network.NetworkConfiguration;
+import org.jclouds.vcloud.director.v1_5.domain.network.NetworkFeatures;
+import org.jclouds.vcloud.director.v1_5.domain.network.SyslogServerSettings;
 import org.jclouds.vcloud.director.v1_5.domain.org.OrgNetwork;
-import org.jclouds.vcloud.director.v1_5.features.NetworkApiExpectTest;
 import org.jclouds.vcloud.director.v1_5.internal.VCloudDirectorAdminApiExpectTest;
 import org.testng.annotations.Test;
 
-import com.google.common.collect.ImmutableSet;
+import com.google.common.net.HttpHeaders;
 
 /**
  * Test the {@link AdminNetworkApi} by observing its side effects.
  * 
- * @author danikov
+ * @author danikov, Adrian Cole
  */
 @Test(groups = { "unit", "admin" }, singleThreaded = true, testName = "AdminNetworkApiExpectTest")
 public class AdminNetworkApiExpectTest extends VCloudDirectorAdminApiExpectTest {
+
+   static String network = "55a677cf-ab3f-48ae-b880-fab90421980c";
+   static String networkUrn = "urn:vcloud:network:" + network;
+   static URI networkHref = URI.create(endpoint + "/network/" + network);
+   static URI networkAdminHref = URI.create(endpoint + "/admin/network/" + network);
    
-   Reference networkRef = Reference.builder()
-      .href(URI.create(endpoint+"/admin/network/b466c0c5-8a5c-4335-b703-a2e2e6b5f3e1"))
-      .build();
+   HttpRequest get = HttpRequest.builder()
+            .method("GET")
+            .endpoint(networkAdminHref)
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+            .build();
+
+    HttpResponse getResponse = HttpResponse.builder()
+            .statusCode(200)
+            .payload(payloadFromResourceWithContentType("/network/network.xml", ORG + ";version=1.5"))
+            .build();
+    
+   @Test
+   public void testGetNetworkHref() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, get, getResponse);
+      assertEquals(api.getNetworkApi().get(networkAdminHref), network());
+   }
+   
+   HttpRequest resolveNetwork = HttpRequest.builder()
+            .method("GET")
+            .endpoint(endpoint + "/entity/" + networkUrn)
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+            .build();
+   
+   String networkEntity = asString(createXMLBuilder("Entity").a("xmlns", "http://www.vmware.com/vcloud/v1.5")
+                                                             .a("name", networkUrn)
+                                                             .a("id", networkUrn)
+                                                             .a("type", ENTITY)
+                                                             .a("href", endpoint + "/entity/" + networkUrn)
+                                  .e("Link").a("rel", "alternate").a("type", NETWORK).a("href", networkHref.toString()).up()
+                                  .e("Link").a("rel", "alternate").a("type", ADMIN_NETWORK).a("href", networkAdminHref.toString()).up());
+   
+   HttpResponse resolveNetworkResponse = HttpResponse.builder()
+           .statusCode(200)
+           .payload(payloadFromStringWithContentType(networkEntity, ENTITY + ";version=1.5"))
+           .build();
    
    @Test
-   public void testGetNetworkWithOrgNetwork() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("GET", "/admin/network/b466c0c5-8a5c-4335-b703-a2e2e6b5f3e1")
-            .acceptAnyMedia()
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/network/admin/orgNetwork.xml", VCloudDirectorMediaType.ORG_NETWORK)
-            .httpResponseBuilder().build());
+   public void testGetNetworkUrn() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, resolveNetwork, resolveNetworkResponse, get, getResponse);
+      assertEquals(api.getNetworkApi().get(networkUrn), network());
+   }
+   
+   HttpRequest edit = HttpRequest.builder()
+            .method("PUT")
+            .endpoint(networkAdminHref )
+            .addHeader("Accept", TASK)
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+            .payload(payloadFromResourceWithContentType("/network/admin/editNetworkSource.xml", ORG_NETWORK))
+            .build();
 
-      OrgNetwork expected = orgNetwork();
+   HttpResponse editResponse = HttpResponse.builder()
+            .statusCode(200)
+            .payload(payloadFromResourceWithContentType("/network/admin/editNetworkTask.xml", TASK))
+            .build();
 
-      assertEquals(api.getNetworkApi().getNetwork(networkRef.getHref()), expected);
+   @Test
+   public void testEditNetworkHref() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, edit, editResponse);
+      assertEquals(api.getNetworkApi().edit(networkAdminHref, editNetwork()), editNetworkTask());
    }
    
    @Test
-   public void testUpdateNetwork() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("PUT", "/admin/network/b466c0c5-8a5c-4335-b703-a2e2e6b5f3e1")
-            .xmlFilePayload("/network/admin/updateNetworkSource.xml", VCloudDirectorMediaType.ORG_NETWORK)
-            .acceptMedia(VCloudDirectorMediaType.TASK)
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/network/admin/updateNetworkTask.xml", VCloudDirectorMediaType.TASK)
-            .httpResponseBuilder().build());
-
-      Task expected = updateNetworkTask();
-
-      assertEquals(api.getNetworkApi().updateNetwork(networkRef.getHref(), updateNetwork()), expected);
+   public void testEditNetworkUrn() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, resolveNetwork, resolveNetworkResponse, edit, editResponse);
+      assertEquals(api.getNetworkApi().edit(networkUrn, editNetwork()), editNetworkTask());
    }
    
-   @Test(enabled = false)
-   public void testResetNetwork() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("POST", "/admin/network/b466c0c5-8a5c-4335-b703-a2e2e6b5f3e1/action/reset")
-            .acceptMedia(VCloudDirectorMediaType.TASK)
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/network/admin/resetNetworkTask.xml", VCloudDirectorMediaType.TASK)
-            .httpResponseBuilder().build());
+   HttpRequest reset = HttpRequest.builder()
+            .method("POST")
+            .endpoint(networkAdminHref + "/action/reset")
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+            .build();
 
-      Task expected = resetNetworkTask();
+   HttpResponse resetResponse = HttpResponse.builder()
+            .statusCode(200)
+            .payload(payloadFromResourceWithContentType("/network/admin/resetNetworkTask.xml", TASK))
+            .build();
 
-      assertEquals(api.getNetworkApi().resetNetwork(networkRef.getHref()), expected);
+   @Test
+   public void testResetNetworkHref() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, reset, resetResponse);
+      assertEquals(api.getNetworkApi().reset(networkAdminHref), resetNetworkTask());
    }
    
-   public final OrgNetwork orgNetwork() {
-      return NetworkApiExpectTest.orgNetwork().toBuilder()
-         .href(toAdminUri(NetworkApiExpectTest.orgNetwork().getHref()))
-         .links(ImmutableSet.of(
-            Link.builder()
-               .rel("alternate")
-               .type("application/vnd.vmware.vcloud.orgNetwork+xml")
-               .href(URI.create("https://vcloudbeta.bluelock.com/api/network/f3ba8256-6f48-4512-aad6-600e85b4dc38"))
-               .build(),
-            Link.builder()
-               .rel("edit")
-               .type("application/vnd.vmware.admin.orgNetwork+xml")
-               .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/network/f3ba8256-6f48-4512-aad6-600e85b4dc38"))
-               .build(),
-            Link.builder()
-               .rel("up")
-               .type("application/vnd.vmware.admin.organization+xml")
-               .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
-               .build(),
-            Link.builder()
-               .rel("repair")
-               .type("application/vnd.vmware.admin.orgNetwork+xml")
-               .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/network/f3ba8256-6f48-4512-aad6-600e85b4dc38/action/reset"))
-               .build(),
-            Link.builder()
-               .rel("down")
-               .type("application/vnd.vmware.vcloud.metadata+xml")
-               .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/network/f3ba8256-6f48-4512-aad6-600e85b4dc38/metadata"))
-               .build()))
-         .networkPool(Reference.builder()
-            .type("application/vnd.vmware.admin.networkPool+xml")
-            .name("vcdni01")
-            .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/extension/networkPool/e86bfdb5-b3e0-4ece-9125-e764ac64c95c"))
+   @Test
+   public void testResetNetworkUrn() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, resolveNetwork, resolveNetworkResponse, reset, resetResponse);
+      assertEquals(api.getNetworkApi().reset(networkUrn), resetNetworkTask());
+   }
+   
+   public static OrgNetwork network() {
+      return OrgNetwork.builder()
+         .name("ilsolation01-Jclouds")
+         .id("urn:vcloud:network:f3ba8256-6f48-4512-aad6-600e85b4dc38")
+         .type("application/vnd.vmware.vcloud.orgNetwork+xml")
+         .href(URI.create("https://vcloudbeta.bluelock.com/api/network/f3ba8256-6f48-4512-aad6-600e85b4dc38"))
+         .link(Link.builder()
+            .rel("up")
+            .type("application/vnd.vmware.vcloud.org+xml")
+            .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
             .build())
+         .link(Link.builder()
+            .rel("down")
+            .type("application/vnd.vmware.vcloud.metadata+xml")
+            .href(URI.create("https://vcloudbeta.bluelock.com/api/network/f3ba8256-6f48-4512-aad6-600e85b4dc38/metadata"))
+            .build())
+         .description("")
+         .configuration(NetworkConfiguration.builder()
+            .ipScope(IpScope.builder()
+               .isInherited(false)
+               .gateway("192.168.1.1")
+               .netmask("255.255.255.0")
+               .dns1("173.240.111.52")
+               .dns2("173.240.111.53")
+               .ipRanges(IpRanges.builder()
+                     .ipRange(IpRange.builder()
+                           .startAddress("192.168.1.100")
+                           .endAddress("192.168.1.199")
+                           .build())
+                     .build())
+               .build())
+            .fenceMode(FenceMode.ISOLATED)
+            .retainNetInfoAcrossDeployments(false)
+            .features(NetworkFeatures.builder()
+               .service(DhcpService.builder()
+                  .enabled(false)
+                  .defaultLeaseTime(3600)
+                  .maxLeaseTime(7200)
+                  .ipRange(IpRange.builder()
+                     .startAddress("192.168.1.2")
+                     .endAddress("192.168.1.99")
+                     .build())
+                  .build())
+               .build())
+            .syslogServerSettings(SyslogServerSettings.builder().build())
+            .build())
+         .allowedExternalIpAddresses(IpAddresses.builder().build())
          .build();
    }
    
-   public final OrgNetwork updateNetwork() {
-      return orgNetwork().toBuilder()
+   public final OrgNetwork editNetwork() {
+      return network().toBuilder()
             
          .build();
    }
    
    public final Task resetNetworkTask() {
       return Task.builder()
-            
-         .build();
+               .status("running")
+               .startTime(dateService.iso8601DateParse("2012-03-14T12:39:23.720-04:00"))
+               .operationName("networkResetNetwork")
+               .operation("Resetting Network ilsolation01-Jclouds(f3ba8256-6f48-4512-aad6-600e85b4dc38)")
+               .expiryTime(dateService.iso8601DateParse("2012-06-12T12:39:23.720-04:00"))
+               .name("task")
+               .id("urn:vcloud:task:49d2e180-7921-4902-ac39-b4ff5406bb94")
+               .type("application/vnd.vmware.vcloud.task+xml")
+               .href(URI.create("https://vcloudbeta.bluelock.com/api/task/49d2e180-7921-4902-ac39-b4ff5406bb94"))
+               .link(Link.builder()
+                  .rel("task:cancel")
+                  .href(URI.create("https://vcloudbeta.bluelock.com/api/task/49d2e180-7921-4902-ac39-b4ff5406bb94/action/cancel"))
+                  .build())
+               .owner(Reference.builder()
+                  .type("application/vnd.vmware.vcloud.network+xml")
+                  .name("ilsolation01-Jclouds")
+                  .href(URI.create("https://vcloudbeta.bluelock.com/api/network/f3ba8256-6f48-4512-aad6-600e85b4dc38"))
+                  .build())
+               .user(Reference.builder()
+                  .type("application/vnd.vmware.admin.user+xml")
+                  .name("dan@cloudsoftcorp.com")
+                  .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/user/ae75edd2-12de-414c-8e85-e6ea10442c08"))
+                  .build())
+               .org(Reference.builder()
+                  .type("application/vnd.vmware.vcloud.org+xml")
+                  .name("JClouds")
+                  .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
+                  .build())
+               .build();
    }
    
-   public final Task updateNetworkTask() {
+   public final Task editNetworkTask() {
       return Task.builder()
          .status("running")
          .startTime(dateService.iso8601DateParse("2012-03-14T12:39:23.720-04:00"))
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminNetworkApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminNetworkApiLiveTest.java
index eebbaf4..8c23d1b 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminNetworkApiLiveTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminNetworkApiLiveTest.java
@@ -20,18 +20,15 @@
 
 import static com.google.common.base.Objects.equal;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_UPDATABLE;
-import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_REQ_LIVE;
-import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.REF_REQ_LIVE;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.REQUIRED_VALUE_OBJECT_FMT;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.TASK_COMPLETE_TIMELY;
-import static org.testng.Assert.assertNotNull;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.URN_REQ_LIVE;
 import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
 
 import java.util.Collections;
 
 import org.jclouds.vcloud.director.v1_5.domain.Checks;
-import org.jclouds.vcloud.director.v1_5.domain.Reference;
 import org.jclouds.vcloud.director.v1_5.domain.Task;
 import org.jclouds.vcloud.director.v1_5.domain.network.ExternalNetwork;
 import org.jclouds.vcloud.director.v1_5.domain.network.IpScope;
@@ -60,24 +57,19 @@
     */
    private AdminNetworkApi networkApi;
 
-   /*
-    * Shared state between dependant tests.
-    */
-   Reference networkRef;
-   Network network;
+   private Network network;
    
    @Override
    @BeforeClass(alwaysRun = true)
    protected void setupRequiredApis() {
       networkApi = adminContext.getApi().getNetworkApi();
-      networkRef = Reference.builder().href(networkURI).build().toAdminReference(endpoint);
    }
    
    @Test(description = "GET /admin/network/{id}")
    public void testGetNetwork() {
       //TODO: test both org and external networks
-      assertNotNull(networkRef, String.format(OBJ_REQ_LIVE, NETWORK));
-      network = networkApi.getNetwork(networkRef.getHref());
+      network =  lazyGetNetwork();
+
       
       if(network instanceof ExternalNetwork) {
          Checks.checkExternalNetwork(Network.<ExternalNetwork>toSubType(network));
@@ -91,69 +83,69 @@
    
    // TODO: this test is far from exhaustive
    @Test(description = "PUT /admin/network/{id}" )
-   public void testUpdateNetwork() {
+   public void testEditNetwork() {
       //TODO: ensure network instanceof OrgNetwork, may require queries
-      assertTrue(network instanceof OrgNetwork, String.format(REF_REQ_LIVE, "OrgNetwork"));
+      assertTrue(network instanceof OrgNetwork, String.format(URN_REQ_LIVE, "OrgNetwork"));
       
       OrgNetwork oldNetwork = Network.<OrgNetwork>toSubType(network)
             .toBuilder()
             .tasks(Collections.<Task>emptySet())
             .build();
       
-      OrgNetwork updateNetwork = getMutatedOrgNetwork(oldNetwork);
+      OrgNetwork editNetwork = getMutatedOrgNetwork(oldNetwork);
       
       try {
-         Task updateNetworkTask = networkApi.updateNetwork(network.getHref(), updateNetwork);
-         Checks.checkTask(updateNetworkTask);
-         assertTrue(retryTaskSuccess.apply(updateNetworkTask), String.format(TASK_COMPLETE_TIMELY, "updateNetworkTask"));
-         network = networkApi.getNetwork(network.getHref());
+         Task editNetworkTask = networkApi.edit(networkUrn, editNetwork);
+         Checks.checkTask(editNetworkTask);
+         assertTrue(retryTaskSuccess.apply(editNetworkTask), String.format(TASK_COMPLETE_TIMELY, "editNetworkTask"));
+         network = networkApi.get(networkUrn);
          
          Checks.checkOrgNetwork(Network.<OrgNetwork>toSubType(network));
          
          assertTrue(equal(network.getConfiguration().getIpScope(), 
-               updateNetwork.getConfiguration().getIpScope()), 
+               editNetwork.getConfiguration().getIpScope()), 
                String.format(OBJ_FIELD_UPDATABLE, NETWORK+".configuration", "ipScope"));
          assertTrue(equal(network.getConfiguration().getParentNetwork(), 
-               updateNetwork.getConfiguration().getParentNetwork()), 
+               editNetwork.getConfiguration().getParentNetwork()), 
                String.format(OBJ_FIELD_UPDATABLE, NETWORK+".configuration", "parentNetwork"));
          assertTrue(equal(network.getConfiguration().getFenceMode(), 
-               updateNetwork.getConfiguration().getFenceMode()), 
+               editNetwork.getConfiguration().getFenceMode()), 
                String.format(OBJ_FIELD_UPDATABLE, NETWORK+".configuration", "fenceMode"));
          assertTrue(equal(network.getConfiguration().retainNetInfoAcrossDeployments(), 
-               updateNetwork.getConfiguration().retainNetInfoAcrossDeployments()), 
+               editNetwork.getConfiguration().retainNetInfoAcrossDeployments()), 
                String.format(OBJ_FIELD_UPDATABLE, NETWORK+".configuration", "retainNetInfoAcrossDeployments"));
          assertTrue(equal(network.getConfiguration().getNetworkFeatures(), 
-               updateNetwork.getConfiguration().getNetworkFeatures()), 
+               editNetwork.getConfiguration().getNetworkFeatures()), 
                String.format(OBJ_FIELD_UPDATABLE, NETWORK+".configuration", "networkFeatures"));
          assertTrue(equal(network.getConfiguration().getSyslogServerSettings(), 
-               updateNetwork.getConfiguration().getSyslogServerSettings()), 
+               editNetwork.getConfiguration().getSyslogServerSettings()), 
                String.format(OBJ_FIELD_UPDATABLE, NETWORK+".configuration", "syslogServerSettings"));
          assertTrue(equal(network.getConfiguration().getRouterInfo(), 
-               updateNetwork.getConfiguration().getRouterInfo()), 
+               editNetwork.getConfiguration().getRouterInfo()), 
                String.format(OBJ_FIELD_UPDATABLE, NETWORK+".configuration", "routerInfo"));
          // FIXME: fails
 //      assertTrue(equal(Network.<OrgNetwork>toSubType(network).getNetworkPool(), 
-//            updateNetwork.getNetworkPool()), 
+//            editNetwork.getNetworkPool()), 
 //            String.format(OBJ_FIELD_UPDATABLE, NETWORK, "networkPool"));
          
 //      assertTrue(equal(Network.<OrgNetwork>toSubType(network).getAllowedExternalIpAddresses(), 
-//            updateNetwork.getAllowedExternalIpAddresses()), 
+//            editNetwork.getAllowedExternalIpAddresses()), 
 //            String.format(OBJ_FIELD_UPDATABLE, NETWORK, "allowedExternalIpAddresses"));
       } finally {
-         Task updateNetworkTask = networkApi.updateNetwork(network.getHref(), oldNetwork);
-         Checks.checkTask(updateNetworkTask);
-         assertTrue(retryTaskSuccess.apply(updateNetworkTask), String.format(TASK_COMPLETE_TIMELY, "updateNetworkTask"));
-         network = networkApi.getNetwork(network.getHref());
+         Task editNetworkTask = networkApi.edit(networkUrn, oldNetwork);
+         Checks.checkTask(editNetworkTask);
+         assertTrue(retryTaskSuccess.apply(editNetworkTask), String.format(TASK_COMPLETE_TIMELY, "editNetworkTask"));
+         network = networkApi.get(networkUrn);
       }
    }
    
    @Test(description = "POST /admin/network/{id}/action/reset")
    public void testResetNetwork() { 
       // TODO assert that network is deployed somehow
-      Task resetNetworkTask = networkApi.resetNetwork(networkRef.getHref());
+      Task resetNetworkTask = networkApi.reset(networkUrn);
       Checks.checkTask(resetNetworkTask);
       assertTrue(retryTaskSuccess.apply(resetNetworkTask), String.format(TASK_COMPLETE_TIMELY, "resetNetworkTask"));
-      network = networkApi.getNetwork(network.getHref());
+      network = networkApi.get(networkUrn);
       
       Checks.checkOrgNetwork(Network.<OrgNetwork>toSubType(network));
       // TODO: other assertions about the reset? that network is deployed when task is complete, for example
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminOrgApiExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminOrgApiExpectTest.java
index 4032e6e..28dee0a 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminOrgApiExpectTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminOrgApiExpectTest.java
@@ -39,234 +39,250 @@
 import org.testng.annotations.Test;
 
 /**
- * Test the {@link AdminOrgApi} by observing its side effects.
+ * Test the {@link AdminOrgApi} by observing its side effects. TODO: this needs to be rewritten to
+ * test both URN and href access
  * 
  * @author danikov
  */
 @Test(groups = { "unit", "user" }, singleThreaded = true, testName = "AdminOrgApiExpectTest")
 public class AdminOrgApiExpectTest extends VCloudDirectorAdminApiExpectTest {
-   
+
    private Reference orgRef = Reference.builder()
-         .href(URI.create(endpoint + "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
-         .build();
-   
+            .href(URI.create(endpoint + "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0")).build();
+
    @Test
    public void testGetOrg() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("GET", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0")
-            .acceptAnyMedia()
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/org/admin/org.xml", 
-                  VCloudDirectorMediaType.ADMIN_ORG)
-            .httpResponseBuilder().build());
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, new VcloudHttpRequestPrimer()
+               .apiCommand("GET", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0").acceptAnyMedia()
+               .httpRequestBuilder().build(),
+               new VcloudHttpResponsePrimer().xmlFilePayload("/org/admin/org.xml", VCloudDirectorMediaType.ADMIN_ORG)
+                        .httpResponseBuilder().build());
 
       AdminOrg expected = adminOrg();
 
-      assertEquals(api.getOrgApi().getOrg(orgRef.getHref()), expected);
+      assertEquals(api.getOrgApi().get(orgRef.getHref()), expected);
    }
-   
+
    public static final AdminOrg adminOrg() {
-      return AdminOrg.builder()
-         .name("JClouds")
-         .id("urn:vcloud:org:6f312e42-cd2b-488d-a2bb-97519cd57ed0")
-         .type("application/vnd.vmware.admin.organization+xml")
-         .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
-         .link(Link.builder()
-            .rel("down")
-            .type("application/vnd.vmware.vcloud.tasksList+xml")
-            .href(URI.create("https://vcloudbeta.bluelock.com/api/tasksList/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
-            .build())
-         .link(Link.builder()
-            .rel("down")
-            .type("application/vnd.vmware.vcloud.metadata+xml")
-            .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata"))
-            .build())
-         .link(Link.builder()
-            .rel("add")
-            .type("application/vnd.vmware.admin.catalog+xml")
-            .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/catalogs"))
-            .build())
-         .link(Link.builder()
-            .rel("add")
-            .type("application/vnd.vmware.admin.user+xml")
-            .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/users"))
-            .build())
-         .link(Link.builder()
-            .rel("add")
-            .type("application/vnd.vmware.admin.group+xml")
-            .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/groups"))
-            .build())
-         .link(Link.builder()
-            .rel("add")
-            .type("application/vnd.vmware.admin.orgNetwork+xml")
-            .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/networks"))
-            .build())
-         .link(Link.builder()
-            .rel("edit")
-            .type("application/vnd.vmware.admin.organization+xml")
-            .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
-            .build())
-         .link(Link.builder()
-            .rel("remove")
-            .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
-            .build())
-         .link(Link.builder()
-            .rel("alternate")
-            .type("application/vnd.vmware.vcloud.org+xml")
-            .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
-            .build())
-         .description("")
-         .fullName("JClouds")
-         .isEnabled(true)
-         .settings(settings())
-            .user(Reference.builder()
-               .type("application/vnd.vmware.admin.user+xml")
-               .name("adam.lowe@cloudsoftcorp.com")
-               .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/user/672ebb67-d8ff-4201-9c1b-c1be869e526c"))
-               .build())
-            .user(Reference.builder()
-               .type("application/vnd.vmware.admin.user+xml")
-               .name("adrian@jclouds.org")
-               .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/user/8c360b93-ed25-4c9a-8e24-d48cd9966d93"))
-               .build())
-            .user(Reference.builder()
-               .type("application/vnd.vmware.admin.user+xml")
-               .name("qunying.huang@enstratus.com")
-               .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/user/967d317c-4273-4a95-b8a4-bf63b78e9c69"))
-               .build())
-            .user(Reference.builder()
-               .type("application/vnd.vmware.admin.user+xml")
-               .name("dan@cloudsoftcorp.com")
-               .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/user/ae75edd2-12de-414c-8e85-e6ea10442c08"))
-               .build())
-            .user(Reference.builder()
-               .type("application/vnd.vmware.admin.user+xml")
-               .name("adk@cloudsoftcorp.com")
-               .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/user/e9eb1b29-0404-4c5e-8ef7-e584acc51da9"))
-               .build())
-            .catalog(Reference.builder()
-               .type("application/vnd.vmware.admin.catalog+xml")
-               .name("QunyingTestCatalog")
-               .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4"))
-               .build())
-            .catalog(Reference.builder()
-               .type("application/vnd.vmware.admin.catalog+xml")
-               .name("Public")
-               .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/catalog/9e08c2f6-077a-42ce-bece-d5332e2ebb5c"))
-               .build())
-            .catalog(Reference.builder()
-               .type("application/vnd.vmware.admin.catalog+xml")
-               .name("dantest")
-               .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/catalog/b542aff4-9f97-4f51-a126-4330fbf62f02"))
-               .build())
-            .catalog(Reference.builder()
-               .type("application/vnd.vmware.admin.catalog+xml")
-               .name("test")
-               .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/catalog/b7289d54-4ca4-497f-9a93-2d4afc97e3da"))
-               .build())
-            .vdc(Reference.builder()
-               .type("application/vnd.vmware.vcloud.vdc+xml")
-               .name("Cluster01-JClouds")
-               .href(URI.create("https://vcloudbeta.bluelock.com/api/vdc/d16d333b-e3c0-4176-845d-a5ee6392df07"))
-               .build())
-            .network(Reference.builder()
-               .type("application/vnd.vmware.admin.network+xml")
-               .name("ilsolation01-Jclouds")
-               .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/network/f3ba8256-6f48-4512-aad6-600e85b4dc38"))
-               .build())
-            .network(Reference.builder()
-               .type("application/vnd.vmware.admin.network+xml")
-               .name("internet01-Jclouds")
-               .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/network/55a677cf-ab3f-48ae-b880-fab90421980c"))
-               .build())
-         .build();
+      return AdminOrg
+               .builder()
+               .name("JClouds")
+               .id("urn:vcloud:org:6f312e42-cd2b-488d-a2bb-97519cd57ed0")
+               .type("application/vnd.vmware.admin.organization+xml")
+               .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
+               .link(Link
+                        .builder()
+                        .rel("down")
+                        .type("application/vnd.vmware.vcloud.tasksList+xml")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/tasksList/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
+                        .build())
+               .link(Link
+                        .builder()
+                        .rel("down")
+                        .type("application/vnd.vmware.vcloud.metadata+xml")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/metadata"))
+                        .build())
+               .link(Link
+                        .builder()
+                        .rel("add")
+                        .type("application/vnd.vmware.admin.catalog+xml")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/catalogs"))
+                        .build())
+               .link(Link
+                        .builder()
+                        .rel("add")
+                        .type("application/vnd.vmware.admin.user+xml")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/users"))
+                        .build())
+               .link(Link
+                        .builder()
+                        .rel("add")
+                        .type("application/vnd.vmware.admin.group+xml")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/groups"))
+                        .build())
+               .link(Link
+                        .builder()
+                        .rel("add")
+                        .type("application/vnd.vmware.admin.orgNetwork+xml")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/networks"))
+                        .build())
+               .link(Link
+                        .builder()
+                        .rel("edit")
+                        .type("application/vnd.vmware.admin.organization+xml")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
+                        .build())
+               .link(Link
+                        .builder()
+                        .rel("remove")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
+                        .build())
+               .link(Link
+                        .builder()
+                        .rel("alternate")
+                        .type("application/vnd.vmware.vcloud.org+xml")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
+                        .build())
+               .description("")
+               .fullName("JClouds")
+               .isEnabled(true)
+               .settings(settings())
+               .user(Reference
+                        .builder()
+                        .type("application/vnd.vmware.admin.user+xml")
+                        .name("adam.lowe@cloudsoftcorp.com")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/user/672ebb67-d8ff-4201-9c1b-c1be869e526c"))
+                        .build())
+               .user(Reference
+                        .builder()
+                        .type("application/vnd.vmware.admin.user+xml")
+                        .name("adrian@jclouds.org")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/user/8c360b93-ed25-4c9a-8e24-d48cd9966d93"))
+                        .build())
+               .user(Reference
+                        .builder()
+                        .type("application/vnd.vmware.admin.user+xml")
+                        .name("qunying.huang@enstratus.com")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/user/967d317c-4273-4a95-b8a4-bf63b78e9c69"))
+                        .build())
+               .user(Reference
+                        .builder()
+                        .type("application/vnd.vmware.admin.user+xml")
+                        .name("dan@cloudsoftcorp.com")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/user/ae75edd2-12de-414c-8e85-e6ea10442c08"))
+                        .build())
+               .user(Reference
+                        .builder()
+                        .type("application/vnd.vmware.admin.user+xml")
+                        .name("adk@cloudsoftcorp.com")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/user/e9eb1b29-0404-4c5e-8ef7-e584acc51da9"))
+                        .build())
+               .catalog(Reference
+                        .builder()
+                        .type("application/vnd.vmware.admin.catalog+xml")
+                        .name("QunyingTestCatalog")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/catalog/7212e451-76e1-4631-b2de-ba1dfd8080e4"))
+                        .build())
+               .catalog(Reference
+                        .builder()
+                        .type("application/vnd.vmware.admin.catalog+xml")
+                        .name("Public")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/catalog/9e08c2f6-077a-42ce-bece-d5332e2ebb5c"))
+                        .build())
+               .catalog(Reference
+                        .builder()
+                        .type("application/vnd.vmware.admin.catalog+xml")
+                        .name("dantest")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/catalog/b542aff4-9f97-4f51-a126-4330fbf62f02"))
+                        .build())
+               .catalog(Reference
+                        .builder()
+                        .type("application/vnd.vmware.admin.catalog+xml")
+                        .name("test")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/catalog/b7289d54-4ca4-497f-9a93-2d4afc97e3da"))
+                        .build())
+               .vdc(Reference
+                        .builder()
+                        .type("application/vnd.vmware.vcloud.vdc+xml")
+                        .name("Cluster01-JClouds")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/vdc/d16d333b-e3c0-4176-845d-a5ee6392df07"))
+                        .build())
+               .network(Reference
+                        .builder()
+                        .type("application/vnd.vmware.admin.network+xml")
+                        .name("ilsolation01-Jclouds")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/network/f3ba8256-6f48-4512-aad6-600e85b4dc38"))
+                        .build())
+               .network(Reference
+                        .builder()
+                        .type("application/vnd.vmware.admin.network+xml")
+                        .name("internet01-Jclouds")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/network/55a677cf-ab3f-48ae-b880-fab90421980c"))
+                        .build()).build();
    }
-   
+
    @Test(enabled = false)
    public void testGetSettings() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("GET", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/")
-            .acceptAnyMedia()
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/org/admin/settings.xml", 
-                  VCloudDirectorMediaType.ORG_SETTINGS)
-            .httpResponseBuilder().build());
+      VCloudDirectorAdminApi api = requestsSendResponses(
+               loginRequest,
+               sessionResponse,
+               new VcloudHttpRequestPrimer()
+                        .apiCommand("GET", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/")
+                        .acceptAnyMedia().httpRequestBuilder().build(),
+               new VcloudHttpResponsePrimer()
+                        .xmlFilePayload("/org/admin/settings.xml", VCloudDirectorMediaType.ORG_SETTINGS)
+                        .httpResponseBuilder().build());
 
       OrgSettings expected = settings();
 
       assertEquals(api.getOrgApi().getSettings(orgRef.getHref()), expected);
    }
-   
+
    @Test(enabled = false)
-   public void testUpdateSettings() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("PUT", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/")
-            .xmlFilePayload("/org/admin/updateSettingsSource.xml", 
-                  VCloudDirectorMediaType.ORG_SETTINGS)
-            .acceptMedia(VCloudDirectorMediaType.ORG_SETTINGS)
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/org/admin/updateSettings.xml", 
-                  VCloudDirectorMediaType.ORG_SETTINGS)
-            .httpResponseBuilder().build());
+   public void testEditSettings() {
+      VCloudDirectorAdminApi api = requestsSendResponses(
+               loginRequest,
+               sessionResponse,
+               new VcloudHttpRequestPrimer()
+                        .apiCommand("PUT", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/")
+                        .xmlFilePayload("/org/admin/editSettingsSource.xml", VCloudDirectorMediaType.ORG_SETTINGS)
+                        .acceptMedia(VCloudDirectorMediaType.ORG_SETTINGS).httpRequestBuilder().build(),
+               new VcloudHttpResponsePrimer()
+                        .xmlFilePayload("/org/admin/editSettings.xml", VCloudDirectorMediaType.ORG_SETTINGS)
+                        .httpResponseBuilder().build());
 
-      OrgSettings expected = updateSettings();
+      OrgSettings expected = editSettings();
 
-      assertEquals(api.getOrgApi().updateSettings(orgRef.getHref(), expected), expected);
+      assertEquals(api.getOrgApi().editSettings(orgRef.getHref(), expected), expected);
    }
-   
+
    @Test
    public void testGetEmailSettings() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("GET", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/email")
-            .acceptAnyMedia()
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/org/admin/emailSettings.xml", 
-                  VCloudDirectorMediaType.ORG_GENERAL_SETTINGS)
-            .httpResponseBuilder().build());
+      VCloudDirectorAdminApi api = requestsSendResponses(
+               loginRequest,
+               sessionResponse,
+               new VcloudHttpRequestPrimer()
+                        .apiCommand("GET", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/email")
+                        .acceptAnyMedia().httpRequestBuilder().build(),
+               new VcloudHttpResponsePrimer()
+                        .xmlFilePayload("/org/admin/emailSettings.xml", VCloudDirectorMediaType.ORG_GENERAL_SETTINGS)
+                        .httpResponseBuilder().build());
 
       OrgEmailSettings expected = emailSettings();
 
       assertEquals(api.getOrgApi().getEmailSettings(orgRef.getHref()), expected);
    }
-   
+
    @Test
-   public void testUpdateEmailSettings() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("PUT", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/email")
-            .xmlFilePayload("/org/admin/updateEmailSettingsSource.xml", 
-                  VCloudDirectorMediaType.ORG_EMAIL_SETTINGS)
-            .acceptMedia(VCloudDirectorMediaType.ORG_EMAIL_SETTINGS)
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/org/admin/updateEmailSettings.xml", 
-                  VCloudDirectorMediaType.ORG_EMAIL_SETTINGS)
-            .httpResponseBuilder().build());
+   public void testEditEmailSettings() {
+      VCloudDirectorAdminApi api = requestsSendResponses(
+               loginRequest,
+               sessionResponse,
+               new VcloudHttpRequestPrimer()
+                        .apiCommand("PUT", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/email")
+                        .xmlFilePayload("/org/admin/editEmailSettingsSource.xml",
+                                 VCloudDirectorMediaType.ORG_EMAIL_SETTINGS)
+                        .acceptMedia(VCloudDirectorMediaType.ORG_EMAIL_SETTINGS).httpRequestBuilder().build(),
+               new VcloudHttpResponsePrimer()
+                        .xmlFilePayload("/org/admin/editEmailSettings.xml",
+                                 VCloudDirectorMediaType.ORG_EMAIL_SETTINGS).httpResponseBuilder().build());
 
-      OrgEmailSettings expected = updateEmailSettings();
+      OrgEmailSettings expected = editEmailSettings();
 
-      assertEquals(api.getOrgApi().updateEmailSettings(orgRef.getHref(), expected), expected);
+      assertEquals(api.getOrgApi().editEmailSettings(orgRef.getHref(), expected), expected);
    }
-   
+
    @Test(enabled = false)
    public void testGetGeneralSettings() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("GET", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/general")
-            .acceptAnyMedia()
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/org/admin/generalSettings.xml", 
-                  VCloudDirectorMediaType.ORG_GENERAL_SETTINGS)
-            .httpResponseBuilder().build());
+      VCloudDirectorAdminApi api = requestsSendResponses(
+               loginRequest,
+               sessionResponse,
+               new VcloudHttpRequestPrimer()
+                        .apiCommand("GET", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/general")
+                        .acceptAnyMedia().httpRequestBuilder().build(),
+               new VcloudHttpResponsePrimer()
+                        .xmlFilePayload("/org/admin/generalSettings.xml", VCloudDirectorMediaType.ORG_GENERAL_SETTINGS)
+                        .httpResponseBuilder().build());
 
       OrgGeneralSettings expected = generalSettings();
 
@@ -274,335 +290,329 @@
    }
 
    public static final OrgGeneralSettings generalSettings() {
-      return OrgGeneralSettings.builder()
-         .type("application/vnd.vmware.admin.organizationGeneralSettings+xml")
-         .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/general"))
-         .link(Link.builder()
-            .rel("edit")
-            .type("application/vnd.vmware.admin.organizationGeneralSettings+xml")
-            .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/general"))
-            .build())
-         .canPublishCatalogs(false)
-         .deployedVMQuota(0)
-         .storedVmQuota(0)
-         .useServerBootSequence(false)
-         .delayAfterPowerOnSeconds(0)
-         .build();
+      return OrgGeneralSettings
+               .builder()
+               .type("application/vnd.vmware.admin.organizationGeneralSettings+xml")
+               .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/general"))
+               .link(Link
+                        .builder()
+                        .rel("edit")
+                        .type("application/vnd.vmware.admin.organizationGeneralSettings+xml")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/general"))
+                        .build()).canPublishCatalogs(false).deployedVMQuota(0).storedVmQuota(0)
+               .useServerBootSequence(false).delayAfterPowerOnSeconds(0).build();
    }
-   
+
    @Test(enabled = false)
-   public void testUpdateGeneralSettings() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("PUT", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/general")
-            .xmlFilePayload("/org/admin/updateGeneralSettingsSource.xml", 
-                  VCloudDirectorMediaType.ORG_GENERAL_SETTINGS)
-            .acceptMedia(VCloudDirectorMediaType.ORG_GENERAL_SETTINGS)
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/org/admin/updateGeneralSettings.xml", 
-                  VCloudDirectorMediaType.ORG_GENERAL_SETTINGS)
-            .httpResponseBuilder().build());
+   public void testEditGeneralSettings() {
+      VCloudDirectorAdminApi api = requestsSendResponses(
+               loginRequest,
+               sessionResponse,
+               new VcloudHttpRequestPrimer()
+                        .apiCommand("PUT", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/general")
+                        .xmlFilePayload("/org/admin/editGeneralSettingsSource.xml",
+                                 VCloudDirectorMediaType.ORG_GENERAL_SETTINGS)
+                        .acceptMedia(VCloudDirectorMediaType.ORG_GENERAL_SETTINGS).httpRequestBuilder().build(),
+               new VcloudHttpResponsePrimer()
+                        .xmlFilePayload("/org/admin/editGeneralSettings.xml",
+                                 VCloudDirectorMediaType.ORG_GENERAL_SETTINGS).httpResponseBuilder().build());
 
-      OrgGeneralSettings expected = updateGeneralSettings();
+      OrgGeneralSettings expected = editGeneralSettings();
 
-      assertEquals(api.getOrgApi().updateGeneralSettings(orgRef.getHref(), expected), expected);
+      assertEquals(api.getOrgApi().editGeneralSettings(orgRef.getHref(), expected), expected);
    }
-   
-   public static final OrgGeneralSettings updateGeneralSettings() {
+
+   public static final OrgGeneralSettings editGeneralSettings() {
       return generalSettings().toBuilder()
-         
-         .build();
+
+      .build();
    }
- 
+
    @Test
    public void testGetLdapSettings() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("GET", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/ldap")
-            .acceptAnyMedia()
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/org/admin/ldapSettings.xml", 
-                  VCloudDirectorMediaType.ORG_LDAP_SETTINGS)
-            .httpResponseBuilder().build());
+      VCloudDirectorAdminApi api = requestsSendResponses(
+               loginRequest,
+               sessionResponse,
+               new VcloudHttpRequestPrimer()
+                        .apiCommand("GET", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/ldap")
+                        .acceptAnyMedia().httpRequestBuilder().build(),
+               new VcloudHttpResponsePrimer()
+                        .xmlFilePayload("/org/admin/ldapSettings.xml", VCloudDirectorMediaType.ORG_LDAP_SETTINGS)
+                        .httpResponseBuilder().build());
 
       OrgLdapSettings expected = ldapSettings();
 
       assertEquals(api.getOrgApi().getLdapSettings(orgRef.getHref()), expected);
    }
-   
+
    public static final OrgLdapSettings ldapSettings() {
-      return OrgLdapSettings.builder()
-         .type("application/vnd.vmware.admin.organizationLdapSettings+xml")
-         .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/ldap"))
-         .ldapMode("NONE")
-         .build();
+      return OrgLdapSettings
+               .builder()
+               .type("application/vnd.vmware.admin.organizationLdapSettings+xml")
+               .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/ldap"))
+               .ldapMode("NONE").build();
    }
- 
+
    @Test
    public void testGetPasswordPolicy() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("GET", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/passwordPolicy")
-            .acceptAnyMedia()
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/org/admin/passwordPolicy.xml", 
-                  VCloudDirectorMediaType.ORG_PASSWORD_POLICY_SETTINGS)
-            .httpResponseBuilder().build());
+      VCloudDirectorAdminApi api = requestsSendResponses(
+               loginRequest,
+               sessionResponse,
+               new VcloudHttpRequestPrimer()
+                        .apiCommand("GET", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/passwordPolicy")
+                        .acceptAnyMedia().httpRequestBuilder().build(),
+               new VcloudHttpResponsePrimer()
+                        .xmlFilePayload("/org/admin/passwordPolicy.xml",
+                                 VCloudDirectorMediaType.ORG_PASSWORD_POLICY_SETTINGS).httpResponseBuilder().build());
 
       OrgPasswordPolicySettings expected = passwordPolicy();
 
       assertEquals(api.getOrgApi().getPasswordPolicy(orgRef.getHref()), expected);
    }
-   
+
    public static final OrgPasswordPolicySettings passwordPolicy() {
-      return OrgPasswordPolicySettings.builder()
-         .type("application/vnd.vmware.admin.organizationPasswordPolicySettings+xml")
-         .link(Link.builder()
-               .rel("edit")
+      return OrgPasswordPolicySettings
+               .builder()
                .type("application/vnd.vmware.admin.organizationPasswordPolicySettings+xml")
+               .link(Link
+                        .builder()
+                        .rel("edit")
+                        .type("application/vnd.vmware.admin.organizationPasswordPolicySettings+xml")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/passwordPolicy"))
+                        .build())
                .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/passwordPolicy"))
-               .build())
-         .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/passwordPolicy"))
-         .accountLockoutEnabled(false)
-         .invalidLoginsBeforeLockout(5)
-         .accountLockoutIntervalMinutes(10)
-         .build();
+               .accountLockoutEnabled(false).invalidLoginsBeforeLockout(5).accountLockoutIntervalMinutes(10).build();
    }
-   
+
    @Test
-   public void testUpdatePasswordPolicy() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("PUT", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/passwordPolicy")
-            .xmlFilePayload("/org/admin/updatePasswordPolicySource.xml", 
-                  VCloudDirectorMediaType.ORG_PASSWORD_POLICY_SETTINGS)
-            .acceptMedia(VCloudDirectorMediaType.ORG_PASSWORD_POLICY_SETTINGS)
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/org/admin/updatePasswordPolicy.xml", 
-                  VCloudDirectorMediaType.ORG_PASSWORD_POLICY_SETTINGS)
-            .httpResponseBuilder().build());
+   public void testEditPasswordPolicy() {
+      VCloudDirectorAdminApi api = requestsSendResponses(
+               loginRequest,
+               sessionResponse,
+               new VcloudHttpRequestPrimer()
+                        .apiCommand("PUT", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/passwordPolicy")
+                        .xmlFilePayload("/org/admin/editPasswordPolicySource.xml",
+                                 VCloudDirectorMediaType.ORG_PASSWORD_POLICY_SETTINGS)
+                        .acceptMedia(VCloudDirectorMediaType.ORG_PASSWORD_POLICY_SETTINGS).httpRequestBuilder().build(),
+               new VcloudHttpResponsePrimer()
+                        .xmlFilePayload("/org/admin/editPasswordPolicy.xml",
+                                 VCloudDirectorMediaType.ORG_PASSWORD_POLICY_SETTINGS).httpResponseBuilder().build());
 
-      OrgPasswordPolicySettings expected = updateOrgPasswordPolicy();
+      OrgPasswordPolicySettings expected = editOrgPasswordPolicy();
 
-      assertEquals(api.getOrgApi().updatePasswordPolicy(orgRef.getHref(), expected), expected);
+      assertEquals(api.getOrgApi().editPasswordPolicy(orgRef.getHref(), expected), expected);
    }
-   
-   public static final OrgPasswordPolicySettings updateOrgPasswordPolicy() {
-      return passwordPolicy().toBuilder()
-         .accountLockoutEnabled(true)
-         .invalidLoginsBeforeLockout(6)
-         .accountLockoutIntervalMinutes(11)
-         .build();
+
+   public static final OrgPasswordPolicySettings editOrgPasswordPolicy() {
+      return passwordPolicy().toBuilder().accountLockoutEnabled(true).invalidLoginsBeforeLockout(6)
+               .accountLockoutIntervalMinutes(11).build();
    }
- 
+
    @Test(enabled = false)
    public void testGetVAppLeaseSettings() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("GET", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppLeaseSettings")
-            .acceptAnyMedia()
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/org/admin/vAppLeaseSettings.xml", 
-                  VCloudDirectorMediaType.ORG_LEASE_SETTINGS)
-            .httpResponseBuilder().build());
+      VCloudDirectorAdminApi api = requestsSendResponses(
+               loginRequest,
+               sessionResponse,
+               new VcloudHttpRequestPrimer()
+                        .apiCommand("GET", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppLeaseSettings")
+                        .acceptAnyMedia().httpRequestBuilder().build(),
+               new VcloudHttpResponsePrimer()
+                        .xmlFilePayload("/org/admin/vAppLeaseSettings.xml", VCloudDirectorMediaType.ORG_LEASE_SETTINGS)
+                        .httpResponseBuilder().build());
 
       OrgLeaseSettings expected = vAppLeaseSettings();
 
       assertEquals(api.getOrgApi().getVAppLeaseSettings(orgRef.getHref()), expected);
    }
-   
+
    public static final OrgLeaseSettings vAppLeaseSettings() {
-      return OrgLeaseSettings.builder()
-         .type("application/vnd.vmware.admin.vAppLeaseSettings+xml")
-         .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppLeaseSettings"))
-         .link(Link.builder()
-            .rel("edit")
-            .type("application/vnd.vmware.admin.vAppLeaseSettings+xml")
-            .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppLeaseSettings"))
-            .build())
-         .deleteOnStorageLeaseExpiration(false)
-         .deploymentLeaseSeconds(0)
-         .storageLeaseSeconds(0)
-         .build();
+      return OrgLeaseSettings
+               .builder()
+               .type("application/vnd.vmware.admin.vAppLeaseSettings+xml")
+               .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppLeaseSettings"))
+               .link(Link
+                        .builder()
+                        .rel("edit")
+                        .type("application/vnd.vmware.admin.vAppLeaseSettings+xml")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppLeaseSettings"))
+                        .build()).deleteOnStorageLeaseExpiration(false).deploymentLeaseSeconds(0)
+               .storageLeaseSeconds(0).build();
    }
-   
+
    @Test(enabled = false)
-   public void testUpdateOrgVAppLeaseSettings() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("PUT", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppLeaseSettings")
-            .xmlFilePayload("/org/admin/updateVAppLeaseSettingsSource.xml", 
-                  VCloudDirectorMediaType.ORG_LEASE_SETTINGS)
-            .acceptMedia(VCloudDirectorMediaType.ORG_LEASE_SETTINGS)
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/org/admin/updateVAppLeaseSettings.xml", 
-                  VCloudDirectorMediaType.ORG_LEASE_SETTINGS)
-            .httpResponseBuilder().build());
+   public void testEditOrgVAppLeaseSettings() {
+      VCloudDirectorAdminApi api = requestsSendResponses(
+               loginRequest,
+               sessionResponse,
+               new VcloudHttpRequestPrimer()
+                        .apiCommand("PUT", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppLeaseSettings")
+                        .xmlFilePayload("/org/admin/editVAppLeaseSettingsSource.xml",
+                                 VCloudDirectorMediaType.ORG_LEASE_SETTINGS)
+                        .acceptMedia(VCloudDirectorMediaType.ORG_LEASE_SETTINGS).httpRequestBuilder().build(),
+               new VcloudHttpResponsePrimer()
+                        .xmlFilePayload("/org/admin/editVAppLeaseSettings.xml",
+                                 VCloudDirectorMediaType.ORG_LEASE_SETTINGS).httpResponseBuilder().build());
 
-      OrgLeaseSettings expected = updateVAppLeaseSettings();
+      OrgLeaseSettings expected = editVAppLeaseSettings();
 
-      assertEquals(api.getOrgApi().updateVAppLeaseSettings(orgRef.getHref(), expected), expected);
+      assertEquals(api.getOrgApi().editVAppLeaseSettings(orgRef.getHref(), expected), expected);
    }
-   
-   public static final OrgLeaseSettings updateVAppLeaseSettings() {
+
+   public static final OrgLeaseSettings editVAppLeaseSettings() {
       return vAppLeaseSettings().toBuilder()
-         
-         .build();
+
+      .build();
    }
- 
+
    @Test(enabled = false)
    public void testGetVAppTemplateLeaseSettings() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("GET", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppTemplateLeaseSettings")
-            .acceptAnyMedia()
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/org/admin/vAppTemplateLeaseSettings.xml", 
-                  VCloudDirectorMediaType.ORG_VAPP_TEMPLATE_LEASE_SETTINGS)
-            .httpResponseBuilder().build());
+      VCloudDirectorAdminApi api = requestsSendResponses(
+               loginRequest,
+               sessionResponse,
+               new VcloudHttpRequestPrimer()
+                        .apiCommand("GET",
+                                 "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppTemplateLeaseSettings")
+                        .acceptAnyMedia().httpRequestBuilder().build(),
+               new VcloudHttpResponsePrimer()
+                        .xmlFilePayload("/org/admin/vAppTemplateLeaseSettings.xml",
+                                 VCloudDirectorMediaType.ORG_VAPP_TEMPLATE_LEASE_SETTINGS).httpResponseBuilder()
+                        .build());
 
       OrgVAppTemplateLeaseSettings expected = vAppTemplateLeaseSettings();
 
       assertEquals(api.getOrgApi().getVAppTemplateLeaseSettings(orgRef.getHref()), expected);
    }
-   
+
    public static final OrgVAppTemplateLeaseSettings vAppTemplateLeaseSettings() {
-      return OrgVAppTemplateLeaseSettings.builder()
-         .type("application/vnd.vmware.admin.vAppTemplateLeaseSettings+xml")
-         .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppTemplateLeaseSettings"))
-         .link(Link.builder()
-               .rel("edit")
+      return OrgVAppTemplateLeaseSettings
+               .builder()
                .type("application/vnd.vmware.admin.vAppTemplateLeaseSettings+xml")
                .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppTemplateLeaseSettings"))
-               .build())
-         .deleteOnStorageLeaseExpiration(false)
-         .storageLeaseSeconds(0)
-         .build();
+               .link(Link
+                        .builder()
+                        .rel("edit")
+                        .type("application/vnd.vmware.admin.vAppTemplateLeaseSettings+xml")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppTemplateLeaseSettings"))
+                        .build()).deleteOnStorageLeaseExpiration(false).storageLeaseSeconds(0).build();
    }
-   
+
    @Test(enabled = false)
-   public void testUpdateOrgVAppTemplateLeaseSettings() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("PUT", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppTemplateLeaseSettings")
-            .xmlFilePayload("/org/admin/updateVAppLeaseSettingsSource.xml", 
-                  VCloudDirectorMediaType.ORG_VAPP_TEMPLATE_LEASE_SETTINGS)
-            .acceptMedia(VCloudDirectorMediaType.ORG_VAPP_TEMPLATE_LEASE_SETTINGS)
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/org/admin/updateVAppLeaseSettings.xml", 
-                  VCloudDirectorMediaType.ORG_VAPP_TEMPLATE_LEASE_SETTINGS)
-            .httpResponseBuilder().build());
+   public void testEditOrgVAppTemplateLeaseSettings() {
+      VCloudDirectorAdminApi api = requestsSendResponses(
+               loginRequest,
+               sessionResponse,
+               new VcloudHttpRequestPrimer()
+                        .apiCommand("PUT",
+                                 "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppTemplateLeaseSettings")
+                        .xmlFilePayload("/org/admin/editVAppLeaseSettingsSource.xml",
+                                 VCloudDirectorMediaType.ORG_VAPP_TEMPLATE_LEASE_SETTINGS)
+                        .acceptMedia(VCloudDirectorMediaType.ORG_VAPP_TEMPLATE_LEASE_SETTINGS).httpRequestBuilder()
+                        .build(),
+               new VcloudHttpResponsePrimer()
+                        .xmlFilePayload("/org/admin/editVAppLeaseSettings.xml",
+                                 VCloudDirectorMediaType.ORG_VAPP_TEMPLATE_LEASE_SETTINGS).httpResponseBuilder()
+                        .build());
 
-      OrgVAppTemplateLeaseSettings expected = updateVAppTemplateLeaseSettings();
+      OrgVAppTemplateLeaseSettings expected = editVAppTemplateLeaseSettings();
 
-      assertEquals(api.getOrgApi().updateVAppTemplateLeaseSettings(orgRef.getHref(), expected), expected);
+      assertEquals(api.getOrgApi().editVAppTemplateLeaseSettings(orgRef.getHref(), expected), expected);
    }
-   
-   public static final OrgVAppTemplateLeaseSettings updateVAppTemplateLeaseSettings() {
+
+   public static final OrgVAppTemplateLeaseSettings editVAppTemplateLeaseSettings() {
       return vAppTemplateLeaseSettings().toBuilder()
-         
-         .build();
+
+      .build();
    }
-   
+
    public static final OrgSettings settings() {
-      return OrgSettings.builder()
-         .type("application/vnd.vmware.admin.orgSettings+xml")
-         .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings"))
-         .link(Link.builder()
-            .rel("down")
-            .type("application/vnd.vmware.admin.vAppTemplateLeaseSettings+xml")
-            .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppTemplateLeaseSettings"))
-            .build())
-         .link(Link.builder()
-            .rel("down")
-            .type("application/vnd.vmware.admin.organizationEmailSettings+xml")
-            .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/email"))
-            .build())
-         .link(Link.builder()
-            .rel("down")
-            .type("application/vnd.vmware.admin.vAppLeaseSettings+xml")
-            .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppLeaseSettings"))
-            .build())
-         .link(Link.builder()
-            .rel("down")
-            .type("application/vnd.vmware.admin.organizationPasswordPolicySettings+xml")
-            .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/passwordPolicy"))
-            .build())
-         .link(Link.builder()
-            .rel("down")
-            .type("application/vnd.vmware.admin.organizationGeneralSettings+xml")
-            .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/general"))
-            .build())
-         .link(Link.builder()
-            .rel("down")
-            .type("application/vnd.vmware.admin.organizationLdapSettings+xml")
-            .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/ldap"))
-            .build())
-         .link(Link.builder()
-            .rel("edit")
-            .type("application/vnd.vmware.admin.orgSettings+xml")
-            .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings"))
-            .build())
-         .generalSettings(generalSettings())
-         .vAppLeaseSettings(vAppLeaseSettings())
-         .vAppTemplateLeaseSettings(vAppTemplateLeaseSettings())
-         .ldapSettings(ldapSettings())
-         .emailSettings(emailSettings())
-         .passwordPolicy(passwordPolicy())
-         .build();
+      return OrgSettings
+               .builder()
+               .type("application/vnd.vmware.admin.orgSettings+xml")
+               .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings"))
+               .link(Link
+                        .builder()
+                        .rel("down")
+                        .type("application/vnd.vmware.admin.vAppTemplateLeaseSettings+xml")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppTemplateLeaseSettings"))
+                        .build())
+               .link(Link
+                        .builder()
+                        .rel("down")
+                        .type("application/vnd.vmware.admin.organizationEmailSettings+xml")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/email"))
+                        .build())
+               .link(Link
+                        .builder()
+                        .rel("down")
+                        .type("application/vnd.vmware.admin.vAppLeaseSettings+xml")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/vAppLeaseSettings"))
+                        .build())
+               .link(Link
+                        .builder()
+                        .rel("down")
+                        .type("application/vnd.vmware.admin.organizationPasswordPolicySettings+xml")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/passwordPolicy"))
+                        .build())
+               .link(Link
+                        .builder()
+                        .rel("down")
+                        .type("application/vnd.vmware.admin.organizationGeneralSettings+xml")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/general"))
+                        .build())
+               .link(Link
+                        .builder()
+                        .rel("down")
+                        .type("application/vnd.vmware.admin.organizationLdapSettings+xml")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/ldap"))
+                        .build())
+               .link(Link
+                        .builder()
+                        .rel("edit")
+                        .type("application/vnd.vmware.admin.orgSettings+xml")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings"))
+                        .build()).generalSettings(generalSettings()).vAppLeaseSettings(vAppLeaseSettings())
+               .vAppTemplateLeaseSettings(vAppTemplateLeaseSettings()).ldapSettings(ldapSettings())
+               .emailSettings(emailSettings()).passwordPolicy(passwordPolicy()).build();
    }
-   
+
    @Test
-   public static final OrgSettings updateSettings() {
-      return settings().toBuilder()
-         .build();
+   public static final OrgSettings editSettings() {
+      return settings().toBuilder().build();
    }
-   
+
    public static final OrgEmailSettings emailSettings() {
-      return OrgEmailSettings.builder()
-         .type("application/vnd.vmware.admin.organizationEmailSettings+xml")
-         .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/email"))
-         .link(Link.builder()
-               .rel("edit")
+      return OrgEmailSettings
+               .builder()
                .type("application/vnd.vmware.admin.organizationEmailSettings+xml")
                .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/email"))
-               .build())
-         .isDefaultSmtpServer(true)
-         .isDefaultOrgEmail(true)
-         .fromEmailAddress("")
-         .defaultSubjectPrefix("")
-         .isAlertEmailToAllAdmins(true)
-         .smtpServerSettings(SmtpServerSettings.builder()
-            .useAuthentication(false)
-            .host("")
-            .username("")
-            .password("")
-            .build())
-         .build();
+               .link(Link
+                        .builder()
+                        .rel("edit")
+                        .type("application/vnd.vmware.admin.organizationEmailSettings+xml")
+                        .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/settings/email"))
+                        .build())
+               .isDefaultSmtpServer(true)
+               .isDefaultOrgEmail(true)
+               .fromEmailAddress("")
+               .defaultSubjectPrefix("")
+               .isAlertEmailToAllAdmins(true)
+               .smtpServerSettings(
+                        SmtpServerSettings.builder().useAuthentication(false).host("").username("").password("")
+                                 .build()).build();
    }
-   
+
    @Test
-   public static final OrgEmailSettings updateEmailSettings() {
-      return emailSettings().toBuilder()
-         .isDefaultSmtpServer(false)
-         .isDefaultOrgEmail(false)
-         .fromEmailAddress("test@test.com")
-         .defaultSubjectPrefix("new")
-         .isAlertEmailToAllAdmins(false)
-         .smtpServerSettings(emailSettings().getSmtpServerSettings().toBuilder()
-            .useAuthentication(true)
-            .host("new")
-            .username("new")
-            .build())
-         .build();
+   public static final OrgEmailSettings editEmailSettings() {
+      return emailSettings()
+               .toBuilder()
+               .isDefaultSmtpServer(false)
+               .isDefaultOrgEmail(false)
+               .fromEmailAddress("test@test.com")
+               .defaultSubjectPrefix("new")
+               .isAlertEmailToAllAdmins(false)
+               .smtpServerSettings(
+                        emailSettings().getSmtpServerSettings().toBuilder().useAuthentication(true).host("new")
+                                 .username("new").build()).build();
    }
-   
+
 }
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminOrgApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminOrgApiLiveTest.java
index 4f8e999..a391aba 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminOrgApiLiveTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminOrgApiLiveTest.java
@@ -20,12 +20,9 @@
 
 import static com.google.common.base.Objects.equal;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_FIELD_UPDATABLE;
-import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.REF_REQ_LIVE;
-import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertTrue;
 
 import org.jclouds.vcloud.director.v1_5.domain.Checks;
-import org.jclouds.vcloud.director.v1_5.domain.Reference;
 import org.jclouds.vcloud.director.v1_5.domain.network.SmtpServerSettings;
 import org.jclouds.vcloud.director.v1_5.domain.org.AdminOrg;
 import org.jclouds.vcloud.director.v1_5.domain.org.OrgEmailSettings;
@@ -39,16 +36,14 @@
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
-import com.google.common.collect.Iterables;
-
 /**
- * Tests live behavior of {@link AdminGroupApi}.
+ * Tests live behavior of {@link AdminOrgApi}.
  * 
  * @author danikov
  */
 @Test(groups = { "live", "admin" }, singleThreaded = true, testName = "AdminOrgApiLiveTest")
 public class AdminOrgApiLiveTest extends BaseVCloudDirectorApiLiveTest {
-   
+
    public static final String ORG = "admin org";
 
    /*
@@ -60,7 +55,6 @@
    /*
     * Shared state between dependant tests.
     */
-   private Reference orgRef;
    private OrgSettings settings;
    private OrgEmailSettings emailSettings;
    private OrgGeneralSettings generalSettings;
@@ -73,338 +67,278 @@
    @BeforeClass(alwaysRun = true)
    public void setupRequiredApis() {
       orgApi = adminContext.getApi().getOrgApi();
-      orgRef = Iterables.getFirst(orgApi.getOrgList().getOrgs(), null).toAdminReference(endpoint);
-      assertNotNull(orgRef, String.format(REF_REQ_LIVE, "admin org"));
    }
-   
+
    @Test(description = "GET /admin/org/{id}")
    public void testGetAdminOrg() {
-      AdminOrg adminOrg = orgApi.getOrg(orgRef.getHref());
-      
+      AdminOrg adminOrg = orgApi.get(org.getId());
+
       Checks.checkAdminOrg(adminOrg);
    }
-   
+
    @Test(description = "GET /admin/org/{id}/settings/email")
    public void testGetEmailSettings() {
-      emailSettings = orgApi.getEmailSettings(orgRef.getHref());
-      
+      emailSettings = orgApi.getEmailSettings(org.getId());
+
       Checks.checkEmailSettings(emailSettings);
    }
-   
-   @Test(description = "PUT /admin/org/{id}/settings/email", 
-         dependsOnMethods = { "testGetEmailSettings" })
-   public void testUpdateEmailSettings() {
+
+   @Test(description = "PUT /admin/org/{id}/settings/email", dependsOnMethods = { "testGetEmailSettings" })
+   public void testEditEmailSettings() {
       boolean isDefaultSmtpServer = emailSettings.isDefaultSmtpServer();
       boolean isDefaultOrgEmail = emailSettings.isDefaultOrgEmail();
       String oldFromEmailAddress = emailSettings.getFromEmailAddress();
       String newFromEmailAddress = "test@test.com";
       String oldDefaultSubjectPrefix = emailSettings.getDefaultSubjectPrefix();
-      String newDefaultSubjectPrefix = "new"+oldDefaultSubjectPrefix;
+      String newDefaultSubjectPrefix = "new" + oldDefaultSubjectPrefix;
       boolean isAlertEmailToAllAdmins = emailSettings.isAlertEmailToAllAdmins();
       SmtpServerSettings oldSmtpServerSettings = emailSettings.getSmtpServerSettings();
       SmtpServerSettings newSmtpServerSettings = oldSmtpServerSettings.toBuilder()
-         .useAuthentication(!oldSmtpServerSettings.useAuthentication())
-         .host("new"+oldSmtpServerSettings.getHost())
-         .username("new"+oldSmtpServerSettings.getUsername())
-         .password("new"+oldSmtpServerSettings.getPassword())
-         .build();
-      
+               .useAuthentication(!oldSmtpServerSettings.useAuthentication())
+               .host("new" + oldSmtpServerSettings.getHost()).username("new" + oldSmtpServerSettings.getUsername())
+               .password("new" + oldSmtpServerSettings.getPassword()).build();
+
       try {
-         OrgEmailSettings newEmailSettings = emailSettings.toBuilder()
-               .isDefaultSmtpServer(!isDefaultSmtpServer)
-               .isDefaultOrgEmail(!isDefaultOrgEmail)
-               .fromEmailAddress(newFromEmailAddress)
-               .defaultSubjectPrefix(newDefaultSubjectPrefix)
-               .isAlertEmailToAllAdmins(!isAlertEmailToAllAdmins)
-               .smtpServerSettings(newSmtpServerSettings)
-               .build();
-         
-         emailSettings = orgApi.updateEmailSettings(
-               orgRef.getHref(), newEmailSettings);
-         
-         assertTrue(equal(emailSettings.isDefaultSmtpServer(), !isDefaultSmtpServer), 
-               String.format(OBJ_FIELD_UPDATABLE, 
-               "emailSettings", "isDefaultSmtpServer"));
-         assertTrue(equal(emailSettings.isDefaultOrgEmail(), !isDefaultOrgEmail), 
-               String.format(OBJ_FIELD_UPDATABLE, 
-               "emailSettings", "isDefaultOrgEmail"));
-         assertTrue(equal(emailSettings.getFromEmailAddress(), newFromEmailAddress), 
-               String.format(OBJ_FIELD_UPDATABLE, 
-               "emailSettings", "fromEmailAddress"));
-         assertTrue(equal(emailSettings.getDefaultSubjectPrefix(), newDefaultSubjectPrefix), 
-               String.format(OBJ_FIELD_UPDATABLE, 
-               "emailSettings", "defaultSubjectPrefix"));
-         assertTrue(equal(emailSettings.isAlertEmailToAllAdmins(), !isAlertEmailToAllAdmins), 
-               String.format(OBJ_FIELD_UPDATABLE, 
-               "emailSettings", "isAlertEmailToAllAdmins"));
-         assertTrue(equal(emailSettings.getSmtpServerSettings(), newSmtpServerSettings), 
-               String.format(OBJ_FIELD_UPDATABLE, 
-               "emailSettings", "smtpServerSettings"));
-         
-         //TODO negative tests?
-         
+         OrgEmailSettings newEmailSettings = emailSettings.toBuilder().isDefaultSmtpServer(!isDefaultSmtpServer)
+                  .isDefaultOrgEmail(!isDefaultOrgEmail).fromEmailAddress(newFromEmailAddress)
+                  .defaultSubjectPrefix(newDefaultSubjectPrefix).isAlertEmailToAllAdmins(!isAlertEmailToAllAdmins)
+                  .smtpServerSettings(newSmtpServerSettings).build();
+
+         emailSettings = orgApi.editEmailSettings(org.getId(), newEmailSettings);
+
+         assertTrue(equal(emailSettings.isDefaultSmtpServer(), !isDefaultSmtpServer),
+                  String.format(OBJ_FIELD_UPDATABLE, "emailSettings", "isDefaultSmtpServer"));
+         assertTrue(equal(emailSettings.isDefaultOrgEmail(), !isDefaultOrgEmail),
+                  String.format(OBJ_FIELD_UPDATABLE, "emailSettings", "isDefaultOrgEmail"));
+         assertTrue(equal(emailSettings.getFromEmailAddress(), newFromEmailAddress),
+                  String.format(OBJ_FIELD_UPDATABLE, "emailSettings", "fromEmailAddress"));
+         assertTrue(equal(emailSettings.getDefaultSubjectPrefix(), newDefaultSubjectPrefix),
+                  String.format(OBJ_FIELD_UPDATABLE, "emailSettings", "defaultSubjectPrefix"));
+         assertTrue(equal(emailSettings.isAlertEmailToAllAdmins(), !isAlertEmailToAllAdmins),
+                  String.format(OBJ_FIELD_UPDATABLE, "emailSettings", "isAlertEmailToAllAdmins"));
+         assertTrue(equal(emailSettings.getSmtpServerSettings(), newSmtpServerSettings),
+                  String.format(OBJ_FIELD_UPDATABLE, "emailSettings", "smtpServerSettings"));
+
+         // TODO negative tests?
+
          Checks.checkEmailSettings(emailSettings);
       } finally {
-         emailSettings = emailSettings.toBuilder()
-               .isDefaultSmtpServer(isDefaultSmtpServer)
-               .isDefaultOrgEmail(isDefaultOrgEmail)
-               .fromEmailAddress(oldFromEmailAddress)
-               .defaultSubjectPrefix(oldDefaultSubjectPrefix)
-               .isAlertEmailToAllAdmins(isAlertEmailToAllAdmins)
-               .smtpServerSettings(oldSmtpServerSettings)
-               .build();
-         
-         emailSettings = orgApi.updateEmailSettings(
-               orgRef.getHref(), emailSettings);
+         emailSettings = emailSettings.toBuilder().isDefaultSmtpServer(isDefaultSmtpServer)
+                  .isDefaultOrgEmail(isDefaultOrgEmail).fromEmailAddress(oldFromEmailAddress)
+                  .defaultSubjectPrefix(oldDefaultSubjectPrefix).isAlertEmailToAllAdmins(isAlertEmailToAllAdmins)
+                  .smtpServerSettings(oldSmtpServerSettings).build();
+
+         emailSettings = orgApi.editEmailSettings(org.getId(), emailSettings);
       }
    }
- 
+
    @Test(description = "GET /admin/org/{id}/settings/general")
    public void testGetGeneralSettings() {
-      generalSettings = orgApi.getGeneralSettings(orgRef.getHref());
-      
+      generalSettings = orgApi.getGeneralSettings(org.getId());
+
       Checks.checkGeneralSettings(generalSettings);
    }
-   
-   @Test(description = "PUT /admin/org/{id}/settings/general", 
-         dependsOnMethods = { "testGetGeneralSettings" } )
-   public void testUpdateGeneralSettings() {
-      // FIXME: canPublishCatalogs does not update
-      //boolean canPublishCatalogs = generalSettings.canPublishCatalogs();
+
+   @Test(description = "PUT /admin/org/{id}/settings/general", dependsOnMethods = { "testGetGeneralSettings" })
+   public void testEditGeneralSettings() {
+      // FIXME: canPublishCatalogs does not edit
+      // boolean canPublishCatalogs = generalSettings.canPublishCatalogs();
       Integer deployedVMQuota = generalSettings.getDeployedVMQuota();
       Integer storedVmQuota = generalSettings.getStoredVmQuota();
       boolean useServerBootSequence = generalSettings.useServerBootSequence();
       Integer delayAfterPowerOnSeconds = generalSettings.getDelayAfterPowerOnSeconds();
-      
+
       try {
-         OrgGeneralSettings newGeneralSettings = generalSettings.toBuilder()
-               //.canPublishCatalogs(!canPublishCatalogs)
-               .deployedVMQuota(deployedVMQuota+1)
-               .storedVmQuota(storedVmQuota+1)
-               .useServerBootSequence(!useServerBootSequence)
-               .delayAfterPowerOnSeconds(delayAfterPowerOnSeconds+1)
-               .build();
-         
-         generalSettings = orgApi.updateGeneralSettings(
-               orgRef.getHref(), newGeneralSettings);
-         
-//         assertTrue(equal(generalSettings.canPublishCatalogs(), !canPublishCatalogs), 
-//               String.format(OBJ_FIELD_UPDATABLE, 
-//               "generalSettings", "canPublishCatalogs"));
-         assertTrue(equal(generalSettings.getDeployedVMQuota(), deployedVMQuota+1), 
-               String.format(OBJ_FIELD_UPDATABLE, 
-               "generalSettings", "deployedVMQuota"));
-         assertTrue(equal(generalSettings.getStoredVmQuota(), storedVmQuota+1), 
-               String.format(OBJ_FIELD_UPDATABLE, 
-               "generalSettings", "storedVmQuota"));
-         assertTrue(equal(generalSettings.useServerBootSequence(), !useServerBootSequence), 
-               String.format(OBJ_FIELD_UPDATABLE, 
-               "generalSettings", "useServerBootSequence"));
-         assertTrue(equal(generalSettings.getDelayAfterPowerOnSeconds(), delayAfterPowerOnSeconds+1), 
-               String.format(OBJ_FIELD_UPDATABLE, 
-               "generalSettings", "delayAfterPowerOnSeconds"));
-         
-         //TODO negative tests?
-         
+         OrgGeneralSettings newGeneralSettings = generalSettings
+                  .toBuilder()
+                  // .canPublishCatalogs(!canPublishCatalogs)
+                  .deployedVMQuota(deployedVMQuota + 1).storedVmQuota(storedVmQuota + 1)
+                  .useServerBootSequence(!useServerBootSequence).delayAfterPowerOnSeconds(delayAfterPowerOnSeconds + 1)
+                  .build();
+
+         generalSettings = orgApi.editGeneralSettings(org.getId(), newGeneralSettings);
+
+         // assertTrue(equal(generalSettings.canPublishCatalogs(), !canPublishCatalogs),
+         // String.format(OBJ_FIELD_UPDATABLE,
+         // "generalSettings", "canPublishCatalogs"));
+         assertTrue(equal(generalSettings.getDeployedVMQuota(), deployedVMQuota + 1),
+                  String.format(OBJ_FIELD_UPDATABLE, "generalSettings", "deployedVMQuota"));
+         assertTrue(equal(generalSettings.getStoredVmQuota(), storedVmQuota + 1),
+                  String.format(OBJ_FIELD_UPDATABLE, "generalSettings", "storedVmQuota"));
+         assertTrue(equal(generalSettings.useServerBootSequence(), !useServerBootSequence),
+                  String.format(OBJ_FIELD_UPDATABLE, "generalSettings", "useServerBootSequence"));
+         assertTrue(equal(generalSettings.getDelayAfterPowerOnSeconds(), delayAfterPowerOnSeconds + 1),
+                  String.format(OBJ_FIELD_UPDATABLE, "generalSettings", "delayAfterPowerOnSeconds"));
+
+         // TODO negative tests?
+
          Checks.checkGeneralSettings(generalSettings);
       } finally {
-         generalSettings = generalSettings.toBuilder()
-//               .canPublishCatalogs(canPublishCatalogs)
-               .deployedVMQuota(deployedVMQuota)
-               .storedVmQuota(storedVmQuota)
-               .useServerBootSequence(useServerBootSequence)
-               .delayAfterPowerOnSeconds(delayAfterPowerOnSeconds)
-               .build();
-         
-         generalSettings = orgApi.updateGeneralSettings(
-               orgRef.getHref(), generalSettings);
+         generalSettings = generalSettings
+                  .toBuilder()
+                  // .canPublishCatalogs(canPublishCatalogs)
+                  .deployedVMQuota(deployedVMQuota).storedVmQuota(storedVmQuota)
+                  .useServerBootSequence(useServerBootSequence).delayAfterPowerOnSeconds(delayAfterPowerOnSeconds)
+                  .build();
+
+         generalSettings = orgApi.editGeneralSettings(org.getId(), generalSettings);
       }
    }
- 
+
    @Test(description = "GET /admin/org/{id}/settings/ldap")
    public void testGetLdapSettings() {
-      ldapSettings = orgApi.getLdapSettings(orgRef.getHref());
-      
+      ldapSettings = orgApi.getLdapSettings(org.getId());
+
       Checks.checkLdapSettings(ldapSettings);
    }
- 
+
    @Test(description = "GET /admin/org/{id}/settings/passwordPolicy")
    public void testGetPasswordPolicy() {
-      passwordPolicy = orgApi.getPasswordPolicy(orgRef.getHref());
-      
+      passwordPolicy = orgApi.getPasswordPolicy(org.getId());
+
       Checks.checkPasswordPolicySettings(passwordPolicy);
    }
-   
-   @Test(description = "PUT /admin/org/{id}/settings/passwordPolicy", 
-         dependsOnMethods = { "testGetPasswordPolicy" })
-   public void testUpdatePasswordPolicy() {
+
+   @Test(description = "PUT /admin/org/{id}/settings/passwordPolicy", dependsOnMethods = { "testGetPasswordPolicy" })
+   public void testEditPasswordPolicy() {
       boolean accountLockoutEnabled = passwordPolicy.isAccountLockoutEnabled();
       Integer invalidLoginsBeforeLockout = passwordPolicy.getInvalidLoginsBeforeLockout();
       Integer accountLockoutIntervalMinutes = passwordPolicy.getAccountLockoutIntervalMinutes();
-      
+
       try {
          OrgPasswordPolicySettings newPasswordPolicy = passwordPolicy.toBuilder()
-               .accountLockoutEnabled(!accountLockoutEnabled)
-               .invalidLoginsBeforeLockout(invalidLoginsBeforeLockout+1)
-               .accountLockoutIntervalMinutes(accountLockoutIntervalMinutes+1)
-               .build();
-         
-         passwordPolicy = orgApi.updatePasswordPolicy(
-               orgRef.getHref(), newPasswordPolicy);
-         
-         assertTrue(equal(passwordPolicy.isAccountLockoutEnabled(), !accountLockoutEnabled), 
-               String.format(OBJ_FIELD_UPDATABLE, 
-               "PasswordPolicySettings", "deleteOnStorageLeaseExpiration"));
-         assertTrue(equal(passwordPolicy.getInvalidLoginsBeforeLockout(), invalidLoginsBeforeLockout+1), 
-               String.format(OBJ_FIELD_UPDATABLE, 
-               "PasswordPolicySettings", "storageLeaseSeconds"));
-         assertTrue(equal(passwordPolicy.getAccountLockoutIntervalMinutes(), accountLockoutIntervalMinutes+1), 
-               String.format(OBJ_FIELD_UPDATABLE, 
-               "PasswordPolicySettings", "deploymentLeaseSeconds"));
-         
-         //TODO negative tests?
-         
+                  .accountLockoutEnabled(!accountLockoutEnabled)
+                  .invalidLoginsBeforeLockout(invalidLoginsBeforeLockout + 1)
+                  .accountLockoutIntervalMinutes(accountLockoutIntervalMinutes + 1).build();
+
+         passwordPolicy = orgApi.editPasswordPolicy(org.getId(), newPasswordPolicy);
+
+         assertTrue(equal(passwordPolicy.isAccountLockoutEnabled(), !accountLockoutEnabled),
+                  String.format(OBJ_FIELD_UPDATABLE, "PasswordPolicySettings", "deleteOnStorageLeaseExpiration"));
+         assertTrue(equal(passwordPolicy.getInvalidLoginsBeforeLockout(), invalidLoginsBeforeLockout + 1),
+                  String.format(OBJ_FIELD_UPDATABLE, "PasswordPolicySettings", "storageLeaseSeconds"));
+         assertTrue(equal(passwordPolicy.getAccountLockoutIntervalMinutes(), accountLockoutIntervalMinutes + 1),
+                  String.format(OBJ_FIELD_UPDATABLE, "PasswordPolicySettings", "deploymentLeaseSeconds"));
+
+         // TODO negative tests?
+
          Checks.checkPasswordPolicySettings(passwordPolicy);
       } finally {
-         passwordPolicy = passwordPolicy.toBuilder()
-               .accountLockoutEnabled(accountLockoutEnabled)
-               .invalidLoginsBeforeLockout(invalidLoginsBeforeLockout)
-               .accountLockoutIntervalMinutes(accountLockoutIntervalMinutes)
-               .build();
-         
-         passwordPolicy = orgApi.updatePasswordPolicy(
-               orgRef.getHref(), passwordPolicy);
+         passwordPolicy = passwordPolicy.toBuilder().accountLockoutEnabled(accountLockoutEnabled)
+                  .invalidLoginsBeforeLockout(invalidLoginsBeforeLockout)
+                  .accountLockoutIntervalMinutes(accountLockoutIntervalMinutes).build();
+
+         passwordPolicy = orgApi.editPasswordPolicy(org.getId(), passwordPolicy);
       }
    }
-   
+
    @Test(description = "GET /admin/org/{id}/settings/vAppLeaseSettings")
    public void testGetVAppLeaseSettings() {
-      vAppLeaseSettings = orgApi.getVAppLeaseSettings(orgRef.getHref());
-      
+      vAppLeaseSettings = orgApi.getVAppLeaseSettings(org.getId());
+
       Checks.checkVAppLeaseSettings(vAppLeaseSettings);
    }
-   
-   @Test(description = "PUT /admin/org/{id}/settings/vAppLeaseSettings", 
-         dependsOnMethods = { "testGetVAppLeaseSettings" } ) // FIXME: fails with 403 forbidden
-   public void testUpdateVAppLeaseSettings() {
+
+   @Test(description = "PUT /admin/org/{id}/settings/vAppLeaseSettings", dependsOnMethods = { "testGetVAppLeaseSettings" })
+   // FIXME: fails with 403 forbidden
+   public void testEditVAppLeaseSettings() {
       boolean deleteOnStorageLeaseExpiration = vAppLeaseSettings.deleteOnStorageLeaseExpiration();
       Integer storageLeaseSeconds = vAppLeaseSettings.getStorageLeaseSeconds();
       Integer deploymentLeaseSeconds = vAppLeaseSettings.getDeploymentLeaseSeconds();
-      
+
       try {
          OrgLeaseSettings newVAppLeaseSettings = vAppLeaseSettings.toBuilder()
-               .deleteOnStorageLeaseExpiration(!deleteOnStorageLeaseExpiration)
-               .storageLeaseSeconds(storageLeaseSeconds+1)
-               .deploymentLeaseSeconds(deploymentLeaseSeconds+1)
-               .build();
-         
-         vAppLeaseSettings = orgApi.updateVAppLeaseSettings(
-               orgRef.getHref(), newVAppLeaseSettings);
-         
-         assertTrue(equal(vAppLeaseSettings.deleteOnStorageLeaseExpiration(), !deleteOnStorageLeaseExpiration), 
-               String.format(OBJ_FIELD_UPDATABLE, 
-               "vAppLeaseSettings", "deleteOnStorageLeaseExpiration"));
-         assertTrue(equal(vAppLeaseSettings.getStorageLeaseSeconds(), storageLeaseSeconds+1), 
-               String.format(OBJ_FIELD_UPDATABLE, 
-               "vAppLeaseSettings", "storageLeaseSeconds"));
-         assertTrue(equal(vAppLeaseSettings.getDeploymentLeaseSeconds(), deploymentLeaseSeconds+1), 
-               String.format(OBJ_FIELD_UPDATABLE, 
-               "vAppLeaseSettings", "deploymentLeaseSeconds"));
-         
-         //TODO negative tests?
-         
+                  .deleteOnStorageLeaseExpiration(!deleteOnStorageLeaseExpiration)
+                  .storageLeaseSeconds(storageLeaseSeconds + 1).deploymentLeaseSeconds(deploymentLeaseSeconds + 1)
+                  .build();
+
+         vAppLeaseSettings = orgApi.editVAppLeaseSettings(org.getId(), newVAppLeaseSettings);
+
+         assertTrue(equal(vAppLeaseSettings.deleteOnStorageLeaseExpiration(), !deleteOnStorageLeaseExpiration),
+                  String.format(OBJ_FIELD_UPDATABLE, "vAppLeaseSettings", "deleteOnStorageLeaseExpiration"));
+         assertTrue(equal(vAppLeaseSettings.getStorageLeaseSeconds(), storageLeaseSeconds + 1),
+                  String.format(OBJ_FIELD_UPDATABLE, "vAppLeaseSettings", "storageLeaseSeconds"));
+         assertTrue(equal(vAppLeaseSettings.getDeploymentLeaseSeconds(), deploymentLeaseSeconds + 1),
+                  String.format(OBJ_FIELD_UPDATABLE, "vAppLeaseSettings", "deploymentLeaseSeconds"));
+
+         // TODO negative tests?
+
          Checks.checkVAppLeaseSettings(vAppLeaseSettings);
       } finally {
          vAppLeaseSettings = vAppLeaseSettings.toBuilder()
-               .deleteOnStorageLeaseExpiration(deleteOnStorageLeaseExpiration)
-               .storageLeaseSeconds(storageLeaseSeconds)
-               .deploymentLeaseSeconds(deploymentLeaseSeconds)
-               .build();
-         
-         vAppLeaseSettings = orgApi.updateVAppLeaseSettings(
-               orgRef.getHref(), vAppLeaseSettings);
+                  .deleteOnStorageLeaseExpiration(deleteOnStorageLeaseExpiration)
+                  .storageLeaseSeconds(storageLeaseSeconds).deploymentLeaseSeconds(deploymentLeaseSeconds).build();
+
+         vAppLeaseSettings = orgApi.editVAppLeaseSettings(org.getId(), vAppLeaseSettings);
       }
    }
- 
+
    @Test(description = "GET /admin/org/{id}/settings/vAppTemplateLeaseSettings")
    public void testGetVAppTemplateLeaseSettings() {
-      vAppTemplateLeaseSettings = orgApi.getVAppTemplateLeaseSettings(orgRef.getHref());
-      
+      vAppTemplateLeaseSettings = orgApi.getVAppTemplateLeaseSettings(org.getId());
+
       Checks.checkVAppTemplateLeaseSettings(vAppTemplateLeaseSettings);
    }
-   
-   @Test(description = "PUT /admin/org/{id}/settings/vAppTemplateLeaseSettings", 
-         dependsOnMethods = { "testGetVAppTemplateLeaseSettings" }) // FIXME: fails with 403 forbidden
-   public void testUpdateVAppTemplateLeaseSettings() {
+
+   @Test(description = "PUT /admin/org/{id}/settings/vAppTemplateLeaseSettings", dependsOnMethods = { "testGetVAppTemplateLeaseSettings" })
+   // FIXME: fails with 403 forbidden
+   public void testEditVAppTemplateLeaseSettings() {
       boolean deleteOnStorageLeaseExpiration = vAppTemplateLeaseSettings.deleteOnStorageLeaseExpiration();
       Integer storageLeaseSeconds = vAppTemplateLeaseSettings.getStorageLeaseSeconds();
-      
+
       try {
          OrgVAppTemplateLeaseSettings newVAppTemplateLeaseSettings = vAppTemplateLeaseSettings.toBuilder()
-               .deleteOnStorageLeaseExpiration(!deleteOnStorageLeaseExpiration)
-               .storageLeaseSeconds(storageLeaseSeconds+1)
-               .build();
-         
-         vAppTemplateLeaseSettings = orgApi.updateVAppTemplateLeaseSettings(
-               orgRef.getHref(), newVAppTemplateLeaseSettings);
-         
-         assertTrue(equal(vAppTemplateLeaseSettings.deleteOnStorageLeaseExpiration(), !deleteOnStorageLeaseExpiration), 
-               String.format(OBJ_FIELD_UPDATABLE, 
-               "vAppTemplateLeaseSettings", "deleteOnStorageLeaseExpiration"));
-         assertTrue(equal(vAppTemplateLeaseSettings.getStorageLeaseSeconds(), storageLeaseSeconds+1), 
-               String.format(OBJ_FIELD_UPDATABLE, 
-               "vAppTemplateLeaseSettings", "storageLeaseSeconds"));
-         
-         //TODO negative tests?
-         
+                  .deleteOnStorageLeaseExpiration(!deleteOnStorageLeaseExpiration)
+                  .storageLeaseSeconds(storageLeaseSeconds + 1).build();
+
+         vAppTemplateLeaseSettings = orgApi.editVAppTemplateLeaseSettings(org.getId(), newVAppTemplateLeaseSettings);
+
+         assertTrue(equal(vAppTemplateLeaseSettings.deleteOnStorageLeaseExpiration(), !deleteOnStorageLeaseExpiration),
+                  String.format(OBJ_FIELD_UPDATABLE, "vAppTemplateLeaseSettings", "deleteOnStorageLeaseExpiration"));
+         assertTrue(equal(vAppTemplateLeaseSettings.getStorageLeaseSeconds(), storageLeaseSeconds + 1),
+                  String.format(OBJ_FIELD_UPDATABLE, "vAppTemplateLeaseSettings", "storageLeaseSeconds"));
+
+         // TODO negative tests?
+
          Checks.checkVAppTemplateLeaseSettings(vAppTemplateLeaseSettings);
       } finally {
          vAppTemplateLeaseSettings = vAppTemplateLeaseSettings.toBuilder()
-               .deleteOnStorageLeaseExpiration(deleteOnStorageLeaseExpiration)
-               .storageLeaseSeconds(storageLeaseSeconds)
-               .build();
-         
-         vAppTemplateLeaseSettings = orgApi.updateVAppTemplateLeaseSettings(
-               orgRef.getHref(), vAppTemplateLeaseSettings);
+                  .deleteOnStorageLeaseExpiration(deleteOnStorageLeaseExpiration)
+                  .storageLeaseSeconds(storageLeaseSeconds).build();
+
+         vAppTemplateLeaseSettings = orgApi.editVAppTemplateLeaseSettings(org.getId(), vAppTemplateLeaseSettings);
       }
    }
-   
+
    @Test(description = "GET /admin/org/{id}/settings")
    public void testGetSettings() {
-      settings = orgApi.getSettings(orgRef.getHref());
-      
+      settings = orgApi.getSettings(org.getId());
+
       Checks.checkOrgSettings(settings);
    }
-   
-   @Test(description = "PUT /admin/org/{id}/settings",
-         dependsOnMethods = { "testGetEmailSettings" } )
-   public void testUpdateSettings() throws Exception {
-      String newFromEmailAddress = "test"+random.nextInt(Integer.MAX_VALUE)+"@test.com";
+
+   @Test(description = "PUT /admin/org/{id}/settings", dependsOnMethods = { "testGetEmailSettings" })
+   public void testEditSettings() throws Exception {
+      String newFromEmailAddress = "test" + random.nextInt(Integer.MAX_VALUE) + "@test.com";
       Exception exception = null;
-      
+
       try {
          OrgSettings newSettings = OrgSettings.builder()
-               .emailSettings(emailSettings.toBuilder().fromEmailAddress(newFromEmailAddress).build())
-               .build();
-         
-         OrgSettings modified = orgApi.updateSettings(
-               orgRef.getHref(), newSettings);
-         
+                  .emailSettings(emailSettings.toBuilder().fromEmailAddress(newFromEmailAddress).build()).build();
+
+         OrgSettings modified = orgApi.editSettings(org.getId(), newSettings);
+
          Checks.checkOrgSettings(settings);
-         assertTrue(equal(modified.getEmailSettings().getFromEmailAddress(), newFromEmailAddress), 
-               String.format(OBJ_FIELD_UPDATABLE, 
-               "orgSettings", "emailSettings"));
-         
+         assertTrue(equal(modified.getEmailSettings().getFromEmailAddress(), newFromEmailAddress),
+                  String.format(OBJ_FIELD_UPDATABLE, "orgSettings", "emailSettings"));
+
       } catch (Exception e) {
          exception = e;
       } finally {
          try {
-            OrgSettings restorableSettings = OrgSettings.builder()
-                     .emailSettings(emailSettings)
-                     .build();
-            
-            settings = orgApi.updateSettings(
-                     orgRef.getHref(), restorableSettings);
+            OrgSettings restorableSettings = OrgSettings.builder().emailSettings(emailSettings).build();
+
+            settings = orgApi.editSettings(org.getId(), restorableSettings);
          } catch (Exception e) {
             if (exception != null) {
                logger.warn(e, "Error resetting settings; rethrowing original test exception...");
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminVdcApiExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminVdcApiExpectTest.java
index dc198f7..e0f3750 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminVdcApiExpectTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminVdcApiExpectTest.java
@@ -56,7 +56,7 @@
 
       AdminVdc expected = adminVdc();
 
-      assertEquals(api.getVdcApi().getVdc(vdcRef.getHref()), expected);
+      assertEquals(api.getVdcApi().get(vdcRef.getHref()), expected);
    }
    
    public static final AdminVdc adminVdc() {
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminVdcApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminVdcApiLiveTest.java
index 5c230c6..8e5eeb0 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminVdcApiLiveTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/AdminVdcApiLiveTest.java
@@ -19,13 +19,10 @@
 package org.jclouds.vcloud.director.v1_5.features.admin;
 
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.OBJ_REQ_LIVE;
-import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.REF_REQ_LIVE;
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.fail;
 
-import java.net.URI;
-
 import org.jclouds.vcloud.director.v1_5.VCloudDirectorException;
 import org.jclouds.vcloud.director.v1_5.domain.AdminVdc;
 import org.jclouds.vcloud.director.v1_5.domain.Checks;
@@ -47,34 +44,30 @@
  */
 @Test(groups = { "live", "admin" }, singleThreaded = true, testName = "AdminVdcApiLiveTest")
 public class AdminVdcApiLiveTest extends BaseVCloudDirectorApiLiveTest {
-   
+
    public static final String VDC = "admin vdc";
- 
+
    /*
     * Convenience reference to API api.
     */
    protected AdminVdcApi vdcApi;
    protected MetadataApi.Writeable metadataApi;
-   
-   protected URI adminVdcUri;
 
    private String metadataKey;
    private String metadataValue;
-   
+
    @Override
    @BeforeClass(alwaysRun = true)
    public void setupRequiredApis() {
       vdcApi = adminContext.getApi().getVdcApi();
-      metadataApi = vdcApi.getMetadataApi();
-      assertNotNull(vdcURI, String.format(REF_REQ_LIVE, VDC));
-      adminVdcUri = toAdminUri(vdcURI);
+      metadataApi = vdcApi.getMetadataApi(vdcUrn);
    }
 
    @AfterClass(alwaysRun = true)
    public void cleanUp() throws Exception {
       if (metadataKey != null) {
          try {
-            Task task = metadataApi.deleteMetadataEntry(adminVdcUri, metadataKey);
+            Task task = metadataApi.removeEntry(metadataKey);
             taskDoneEventually(task);
          } catch (VCloudDirectorException e) {
             logger.warn(e, "Error deleting metadata-value (perhaps it doesn't exist?); continuing...");
@@ -84,31 +77,29 @@
 
    @Test(description = "GET /admin/vdc/{id}")
    public void testGetVdc() {
-      AdminVdc vdc = vdcApi.getVdc(adminVdcUri);
+      AdminVdc vdc = vdcApi.get(vdcUrn);
       assertNotNull(vdc, String.format(OBJ_REQ_LIVE, VDC));
-       
+
       // parent type
       Checks.checkAdminVdc(vdc);
    }
-   
+
    // TODO insufficient permissions to test
-   @Test(description = "PUT /admin/vdc/{id}", enabled=false)
+   @Test(description = "PUT /admin/vdc/{id}", enabled = false)
    public void testEditVdc() throws Exception {
-      String origName = vdcApi.getVdc(adminVdcUri).getName();
+      String origName = lazyGetVdc().getName();
       String newName = name("a");
       Exception exception = null;
-      
-      AdminVdc vdc = AdminVdc.builder()
-               .name(newName)
-               .build();
-      
+
+      AdminVdc vdc = AdminVdc.builder().name(newName).build();
+
       try {
-         Task task = vdcApi.editVdc(adminVdcUri, vdc);
+         Task task = vdcApi.edit(vdcUrn, vdc);
          assertTaskSucceeds(task);
-         
-         AdminVdc modified = vdcApi.getVdc(adminVdcUri);
+
+         AdminVdc modified = vdcApi.get(vdcUrn);
          assertEquals(modified.getName(), newName);
-          
+
          // parent type
          Checks.checkAdminVdc(vdc);
       } catch (Exception e) {
@@ -116,7 +107,7 @@
       } finally {
          try {
             AdminVdc restorableVdc = AdminVdc.builder().name(origName).build();
-            Task task = vdcApi.editVdc(adminVdcUri, restorableVdc);
+            Task task = vdcApi.edit(vdcUrn, restorableVdc);
             assertTaskSucceeds(task);
          } catch (Exception e) {
             if (exception != null) {
@@ -128,34 +119,35 @@
          }
       }
    }
-   
+
    // TODO insufficient permissions to test
-   @Test(description = "DELETE /admin/vdc/{id}", enabled=false)
-   public void testDeleteVdc() throws Exception {
-      // TODO Need to have a VDC that we're happy to delete!
-      Task task = vdcApi.deleteVdc(adminVdcUri);
+   @Test(description = "DELETE /admin/vdc/{id}", enabled = false)
+   public void testRemoveVdc() throws Exception {
+      // TODO Need to have a VDC that we're happy to remove!
+      Task task = vdcApi.remove(vdcUrn);
       assertTaskSucceeds(task);
-         
+
       try {
-         vdcApi.getVdc(adminVdcUri);
+         vdcApi.get(vdcUrn);
       } catch (VCloudDirectorException e) {
-         // success; unreachable because it has been deleted
+         // success; unreachable because it has been removed
+         // TODO: ^^ wrong. this should return null
       }
    }
-   
+
    // TODO insufficient permissions to test
-   @Test(description = "DISABLE/ENABLE /admin/vdc/{id}", enabled=false)
+   @Test(description = "DISABLE/ENABLE /admin/vdc/{id}", enabled = false)
    public void testDisableAndEnableVdc() throws Exception {
-      // TODO Need to have a VDC that we're happy to delete!
+      // TODO Need to have a VDC that we're happy to remove!
       Exception exception = null;
-      
+
       try {
-         vdcApi.disableVdc(adminVdcUri);
+         vdcApi.disable(vdcUrn);
       } catch (Exception e) {
          exception = e;
       } finally {
          try {
-            vdcApi.enableVdc(adminVdcUri);
+            vdcApi.enable(vdcUrn);
          } catch (Exception e) {
             if (exception != null) {
                logger.warn(e, "Error resetting adminVdc.name; rethrowing original test exception...");
@@ -166,63 +158,62 @@
          }
       }
    }
-   
+
    @Test(description = "GET /admin/vdc/{id}/metadata")
    public void testGetMetadata() throws Exception {
-      Metadata metadata = metadataApi.getMetadata(adminVdcUri);
+      Metadata metadata = metadataApi.get();
 
       Checks.checkMetadata(metadata);
    }
-   
+
    // TODO insufficient permissions to test
-   @Test(description = "PUT /admin/vdc/{id}/metadata", enabled=false)
+   @Test(description = "PUT /admin/vdc/{id}/metadata", enabled = false)
    public void testSetMetadata() throws Exception {
       metadataKey = name("key-");
       metadataValue = name("value-");
-      Metadata metadata = Metadata.builder()
-               .entry(MetadataEntry.builder().entry(metadataKey, metadataValue).build())
+      Metadata metadata = Metadata.builder().entry(MetadataEntry.builder().entry(metadataKey, metadataValue).build())
                .build();
-      
-      Task task = metadataApi.mergeMetadata(adminVdcUri, metadata);
+
+      Task task = metadataApi.merge(metadata);
       assertTaskSucceeds(task);
-      
-      MetadataValue modified = metadataApi.getMetadataValue(adminVdcUri, metadataKey);
+
+      MetadataValue modified = metadataApi.getValue(metadataKey);
       Checks.checkMetadataValueFor("AdminVdc", modified, metadataValue);
       Checks.checkMetadata(metadata);
    }
-   
+
    // TODO insufficient permissions to test
-   @Test(description = "GET /admin/vdc/{id}/metadata/{key}", dependsOnMethods = { "testSetMetadata" }, enabled=false)
+   @Test(description = "GET /admin/vdc/{id}/metadata/{key}", dependsOnMethods = { "testSetMetadata" }, enabled = false)
    public void testGetMetadataValue() throws Exception {
-      MetadataValue retrievedMetadataValue = metadataApi.getMetadataValue(adminVdcUri, metadataKey);
-         
+      MetadataValue retrievedMetadataValue = metadataApi.getValue(metadataKey);
+
       Checks.checkMetadataValueFor("AdminVdc", retrievedMetadataValue, metadataValue);
    }
-   
+
    // TODO insufficient permissions to test
-   @Test(description = "PUT /admin/vdc/{id}/metadata/{key}", dependsOnMethods = { "testGetMetadataValue" }, enabled=false )
+   @Test(description = "PUT /admin/vdc/{id}/metadata/{key}", dependsOnMethods = { "testGetMetadataValue" }, enabled = false)
    public void testSetMetadataValue() throws Exception {
       metadataValue = name("value-");
       MetadataValue newV = MetadataValue.builder().value(metadataValue).build();
-      
-      Task task = metadataApi.setMetadata(adminVdcUri, metadataKey, newV);
+
+      Task task = metadataApi.putEntry(metadataKey, newV);
       assertTaskSucceeds(task);
-      
-      MetadataValue retrievedMetadataValue = metadataApi.getMetadataValue(adminVdcUri, metadataKey);
+
+      MetadataValue retrievedMetadataValue = metadataApi.getValue(metadataKey);
       Checks.checkMetadataValueFor("AdminVdc", retrievedMetadataValue, metadataValue);
    }
-   
+
    // TODO insufficient permissions to test
-   @Test(description = "DELETE /admin/vdc/{id}/metadata/{key}", dependsOnMethods = { "testSetMetadataValue" }, enabled=false )
-   public void testDeleteMetadataValue() throws Exception {
-      // TODO Remove dependency on other tests; make cleanUp delete a list of metadata entries?
-      
-      Task task = metadataApi.deleteMetadataEntry(adminVdcUri, metadataKey);
+   @Test(description = "DELETE /admin/vdc/{id}/metadata/{key}", dependsOnMethods = { "testSetMetadataValue" }, enabled = false)
+   public void testRemoveMetadataValue() throws Exception {
+      // TODO Remove dependency on other tests; make cleanUp remove a list of metadata entries?
+
+      Task task = metadataApi.removeEntry(metadataKey);
       assertTaskSucceeds(task);
 
       try {
-         metadataApi.getMetadataValue(adminVdcUri, metadataKey);
-         fail("Retrieval of metadata value "+metadataKey+" should have fail after deletion");
+         metadataApi.getValue(metadataKey);
+         fail("Retrieval of metadata value " + metadataKey + " should have fail after deletion");
       } catch (VCloudDirectorException e) {
          // success; should not be accessible
       }
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupApiExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupApiExpectTest.java
index 90d0337..5601ad5 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupApiExpectTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupApiExpectTest.java
@@ -56,7 +56,7 @@
 
       Group expected = group();
 
-      assertEquals(api.getGroupApi().getGroup(groupRef.getHref()), expected);
+      assertEquals(api.getGroupApi().get(groupRef.getHref()), expected);
    }
    
    public static final Group group() {
@@ -66,28 +66,28 @@
    }
    
    @Test(enabled = false)
-   public void testUpdateGroup() {
+   public void testEditGroup() {
       VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
          new VcloudHttpRequestPrimer()
             .apiCommand("PUT", "/admin/group/???")
-            .xmlFilePayload("/group/updateGroupSource.xml", VCloudDirectorMediaType.GROUP)
+            .xmlFilePayload("/group/editGroupSource.xml", VCloudDirectorMediaType.GROUP)
             .acceptMedia(VCloudDirectorMediaType.GROUP)
             .httpRequestBuilder().build(), 
          new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/group/updateGroup.xml", VCloudDirectorMediaType.GROUP)
+            .xmlFilePayload("/group/editGroup.xml", VCloudDirectorMediaType.GROUP)
             .httpResponseBuilder().build());
 
-      Group expected = updateGroup();
+      Group expected = editGroup();
 
-      assertEquals(api.getGroupApi().updateGroup(groupRef.getHref(), expected), expected);
+      assertEquals(api.getGroupApi().edit(groupRef.getHref(), expected), expected);
    }
    
-   public static Group updateGroup() {
-      return null; // TODO chain onto group() then toBuilder() and modify?
+   public static Group editGroup() {
+      return null; // TODO chain onto group() then toBuilder() and edit?
    }
    
    @Test
-   public void testDeleteGroup() {
+   public void testRemoveGroup() {
       VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
             new VcloudHttpRequestPrimer()
                .apiCommand("DELETE", "/admin/group/???")
@@ -96,6 +96,6 @@
             new VcloudHttpResponsePrimer()
                .httpResponseBuilder().statusCode(204).build());
       
-      api.getCatalogApi().deleteCatalog(groupRef.getHref());
+      api.getGroupApi().remove(groupRef.getHref());
    }
 }
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupApiLiveTest.java
index cbf7d47..5226c29 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupApiLiveTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/GroupApiLiveTest.java
@@ -50,7 +50,6 @@
    /*
     * Shared state between dependant tests.
     */
-   private Reference groupRef;
    private Group group;
    private OrgLdapSettings oldLdapSettings, newLdapSettings;
    
@@ -61,15 +60,15 @@
       Reference orgRef = null;
       
       // TODO: requisite LDAP settings
-//      oldLdapSettings = adminContext.getApi().getAdminOrgApi().getLdapSettings(orgRef.getHref());
+//      oldLdapSettings = adminContext.getApi().getAdminOrgApi().getLdapSettings(orgRef.getId());
 //      OrgLdapSettings newLdapSettings = oldLdapSettings.toBuilder()
 //         .ldapMode(OrgLdapSettings.LdapMode.SYSTEM)  
 //         .build();
-//      context.getApi().getAdminOrgApi().updateLdapSettings(newLdapSettings);
+//      context.getApi().getAdminOrgApi().editLdapSettings(newLdapSettings);
    }
    
    @Test(description = "POST /admin/org/{id}/groups")
-   public void testCreateGroup() {
+   public void testAddGroup() {
       fail("LDAP not configured, group api isn't currently testable.");
 //      group = groupApi.createGroup(orgUri, Group.builder()
 //         .build();
@@ -77,15 +76,15 @@
       Checks.checkGroup(group);
    }
    
-   @Test(description = "GET /admin/group/{id}", dependsOnMethods = { "testCreateGroup" })
+   @Test(description = "GET /admin/group/{id}", dependsOnMethods = { "testAddGroup" })
    public void testGetGroup() {
-      group = groupApi.getGroup(groupRef.getHref());
+      group = groupApi.get(group.getId());
       
       Checks.checkGroup(group);
    }
    
    @Test(description = "PUT /admin/group/{id}", dependsOnMethods = { "testGetGroup" } )
-   public void testUpdateGroup() {
+   public void testEditGroup() {
       String oldName = group.getName();
       String newName = "new "+oldName;
       String oldDescription = group.getDescription();
@@ -98,7 +97,7 @@
                .description(newDescription)
                .build();
          
-         group = groupApi.updateGroup(group.getHref(), group);
+         group = groupApi.edit(group.getId(), group);
          
          assertTrue(equal(group.getName(), newName), String.format(OBJ_FIELD_UPDATABLE, GROUP, "name"));
          assertTrue(equal(group.getDescription(), newDescription),
@@ -113,13 +112,13 @@
                .description(oldDescription)
                .build();
          
-         group = groupApi.updateGroup(group.getHref(), group);
+         group = groupApi.edit(group.getId(), group);
       }
    }
    
-   @Test(description = "DELETE /admin/group/{id}", dependsOnMethods = { "testUpdateGroup" } )
-   public void testDeleteGroup() {
-      groupApi.deleteGroup(groupRef.getHref());
+   @Test(description = "DELETE /admin/group/{id}", dependsOnMethods = { "testEditGroup" } )
+   public void testRemoveGroup() {
+      groupApi.remove(group.getId());
       
       // TODO stronger assertion of error expected
 //      Error expected = Error.builder()
@@ -129,7 +128,7 @@
 //            .build();
       
       try {
-         group = groupApi.getGroup(groupRef.getHref());
+         group = groupApi.get(group.getId());
          fail("Should give HTTP 403 error");
       } catch (VCloudDirectorException vde) {
          // success
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/UserApiExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/UserApiExpectTest.java
index 1eacc74..4d05350 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/UserApiExpectTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/UserApiExpectTest.java
@@ -18,11 +18,18 @@
  */
 package org.jclouds.vcloud.director.v1_5.features.admin;
 
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ADMIN_ORG;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ENTITY;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ERROR;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ORG;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.USER;
 import static org.testng.Assert.assertEquals;
 
 import java.net.URI;
 import java.util.Collections;
 
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.HttpResponse;
 import org.jclouds.rest.ResourceNotFoundException;
 import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
 import org.jclouds.vcloud.director.v1_5.admin.VCloudDirectorAdminApi;
@@ -32,41 +39,200 @@
 import org.jclouds.vcloud.director.v1_5.internal.VCloudDirectorAdminApiExpectTest;
 import org.testng.annotations.Test;
 
+import com.google.common.net.HttpHeaders;
+
 /**
  * Test the {@link UserApi} by observing its side effects.
  * 
- * @author danikov
+ * @author danikov, Adrian Cole
  */
 @Test(groups = { "unit", "admin" }, singleThreaded = true, testName = "UserApiExpectTest")
 public class UserApiExpectTest extends VCloudDirectorAdminApiExpectTest {
    
-   private Reference orgRef = Reference.builder()
-         .href(URI.create(endpoint + "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"))
-         .build();
+   private static String user = "7212e451-76e1-4631-b2de-ba1dfd8080e4";
+   private static String userUrn = "urn:vcloud:user:" + user;
+   private static URI userHref = URI.create(endpoint + "/user/" + user);
    
-   private Reference userRef = Reference.builder()
-         .href(URI.create(endpoint + "/admin/user/b37223f3-8792-477a-820f-334998f61cd6"))
-         .build();
+   private static String org = "7212e451-76e1-4631-b2de-asdasdasd";
+   private static String orgUrn = "urn:vcloud:org:" + org;
+   private static URI orgHref = URI.create(endpoint + "/org/" + org);
+   private static URI orgAdminHref = URI.create(endpoint + "/admin/org/" + org);
+   
+   private HttpRequest add = HttpRequest.builder()
+            .method("POST")
+            .endpoint(orgAdminHref + "/users")
+            .addHeader("Accept", USER)
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+            .payload(payloadFromResourceWithContentType("/user/addUserSource.xml", VCloudDirectorMediaType.USER))
+            .build();
+
+   private HttpResponse addResponse = HttpResponse.builder()
+            .statusCode(200)
+            .payload(payloadFromResourceWithContentType("/user/addUser.xml", USER + ";version=1.5"))
+            .build();
+    
+   @Test
+   public void testAddUserHref() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, add, addResponse);
+      assertEquals(api.getUserApi().addUserToOrg(addUserSource(), orgAdminHref), addUser());
+   }
+
+   private HttpRequest resolveOrg = HttpRequest.builder()
+            .method("GET")
+            .endpoint(endpoint + "/entity/" + orgUrn)
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+            .build();
+   
+   private String orgEntity = asString(createXMLBuilder("Entity").a("xmlns", "http://www.vmware.com/vcloud/v1.5")
+                                                             .a("name", orgUrn)
+                                                             .a("id", orgUrn)
+                                                             .a("type", ENTITY)
+                                                             .a("href", endpoint + "/entity/" + userUrn)
+                                  .e("Link").a("rel", "alternate").a("type", ORG).a("href", orgHref.toString()).up()
+                                  .e("Link").a("rel", "alternate").a("type", ADMIN_ORG).a("href", orgAdminHref.toString()).up());
+   
+   private HttpResponse resolveOrgResponse = HttpResponse.builder()
+           .statusCode(200)
+           .payload(payloadFromStringWithContentType(orgEntity, ENTITY + ";version=1.5"))
+           .build();
    
    @Test
-   public void testCreateUser() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("POST", "/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0/users")
-            .xmlFilePayload("/user/createUserSource.xml", VCloudDirectorMediaType.USER)
-            .acceptMedia(VCloudDirectorMediaType.USER)
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/user/createUser.xml", VCloudDirectorMediaType.USER)
-            .httpResponseBuilder().build());
-
-      User source = createUserSource();
-      User expected = createUser();
-
-      assertEquals(api.getUserApi().createUser(orgRef.getHref(), source), expected);
+   public void testAddUserUrn() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, resolveOrg, resolveOrgResponse, add, addResponse);
+      assertEquals(api.getUserApi().addUserToOrg(addUserSource(), orgUrn), addUser());
    }
    
-   public static final User createUserSource() {
+   HttpRequest get = HttpRequest.builder()
+            .method("GET")
+            .endpoint(userHref)
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+            .build();
+
+    HttpResponse getResponse = HttpResponse.builder()
+            .statusCode(200)
+            .payload(payloadFromResourceWithContentType("/user/user.xml", ORG + ";version=1.5"))
+            .build();
+    
+   @Test
+   public void testGetUserHref() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, get, getResponse);
+      assertEquals(api.getUserApi().get(userHref), user());
+   }
+   
+   HttpRequest resolveUser = HttpRequest.builder()
+            .method("GET")
+            .endpoint(endpoint + "/entity/" + userUrn)
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+            .build();
+   
+   String userEntity = asString(createXMLBuilder("Entity").a("xmlns", "http://www.vmware.com/vcloud/v1.5")
+                                                             .a("name", userUrn)
+                                                             .a("id", userUrn)
+                                                             .a("type", ENTITY)
+                                                             .a("href", endpoint + "/entity/" + userUrn)
+                                  .e("Link").a("rel", "alternate").a("type", USER).a("href", userHref.toString()).up());
+   
+   HttpResponse resolveUserResponse = HttpResponse.builder()
+           .statusCode(200)
+           .payload(payloadFromStringWithContentType(userEntity, ENTITY + ";version=1.5"))
+           .build();
+   
+   @Test
+   public void testGetUserUrn() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, resolveUser, resolveUserResponse, get, getResponse);
+      assertEquals(api.getUserApi().get(userUrn), user());
+   }
+   
+   HttpRequest edit = HttpRequest.builder()
+            .method("PUT")
+            .endpoint(userHref)
+            .addHeader("Accept", USER)
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+            .payload(payloadFromResourceWithContentType("/user/editUserSource.xml", USER))
+            .build();
+
+   HttpResponse editResponse = HttpResponse.builder()
+            .statusCode(200)
+            .payload(payloadFromResourceWithContentType("/user/editUser.xml", USER))
+            .build();
+
+   @Test
+   public void testEditUserHref() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, edit, editResponse);
+      assertEquals(api.getUserApi().edit(userHref, editUserSource()), editUser());
+   }
+   
+   @Test
+   public void testEditUserUrn() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, resolveUser, resolveUserResponse, edit, editResponse);
+      assertEquals(api.getUserApi().edit(userUrn, editUserSource()), editUser());
+   }
+   
+   HttpRequest unlock = HttpRequest.builder()
+            .method("POST")
+            .endpoint(userHref + "/action/unlock")
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token)
+            .build();
+
+   HttpResponse unlockResponse = HttpResponse.builder()
+            .statusCode(204)
+            .build();
+
+   @Test
+   public void testUnlockUserHref() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, unlock, unlockResponse);
+      api.getUserApi().unlock(userHref);
+   }
+   
+   @Test(expectedExceptions = ResourceNotFoundException.class)
+   public void testUnlockUserHrefNotFound() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, unlock,  HttpResponse.builder()
+               .statusCode(403)
+               .payload(payloadFromResourceWithContentType("/org/error400.xml", ERROR))
+               .build());
+      api.getUserApi().unlock(userHref);
+   }
+   
+   @Test
+   public void testUnlockUserUrn() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, resolveUser, resolveUserResponse, unlock, unlockResponse);
+      api.getUserApi().unlock(userUrn);
+   }
+   
+   HttpRequest remove = HttpRequest.builder()
+            .method("DELETE")
+            .endpoint(userHref)
+            .addHeader("Accept", "*/*")
+            .addHeader("x-vcloud-authorization", token)
+            .addHeader(HttpHeaders.COOKIE, "vcloud-token=" + token).build();
+
+   HttpResponse removeResponse = HttpResponse.builder()
+            .statusCode(200)
+            .build();
+      
+   @Test
+   public void testRemoveUserHref() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, remove, removeResponse);
+      api.getUserApi().remove(userHref);
+   }
+
+   @Test
+   public void testRemoveUserUrn() {
+      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, resolveUser, resolveUserResponse, remove, removeResponse);
+      api.getUserApi().remove(userUrn);
+   }
+   
+   public static final User addUserSource() {
       return User.builder()
             .name("test")
             .fullName("testFullName")
@@ -89,8 +255,8 @@
             .build();
    }
    
-   public static final User createUser() {
-      return createUserSource().toBuilder()
+   public static final User addUser() {
+      return addUserSource().toBuilder()
          .id("urn:vcloud:user:b37223f3-8792-477a-820f-334998f61cd6")
          .type("application/vnd.vmware.admin.user+xml")
          .href(URI.create("https://vcloudbeta.bluelock.com/api/admin/user/b37223f3-8792-477a-820f-334998f61cd6"))
@@ -111,47 +277,13 @@
          .build();
    }
    
-   @Test
-   public void testGetUser() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("GET", "/admin/user/b37223f3-8792-477a-820f-334998f61cd6")
-            .acceptAnyMedia()
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/user/user.xml", VCloudDirectorMediaType.USER)
-            .httpResponseBuilder().build());
-
-      User expected = user();
-
-      assertEquals(api.getUserApi().getUser(userRef.getHref()), expected);
-   }
-   
    public static final User user() {
-      return createUser().toBuilder()
+      return addUser().toBuilder()
          .nameInSource("test")
          .build();
    }
- 
-   @Test
-   public void testUpdateUser() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
-         new VcloudHttpRequestPrimer()
-            .apiCommand("PUT", "/admin/user/b37223f3-8792-477a-820f-334998f61cd6")
-            .xmlFilePayload("/user/updateUserSource.xml", VCloudDirectorMediaType.USER)
-            .acceptMedia(VCloudDirectorMediaType.USER)
-            .httpRequestBuilder().build(), 
-         new VcloudHttpResponsePrimer()
-            .xmlFilePayload("/user/updateUser.xml", VCloudDirectorMediaType.USER)
-            .httpResponseBuilder().build());
 
-      User source = updateUserSource();
-      User expected = updateUser();
-
-      assertEquals(api.getUserApi().updateUser(userRef.getHref(), source), expected);
-   }
-   
-   public static final User updateUserSource() {
+   public static final User editUserSource() {
       return user().toBuilder()
          .fullName("new"+user().getFullName())
          .emailAddress("new"+user().getEmailAddress())
@@ -167,50 +299,10 @@
          .build();
    }
    
-   public static final User updateUser() {
-      return updateUserSource().toBuilder()
+   public static final User editUser() {
+      return editUserSource().toBuilder()
          .password(null)
          .build();
    }
  
-   @Test
-   public void testDeleteUser() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse, 
-            new VcloudHttpRequestPrimer()
-               .apiCommand("DELETE", "/admin/user/b37223f3-8792-477a-820f-334998f61cd6")
-               .acceptAnyMedia()
-               .httpRequestBuilder().build(), 
-            new VcloudHttpResponsePrimer()
-               .httpResponseBuilder().statusCode(204).build());
-      
-      api.getUserApi().deleteUser(userRef.getHref());
-   }
-   
-   @Test
-   public void testUnlockUser() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse,
-            new VcloudHttpRequestPrimer()
-                  .apiCommand("POST", "/admin/user/b37223f3-8792-477a-820f-334998f61cd6/action/unlock")
-                  .acceptAnyMedia()
-                  .httpRequestBuilder().build(),
-            new VcloudHttpResponsePrimer()
-                  .httpResponseBuilder().statusCode(204).build());
-
-      api.getUserApi().unlockUser(userRef.getHref());
-   }
-
-   @Test(expectedExceptions = ResourceNotFoundException.class)
-   public void testUnlockUserFailNotFound() {
-      VCloudDirectorAdminApi api = requestsSendResponses(loginRequest, sessionResponse,
-            new VcloudHttpRequestPrimer()
-                  .apiCommand("POST", "/admin/user/b37223f3-8792-477a-820f-334998f61cd6/action/unlock")
-                  .acceptAnyMedia()
-                  .httpRequestBuilder().build(),
-            new VcloudHttpResponsePrimer()
-                  .httpResponseBuilder().statusCode(403)
-                  .payload(payloadFromResourceWithContentType("/org/error400.xml", VCloudDirectorMediaType.ERROR))
-                  .build());
-
-      api.getUserApi().unlockUser(userRef.getHref());
-   }
 }
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/UserApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/UserApiLiveTest.java
index e399146..3cacca0 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/UserApiLiveTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/features/admin/UserApiLiveTest.java
@@ -30,7 +30,6 @@
 import java.net.URI;
 
 import org.jclouds.rest.AuthorizationException;
-import org.jclouds.vcloud.director.v1_5.domain.Reference;
 import org.jclouds.vcloud.director.v1_5.domain.Role.DefaultRoles;
 import org.jclouds.vcloud.director.v1_5.domain.SessionWithToken;
 import org.jclouds.vcloud.director.v1_5.domain.User;
@@ -41,8 +40,6 @@
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
-import com.google.common.collect.Iterables;
-
 /**
  * Tests live behavior of {@link UserApi}.
  * 
@@ -61,21 +58,19 @@
    /*
     * Shared state between dependant tests.
     */
-   private Reference orgRef;
    private User user;
 
    @Override
    @BeforeClass(alwaysRun = true)
    public void setupRequiredApis() {
       userApi = adminContext.getApi().getUserApi();
-      orgRef = Iterables.getFirst(context.getApi().getOrgApi().getOrgList().getOrgs(), null).toAdminReference(endpoint);
    }
    
    @AfterClass(alwaysRun = true)
    public void cleanUp() throws Exception {
       if (user != null) {
          try {
-            userApi.deleteUser(user.getHref());
+            userApi.remove(user.getHref());
          } catch (Exception e) {
             logger.warn(e, "Error deleting user '%s'", user.getName());
          }
@@ -83,21 +78,21 @@
    }
    
    @Test(description = "POST /admin/org/{id}/users")
-   public void testCreateUser() {
-      User newUser = randomTestUser("testCreateUser");
-      user = userApi.createUser(orgRef.getHref(), newUser);
+   public void testAddUser() {
+      User newUser = randomTestUser("testAddUser");
+      user = userApi.addUserToOrg(newUser, org.getId());
       checkUser(newUser);
    }
    
-   @Test(description = "GET /admin/user/{id}", dependsOnMethods = { "testCreateUser" })
+   @Test(description = "GET /admin/user/{id}", dependsOnMethods = { "testAddUser" })
    public void testGetUser() {
-      user = userApi.getUser(user.getHref());
+      user = userApi.get(user.getHref());
       
       checkUser(user);
    }
  
    @Test(description = "PUT /admin/user/{id}", dependsOnMethods = { "testGetUser" })
-   public void testUpdateUser() {
+   public void testEditUser() {
       User oldUser = user.toBuilder().build();
       User newUser = user.toBuilder()
          .fullName("new"+oldUser.getFullName())
@@ -116,8 +111,8 @@
          .role(getRoleReferenceFor(DefaultRoles.AUTHOR.value()))
          .build();
       
-      userApi.updateUser(user.getHref(), newUser);
-      user = userApi.getUser(user.getHref());
+      userApi.edit(user.getHref(), newUser);
+      user = userApi.get(user.getHref());
       
       checkUser(user);
       assertTrue(equal(user.getFullName(), newUser.getFullName()), 
@@ -148,12 +143,12 @@
 
       // Check the user can really login with the changed password
       // NOTE: the password is NOT returned in the User object returned from the server
-      SessionWithToken sessionWithToken = sessionApi.loginUserInOrgWithPassword(URI.create(endpoint + "/sessions"), user.getName(), orgRef.getName(), "newPassword");
+      SessionWithToken sessionWithToken = sessionApi.loginUserInOrgWithPassword(URI.create(endpoint + "/sessions"), user.getName(), org.getName(), "newPassword");
       assertNotNull(sessionWithToken.getToken());
       sessionApi.logoutSessionWithToken(sessionWithToken.getSession().getHref(), sessionWithToken.getToken());
    }
  
-   @Test(description = "POST /admin/user/{id}/action/unlock", dependsOnMethods = { "testUpdateUser" })
+   @Test(description = "POST /admin/user/{id}/action/unlock", dependsOnMethods = { "testEditUser" })
    public void testUnlockUser() {
       // Need to know how many times to fail login to lock account
       AdminOrgApi adminOrgApi = adminContext.getApi().getOrgApi();
@@ -162,21 +157,21 @@
       // session api isn't typically exposed to the user, as it is implicit
       SessionApi sessionApi = context.utils().injector().getInstance(SessionApi.class);
       
-      OrgPasswordPolicySettings settings = adminOrgApi.getSettings(orgRef.getHref()).getPasswordPolicy();
+      OrgPasswordPolicySettings settings = adminOrgApi.getSettings(org.getId()).getPasswordPolicy();
       assertNotNull(settings);
 
       // Adjust account settings so we can lock the account - be careful to not set invalidLoginsBeforeLockout too low!
       if (!settings.isAccountLockoutEnabled()) {
          settingsToRevertTo = settings;
          settings = settings.toBuilder().accountLockoutEnabled(true).invalidLoginsBeforeLockout(5).build();
-         settings = adminOrgApi.updatePasswordPolicy(orgRef.getHref(), settings);
+         settings = adminOrgApi.editPasswordPolicy(org.getId(), settings);
       }
 
       assertTrue(settings.isAccountLockoutEnabled());
       
       for (int i = 0; i < settings.getInvalidLoginsBeforeLockout() + 1; i++) {
          try {
-            sessionApi.loginUserInOrgWithPassword(URI.create(endpoint + "/sessions"), user.getName(), orgRef.getName(), "wrongpassword!");
+            sessionApi.loginUserInOrgWithPassword(URI.create(endpoint + "/sessions"), user.getName(), org.getName(), "wrongpassword!");
             fail("Managed to login using the wrong password!");
          } catch (AuthorizationException e) {
          } catch (Exception e) {
@@ -184,44 +179,44 @@
          }
       }
       
-      user = userApi.getUser(user.getHref());
+      user = userApi.get(user.getHref());
       assertTrue(user.isLocked());
 
       try {
-         sessionApi.loginUserInOrgWithPassword(URI.create(endpoint + "/sessions"), user.getName(), orgRef.getName(), "newPassword");
+         sessionApi.loginUserInOrgWithPassword(URI.create(endpoint + "/sessions"), user.getName(), org.getName(), "newPassword");
          fail("Managed to login to locked account!");
       } catch (AuthorizationException e) {
       } catch (Exception e) {
          fail("Expected AuthorizationException", e);
       }
       
-      userApi.unlockUser(user.getHref());
+      userApi.unlock(user.getHref());
 
-      user = userApi.getUser(user.getHref());
+      user = userApi.get(user.getHref());
       assertFalse(user.isLocked());
 
       // Double-check the user can now login again
-      SessionWithToken sessionWithToken = sessionApi.loginUserInOrgWithPassword(URI.create(endpoint + "/sessions"), user.getName(), orgRef.getName(), "newPassword");
+      SessionWithToken sessionWithToken = sessionApi.loginUserInOrgWithPassword(URI.create(endpoint + "/sessions"), user.getName(), org.getName(), "newPassword");
       assertNotNull(sessionWithToken.getToken());
       sessionApi.logoutSessionWithToken(sessionWithToken.getSession().getHref(), sessionWithToken.getToken());
       
       // Return account settings to the previous values, if necessary
       if (settingsToRevertTo != null) {
-         adminOrgApi.updatePasswordPolicy(orgRef.getHref(), settingsToRevertTo);
+         adminOrgApi.editPasswordPolicy(org.getId(), settingsToRevertTo);
       }
    }
  
-   @Test(description = "DELETE /admin/user/{id}", dependsOnMethods = { "testCreateUser" })
-   public void testDeleteUser() {
-      // Create a user to be deleted (so we remove dependencies on test ordering)
-      User newUser = randomTestUser("testDeleteUser"+getTestDateTimeStamp());
-      User userToBeDeleted = userApi.createUser(orgRef.getHref(), newUser);
+   @Test(description = "DELETE /admin/user/{id}", dependsOnMethods = { "testAddUser" })
+   public void testRemoveUser() {
+      // Create a user to be removed (so we remove dependencies on test ordering)
+      User newUser = randomTestUser("testRemoveUser"+getTestDateTimeStamp());
+      User userToBeDeleted = userApi.addUserToOrg(newUser, org.getId());
 
       // Delete the user
-      userApi.deleteUser(userToBeDeleted.getHref());
+      userApi.remove(userToBeDeleted.getHref());
 
       // Confirm cannot no longer be accessed 
-      User deleted = userApi.getUser(userToBeDeleted.getHref());
-      assertNull(deleted);
+      User removed = userApi.get(userToBeDeleted.getHref());
+      assertNull(removed);
    }
 }
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorApiLiveTest.java
index 5ce92f6..55fef1f 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorApiLiveTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorApiLiveTest.java
@@ -18,8 +18,27 @@
  */
 package org.jclouds.vcloud.director.v1_5.internal;
 
+import static com.google.common.base.Predicates.and;
+import static com.google.common.base.Strings.emptyToNull;
+import static com.google.common.collect.Iterables.any;
+import static com.google.common.collect.Iterables.contains;
+import static com.google.common.collect.Iterables.find;
+import static com.google.common.collect.Iterables.getFirst;
+import static com.google.common.collect.Iterables.tryFind;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.ENTITY_NON_NULL;
 import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.TASK_COMPLETE_TIMELY;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorLiveTestConstants.URN_REQ_LIVE;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.CATALOG;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.NETWORK;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.ORG_NETWORK;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.USER;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.VAPP;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.VAPP_TEMPLATE;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.VDC;
+import static org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType.VM;
+import static org.jclouds.vcloud.director.v1_5.predicates.LinkPredicates.relEquals;
+import static org.jclouds.vcloud.director.v1_5.predicates.LinkPredicates.typeEquals;
+import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.assertTrue;
 import static org.testng.Assert.fail;
@@ -28,7 +47,6 @@
 import java.text.SimpleDateFormat;
 import java.util.Collections;
 import java.util.Date;
-import java.util.Properties;
 import java.util.Random;
 import java.util.Set;
 
@@ -37,6 +55,7 @@
 
 import org.jclouds.apis.BaseContextLiveTest;
 import org.jclouds.date.DateService;
+import org.jclouds.io.Payloads;
 import org.jclouds.logging.Logger;
 import org.jclouds.predicates.RetryablePredicate;
 import org.jclouds.rest.RestContext;
@@ -44,9 +63,13 @@
 import org.jclouds.vcloud.director.v1_5.VCloudDirectorApiMetadata;
 import org.jclouds.vcloud.director.v1_5.VCloudDirectorContext;
 import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
-import org.jclouds.vcloud.director.v1_5.admin.VCloudDirectorAdminAsyncApi;
 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.domain.Catalog;
+import org.jclouds.vcloud.director.v1_5.domain.Checks;
 import org.jclouds.vcloud.director.v1_5.domain.Link;
+import org.jclouds.vcloud.director.v1_5.domain.Link.Rel;
+import org.jclouds.vcloud.director.v1_5.domain.Media;
 import org.jclouds.vcloud.director.v1_5.domain.Reference;
 import org.jclouds.vcloud.director.v1_5.domain.ResourceEntity.Status;
 import org.jclouds.vcloud.director.v1_5.domain.Role.DefaultRoles;
@@ -57,6 +80,7 @@
 import org.jclouds.vcloud.director.v1_5.domain.VApp;
 import org.jclouds.vcloud.director.v1_5.domain.VAppTemplate;
 import org.jclouds.vcloud.director.v1_5.domain.Vdc;
+import org.jclouds.vcloud.director.v1_5.domain.Vm;
 import org.jclouds.vcloud.director.v1_5.domain.network.Network;
 import org.jclouds.vcloud.director.v1_5.domain.network.NetworkConfiguration;
 import org.jclouds.vcloud.director.v1_5.domain.network.VAppNetworkConfiguration;
@@ -69,32 +93,31 @@
 import org.jclouds.vcloud.director.v1_5.features.VAppApi;
 import org.jclouds.vcloud.director.v1_5.features.VAppTemplateApi;
 import org.jclouds.vcloud.director.v1_5.features.VdcApi;
+import org.jclouds.vcloud.director.v1_5.predicates.LinkPredicates;
 import org.jclouds.vcloud.director.v1_5.predicates.ReferencePredicates;
 import org.jclouds.vcloud.director.v1_5.predicates.TaskStatusEquals;
 import org.jclouds.vcloud.director.v1_5.predicates.TaskSuccess;
-import org.jclouds.vcloud.director.v1_5.user.VCloudDirectorAsyncApi;
 import org.jclouds.vcloud.director.v1_5.user.VCloudDirectorApi;
-import org.testng.annotations.AfterClass;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Listeners;
 import org.testng.annotations.Test;
 
+import com.google.common.base.Function;
+import com.google.common.base.Objects;
 import com.google.common.base.Optional;
 import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
-import com.google.common.base.Splitter;
-import com.google.common.base.Strings;
+import com.google.common.collect.FluentIterable;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
-import com.google.common.io.Closeables;
 import com.google.common.reflect.TypeToken;
 import com.google.inject.Guice;
 
 /**
  * Tests behavior of {@link VCloudDirectorApi} and acts as parent for other api live tests.
- *
+ * 
  * @author Adrian Cole
  * @author grkvlt@apache.org
  */
@@ -108,9 +131,6 @@
    protected static final long TASK_TIMEOUT_SECONDS = 100L;
    protected static final long LONG_TASK_TIMEOUT_SECONDS = 300L;
 
-   public static final String VAPP = "vApp";
-   public static final String VAPP_TEMPLATE = "vAppTemplate";
-   public static final String VDC = "vdc";
    public static final int REQUIRED_ADMIN_VM_QUOTA = 0;
    public static final int REQUIRED_USER_VM_QUOTA = 0;
 
@@ -118,17 +138,24 @@
    public Predicate<Task> retryTaskSuccessLong;
 
    protected RestContext<VCloudDirectorAdminApi, VCloudDirectorAdminAsyncApi> adminContext;
-   protected RestContext<VCloudDirectorApi, VCloudDirectorAsyncApi> context; // FIXME: rename to userContext?
+
    protected Session adminSession;
    protected Session session;
 
-   protected String catalogId;
-   protected URI catalogURI;
-   protected URI vAppTemplateURI;
-   protected URI mediaURI;
-   protected URI networkURI;
-   protected URI vdcURI;
-   protected URI userURI;
+   protected String orgUrn;
+   protected Org org;
+   protected String catalogUrn;
+   private Catalog catalog;
+   protected String vAppTemplateUrn;
+   private VAppTemplate vAppTemplate;
+   protected String mediaUrn;
+   private Media media;
+   protected String networkUrn;
+   private Network network;
+   protected String vdcUrn;
+   private Vdc vdc;
+   protected String userUrn;
+   private User user;
 
    protected final Set<String> vAppNames = Sets.newLinkedHashSet();
    protected static final Random random = new Random();
@@ -139,8 +166,6 @@
 
    protected DateService dateService;
 
-   protected VCloudDirectorTestSession testSession;
-
    protected static String testStamp;
 
    @BeforeClass(alwaysRun = true)
@@ -162,29 +187,13 @@
       retryTaskSuccessLong = new RetryablePredicate<Task>(taskSuccess, LONG_TASK_TIMEOUT_SECONDS * 1000L);
    }
 
-   @AfterClass(alwaysRun = true)
-   protected void tearDownTestSession() {
-      Closeables.closeQuietly(testSession);
-   }
+   @BeforeClass(groups = { "integration", "live" })
+   public void setupContext() {
+      super.setupContext();
+      adminContext = context.getAdminContext();
 
-   @Override
-   protected void initializeContext() {
-      Properties overrides = setupProperties();
-      testSession = VCloudDirectorTestSession.builder()
-            .provider(provider)
-            .identity(identity)
-            .credential(credential)
-            .endpoint(endpoint)
-            .overrides(overrides)
-            .build();
-
-      context = testSession.getUserContext();
-      adminContext = testSession.getAdminContext();
-
-      if (adminContext != null) {
-         adminSession = adminContext.getApi().getCurrentSession();
-         adminContext.utils().injector().injectMembers(this);
-      }
+      adminSession = adminContext.getApi().getCurrentSession();
+      adminContext.utils().injector().injectMembers(this);
 
       session = context.getApi().getCurrentSession();
       context.utils().injector().injectMembers(this);
@@ -205,10 +214,12 @@
       return getRoleReferenceFor(name, adminContext);
    }
 
-   public static Reference getRoleReferenceFor(String name, RestContext<VCloudDirectorAdminApi, VCloudDirectorAdminAsyncApi> adminContext) {
+   public static Reference getRoleReferenceFor(String name,
+            RestContext<VCloudDirectorAdminApi, VCloudDirectorAdminAsyncApi> adminContext) {
       RoleReferences roles = adminContext.getApi().getQueryApi().roleReferencesQueryAll();
       // backend in a builder to strip out unwanted xml cruft that the api chokes on
-      return Reference.builder().fromReference(Iterables.find(roles.getReferences(), ReferencePredicates.nameEquals(name))).build();
+      return Reference.builder().fromReference(find(roles.getReferences(), ReferencePredicates.nameEquals(name)))
+               .build();
    }
 
    public User randomTestUser(String prefix) {
@@ -216,76 +227,309 @@
    }
 
    public User randomTestUser(String prefix, Reference role) {
-      return User.builder()
-         .name(name(prefix)+getTestDateTimeStamp())
-         .fullName("testFullName")
-         .emailAddress("test@test.com")
-         .telephone("555-1234")
-         .isEnabled(false)
-         .im("testIM")
-         .isAlertEnabled(false)
-         .alertEmailPrefix("testPrefix")
-         .alertEmail("testAlert@test.com")
-         .isExternal(false)
-         .isGroupRole(false)
-         .role(role)
-         .password("password")
-         .build();
+      return User.builder().name(name(prefix) + getTestDateTimeStamp()).fullName("testFullName")
+               .emailAddress("test@test.com").telephone("555-1234").isEnabled(false).im("testIM").isAlertEnabled(false)
+               .alertEmailPrefix("testPrefix").alertEmail("testAlert@test.com").isExternal(false).isGroupRole(false)
+               .role(role).password("password").build();
    }
 
-   // TODO change properties to URI, not id
    protected void initTestParametersFromPropertiesOrLazyDiscover() {
-      catalogId = Strings.emptyToNull(System.getProperty("test." + provider + ".catalog-id"));
-      if (catalogId != null) {
-         catalogURI = URI.create(endpoint + "/catalog/" + catalogId);
-      }
+      catalogUrn = emptyToNull(System.getProperty("test." + provider + ".catalog-id"));
 
-      String vAppTemplateId = Strings.emptyToNull(System.getProperty("test." + provider + ".vapptemplate-id"));
-      if (vAppTemplateId != null)
-         vAppTemplateURI = URI.create(endpoint + "/vAppTemplate/" + vAppTemplateId);
+      vAppTemplateUrn = emptyToNull(System.getProperty("test." + provider + ".vapptemplate-id"));
 
-      String vdcId = Strings.emptyToNull(System.getProperty("test." + provider + ".vdc-id"));
-      if (vdcId != null)
-         vdcURI = URI.create(endpoint + "/vdc/" + vdcId);
+      vdcUrn = emptyToNull(System.getProperty("test." + provider + ".vdc-id"));
 
-      String mediaId = Strings.emptyToNull(System.getProperty("test." + provider + ".media-id"));
-      if (mediaId != null)
-         mediaURI = URI.create(endpoint + "/media/" + mediaId);
+      mediaUrn = emptyToNull(System.getProperty("test." + provider + ".media-id"));
 
-      String networkId = Strings.emptyToNull(System.getProperty("test." + provider + ".network-id"));
-      if (networkId != null)
-         networkURI = URI.create(endpoint + "/network/" + networkId);
+      networkUrn = emptyToNull(System.getProperty("test." + provider + ".network-id"));
 
-      String userId = Strings.emptyToNull(System.getProperty("test." + provider + ".user-id"));
-      if (userId != null)
-         userURI = URI.create(endpoint + "/admin/user/" + userId);
+      userUrn = emptyToNull(System.getProperty("test." + provider + ".user-id"));
 
-      if (Iterables.any(Lists.newArrayList(vAppTemplateURI, networkURI, vdcURI), Predicates.isNull())) {
-         Org thisOrg = context.getApi().getOrgApi().getOrg(
-                  Iterables.find(context.getApi().getOrgApi().getOrgList().getOrgs(),
-                           ReferencePredicates.<Reference> nameEquals(session.getOrg())).getHref());
+      org = context
+               .getApi()
+               .getOrgApi()
+               .get(find(context.getApi().getOrgApi().list(), ReferencePredicates.<Reference> nameEquals(session.get()))
+                        .getHref());
+      orgUrn = org.getId();
 
-         if (vdcURI == null)
-            vdcURI = Iterables.find(thisOrg.getLinks(),
-                     ReferencePredicates.<Link> typeEquals(VCloudDirectorMediaType.VDC)).getHref();
+      if (any(Lists.newArrayList(vAppTemplateUrn, networkUrn, vdcUrn), Predicates.isNull())) {
 
-         if (networkURI == null)
-            networkURI = Iterables.find(thisOrg.getLinks(),
-                     ReferencePredicates.<Link> typeEquals(VCloudDirectorMediaType.ORG_NETWORK)).getHref();
+         if (vdcUrn == null) {
+            vdc = context.getApi().getVdcApi()
+                     .get(find(org.getLinks(), ReferencePredicates.<Link> typeEquals(VDC)).getHref());
+            vdcUrn = vdc.getId();
 
-         // FIXME the URI should be opaque
-         if (Strings.isNullOrEmpty(catalogId)) {
-            String uri = Iterables.find(thisOrg.getLinks(),
-                     ReferencePredicates.<Link> typeEquals(VCloudDirectorMediaType.CATALOG)).getHref().toASCIIString();
-            catalogId = Iterables.getLast(Splitter.on('/').split(uri));
+            if (vAppTemplateUrn == null) {
+               Optional<VAppTemplate> optionalvAppTemplate = tryFindVAppTemplateInOrg();
+               if (optionalvAppTemplate.isPresent()) {
+               vAppTemplate = optionalvAppTemplate.get();
+               vAppTemplateUrn = vAppTemplate.getId();
+               }
+            }
+
+         }
+
+         if (networkUrn == null) {
+            Optional<Network> optionalNetwork = tryFindBridgedNetworkInOrg();
+            if (optionalNetwork.isPresent()) {
+               network = optionalNetwork.get();
+               networkUrn = network.getId();
+            }
+         }
+
+         if (catalogUrn == null) {
+            Optional<Catalog> optionalCatalog = tryFindWritableCatalogInOrg();
+            if (optionalCatalog.isPresent()) {
+               catalog = optionalCatalog.get();
+               catalogUrn = catalog.getId();
+            }
          }
       }
    }
 
+   Function<VAppTemplate, String> prettyVAppTemplate = new Function<VAppTemplate, String>() {
+
+      @Override
+      public String apply(VAppTemplate input) {
+         return Objects.toStringHelper("").omitNullValues().add("name", input.getName()).add("id", input.getId())
+                  .add("owner", input.getOwner()).toString();
+      }
+
+   };
+   
+   public Optional<VAppTemplate> tryFindVAppTemplateInOrg() {
+      FluentIterable<VAppTemplate> vAppTemplates =  FluentIterable.from(vdc.getResourceEntities())
+               .filter(ReferencePredicates.<Reference> typeEquals(VAPP_TEMPLATE))
+               .transform(new Function<Reference, VAppTemplate>() {
+
+                  @Override
+                  public VAppTemplate apply(Reference in) {
+                     return context.getApi().getVAppTemplateApi().get(in.getHref());
+                  }})
+               .filter(Predicates.notNull());      
+      
+      Optional<VAppTemplate> optionalVAppTemplate = tryFind(vAppTemplates, new Predicate<VAppTemplate>() {
+
+         @Override
+         public boolean apply(VAppTemplate input) {
+            return input.getOwner().getUser().getName().equals(session.getUser());
+         }
+
+      });
+      
+      if (optionalVAppTemplate.isPresent()) {
+         Logger.CONSOLE.info("found vAppTemplate: %s", prettyVAppTemplate.apply(optionalVAppTemplate.get()));
+      } else {
+         Logger.CONSOLE.warn("%s doesn't own any vApp Template in org %s; vApp templates: %s", context.getApi()
+                  .getCurrentSession().getUser(), org.getName(), Iterables.transform(vAppTemplates, prettyVAppTemplate));
+      }
+
+      return optionalVAppTemplate;
+   }
+   
+   Function<Vm, String> prettyVm = new Function<Vm, String>() {
+
+      @Override
+      public String apply(Vm input) {
+         return Objects.toStringHelper("").omitNullValues().add("name", input.getName()).add("id", input.getId()).toString();
+      }
+
+   };
+   
+   public Optional<Vm> tryFindVmInOrg() {
+      FluentIterable<Vm> vms =  FluentIterable.from(vdc.getResourceEntities())
+               .filter(ReferencePredicates.<Reference> typeEquals(VM))
+               .transform(new Function<Reference, Vm>() {
+
+                  @Override
+                  public Vm apply(Reference in) {
+                     return context.getApi().getVmApi().get(in.getHref());
+                  }})
+               .filter(Predicates.notNull());      
+      
+      Optional<Vm> optionalVm = tryFind(vms, new Predicate<Vm>() {
+
+         @Override
+         public boolean apply(Vm input) {
+            return input.getId() != null;
+         }
+
+      });
+      
+      if (optionalVm.isPresent()) {
+         Logger.CONSOLE.info("found vAppTemplate: %s", prettyVm.apply(optionalVm.get()));
+      } else {
+         Logger.CONSOLE.warn("%s doesn't have any vm in org %s; vms: %s", context.getApi()
+                  .getCurrentSession().getUser(), org.getName(), Iterables.transform(vms, prettyVm));
+      }
+      
+      return optionalVm;
+   }   
+   
+   Function<Catalog, String> prettyCatalog = new Function<Catalog, String>() {
+
+      @Override
+      public String apply(Catalog input) {
+         return Objects.toStringHelper("").omitNullValues().add("name", input.getName()).add("id", input.getId())
+                  .add("owner", input.getOwner()).add("isPublished", input.isPublished()).toString();
+      }
+
+   };
+
+   /**
+    * If I can add to a catalog, I can write to it
+    */
+   public Optional<Catalog> tryFindWritableCatalogInOrg() {
+      FluentIterable<Catalog> catalogs = FluentIterable.from(org.getLinks())
+               .filter(ReferencePredicates.<Link> typeEquals(CATALOG)).transform(new Function<Link, Catalog>() {
+                  @Override
+                  public Catalog apply(Link in) {
+                     return context.getApi().getCatalogApi().get(in.getHref());
+                  }
+               });
+
+      Optional<Catalog> optionalCatalog = tryFind(catalogs, new Predicate<Catalog>() {
+
+         @Override
+         public boolean apply(Catalog input) {
+            return Iterables.any(input.getLinks(), LinkPredicates.relEquals(Rel.ADD));
+         }
+
+      });
+      if (optionalCatalog.isPresent()) {
+         Logger.CONSOLE.info("found catalog: %s", prettyCatalog.apply(optionalCatalog.get()));
+      } else {
+         Logger.CONSOLE.warn("%s doesn't own any catalogs in org %s; catalogs: %s", context.getApi()
+                  .getCurrentSession().getUser(), org.getName(), Iterables.transform(catalogs, prettyCatalog));
+      }
+      return optionalCatalog;
+   }
+
+   Function<Network, String> prettyNetwork = new Function<Network, String>() {
+
+      @Override
+      public String apply(Network input) {
+         return Objects.toStringHelper("").omitNullValues().add("name", input.getName()).add("id", input.getId())
+                  .add("fenceMode", input.getConfiguration().getFenceMode())
+                  .add("taskCount", input.getTasks().size() > 0 ? input.getTasks().size() : null).toString();
+      }
+
+   };
+   
+   public Optional<Network> tryFindBridgedNetworkInOrg() {
+      FluentIterable<Network> networks = FluentIterable.from(org.getLinks())
+               .filter(ReferencePredicates.<Link> typeEquals(ORG_NETWORK)).transform(new Function<Link, Network>() {
+                  @Override
+                  public Network apply(Link in) {
+                     return context.getApi().getNetworkApi().get(in.getHref());
+                  }
+               });
+
+      Optional<Network> optionalNetwork = tryFind(networks, new Predicate<Network>() {
+
+         @Override
+         public boolean apply(Network input) {
+            if (input.getConfiguration().getFenceMode().equals(Network.FenceMode.BRIDGED)) {
+               if (input.getTasks().size() == 0) {
+                  return true;
+               }
+            }
+            return false;
+         }
+
+      });
+      if (optionalNetwork.isPresent()) {
+         Logger.CONSOLE.info("found network: %s", prettyNetwork.apply(optionalNetwork.get()));
+      } else {
+         Logger.CONSOLE.warn("no ready bridged networks present in org %s; networks: %s", org.getName(),
+                  Iterables.transform(networks, prettyNetwork));
+      }
+      return optionalNetwork;
+   }
+
+   protected Vdc lazyGetVdc() {
+      if (vdc == null) {
+         assertNotNull(vdcUrn, String.format(URN_REQ_LIVE, VDC));
+         vdc = context.getApi().getVdcApi().get(vdcUrn);
+         assertNotNull(vdc, String.format(ENTITY_NON_NULL, VDC));
+      }
+      return vdc;
+   }
+
+   protected Network lazyGetNetwork() {
+      if (network == null) {
+         assertNotNull(networkUrn, String.format(URN_REQ_LIVE, NETWORK));
+         network = context.getApi().getNetworkApi().get(networkUrn);
+         assertNotNull(network, String.format(ENTITY_NON_NULL, NETWORK));
+      }
+      return network;
+   }
+
+   protected Catalog lazyGetCatalog() {
+      if (catalog == null) {
+         assertNotNull(catalogUrn, String.format(URN_REQ_LIVE, CATALOG));
+         catalog = context.getApi().getCatalogApi().get(catalogUrn);
+         assertNotNull(catalog, String.format(ENTITY_NON_NULL, CATALOG));
+      }
+      return catalog;
+   }
+
+   protected User lazyGetUser() {
+      if (user == null) {
+         assertNotNull(userUrn, String.format(URN_REQ_LIVE, USER));
+         user = adminContext.getApi().getUserApi().get(userUrn);
+         assertNotNull(user, String.format(ENTITY_NON_NULL, USER));
+      }
+      return user;
+   }
+
+   protected Media lazyGetMedia(){
+      if (media == null || mediaUrn == null) {
+         Predicate<Link> addMediaLink = and(relEquals(Link.Rel.ADD), typeEquals(VCloudDirectorMediaType.MEDIA));
+         if (contains(lazyGetVdc().getLinks(), addMediaLink)) {
+            Link addMedia = find(lazyGetVdc().getLinks(), addMediaLink);
+            byte[] iso = new byte[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 };
+
+            Media sourceMedia = Media.builder().type(VCloudDirectorMediaType.MEDIA).name(name("media"))
+                     .size(iso.length).imageType(Media.ImageType.ISO)
+                     .description("Test media generated by VmApiLiveTest").build();
+            media = context.getApi().getMediaApi().add(addMedia.getHref(), sourceMedia);
+
+            Link uploadLink = getFirst(getFirst(media.getFiles(), null).getLinks(), null);
+            context.getApi().getUploadApi().upload(uploadLink.getHref(), Payloads.newByteArrayPayload(iso));
+
+            media = context.getApi().getMediaApi().get(media.getId());
+
+            if (media.getTasks().size() == 1) {
+               Task uploadTask = Iterables.getOnlyElement(media.getTasks());
+               Checks.checkTask(uploadTask);
+               assertEquals(uploadTask.getStatus(), Task.Status.RUNNING);
+               assertTrue(retryTaskSuccess.apply(uploadTask), String.format(TASK_COMPLETE_TIMELY, "uploadTask"));
+               media = context.getApi().getMediaApi().get(media.getId());
+            }
+
+            mediaUrn = media.getId();
+         }
+      }
+      return media;
+   }
+   
+   protected VAppTemplate lazyGetVAppTemplate() {
+      if (vAppTemplate == null) {
+         assertNotNull(vAppTemplateUrn, String.format(URN_REQ_LIVE, VAPP_TEMPLATE));
+         vAppTemplate = adminContext.getApi().getVAppTemplateApi().get(vAppTemplateUrn);
+         assertNotNull(vAppTemplate, String.format(ENTITY_NON_NULL, VAPP_TEMPLATE));
+      }
+      return vAppTemplate;
+   }
+
+   @Deprecated
    public URI toAdminUri(Reference ref) {
       return toAdminUri(ref.getHref());
    }
 
+   @Deprecated
    public URI toAdminUri(URI uri) {
       return Reference.builder().href(uri).build().toAdminReference(endpoint).getHref();
    }
@@ -301,33 +545,33 @@
    protected boolean taskStatusEventually(Task task, Task.Status running, ImmutableSet<Task.Status> immutableSet) {
       TaskApi taskApi = context.getApi().getTaskApi();
       TaskStatusEquals predicate = new TaskStatusEquals(taskApi, running, immutableSet);
-      RetryablePredicate<Task> retryablePredicate = new RetryablePredicate<Task>(predicate, TASK_TIMEOUT_SECONDS * 1000L);
+      RetryablePredicate<Task> retryablePredicate = new RetryablePredicate<Task>(predicate,
+               TASK_TIMEOUT_SECONDS * 1000L);
       return retryablePredicate.apply(task);
    }
 
    protected void assertTaskStatusEventually(Task task, Task.Status running, ImmutableSet<Task.Status> immutableSet) {
       assertTrue(taskStatusEventually(task, running, immutableSet),
-            String.format("Task '%s' must reach status %s", task.getOperationName(), running));
+               String.format("Task '%s' must reach status %s", task.getOperationName(), running));
    }
 
    protected boolean taskDoneEventually(Task task) {
       TaskApi taskApi = context.getApi().getTaskApi();
-      TaskStatusEquals predicate = new TaskStatusEquals(
-               taskApi,
-               ImmutableSet.of(Task.Status.ABORTED, Task.Status.CANCELED, Task.Status.ERROR, Task.Status.SUCCESS),
-               Collections.<Task.Status>emptySet());
-      RetryablePredicate<Task> retryablePredicate = new RetryablePredicate<Task>(predicate, LONG_TASK_TIMEOUT_SECONDS * 1000L);
+      TaskStatusEquals predicate = new TaskStatusEquals(taskApi, ImmutableSet.of(Task.Status.ABORTED,
+               Task.Status.CANCELED, Task.Status.ERROR, Task.Status.SUCCESS), Collections.<Task.Status> emptySet());
+      RetryablePredicate<Task> retryablePredicate = new RetryablePredicate<Task>(predicate,
+               LONG_TASK_TIMEOUT_SECONDS * 1000L);
       return retryablePredicate.apply(task);
    }
 
    protected void assertTaskDoneEventually(Task task) {
-      assertTrue(taskDoneEventually(task),
-            String.format("Task '%s' must complete", task.getOperationName()));
+      assertTrue(taskDoneEventually(task), String.format("Task '%s' must complete", task.getOperationName()));
    }
 
    /**
-    * Instantiate a {@link VApp} in a {@link Vdc} using the {@link VAppTemplate} we have configured for the tests.
-    *
+    * Instantiate a {@link VApp} in a {@link Vdc} using the {@link VAppTemplate} we have configured
+    * for the tests.
+    * 
     * @return the VApp that is being instantiated
     */
    protected VApp instantiateVApp() {
@@ -335,21 +579,17 @@
    }
 
    protected VApp instantiateVApp(String name) {
-      InstantiateVAppTemplateParams instantiate = InstantiateVAppTemplateParams.builder()
-            .name(name)
-            .notDeploy()
-            .notPowerOn()
-            .description("Test VApp")
-            .instantiationParams(instantiationParams())
-            .source(Reference.builder().href(vAppTemplateURI).build())
-            .build();
+      InstantiateVAppTemplateParams instantiate = InstantiateVAppTemplateParams.builder().name(name).notDeploy()
+               .notPowerOn().description("Test VApp").instantiationParams(instantiationParams())
+               .source(Reference.builder().href(lazyGetVAppTemplate().getHref()).build()).build();
 
       VdcApi vdcApi = context.getApi().getVdcApi();
-      VApp vAppInstantiated = vdcApi.instantiateVApp(vdcURI, instantiate);
+      VApp vAppInstantiated = vdcApi.instantiateVApp(vdcUrn, instantiate);
       assertNotNull(vAppInstantiated, String.format(ENTITY_NON_NULL, VAPP));
 
-      Task instantiationTask = Iterables.getFirst(vAppInstantiated.getTasks(), null);
-      if (instantiationTask != null) assertTaskSucceedsLong(instantiationTask);
+      Task instantiationTask = getFirst(vAppInstantiated.getTasks(), null);
+      if (instantiationTask != null)
+         assertTaskSucceedsLong(instantiationTask);
 
       // Save VApp name for cleanUp
       vAppNames.add(name);
@@ -360,52 +600,47 @@
    /** Build an {@link InstantiationParams} object. */
    protected InstantiationParams instantiationParams() {
       InstantiationParams instantiationParams = InstantiationParams.builder()
-            .sections(ImmutableSet.of(networkConfigSection()))
-            .build();
+               .sections(ImmutableSet.of(networkConfigSection())).build();
 
       return instantiationParams;
    }
 
    /** Build a {@link NetworkConfigSection} object. */
    private NetworkConfigSection networkConfigSection() {
-      NetworkConfigSection networkConfigSection = NetworkConfigSection.builder()
-            .info("Configuration parameters for logical networks")
-            .networkConfigs(
-                  ImmutableSet.of(
-                        VAppNetworkConfiguration.builder()
-                              .networkName("vAppNetwork")
-                              .configuration(networkConfiguration())
-                              .build()))
-            .build();
+      NetworkConfigSection networkConfigSection = NetworkConfigSection
+               .builder()
+               .info("Configuration parameters for logical networks")
+               .networkConfigs(
+                        ImmutableSet.of(VAppNetworkConfiguration.builder()
+                                 .networkName("vAppNetwork")
+                                 .configuration(networkConfiguration()).build())).build();
 
       return networkConfigSection;
    }
 
    /** Build a {@link NetworkConfiguration} object. */
    private NetworkConfiguration networkConfiguration() {
-      Vdc vdc = context.getApi().getVdcApi().getVdc(vdcURI);
+      Vdc vdc = context.getApi().getVdcApi().get(vdcUrn);
       assertNotNull(vdc, String.format(ENTITY_NON_NULL, VDC));
 
       Set<Reference> networks = vdc.getAvailableNetworks();
-
+      network = lazyGetNetwork();
       // Look up the network in the Vdc with the id configured for the tests
-      Optional<Reference> parentNetwork = Iterables.tryFind(networks, new Predicate<Reference>() {
+      Optional<Reference> parentNetwork = tryFind(networks, new Predicate<Reference>() {
          @Override
          public boolean apply(Reference reference) {
-            return reference.getHref().equals(networkURI);
+            return reference.getHref().equals(network.getHref());
          }
       });
 
       // Check we actually found a network reference
       if (!parentNetwork.isPresent()) {
-         fail(String.format("Could not find network %s in vdc", networkURI.toASCIIString()));
+         fail(String.format("Could not find network %s in vdc", network.getHref().toASCIIString()));
       }
 
       // Build the configuration object
-      NetworkConfiguration networkConfiguration = NetworkConfiguration.builder()
-            .parentNetwork(parentNetwork.get())
-            .fenceMode(Network.FenceMode.BRIDGED)
-            .build();
+      NetworkConfiguration networkConfiguration = NetworkConfiguration.builder().parentNetwork(parentNetwork.get())
+               .fenceMode(Network.FenceMode.BRIDGED).build();
 
       return networkConfiguration;
    }
@@ -413,30 +648,26 @@
    protected void cleanUpVAppTemplate(VAppTemplate vAppTemplate) {
       VAppTemplateApi vappTemplateApi = context.getApi().getVAppTemplateApi();
       try {
-	      Task task = vappTemplateApi.deleteVappTemplate(vAppTemplate.getHref());
-	      taskDoneEventually(task);
+         Task task = vappTemplateApi.remove(vAppTemplate.getId());
+         taskDoneEventually(task);
       } catch (Exception e) {
          logger.warn(e, "Error deleting template '%s'", vAppTemplate.getName());
       }
-    }
-
-   protected void cleanUpVApp(VApp vApp) {
-      cleanUpVApp(vApp.getHref());
    }
 
-   // TODO code tidy for cleanUpVApp? Seems extremely verbose!
-   protected void cleanUpVApp(URI vAppURI) {
+   protected void cleanUpVApp(VApp vApp) {
       VAppApi vAppApi = context.getApi().getVAppApi();
 
-      VApp vApp = vAppApi.getVApp(vAppURI); // Refresh
+      String vAppUrn = vApp.getId();
+      vApp = vAppApi.get(vAppUrn); // Refresh
       if (vApp == null) {
-         logger.info("Cannot find VApp at %s", vAppURI.getPath());
-         return; // Presumably vApp has already been deleted. Ignore.
+         logger.info("Cannot find VApp at %s", vAppUrn);
+         return; // Presumably vApp has already been removed. Ignore.
       }
-      logger.debug("Deleting VApp %s (%s)", vApp.getName(), vAppURI.getPath());
+      logger.debug("Deleting VApp %s (%s)", vApp.getName(), vAppUrn);
 
       // Wait for busy tasks to complete (don't care if it's failed or successful)
-      // Otherwise, get error on delete "entity is busy completing an operation.
+      // Otherwise, get error on remove "entity is busy completing an operation.
       if (vApp.getTasks() != null) {
          for (Task task : vApp.getTasks()) {
             if (!taskDoneEventually(task)) {
@@ -448,7 +679,7 @@
       // Shutdown and power off the VApp if necessary
       if (vApp.getStatus() == Status.POWERED_ON) {
          try {
-            Task shutdownTask = vAppApi.shutdown(vAppURI);
+            Task shutdownTask = vAppApi.shutdown(vAppUrn);
             taskDoneEventually(shutdownTask);
          } catch (Exception e) {
             // keep going; cleanup as much as possible
@@ -460,9 +691,8 @@
       if (vApp.isDeployed()) {
          try {
             UndeployVAppParams params = UndeployVAppParams.builder()
-                  .undeployPowerAction(UndeployVAppParams.PowerAction.SHUTDOWN)
-                  .build();
-            Task undeployTask = vAppApi.undeploy(vAppURI, params);
+                     .undeployPowerAction(UndeployVAppParams.PowerAction.SHUTDOWN).build();
+            Task undeployTask = vAppApi.undeploy(vAppUrn, params);
             taskDoneEventually(undeployTask);
          } catch (Exception e) {
             // keep going; cleanup as much as possible
@@ -471,13 +701,13 @@
       }
 
       try {
-         Task task = vAppApi.deleteVApp(vAppURI);
+         Task task = vAppApi.remove(vAppUrn);
          taskDoneEventually(task);
          vAppNames.remove(vApp.getName());
          logger.info("Deleted VApp %s", vApp.getName());
       } catch (Exception e) {
-         vApp = vAppApi.getVApp(vAppURI); // Refresh
-         logger.warn(e, "Deleting VApp %s failed (%s)", vApp.getName(), vAppURI.getPath());
+         vApp = vAppApi.get(vApp.getId()); // Refresh
+         logger.warn(e, "Deleting VApp %s failed (%s)", vApp.getName(), vAppUrn);
       }
    }
 
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorExpectTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorExpectTest.java
index 08c1422..44c9d9c 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorExpectTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/BaseVCloudDirectorExpectTest.java
@@ -30,14 +30,15 @@
 import org.jclouds.http.HttpResponse;
 import org.jclouds.rest.internal.BaseRestApiExpectTest;
 import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
-import org.jclouds.vcloud.director.v1_5.domain.Reference;
 import org.testng.annotations.BeforeGroups;
 
+import com.google.common.base.Throwables;
 import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.LinkedListMultimap;
 import com.google.common.collect.Multimap;
 import com.google.common.net.HttpHeaders;
 import com.google.inject.Guice;
+import com.jamesmurty.utils.XMLBuilder;
 
 /**
  * Base class for writing vCloud Director REST api expect tests.
@@ -187,6 +188,7 @@
     *
     * @author danikov
     */
+   @Deprecated
    public class VcloudHttpRequestPrimer {
       private Multimap<String, String> headers = LinkedListMultimap.create();
       private HttpRequest.Builder<?> builder = HttpRequest.builder();
@@ -230,6 +232,7 @@
       }
    }
    
+   @Deprecated
    protected class VcloudHttpResponsePrimer {
       private HttpResponse.Builder<?> builder = HttpResponse.builder();
 
@@ -245,11 +248,19 @@
       }
    }
    
-   public URI toAdminUri(Reference ref) {
-      return toAdminUri(ref.getHref());
+   protected static XMLBuilder createXMLBuilder(String root){
+      try {
+         return XMLBuilder.create(root);
+      } catch (Exception e) {
+         throw Throwables.propagate(e);
+      }
    }
    
-   public URI toAdminUri(URI uri) {
-      return Reference.builder().href(uri).build().toAdminReference(endpoint).getHref();
+   protected static String asString(XMLBuilder in){
+      try {
+         return in.asString();
+      } catch (Exception e) {
+         throw Throwables.propagate(e);
+      }
    }
 }
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/VCloudDirectorTestSession.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/VCloudDirectorTestSession.java
deleted file mode 100644
index 7e2d79b..0000000
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/internal/VCloudDirectorTestSession.java
+++ /dev/null
@@ -1,121 +0,0 @@
-package org.jclouds.vcloud.director.v1_5.internal;
-
-import static org.testng.Assert.assertEquals;
-
-import java.io.Closeable;
-import java.util.Properties;
-
-import org.jclouds.ContextBuilder;
-import org.jclouds.logging.log4j.config.Log4JLoggingModule;
-import org.jclouds.rest.RestContext;
-import org.jclouds.sshj.config.SshjSshClientModule;
-import org.jclouds.vcloud.director.v1_5.VCloudDirectorContext;
-import org.jclouds.vcloud.director.v1_5.VCloudDirectorMediaType;
-import org.jclouds.vcloud.director.v1_5.admin.VCloudDirectorAdminAsyncApi;
-import org.jclouds.vcloud.director.v1_5.admin.VCloudDirectorAdminApi;
-import org.jclouds.vcloud.director.v1_5.domain.Link;
-import org.jclouds.vcloud.director.v1_5.domain.Reference;
-import org.jclouds.vcloud.director.v1_5.domain.Role.DefaultRoles;
-import org.jclouds.vcloud.director.v1_5.domain.User;
-import org.jclouds.vcloud.director.v1_5.predicates.LinkPredicates;
-import org.jclouds.vcloud.director.v1_5.predicates.ReferencePredicates;
-
-import com.google.common.base.Predicates;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.common.io.Closeables;
-import com.google.inject.Module;
-
-public class VCloudDirectorTestSession implements Closeable {
-
-   public static Builder builder() {
-      return new Builder();
-   }
-
-   public static class Builder {
-
-      private String provider;
-      private String identity;
-      private String credential;
-      private Properties overrides;
-      private String endpoint;
-
-      public Builder provider(String provider) {
-         this.provider = provider;
-         return this;
-      }
-
-      public Builder identity(String identity) {
-         this.identity = identity;
-         return this;
-      }
-
-      public Builder credential(String credential) {
-         this.credential = credential;
-         return this;
-      }
-
-      public Builder overrides(Properties overrides) {
-         this.overrides = overrides;
-         return this;
-      }
-
-      public Builder endpoint(String endpoint) {
-         this.endpoint = endpoint;
-         return this;
-      }
-
-      public VCloudDirectorTestSession build() {
-         return new VCloudDirectorTestSession(provider, identity, credential, overrides, endpoint);
-      }
-   }
-
-   private VCloudDirectorContext userContext;
-   private RestContext<VCloudDirectorAdminApi, VCloudDirectorAdminAsyncApi> adminContext;
-
-   private VCloudDirectorTestSession(String provider, String identity, String credential, Properties overrides, String endpoint) {
-      ContextBuilder builder = ContextBuilder.newBuilder(provider)
-            .credentials(identity, credential)
-            .endpoint(endpoint)
-            .modules(ImmutableSet.<Module> of(new Log4JLoggingModule(), new SshjSshClientModule()))
-            .overrides(overrides);
-      userContext = VCloudDirectorContext.class.cast(builder.build());
-
-      // Look for the admin link in the current session
-      Link admin = Iterables.tryFind(
-	            userContext.getApi().getCurrentSession().getLinks(),
-	            Predicates.and(LinkPredicates.relEquals(Link.Rel.DOWN), ReferencePredicates.typeEquals(VCloudDirectorMediaType.ADMIN)))
-            .orNull();
-
-      // Get the admin context if the link exists
-      if (admin != null) {
-         adminContext = userContext.getAdminContext();
-
-         // Lookup the user details
-         Reference orgRef = Iterables.getFirst(userContext.getApi().getOrgApi().getOrgList().getOrgs(), null)
-               .toAdminReference(endpoint);
-         Reference userRef = Iterables.find(
-               adminContext.getApi().getOrgApi().getOrg(orgRef.getHref()).getUsers(),
-               ReferencePredicates.nameEquals(adminContext.getApi().getCurrentSession().getUser()));
-         User user = adminContext.getApi().getUserApi().getUser(userRef.getHref());
-
-         // Check that the user has the org admin role
-         Reference userRole = user.getRole();
-         assertEquals(userRole.getName(), DefaultRoles.ORG_ADMIN.value());
-      }
-   }
-
-   @Override
-   public void close() {
-      // NOTE we only need to close the user context to log out
-      Closeables.closeQuietly(userContext);
-   }
-
-   public VCloudDirectorContext getUserContext() {
-      return userContext;
-   }
-
-   public RestContext<VCloudDirectorAdminApi, VCloudDirectorAdminAsyncApi> getAdminContext() {
-      return adminContext;
-   }
-}
diff --git a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/login/SessionApiLiveTest.java b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/login/SessionApiLiveTest.java
index 04465c1..ec6cbf4 100644
--- a/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/login/SessionApiLiveTest.java
+++ b/labs/vcloud-director/src/test/java/org/jclouds/vcloud/director/v1_5/login/SessionApiLiveTest.java
@@ -72,7 +72,7 @@
 
       sessionWithToken = api.loginUserInOrgWithPassword(URI.create(endpoint + "/sessions"), user, org, password);
       assertEquals(sessionWithToken.getSession().getUser(), user);
-      assertEquals(sessionWithToken.getSession().getOrg(), org);
+      assertEquals(sessionWithToken.getSession().get(), org);
       assertTrue(sessionWithToken.getSession().getLinks().size() > 0);
       assertNotNull(sessionWithToken.getToken());
    }
diff --git a/labs/vcloud-director/src/test/resources/catalog/createdCatalogItem.xml b/labs/vcloud-director/src/test/resources/catalog/adddCatalogItem.xml
similarity index 100%
rename from labs/vcloud-director/src/test/resources/catalog/createdCatalogItem.xml
rename to labs/vcloud-director/src/test/resources/catalog/adddCatalogItem.xml
diff --git a/labs/vcloud-director/src/test/resources/catalog/admin/createCatalog.xml b/labs/vcloud-director/src/test/resources/catalog/admin/addCatalog.xml
similarity index 100%
rename from labs/vcloud-director/src/test/resources/catalog/admin/createCatalog.xml
rename to labs/vcloud-director/src/test/resources/catalog/admin/addCatalog.xml
diff --git a/labs/vcloud-director/src/test/resources/catalog/admin/createCatalogSource.xml b/labs/vcloud-director/src/test/resources/catalog/admin/addCatalogSource.xml
similarity index 100%
rename from labs/vcloud-director/src/test/resources/catalog/admin/createCatalogSource.xml
rename to labs/vcloud-director/src/test/resources/catalog/admin/addCatalogSource.xml
diff --git a/labs/vcloud-director/src/test/resources/catalog/admin/updateCatalog.xml b/labs/vcloud-director/src/test/resources/catalog/admin/editCatalog.xml
similarity index 100%
rename from labs/vcloud-director/src/test/resources/catalog/admin/updateCatalog.xml
rename to labs/vcloud-director/src/test/resources/catalog/admin/editCatalog.xml
diff --git a/labs/vcloud-director/src/test/resources/catalog/admin/updateCatalogSource.xml b/labs/vcloud-director/src/test/resources/catalog/admin/editCatalogSource.xml
similarity index 100%
rename from labs/vcloud-director/src/test/resources/catalog/admin/updateCatalogSource.xml
rename to labs/vcloud-director/src/test/resources/catalog/admin/editCatalogSource.xml
diff --git a/labs/vcloud-director/src/test/resources/catalog/admin/updateOwnerSource.xml b/labs/vcloud-director/src/test/resources/catalog/admin/editOwnerSource.xml
similarity index 100%
rename from labs/vcloud-director/src/test/resources/catalog/admin/updateOwnerSource.xml
rename to labs/vcloud-director/src/test/resources/catalog/admin/editOwnerSource.xml
diff --git a/labs/vcloud-director/src/test/resources/catalog/updateCatalogItem.xml b/labs/vcloud-director/src/test/resources/catalog/editCatalogItem.xml
similarity index 100%
rename from labs/vcloud-director/src/test/resources/catalog/updateCatalogItem.xml
rename to labs/vcloud-director/src/test/resources/catalog/editCatalogItem.xml
diff --git a/labs/vcloud-director/src/test/resources/catalog/deleteMetadataEntryTask.xml b/labs/vcloud-director/src/test/resources/catalog/removeMetadataEntryTask.xml
similarity index 100%
rename from labs/vcloud-director/src/test/resources/catalog/deleteMetadataEntryTask.xml
rename to labs/vcloud-director/src/test/resources/catalog/removeMetadataEntryTask.xml
diff --git a/labs/vcloud-director/src/test/resources/group/updateGroup.xml b/labs/vcloud-director/src/test/resources/group/editGroup.xml
similarity index 100%
rename from labs/vcloud-director/src/test/resources/group/updateGroup.xml
rename to labs/vcloud-director/src/test/resources/group/editGroup.xml
diff --git a/labs/vcloud-director/src/test/resources/group/updateGroupSource.xml b/labs/vcloud-director/src/test/resources/group/editGroupSource.xml
similarity index 100%
rename from labs/vcloud-director/src/test/resources/group/updateGroupSource.xml
rename to labs/vcloud-director/src/test/resources/group/editGroupSource.xml
diff --git a/labs/vcloud-director/src/test/resources/log4j.xml b/labs/vcloud-director/src/test/resources/log4j.xml
deleted file mode 100644
index 63810d3..0000000
--- a/labs/vcloud-director/src/test/resources/log4j.xml
+++ /dev/null
@@ -1,151 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
-
-    <!--
-        For more configuration infromation and examples see the Apache
-        Log4j website: http://logging.apache.org/log4j/
-    -->
-<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
-    debug="false">
-
-    <!-- A time/date based rolling appender -->
-    <appender name="WIREFILE" class="org.apache.log4j.DailyRollingFileAppender">
-        <param name="File" value="target/test-data/jclouds-wire.log" />
-        <param name="Append" value="true" />
-
-        <!-- Rollover at midnight each day -->
-        <param name="DatePattern" value="'.'yyyy-MM-dd" />
-
-        <param name="Threshold" value="TRACE" />
-
-        <layout class="org.apache.log4j.PatternLayout">
-            <!-- The default pattern: Date Priority [Category] Message\n -->
-            <param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
-
-            <!--
-                The full pattern: Date MS Priority [Category]
-                (Thread:NDC) Message\n <param name="ConversionPattern"
-                value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
-            -->
-        </layout>
-    </appender>
-
-    <!-- A time/date based rolling appender -->
-    <appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">
-        <param name="File" value="target/test-data/jclouds.log" />
-        <param name="Append" value="true" />
-
-        <!-- Rollover at midnight each day -->
-        <param name="DatePattern" value="'.'yyyy-MM-dd" />
-
-        <param name="Threshold" value="TRACE" />
-
-        <layout class="org.apache.log4j.PatternLayout">
-            <!-- The default pattern: Date Priority [Category] Message\n -->
-            <param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
-
-            <!--
-                The full pattern: Date MS Priority [Category]
-                (Thread:NDC) Message\n <param name="ConversionPattern"
-                value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
-            -->
-        </layout>
-    </appender>
-    
-    <!-- A time/date based rolling appender -->
-    <appender name="COMPUTEFILE" class="org.apache.log4j.DailyRollingFileAppender">
-        <param name="File" value="target/test-data/jclouds-compute.log" />
-        <param name="Append" value="true" />
-
-        <!-- Rollover at midnight each day -->
-        <param name="DatePattern" value="'.'yyyy-MM-dd" />
-
-        <param name="Threshold" value="TRACE" />
-
-        <layout class="org.apache.log4j.PatternLayout">
-            <!-- The default pattern: Date Priority [Category] Message\n -->
-            <param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
-
-            <!--
-                The full pattern: Date MS Priority [Category]
-                (Thread:NDC) Message\n <param name="ConversionPattern"
-                value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
-            -->
-        </layout>
-    </appender>
-
-    <!-- A time/date based rolling appender -->
-    <appender name="SSHFILE" class="org.apache.log4j.DailyRollingFileAppender">
-        <param name="File" value="target/test-data/jclouds-ssh.log" />
-        <param name="Append" value="true" />
-
-        <!-- Rollover at midnight each day -->
-        <param name="DatePattern" value="'.'yyyy-MM-dd" />
-
-        <param name="Threshold" value="TRACE" />
-
-        <layout class="org.apache.log4j.PatternLayout">
-            <!-- The default pattern: Date Priority [Category] Message\n -->
-            <param name="ConversionPattern" value="%d %-5p [%c] (%t) %m%n" />
-
-            <!--
-                The full pattern: Date MS Priority [Category]
-                (Thread:NDC) Message\n <param name="ConversionPattern"
-                value="%d %-5r %-5p [%c] (%t:%x) %m%n"/>
-            -->
-        </layout>
-    </appender>
-
-    <appender name="ASYNCCOMPUTE" class="org.apache.log4j.AsyncAppender">
-        <appender-ref ref="COMPUTEFILE" />
-    </appender>
-    
-    <appender name="ASYNCSSH" class="org.apache.log4j.AsyncAppender">
-        <appender-ref ref="SSHFILE" />
-    </appender>
-
-    <appender name="ASYNC" class="org.apache.log4j.AsyncAppender">
-        <appender-ref ref="FILE" />
-    </appender>
-
-    <appender name="ASYNCWIRE" class="org.apache.log4j.AsyncAppender">
-        <appender-ref ref="WIREFILE" />
-    </appender>
-
-    <!-- ================ -->
-    <!-- Limit categories -->
-    <!-- ================ -->
-
-    <category name="org.jclouds">
-        <priority value="DEBUG" />
-        <appender-ref ref="ASYNC" />
-    </category>
-
-    <category name="jclouds.headers">
-        <priority value="DEBUG" />
-        <appender-ref ref="ASYNCWIRE" />
-    </category>
-    
-    <category name="jclouds.ssh">
-        <priority value="DEBUG" />
-        <appender-ref ref="ASYNCSSH" />
-    </category>
-    
-    <category name="jclouds.wire">
-        <priority value="DEBUG" />
-        <appender-ref ref="ASYNCWIRE" />
-    </category>
-
-    <category name="jclouds.compute">
-        <priority value="TRACE" />
-        <appender-ref ref="ASYNCCOMPUTE" />
-    </category>
-    <!-- ======================= -->
-    <!-- Setup the Root category -->
-    <!-- ======================= -->
-
-    <root>
-        <priority value="WARN" />
-    </root>
-
-</log4j:configuration>
diff --git a/labs/vcloud-director/src/test/resources/logback.xml b/labs/vcloud-director/src/test/resources/logback.xml
index 660584a..4c97319 100644
--- a/labs/vcloud-director/src/test/resources/logback.xml
+++ b/labs/vcloud-director/src/test/resources/logback.xml
@@ -1,5 +1,37 @@
 <?xml version="1.0"?>

 <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>

+    

     <appender name="API" class="ch.qos.logback.core.FileAppender">

         <file>target/test-data/api.log</file>

 

@@ -18,6 +50,31 @@
         <level value="warn" />

     </root>

 

+    <logger name="org.jclouds">

+        <level value="DEBUG" />

+        <appender-ref ref="FILE" />

+    </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>

+    

     <logger name="jclouds.vcloud.api">

         <level value="INFO" />

         <appender-ref ref="API" />

diff --git a/labs/vcloud-director/src/test/resources/media/createMedia.xml b/labs/vcloud-director/src/test/resources/media/addMedia.xml
similarity index 100%
rename from labs/vcloud-director/src/test/resources/media/createMedia.xml
rename to labs/vcloud-director/src/test/resources/media/addMedia.xml
diff --git a/labs/vcloud-director/src/test/resources/media/createMediaSource.xml b/labs/vcloud-director/src/test/resources/media/addMediaSource.xml
similarity index 100%
rename from labs/vcloud-director/src/test/resources/media/createMediaSource.xml
rename to labs/vcloud-director/src/test/resources/media/addMediaSource.xml
diff --git a/labs/vcloud-director/src/test/resources/media/cloneMediaParams.xml b/labs/vcloud-director/src/test/resources/media/cloneMediaParams.xml
index 4081d71..fa767b0 100644
--- a/labs/vcloud-director/src/test/resources/media/cloneMediaParams.xml
+++ b/labs/vcloud-director/src/test/resources/media/cloneMediaParams.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <CloneMediaParams name="moved test media" xmlns="http://www.vmware.com/vcloud/v1.5">
     <Description>moved by testCloneMedia()</Description>
-    <Source type="application/vnd.vmware.vcloud.media+xml" name="copied test media" id="urn:vcloud:media:da8361af-cccd-4103-a71c-493513c49094" href="https://mycloud.greenhousedata.com/api/media/da8361af-cccd-4103-a71c-493513c49094"/>
+    <Source type="application/vnd.vmware.vcloud.media+xml" name="copied test media" href="https://mycloud.greenhousedata.com/api/media/da8361af-cccd-4103-a71c-493513c49094"/>
     <IsSourceDelete>false</IsSourceDelete>
 </CloneMediaParams>
diff --git a/labs/vcloud-director/src/test/resources/media/updateMedia.xml b/labs/vcloud-director/src/test/resources/media/editMedia.xml
similarity index 100%
rename from labs/vcloud-director/src/test/resources/media/updateMedia.xml
rename to labs/vcloud-director/src/test/resources/media/editMedia.xml
diff --git a/labs/vcloud-director/src/test/resources/media/updateMediaTask.xml b/labs/vcloud-director/src/test/resources/media/editMediaTask.xml
similarity index 100%
rename from labs/vcloud-director/src/test/resources/media/updateMediaTask.xml
rename to labs/vcloud-director/src/test/resources/media/editMediaTask.xml
diff --git a/labs/vcloud-director/src/test/resources/media/deleteMediaTask.xml b/labs/vcloud-director/src/test/resources/media/removeMediaTask.xml
similarity index 100%
rename from labs/vcloud-director/src/test/resources/media/deleteMediaTask.xml
rename to labs/vcloud-director/src/test/resources/media/removeMediaTask.xml
diff --git a/labs/vcloud-director/src/test/resources/media/deleteMetadataEntryTask.xml b/labs/vcloud-director/src/test/resources/media/removeMetadataEntryTask.xml
similarity index 100%
rename from labs/vcloud-director/src/test/resources/media/deleteMetadataEntryTask.xml
rename to labs/vcloud-director/src/test/resources/media/removeMetadataEntryTask.xml
diff --git a/labs/vcloud-director/src/test/resources/network/admin/editNetworkSource.xml b/labs/vcloud-director/src/test/resources/network/admin/editNetworkSource.xml
new file mode 100644
index 0000000..41363dc
--- /dev/null
+++ b/labs/vcloud-director/src/test/resources/network/admin/editNetworkSource.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<OrgNetwork name="ilsolation01-Jclouds" id="urn:vcloud:network:f3ba8256-6f48-4512-aad6-600e85b4dc38" type="application/vnd.vmware.vcloud.orgNetwork+xml" href="https://vcloudbeta.bluelock.com/api/network/f3ba8256-6f48-4512-aad6-600e85b4dc38" xmlns="http://www.vmware.com/vcloud/v1.5">
+    <Link rel="up" type="application/vnd.vmware.vcloud.org+xml" href="https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"/>
+    <Link rel="down" type="application/vnd.vmware.vcloud.metadata+xml" href="https://vcloudbeta.bluelock.com/api/network/f3ba8256-6f48-4512-aad6-600e85b4dc38/metadata"/>
+    <Description></Description>
+    <Configuration>
+        <IpScope>
+            <IsInherited>false</IsInherited>
+            <Gateway>192.168.1.1</Gateway>
+            <Netmask>255.255.255.0</Netmask>
+            <Dns1>173.240.111.52</Dns1>
+            <Dns2>173.240.111.53</Dns2>
+            <IpRanges>
+                <IpRange>
+                    <StartAddress>192.168.1.100</StartAddress>
+                    <EndAddress>192.168.1.199</EndAddress>
+                </IpRange>
+            </IpRanges>
+        </IpScope>
+        <FenceMode>isolated</FenceMode>
+        <RetainNetInfoAcrossDeployments>false</RetainNetInfoAcrossDeployments>
+        <Features>
+            <DhcpService>
+                <IsEnabled>false</IsEnabled>
+                <DefaultLeaseTime>3600</DefaultLeaseTime>
+                <MaxLeaseTime>7200</MaxLeaseTime>
+                <IpRange>
+                    <StartAddress>192.168.1.2</StartAddress>
+                    <EndAddress>192.168.1.99</EndAddress>
+                </IpRange>
+            </DhcpService>
+        </Features>
+        <SyslogServerSettings/>
+    </Configuration>
+    <AllowedExternalIpAddresses/>
+</OrgNetwork>
\ No newline at end of file
diff --git a/labs/vcloud-director/src/test/resources/network/admin/updateNetworkTask.xml b/labs/vcloud-director/src/test/resources/network/admin/editNetworkTask.xml
similarity index 100%
rename from labs/vcloud-director/src/test/resources/network/admin/updateNetworkTask.xml
rename to labs/vcloud-director/src/test/resources/network/admin/editNetworkTask.xml
diff --git a/labs/vcloud-director/src/test/resources/network/admin/resetNetworkTask.xml b/labs/vcloud-director/src/test/resources/network/admin/resetNetworkTask.xml
index e69de29..16dbd18 100644
--- a/labs/vcloud-director/src/test/resources/network/admin/resetNetworkTask.xml
+++ b/labs/vcloud-director/src/test/resources/network/admin/resetNetworkTask.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Task xmlns="http://www.vmware.com/vcloud/v1.5" status="running" startTime="2012-03-14T12:39:23.720-04:00" operationName="networkResetNetwork" operation="Resetting Network ilsolation01-Jclouds(f3ba8256-6f48-4512-aad6-600e85b4dc38)" expiryTime="2012-06-12T12:39:23.720-04:00" name="task" id="urn:vcloud:task:49d2e180-7921-4902-ac39-b4ff5406bb94" type="application/vnd.vmware.vcloud.task+xml" href="https://vcloudbeta.bluelock.com/api/task/49d2e180-7921-4902-ac39-b4ff5406bb94" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.vmware.com/vcloud/v1.5 http://vcloudbeta.bluelock.com/api/v1.5/schema/master.xsd">
+    <Link rel="task:cancel" href="https://vcloudbeta.bluelock.com/api/task/49d2e180-7921-4902-ac39-b4ff5406bb94/action/cancel"/>
+    <Owner type="application/vnd.vmware.vcloud.network+xml" name="ilsolation01-Jclouds" href="https://vcloudbeta.bluelock.com/api/network/f3ba8256-6f48-4512-aad6-600e85b4dc38"/>
+    <User type="application/vnd.vmware.admin.user+xml" name="dan@cloudsoftcorp.com" href="https://vcloudbeta.bluelock.com/api/admin/user/ae75edd2-12de-414c-8e85-e6ea10442c08"/>
+    <Organization type="application/vnd.vmware.vcloud.org+xml" name="JClouds" href="https://vcloudbeta.bluelock.com/api/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"/>
+</Task>
\ No newline at end of file
diff --git a/labs/vcloud-director/src/test/resources/network/admin/updateNetworkSource.xml b/labs/vcloud-director/src/test/resources/network/admin/updateNetworkSource.xml
deleted file mode 100644
index 81d08a6..0000000
--- a/labs/vcloud-director/src/test/resources/network/admin/updateNetworkSource.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<OrgNetwork name="ilsolation01-Jclouds" id="urn:vcloud:network:f3ba8256-6f48-4512-aad6-600e85b4dc38" type="application/vnd.vmware.vcloud.orgNetwork+xml" href="https://vcloudbeta.bluelock.com/api/admin/network/f3ba8256-6f48-4512-aad6-600e85b4dc38" xmlns="http://www.vmware.com/vcloud/v1.5">
-    <Link rel="alternate" type="application/vnd.vmware.vcloud.orgNetwork+xml" href="https://vcloudbeta.bluelock.com/api/network/f3ba8256-6f48-4512-aad6-600e85b4dc38"/>
-    <Link rel="edit" type="application/vnd.vmware.admin.orgNetwork+xml" href="https://vcloudbeta.bluelock.com/api/admin/network/f3ba8256-6f48-4512-aad6-600e85b4dc38"/>
-    <Link rel="up" type="application/vnd.vmware.admin.organization+xml" href="https://vcloudbeta.bluelock.com/api/admin/org/6f312e42-cd2b-488d-a2bb-97519cd57ed0"/>
-    <Link rel="repair" type="application/vnd.vmware.admin.orgNetwork+xml" href="https://vcloudbeta.bluelock.com/api/admin/network/f3ba8256-6f48-4512-aad6-600e85b4dc38/action/reset"/>
-    <Link rel="down" type="application/vnd.vmware.vcloud.metadata+xml" href="https://vcloudbeta.bluelock.com/api/admin/network/f3ba8256-6f48-4512-aad6-600e85b4dc38/metadata"/>
-    <Description></Description>
-    <Configuration>
-        <IpScope>
-            <IsInherited>false</IsInherited>
-            <Gateway>192.168.1.1</Gateway>
-            <Netmask>255.255.255.0</Netmask>
-            <Dns1>173.240.111.52</Dns1>
-            <Dns2>173.240.111.53</Dns2>
-            <IpRanges>
-                <IpRange>
-                    <StartAddress>192.168.1.100</StartAddress>
-                    <EndAddress>192.168.1.199</EndAddress>
-                </IpRange>
-            </IpRanges>
-        </IpScope>
-        <FenceMode>isolated</FenceMode>
-        <RetainNetInfoAcrossDeployments>false</RetainNetInfoAcrossDeployments>
-        <Features>
-            <DhcpService>
-                <IsEnabled>false</IsEnabled>
-                <DefaultLeaseTime>3600</DefaultLeaseTime>
-                <MaxLeaseTime>7200</MaxLeaseTime>
-                <IpRange>
-                    <StartAddress>192.168.1.2</StartAddress>
-                    <EndAddress>192.168.1.99</EndAddress>
-                </IpRange>
-            </DhcpService>
-        </Features>
-        <SyslogServerSettings/>
-    </Configuration>
-    <NetworkPool type="application/vnd.vmware.admin.networkPool+xml" name="vcdni01" href="https://vcloudbeta.bluelock.com/api/admin/extension/networkPool/e86bfdb5-b3e0-4ece-9125-e764ac64c95c"/>
-    <AllowedExternalIpAddresses/>
-</OrgNetwork>
\ No newline at end of file
diff --git a/labs/vcloud-director/src/test/resources/org/admin/updateEmailSettings.xml b/labs/vcloud-director/src/test/resources/org/admin/editEmailSettings.xml
similarity index 100%
rename from labs/vcloud-director/src/test/resources/org/admin/updateEmailSettings.xml
rename to labs/vcloud-director/src/test/resources/org/admin/editEmailSettings.xml
diff --git a/labs/vcloud-director/src/test/resources/org/admin/updateEmailSettingsSource.xml b/labs/vcloud-director/src/test/resources/org/admin/editEmailSettingsSource.xml
similarity index 100%
rename from labs/vcloud-director/src/test/resources/org/admin/updateEmailSettingsSource.xml
rename to labs/vcloud-director/src/test/resources/org/admin/editEmailSettingsSource.xml
diff --git a/labs/vcloud-director/src/test/resources/org/admin/updatePasswordPolicy.xml b/labs/vcloud-director/src/test/resources/org/admin/editPasswordPolicy.xml
similarity index 100%
rename from labs/vcloud-director/src/test/resources/org/admin/updatePasswordPolicy.xml
rename to labs/vcloud-director/src/test/resources/org/admin/editPasswordPolicy.xml
diff --git a/labs/vcloud-director/src/test/resources/org/admin/updatePasswordPolicySource.xml b/labs/vcloud-director/src/test/resources/org/admin/editPasswordPolicySource.xml
similarity index 100%
rename from labs/vcloud-director/src/test/resources/org/admin/updatePasswordPolicySource.xml
rename to labs/vcloud-director/src/test/resources/org/admin/editPasswordPolicySource.xml
diff --git a/labs/vcloud-director/src/test/resources/org/admin/updateVAppLeaseSettings.xml b/labs/vcloud-director/src/test/resources/org/admin/editVAppLeaseSettings.xml
similarity index 100%
rename from labs/vcloud-director/src/test/resources/org/admin/updateVAppLeaseSettings.xml
rename to labs/vcloud-director/src/test/resources/org/admin/editVAppLeaseSettings.xml
diff --git a/labs/vcloud-director/src/test/resources/org/admin/updateVAppLeaseSettingsSource.xml b/labs/vcloud-director/src/test/resources/org/admin/editVAppLeaseSettingsSource.xml
similarity index 100%
rename from labs/vcloud-director/src/test/resources/org/admin/updateVAppLeaseSettingsSource.xml
rename to labs/vcloud-director/src/test/resources/org/admin/editVAppLeaseSettingsSource.xml
diff --git a/labs/vcloud-director/src/test/resources/task/taskslist.xml b/labs/vcloud-director/src/test/resources/task/tasksList.xml
similarity index 100%
rename from labs/vcloud-director/src/test/resources/task/taskslist.xml
rename to labs/vcloud-director/src/test/resources/task/tasksList.xml
diff --git a/labs/vcloud-director/src/test/resources/user/createUser.xml b/labs/vcloud-director/src/test/resources/user/addUser.xml
similarity index 100%
rename from labs/vcloud-director/src/test/resources/user/createUser.xml
rename to labs/vcloud-director/src/test/resources/user/addUser.xml
diff --git a/labs/vcloud-director/src/test/resources/user/createUserSource.xml b/labs/vcloud-director/src/test/resources/user/addUserSource.xml
similarity index 100%
rename from labs/vcloud-director/src/test/resources/user/createUserSource.xml
rename to labs/vcloud-director/src/test/resources/user/addUserSource.xml
diff --git a/labs/vcloud-director/src/test/resources/user/updateUser.xml b/labs/vcloud-director/src/test/resources/user/editUser.xml
similarity index 100%
rename from labs/vcloud-director/src/test/resources/user/updateUser.xml
rename to labs/vcloud-director/src/test/resources/user/editUser.xml
diff --git a/labs/vcloud-director/src/test/resources/user/updateUserSource.xml b/labs/vcloud-director/src/test/resources/user/editUserSource.xml
similarity index 100%
rename from labs/vcloud-director/src/test/resources/user/updateUserSource.xml
rename to labs/vcloud-director/src/test/resources/user/editUserSource.xml
diff --git a/providers/ninefold-compute/pom.xml b/providers/ninefold-compute/pom.xml
index 17ab38c..a935525 100644
--- a/providers/ninefold-compute/pom.xml
+++ b/providers/ninefold-compute/pom.xml
@@ -39,7 +39,7 @@
     <test.ninefold-compute.build-version />
     <test.ninefold-compute.identity>FIXME_IDENTITY</test.ninefold-compute.identity>
     <test.ninefold-compute.credential>FIXME_CREDENTIAL</test.ninefold-compute.credential>
-    <test.ninefold-compute.template>imageId=1215,loginUser=user:Password01,authenticateSudo=true</test.ninefold-compute.template>
+    <test.ninefold-compute.template></test.ninefold-compute.template>
     <jclouds.osgi.export>org.jclouds.ninefold.compute*;version="${project.version}"</jclouds.osgi.export>
     <jclouds.osgi.import>
       org.jclouds.compute.internal;version="${project.version}",
diff --git a/providers/ninefold-compute/src/main/java/org/jclouds/ninefold/compute/NinefoldComputeProviderMetadata.java b/providers/ninefold-compute/src/main/java/org/jclouds/ninefold/compute/NinefoldComputeProviderMetadata.java
index f9a4d32..2cdf200 100644
--- a/providers/ninefold-compute/src/main/java/org/jclouds/ninefold/compute/NinefoldComputeProviderMetadata.java
+++ b/providers/ninefold-compute/src/main/java/org/jclouds/ninefold/compute/NinefoldComputeProviderMetadata.java
@@ -38,7 +38,8 @@
 
    public static Properties defaultProperties() {
       Properties properties = new Properties();
-      properties.setProperty(TEMPLATE, "imageId=1215,loginUser=user:Password01,authenticateSudo=true");
+      // https://ninefold.com/support/display/SPT/Ubuntu+10.04+64+Bit+Micro+Server+with+CHEF
+      properties.setProperty(TEMPLATE, "imageNameMatches=.*Micro.*,osFamily=UBUNTU,osVersionMatches=1[012].[01][04],loginUser=user:Password01,authenticateSudo=true");
       return properties;
    }
 
diff --git a/providers/ninefold-compute/src/test/java/org/jclouds/ninefold/compute/compute/NinefoldComputeTemplateBuilderLiveTest.java b/providers/ninefold-compute/src/test/java/org/jclouds/ninefold/compute/compute/NinefoldComputeTemplateBuilderLiveTest.java
index 912727f..144b619 100644
--- a/providers/ninefold-compute/src/test/java/org/jclouds/ninefold/compute/compute/NinefoldComputeTemplateBuilderLiveTest.java
+++ b/providers/ninefold-compute/src/test/java/org/jclouds/ninefold/compute/compute/NinefoldComputeTemplateBuilderLiveTest.java
@@ -52,16 +52,18 @@
          @Override
          public boolean apply(OsFamilyVersion64Bit input) {
             switch (input.family) {
-            case UBUNTU:
-               return input.version.equals("") || input.version.equals("10.04");
-            case SUSE:
-               return (input.version.equals("") || input.version.equals("11")) && input.is64Bit;
-            case CENTOS:
-               return (input.version.equals("") || input.version.equals("5.5")) && input.is64Bit;
-            case WINDOWS:
-               return input.version.equals("") || (input.version.equals("2008") && !input.is64Bit);
-            default:
-               return false;
+               case UBUNTU:
+                  return input.version.equals("") || input.version.equals("10.04");
+               case SUSE:
+                  return (input.version.equals("") || input.version.equals("11")) && input.is64Bit;
+               case DEBIAN:
+                  return (input.version.equals("") || input.version.equals("6.0")) && !input.is64Bit;
+               case CENTOS:
+                  return (input.version.equals("") || input.version.equals("5.5")) && input.is64Bit;
+               case WINDOWS:
+                  return input.version.equals("") || (input.version.equals("2008") && !input.is64Bit);
+               default:
+                  return false;
             }
          }
 
@@ -72,14 +74,19 @@
    public void testDefaultTemplateBuilder() throws IOException {
       Template defaultTemplate = this.view.getComputeService().templateBuilder().build();
       if (template == null) {
+         assert defaultTemplate.getImage().getOperatingSystem().getVersion().matches("1[012].[10][04]") : defaultTemplate
+                  .getImage().getOperatingSystem().getVersion();
          assertEquals(defaultTemplate.getImage().getOperatingSystem().is64Bit(), true);
-         assertEquals(defaultTemplate.getImage().getOperatingSystem().getVersion(), "10.04");
          assertEquals(defaultTemplate.getImage().getOperatingSystem().getFamily(), OsFamily.UBUNTU);
          assertEquals(defaultTemplate.getLocation().getId(), "1");
          assertEquals(getCores(defaultTemplate.getHardware()), 1.0d);
+         assertEquals(defaultTemplate.getOptions().getLoginUser(), "user");
+         assertEquals(defaultTemplate.getOptions().getLoginPassword(), "Password01");
+         assertEquals(defaultTemplate.getOptions().getLoginPrivateKey(), null);
+         assertEquals(defaultTemplate.getOptions().shouldAuthenticateSudo(), Boolean.TRUE);
       } else {
          assertEquals(defaultTemplate.getImage(), this.view.getComputeService().templateBuilder().from(template)
-               .build().getImage());
+                  .build().getImage());
       }
    }
 
diff --git a/scriptbuilder/src/test/java/org/jclouds/scriptbuilder/ScriptBuilderTest.java b/scriptbuilder/src/test/java/org/jclouds/scriptbuilder/ScriptBuilderTest.java
index aa7409a..e5d3664 100644
--- a/scriptbuilder/src/test/java/org/jclouds/scriptbuilder/ScriptBuilderTest.java
+++ b/scriptbuilder/src/test/java/org/jclouds/scriptbuilder/ScriptBuilderTest.java
@@ -26,18 +26,23 @@
 import static org.jclouds.scriptbuilder.domain.Statements.newStatementList;
 import static org.jclouds.scriptbuilder.domain.Statements.switchArg;
 import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertTrue;
 
 import java.io.IOException;
 import java.net.MalformedURLException;
+import java.util.Map;
 
 import org.jclouds.scriptbuilder.domain.OsFamily;
 import org.jclouds.scriptbuilder.domain.ShellToken;
+import org.jclouds.scriptbuilder.domain.Statement;
 import org.jclouds.scriptbuilder.domain.SwitchArg;
+import org.jclouds.scriptbuilder.util.Utils;
 import org.testng.annotations.Test;
 
 import com.google.common.base.Charsets;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.io.CharStreams;
 import com.google.common.io.Resources;
 
@@ -146,5 +151,22 @@
    public void testExportNPE() {
       new ScriptBuilder().addEnvironmentVariableScope(null, null);
    }
+   
+   @Test
+   public void testResolveFunctionDependenciesForStatementsUNIX() {
+      ImmutableMap<String, String> defaultFunctions = ImmutableMap.of("abort",
+               Utils.writeFunctionFromResource("abort", OsFamily.UNIX));
 
+      for (String fn : defaultFunctions.values()) {
+         assertTrue(fn.indexOf("\r\n") == -1, "windows linefeeds!");
+      }
+
+      Map<String, String> resolvedFunctions = ScriptBuilder.resolveFunctionDependenciesForStatements(defaultFunctions,
+               ImmutableSet.<Statement> of(call("nonewline")), OsFamily.UNIX);
+
+      assertEquals(
+               resolvedFunctions,
+               ImmutableMap.of("abort", Utils.writeFunctionFromResource("abort", OsFamily.UNIX), "nonewline",
+                        Utils.writeFunctionFromResource("nonewline", OsFamily.UNIX)));
+   }
 }