Issue 542: updated terremark eCloud implementation to 2.8 version of Org and added Tag and DataCenter queries
diff --git a/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/config/BaseVCloudExpressRestClientModule.java b/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/config/BaseVCloudExpressRestClientModule.java
index 986d681..e356439 100644
--- a/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/config/BaseVCloudExpressRestClientModule.java
+++ b/apis/vcloudexpress/src/main/java/org/jclouds/vcloud/config/BaseVCloudExpressRestClientModule.java
@@ -21,6 +21,7 @@
 import static com.google.common.base.Throwables.propagate;
 import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL;
 
+import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
 import javax.inject.Named;
@@ -43,7 +44,6 @@
 import com.google.inject.Provides;
 import com.google.inject.TypeLiteral;
 
-
 /**
  * Configures the VCloud authentication service connection, including logging
  * and http transport.
@@ -59,6 +59,11 @@
       super(syncClientType, asyncClientType);
    }
 
+   public BaseVCloudExpressRestClientModule(Class<S> syncClientType, Class<A> asyncClientType,
+         Map<Class<?>, Class<?>> delegateMap) {
+      super(syncClientType, asyncClientType, delegateMap);
+   }
+
    @Override
    protected void configure() {
       bind(new TypeLiteral<Function<Iterable<? extends CatalogItem>, Iterable<? extends VCloudExpressVAppTemplate>>>() {
diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudAsyncClient.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudAsyncClient.java
index a199e49..56fbf30 100644
--- a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudAsyncClient.java
+++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudAsyncClient.java
@@ -57,9 +57,11 @@
 import org.jclouds.vcloud.VCloudExpressAsyncClient;
 import org.jclouds.vcloud.VCloudExpressClient;
 import org.jclouds.vcloud.domain.Catalog;
+import org.jclouds.vcloud.domain.ReferenceType;
 import org.jclouds.vcloud.domain.Task;
 import org.jclouds.vcloud.domain.VCloudExpressVApp;
 import org.jclouds.vcloud.domain.VDC;
+import org.jclouds.vcloud.endpoints.Org;
 import org.jclouds.vcloud.filters.SetVCloudTokenCookie;
 import org.jclouds.vcloud.functions.OrgNameAndVDCNameToEndpoint;
 import org.jclouds.vcloud.functions.OrgNameCatalogNameItemNameToEndpoint;
@@ -96,6 +98,7 @@
 import org.jclouds.vcloud.xml.VCloudExpressVAppHandler;
 
 import com.google.common.util.concurrent.ListenableFuture;
+import com.google.inject.Provides;
 
 /**
  * Provides access to VCloud resources via their REST API.
@@ -107,6 +110,14 @@
 @RequestFilters(SetVCloudTokenCookie.class)
 public interface TerremarkVCloudAsyncClient extends VCloudExpressAsyncClient {
    /**
+    * 
+    * @return a listing of all orgs that the current user has access to.
+    */
+   @Provides
+   @Org
+   Iterable<ReferenceType> listOrgs();
+   
+   /**
     * @see VCloudExpressClient#getCatalogItemInOrg
     */
    @Override
diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudClient.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudClient.java
index eed2fa4..68d377f 100644
--- a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudClient.java
+++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/TerremarkVCloudClient.java
@@ -26,8 +26,10 @@
 
 import org.jclouds.concurrent.Timeout;
 import org.jclouds.vcloud.VCloudExpressClient;
+import org.jclouds.vcloud.domain.ReferenceType;
 import org.jclouds.vcloud.domain.Task;
 import org.jclouds.vcloud.domain.VCloudExpressVApp;
+import org.jclouds.vcloud.endpoints.Org;
 import org.jclouds.vcloud.terremark.domain.CustomizationParameters;
 import org.jclouds.vcloud.terremark.domain.InternetService;
 import org.jclouds.vcloud.terremark.domain.KeyPair;
@@ -41,6 +43,8 @@
 import org.jclouds.vcloud.terremark.options.AddInternetServiceOptions;
 import org.jclouds.vcloud.terremark.options.AddNodeOptions;
 
+import com.google.inject.Provides;
+
 /**
  * Provides access to VCloud resources via their REST API.
  * <p/>
@@ -51,6 +55,14 @@
 @Timeout(duration = 300, timeUnit = TimeUnit.SECONDS)
 public interface TerremarkVCloudClient extends VCloudExpressClient {
    /**
+    * 
+    * @return a listing of all orgs that the current user has access to.
+    */
+   @Provides
+   @Org
+   Iterable<ReferenceType> listOrgs();
+   
+   /**
     * {@inheritDoc}
     */
    @Override
diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkRestClientModule.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkRestClientModule.java
index 7e91fea..6cfb44c 100644
--- a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkRestClientModule.java
+++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkRestClientModule.java
@@ -17,12 +17,11 @@
  * ====================================================================
  */
 package org.jclouds.vcloud.terremark.config;
-
 import static org.jclouds.Constants.PROPERTY_SESSION_INTERVAL;
 
 import java.io.IOException;
 import java.util.Map;
- 
+
 import javax.inject.Inject;
 import javax.inject.Named;
 import javax.inject.Singleton;
@@ -38,7 +37,7 @@
 import org.jclouds.vcloud.domain.VCloudSession;
 import org.jclouds.vcloud.terremark.TerremarkVCloudAsyncClient;
 import org.jclouds.vcloud.terremark.TerremarkVCloudClient;
-import org.jclouds.vcloud.terremark.endpoints.KeysList;
+import org.jclouds.vcloud.terremark.endpoints.Keys;
 import org.jclouds.vcloud.terremark.handlers.ParseTerremarkVCloudErrorFromHttpResponse;
 
 import com.google.common.base.Function;
@@ -53,6 +52,11 @@
       super(syncClientType, asyncClientType);
    }
 
+   public TerremarkRestClientModule(Class<S> syncClientType, Class<A> asyncClientType,
+         Map<Class<?>, Class<?>> delegateMap) {
+      super(syncClientType, asyncClientType, delegateMap);
+   }
+   
    @Singleton
    @Provides
    @Named("CreateInternetService")
@@ -96,7 +100,7 @@
 
             @Override
             public ReferenceType apply(ReferenceType from) {
-               return client.findOrgNamed(from.getName()).getKeysList();
+               return client.findOrgNamed(from.getName()).getKeys();
             }
 
          });
@@ -105,7 +109,7 @@
 
    @Provides
    @Singleton
-   @KeysList
+   @Keys
    protected Supplier<Map<String, ReferenceType>> provideOrgToKeysListCache(
             @Named(PROPERTY_SESSION_INTERVAL) long seconds, final OrgNameToKeysListSupplier supplier) {
       return new MemoizedRetryOnTimeOutButNotOnAuthorizationExceptionSupplier<Map<String, ReferenceType>>(authException,
diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/domain/DataCenter.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/domain/DataCenter.java
new file mode 100644
index 0000000..8e872e7
--- /dev/null
+++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/domain/DataCenter.java
@@ -0,0 +1,131 @@
+/**
+ *
+ * Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed 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.terremark.domain;
+
+
+/**
+ * 
+ * @author Adrian Cole
+ */
+public class DataCenter {
+   public static Builder builder() {
+      return new Builder();
+   }
+
+   public static class Builder {
+      private String id;
+      private String name;
+      private String code;
+
+      public Builder id(String id) {
+         this.id = id;
+         return this;
+      }
+
+      public Builder name(String name) {
+         this.name = name;
+         return this;
+      }
+
+      public Builder code(String code) {
+         this.code = code;
+         return this;
+      }
+
+      public DataCenter build() {
+         return new DataCenter(id, name, code);
+      }
+   }
+
+   private final String id;
+   private final String name;
+   private final String code;
+
+   public DataCenter(String id, String name, String code) {
+      this.id = id;
+      this.name = name;
+      this.code = code;
+   }
+
+   /**
+    * 
+    * @return id of the data center
+    */
+   public String getId() {
+      return id;
+   }
+
+   /**
+    * 
+    * @return name of the data center
+    */
+   public String getName() {
+      return name;
+   }
+
+   /**
+    * 
+    * @return airport code of the data center
+    */
+   public String getCode() {
+      return code;
+   }
+
+   @Override
+   public int hashCode() {
+      final int prime = 31;
+      int result = 1;
+      result = prime * result + ((code == null) ? 0 : code.hashCode());
+      result = prime * result + ((id == null) ? 0 : id.hashCode());
+      result = prime * result + ((name == null) ? 0 : name.hashCode());
+      return result;
+   }
+
+   @Override
+   public boolean equals(Object obj) {
+      if (this == obj)
+         return true;
+      if (obj == null)
+         return false;
+      if (getClass() != obj.getClass())
+         return false;
+      DataCenter other = (DataCenter) obj;
+      if (code == null) {
+         if (other.code != null)
+            return false;
+      } else if (!code.equals(other.code))
+         return false;
+      if (id == null) {
+         if (other.id != null)
+            return false;
+      } else if (!id.equals(other.id))
+         return false;
+      if (name == null) {
+         if (other.name != null)
+            return false;
+      } else if (!name.equals(other.name))
+         return false;
+      return true;
+   }
+
+   @Override
+   public String toString() {
+      return "[id=" + id + ", name=" + name + ", code=" + code + "]";
+   }
+}
diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/domain/InternetService.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/domain/InternetService.java
index 534f3aa..a5e6621 100644
--- a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/domain/InternetService.java
+++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/domain/InternetService.java
@@ -83,9 +83,8 @@
 
    @Override
    public String toString() {
-      return "InternetService [description=" + description + ", enabled=" + enabled + ", id=" + id + ", name="
-            + name + ", port=" + port + ", protocol=" + protocol + ", publicIpAddress=" + publicIpAddress
-            + ", timeout=" + timeout + "]";
+      return "[description=" + description + ", enabled=" + enabled + ", id=" + id + ", name=" + name + ", port="
+            + port + ", protocol=" + protocol + ", publicIpAddress=" + publicIpAddress + ", timeout=" + timeout + "]";
    }
 
    @Override
diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/domain/TerremarkOrg.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/domain/TerremarkOrg.java
index c475181..f077208 100644
--- a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/domain/TerremarkOrg.java
+++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/domain/TerremarkOrg.java
@@ -18,10 +18,12 @@
  */
 package org.jclouds.vcloud.terremark.domain;
 
-import org.jclouds.vcloud.domain.ReferenceType;
+import java.util.Map;
+
 import org.jclouds.vcloud.domain.Org;
+import org.jclouds.vcloud.domain.ReferenceType;
 import org.jclouds.vcloud.terremark.domain.internal.TerremarkOrgImpl;
-import org.jclouds.vcloud.terremark.endpoints.KeysList;
+import org.jclouds.vcloud.terremark.endpoints.Keys;
 
 import com.google.inject.ImplementedBy;
 
@@ -31,8 +33,26 @@
 @org.jclouds.vcloud.endpoints.Org
 @ImplementedBy(TerremarkOrgImpl.class)
 public interface TerremarkOrg extends Org {
-
-   @KeysList
+   /**
+    * 
+    * @see #getKeys
+    */
+   @Deprecated
    ReferenceType getKeysList();
 
+   @Keys
+   ReferenceType getKeys();
+
+   /**
+    * there are multiple tasks lists in a terremark org
+    * 
+    * @see #getTasksLists
+    */
+   @Deprecated
+   ReferenceType getTasksList();
+
+   /**
+    */
+   Map<String, ReferenceType> getTasksLists();
+
 }
\ No newline at end of file
diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/domain/internal/TerremarkOrgImpl.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/domain/internal/TerremarkOrgImpl.java
index 9f9cd2f..1b1f97d 100644
--- a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/domain/internal/TerremarkOrgImpl.java
+++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/domain/internal/TerremarkOrgImpl.java
@@ -18,17 +18,19 @@
  */
 package org.jclouds.vcloud.terremark.domain.internal;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
 import java.net.URI;
 import java.util.Map;
 
-import javax.annotation.Nullable;
-
 import org.jclouds.vcloud.domain.ReferenceType;
 import org.jclouds.vcloud.domain.Task;
 import org.jclouds.vcloud.domain.internal.OrgImpl;
 import org.jclouds.vcloud.terremark.domain.TerremarkOrg;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
 
 /**
  * Locations of resources in a Terremark vCloud
@@ -39,12 +41,15 @@
 public class TerremarkOrgImpl extends OrgImpl implements TerremarkOrg {
 
    private final ReferenceType keysList;
+   private final ImmutableMap<String, ReferenceType> tasksLists;
 
    public TerremarkOrgImpl(String name, String type, URI id, String description, Map<String, ReferenceType> catalogs,
-            Map<String, ReferenceType> vdcs, Map<String, ReferenceType> networks, @Nullable ReferenceType tasksList,
-            ReferenceType keysList) {
-      super(name, type, id, name, description, catalogs, vdcs, networks, tasksList, ImmutableList.<Task> of());
-      this.keysList = keysList;
+         Map<String, ReferenceType> vdcs, Map<String, ReferenceType> networks, Map<String, ReferenceType> tasksLists,
+         ReferenceType keysList) {
+      super(name, type, id, name, description, catalogs, vdcs, networks, Iterables.get(tasksLists.values(), 0),
+            ImmutableList.<Task> of());
+      this.tasksLists = ImmutableMap.copyOf(checkNotNull(tasksLists, "tasksLists"));
+      this.keysList = checkNotNull(keysList, "keysList");
    }
 
    @Override
@@ -52,4 +57,14 @@
       return keysList;
    }
 
+   @Override
+   public Map<String, ReferenceType> getTasksLists() {
+      return tasksLists;
+   }
+
+   @Override
+   public ReferenceType getKeys() {
+      return keysList;
+   }
+
 }
\ No newline at end of file
diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/domain/internal/TerremarkVDCImpl.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/domain/internal/TerremarkVDCImpl.java
index 6a9402f..78bf17c 100644
--- a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/domain/internal/TerremarkVDCImpl.java
+++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/domain/internal/TerremarkVDCImpl.java
@@ -45,9 +45,6 @@
    private final ReferenceType publicIps;
    private final ReferenceType internetServices;
 
-   /** The serialVersionUID */
-   private static final long serialVersionUID = 8464716396538298809L;
-
    public TerremarkVDCImpl(String name, String type, URI id, VDCStatus status, ReferenceType org,
             @Nullable String description, Iterable<Task> tasks, AllocationModel allocationModel,
             @Nullable Capacity storageCapacity, @Nullable Capacity cpuCapacity, @Nullable Capacity memoryCapacity,
diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/endpoints/KeysList.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/endpoints/DataCenters.java
similarity index 93%
copy from common/trmk/src/main/java/org/jclouds/vcloud/terremark/endpoints/KeysList.java
copy to common/trmk/src/main/java/org/jclouds/vcloud/terremark/endpoints/DataCenters.java
index 4d28e01..305cf01 100644
--- a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/endpoints/KeysList.java
+++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/endpoints/DataCenters.java
@@ -26,7 +26,7 @@
 import javax.inject.Qualifier;
 
 /**
- * Related to Terremark SSH Keys List.
+ * Related to Terremark Data Centers List.
  * 
  * @author Adrian Cole
  * 
@@ -34,6 +34,6 @@
 @Retention(value = RetentionPolicy.RUNTIME)
 @Target(value = { ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
 @Qualifier
-public @interface KeysList {
+public @interface DataCenters {
 
 }
\ No newline at end of file
diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/endpoints/KeysList.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/endpoints/Keys.java
similarity index 97%
rename from common/trmk/src/main/java/org/jclouds/vcloud/terremark/endpoints/KeysList.java
rename to common/trmk/src/main/java/org/jclouds/vcloud/terremark/endpoints/Keys.java
index 4d28e01..811a496 100644
--- a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/endpoints/KeysList.java
+++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/endpoints/Keys.java
@@ -34,6 +34,6 @@
 @Retention(value = RetentionPolicy.RUNTIME)
 @Target(value = { ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
 @Qualifier
-public @interface KeysList {
+public @interface Keys {
 
 }
\ No newline at end of file
diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/endpoints/KeysList.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/endpoints/Tags.java
similarity index 94%
copy from common/trmk/src/main/java/org/jclouds/vcloud/terremark/endpoints/KeysList.java
copy to common/trmk/src/main/java/org/jclouds/vcloud/terremark/endpoints/Tags.java
index 4d28e01..e3d5a2b 100644
--- a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/endpoints/KeysList.java
+++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/endpoints/Tags.java
@@ -26,7 +26,7 @@
 import javax.inject.Qualifier;
 
 /**
- * Related to Terremark SSH Keys List.
+ * Related to Terremark Device Tags.
  * 
  * @author Adrian Cole
  * 
@@ -34,6 +34,6 @@
 @Retention(value = RetentionPolicy.RUNTIME)
 @Target(value = { ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
 @Qualifier
-public @interface KeysList {
+public @interface Tags {
 
 }
\ No newline at end of file
diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/endpoints/KeysList.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/endpoints/VAppCatalog.java
similarity index 94%
copy from common/trmk/src/main/java/org/jclouds/vcloud/terremark/endpoints/KeysList.java
copy to common/trmk/src/main/java/org/jclouds/vcloud/terremark/endpoints/VAppCatalog.java
index 4d28e01..5dc78f5 100644
--- a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/endpoints/KeysList.java
+++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/endpoints/VAppCatalog.java
@@ -26,7 +26,7 @@
 import javax.inject.Qualifier;
 
 /**
- * Related to Terremark SSH Keys List.
+ * Related to Terremark vApp Catalog
  * 
  * @author Adrian Cole
  * 
@@ -34,6 +34,6 @@
 @Retention(value = RetentionPolicy.RUNTIME)
 @Target(value = { ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
 @Qualifier
-public @interface KeysList {
+public @interface VAppCatalog {
 
 }
\ No newline at end of file
diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/functions/OrgURIToEndpoint.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/functions/OrgURIToEndpoint.java
new file mode 100644
index 0000000..208b025
--- /dev/null
+++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/functions/OrgURIToEndpoint.java
@@ -0,0 +1,65 @@
+/**
+ *
+ * Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed 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.terremark.functions;
+
+import java.net.URI;
+import java.util.Map;
+
+import org.jclouds.rest.ResourceNotFoundException;
+import org.jclouds.vcloud.domain.Org;
+import org.jclouds.vcloud.terremark.domain.TerremarkOrg;
+
+import com.google.common.base.Function;
+import com.google.common.base.Supplier;
+import com.google.common.collect.Maps;
+
+/**
+ * 
+ * @author Adrian Cole
+ */
+public abstract class OrgURIToEndpoint implements Function<Object, URI> {
+
+   protected final Supplier<Map<String, ? extends Org>> orgMap;
+   protected final URI defaultOrg;
+
+   public OrgURIToEndpoint(Supplier<Map<String, ? extends Org>> orgMap, @org.jclouds.vcloud.endpoints.Org URI defaultUri) {
+      this.orgMap = orgMap;
+      this.defaultOrg = defaultUri;
+   }
+
+   public URI apply(Object from) {
+      Map<URI, ? extends Org> uriToOrg = Maps.uniqueIndex(orgMap.get().values(), new Function<Org, URI>() {
+
+         @Override
+         public URI apply(Org from) {
+            return from.getHref();
+         }
+
+      });
+      try {
+         TerremarkOrg org = TerremarkOrg.class.cast(uriToOrg.get(from == null ? defaultOrg : from));
+         return getUriFromOrg(org);
+      } catch (NullPointerException e) {
+         throw new ResourceNotFoundException("org " + from + " not found in: " + uriToOrg, e);
+      }
+   }
+
+   protected abstract URI getUriFromOrg(TerremarkOrg org);
+
+}
\ No newline at end of file
diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/functions/OrgURIToKeysListEndpoint.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/functions/OrgURIToKeysListEndpoint.java
index 063bc2d..4f670f6 100644
--- a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/functions/OrgURIToKeysListEndpoint.java
+++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/functions/OrgURIToKeysListEndpoint.java
@@ -24,44 +24,26 @@
 import javax.inject.Inject;
 import javax.inject.Singleton;
 
-import org.jclouds.rest.ResourceNotFoundException;
 import org.jclouds.vcloud.domain.Org;
 import org.jclouds.vcloud.terremark.domain.TerremarkOrg;
 
 import com.google.common.base.Function;
 import com.google.common.base.Supplier;
-import com.google.common.collect.Maps;
 
 /**
  * 
  * @author Adrian Cole
  */
 @Singleton
-public class OrgURIToKeysListEndpoint implements Function<Object, URI> {
-   private final Supplier<Map<String, ? extends Org>> orgMap;
-   private final URI defaultOrg;
-
+public class OrgURIToKeysListEndpoint extends OrgURIToEndpoint implements Function<Object, URI> {
    @Inject
    public OrgURIToKeysListEndpoint(Supplier<Map<String, ? extends Org>> orgMap,
-            @org.jclouds.vcloud.endpoints.Org URI defaultUri) {
-      this.orgMap = orgMap;
-      this.defaultOrg = defaultUri;
+         @org.jclouds.vcloud.endpoints.Org URI defaultUri) {
+      super(orgMap, defaultUri);
    }
 
-   public URI apply(Object from) {
-      Map<URI, ? extends Org> uriToOrg = Maps.uniqueIndex(orgMap.get().values(), new Function<Org, URI>() {
-
-         @Override
-         public URI apply(Org from) {
-            return from.getHref();
-         }
-
-      });
-      try {
-         return TerremarkOrg.class.cast(uriToOrg.get(from == null ? defaultOrg : from)).getKeysList().getHref();
-      } catch (NullPointerException e) {
-         throw new ResourceNotFoundException("org " + from + " not found in: " + uriToOrg, e);
-      }
+   public URI getUriFromOrg(TerremarkOrg org) {
+      return org.getKeys().getHref();
    }
 
 }
\ No newline at end of file
diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/xml/DataCenterHandler.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/xml/DataCenterHandler.java
new file mode 100644
index 0000000..ad4ef48
--- /dev/null
+++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/xml/DataCenterHandler.java
@@ -0,0 +1,67 @@
+/**
+ *
+ * Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed 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.terremark.xml;
+
+import static org.jclouds.util.SaxUtils.currentOrNull;
+import static org.jclouds.util.SaxUtils.equalsOrSuffix;
+
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.vcloud.terremark.domain.DataCenter;
+import org.xml.sax.Attributes;
+
+/**
+ * @author Adrian Cole
+ */
+public class DataCenterHandler extends ParseSax.HandlerWithResult<DataCenter> {
+   protected StringBuilder currentText = new StringBuilder();
+
+   protected DataCenter.Builder builder = DataCenter.builder();
+
+   public DataCenter getResult() {
+      try {
+         return builder.build();
+      } finally {
+         builder = DataCenter.builder();
+      }
+   }
+
+   @Override
+   public void startElement(String uri, String localName, String qName, Attributes attrs) {
+   }
+
+   @Override
+   public void endElement(String uri, String localName, String qName) {
+      String current = currentOrNull(currentText);
+      if (current != null) {
+         if (equalsOrSuffix(qName, "Id")) {
+            builder.id(current);
+         } else if (equalsOrSuffix(qName, "Code")) {
+            builder.code(current);
+         } else if (equalsOrSuffix(qName, "Name")) {
+            builder.name(current);
+         }
+      }
+      currentText = new StringBuilder();
+   }
+
+   public void characters(char ch[], int start, int length) {
+      currentText.append(ch, start, length);
+   }
+
+}
diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/xml/DataCentersHandler.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/xml/DataCentersHandler.java
new file mode 100644
index 0000000..0bd331b
--- /dev/null
+++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/xml/DataCentersHandler.java
@@ -0,0 +1,77 @@
+/**
+ *
+ * Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed 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.terremark.xml;
+
+import static org.jclouds.util.SaxUtils.equalsOrSuffix;
+
+import java.util.Set;
+
+import javax.inject.Inject;
+
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.vcloud.terremark.domain.DataCenter;
+import org.xml.sax.Attributes;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSet.Builder;
+
+/**
+ * @author Adrian Cole
+ */
+public class DataCentersHandler extends ParseSax.HandlerWithResult<Set<DataCenter>> {
+   protected StringBuilder currentText = new StringBuilder();
+
+   protected Builder<DataCenter> dataCenters = ImmutableSet.<DataCenter> builder();
+
+   protected DataCenter.Builder builder = DataCenter.builder();
+
+   protected final DataCenterHandler handler;
+
+   public Set<DataCenter> getResult() {
+      try {
+         return dataCenters.build();
+      } finally {
+         dataCenters = ImmutableSet.<DataCenter> builder();
+      }
+   }
+
+   @Inject
+   public DataCentersHandler(DataCenterHandler handler) {
+      this.handler = handler;
+   }
+
+   @Override
+   public void startElement(String uri, String localName, String qName, Attributes attrs) {
+   }
+
+   @Override
+   public void endElement(String uri, String localName, String qName) {
+      if (equalsOrSuffix(qName, "DataCenter")) {
+         dataCenters.add(handler.getResult());
+      } else {
+         handler.endElement(uri, localName, qName);
+      }
+   }
+
+   @Override
+   public void characters(char ch[], int start, int length) {
+      handler.characters(ch, start, length);
+   }
+
+}
diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/xml/InternetServiceHandler.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/xml/InternetServiceHandler.java
index 14a5df5..d33b5c9 100644
--- a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/xml/InternetServiceHandler.java
+++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/xml/InternetServiceHandler.java
@@ -18,25 +18,22 @@
  */
 package org.jclouds.vcloud.terremark.xml;
 
+import static org.jclouds.util.SaxUtils.currentOrNull;
+import static org.jclouds.util.SaxUtils.equalsOrSuffix;
+
 import java.net.URI;
 
-import javax.annotation.Resource;
-
 import org.jclouds.http.functions.ParseSax.HandlerWithResult;
-import org.jclouds.logging.Logger;
 import org.jclouds.vcloud.terremark.domain.InternetService;
 import org.jclouds.vcloud.terremark.domain.Protocol;
 import org.jclouds.vcloud.terremark.domain.PublicIpAddress;
 import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
 
 /**
  * @author Adrian Cole
  */
 public class InternetServiceHandler extends HandlerWithResult<InternetService> {
 
-   @Resource
-   protected Logger logger = Logger.NULL;
    private StringBuilder currentText = new StringBuilder();
 
    private boolean inPublicIpAddress;
@@ -51,10 +48,9 @@
    private boolean enabled;
    private Protocol protocol;
 
-   protected String currentOrNull() {
-      String returnVal = currentText.toString().trim();
-      return returnVal.equals("") ? null : returnVal;
-   }
+   protected int depth = 0;
+
+   private int thisDepth;
 
    @Override
    public InternetService getResult() {
@@ -62,40 +58,48 @@
    }
 
    @Override
-   public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
-      if (qName.equals("PublicIpAddress")) {
+   public void startElement(String uri, String localName, String qName, Attributes attrs) {
+      depth++;
+      if (equalsOrSuffix(qName, "InternetService")) {
+         thisDepth = depth;
+      } else if (equalsOrSuffix(qName, "PublicIpAddress")) {
          inPublicIpAddress = true;
       }
    }
 
    public void endElement(String uri, String name, String qName) {
-      String current = currentOrNull();
-      if (qName.equals("PublicIpAddress")) {
+      depth--;
+      if (equalsOrSuffix(qName, "PublicIpAddress")) {
+         inPublicIpAddress = false;
          publicIpAddress = new PublicIpAddress(address, addressLocation);
          address = null;
          addressLocation = null;
-         inPublicIpAddress = false;
-      } else if (current != null) {
-         if (qName.equals("Href")) {
-            if (inPublicIpAddress)
-               addressLocation = URI.create(current);
-            else
-               location = URI.create(current);
-         } else if (qName.equals("Name")) {
-            if (inPublicIpAddress)
-               address = current;
-            else
-               serviceName = current;
-         } else if (qName.equals("Port")) {
-            port = Integer.parseInt(current);
-         } else if (qName.equals("Protocol")) {
-            protocol = Protocol.valueOf(current);
-         } else if (qName.equals("Enabled")) {
-            enabled = Boolean.parseBoolean(current);
-         } else if (qName.equals("Timeout")) {
-            timeout = Integer.parseInt(current);
-         } else if (qName.equals("Description")) {
-            description = current;
+      } else {
+         String value = currentOrNull(currentText);
+         if (value != null && !value.equals("")) {
+            if (depth == thisDepth) {
+               if (equalsOrSuffix(qName, "Href")) {
+                  location = URI.create(value);
+               } else if (equalsOrSuffix(qName, "Name")) {
+                  serviceName = value;
+               } else if (equalsOrSuffix(qName, "Port")) {
+                  port = Integer.parseInt(value);
+               } else if (equalsOrSuffix(qName, "Protocol")) {
+                  protocol = Protocol.valueOf(value);
+               } else if (equalsOrSuffix(qName, "Enabled")) {
+                  enabled = Boolean.parseBoolean(value);
+               } else if (equalsOrSuffix(qName, "Timeout")) {
+                  timeout = Integer.parseInt(value);
+               } else if (equalsOrSuffix(qName, "Description")) {
+                  description = currentOrNull(currentText);
+               }
+            } else if (inPublicIpAddress) {
+               if (equalsOrSuffix(qName, "Href")) {
+                  addressLocation = URI.create(value);
+               } else if (equalsOrSuffix(qName, "Name")) {
+                  address = value;
+               }
+            }
          }
       }
       currentText = new StringBuilder();
diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/xml/InternetServicesHandler.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/xml/InternetServicesHandler.java
index ff16d9a..4395379 100644
--- a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/xml/InternetServicesHandler.java
+++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/xml/InternetServicesHandler.java
@@ -18,28 +18,26 @@
  */
 package org.jclouds.vcloud.terremark.xml;
 
+import static org.jclouds.util.SaxUtils.equalsOrSuffix;
+
 import java.util.Set;
 
-import javax.annotation.Resource;
 import javax.inject.Inject;
 
 import org.jclouds.http.functions.ParseSax.HandlerWithResult;
-import org.jclouds.logging.Logger;
 import org.jclouds.vcloud.terremark.domain.InternetService;
 import org.xml.sax.Attributes;
-import org.xml.sax.SAXException;
 
-import com.google.common.collect.Sets;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSet.Builder;
 
 /**
  * @author Adrian Cole
  */
 public class InternetServicesHandler extends HandlerWithResult<Set<InternetService>> {
 
-   @Resource
-   protected Logger logger = Logger.NULL;
    private final InternetServiceHandler handler;
-   Set<InternetService> result = Sets.newLinkedHashSet();
+   private Builder<InternetService> builder = ImmutableSet.<InternetService> builder();
 
    @Inject
    public InternetServicesHandler(InternetServiceHandler handler) {
@@ -48,24 +46,44 @@
 
    @Override
    public Set<InternetService> getResult() {
-      return result;
+      try {
+         return builder.build();
+      } finally {
+         builder = ImmutableSet.<InternetService> builder();
+      }
    }
 
+   int depth;
+   private boolean inInternetService;
+
    @Override
-   public void startElement(String uri, String localName, String qName, Attributes attributes)
-            throws SAXException {
-      handler.startElement(uri, localName, qName, attributes);
+   public void startElement(String uri, String localName, String qName, Attributes attrs) {
+      depth++;
+      if (depth == 2) {
+         if (equalsOrSuffix(qName, "InternetService")) {
+            inInternetService = true;
+         }
+      } else if (inInternetService) {
+         handler.startElement(uri, localName, qName, attrs);
+      }
    }
 
    public void endElement(String uri, String name, String qName) {
-      handler.endElement(uri, name, qName);
-      if (qName.equals("InternetService")) {
-         result.add(handler.getResult());
+      depth--;
+      if (depth == 1) {
+         if (equalsOrSuffix(qName, "InternetService")) {
+            inInternetService = false;
+            builder.add(handler.getResult());
+         }
+      } else if (inInternetService) {
+         handler.endElement(uri, name, qName);
       }
    }
 
    public void characters(char ch[], int start, int length) {
-      handler.characters(ch, start, length);
+      if (inInternetService) {
+         handler.characters(ch, start, length);
+      }
    }
 
 }
\ No newline at end of file
diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/xml/TerremarkOrgHandler.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/xml/TerremarkOrgHandler.java
index 26f3bba..8bc95ab 100644
--- a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/xml/TerremarkOrgHandler.java
+++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/xml/TerremarkOrgHandler.java
@@ -18,13 +18,14 @@
  */
 package org.jclouds.vcloud.terremark.xml;
 
-import static org.jclouds.util.SaxUtils.cleanseAttributes;
 import static org.jclouds.vcloud.util.Utils.newReferenceType;
+import static org.jclouds.vcloud.util.Utils.putReferenceType;
 
 import java.util.Map;
 
 import javax.inject.Inject;
 
+import org.jclouds.util.SaxUtils;
 import org.jclouds.vcloud.domain.ReferenceType;
 import org.jclouds.vcloud.terremark.domain.TerremarkOrg;
 import org.jclouds.vcloud.terremark.domain.internal.TerremarkOrgImpl;
@@ -33,6 +34,8 @@
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 
+import com.google.common.collect.Maps;
+
 /**
  * @author Adrian Cole
  */
@@ -42,24 +45,37 @@
       super(taskHandler);
    }
 
-   private ReferenceType keysList;
+   protected ReferenceType keysList;
+   protected Map<String, ReferenceType> tasksLists = Maps.newLinkedHashMap();
 
    public TerremarkOrg getResult() {
       return new TerremarkOrgImpl(org.getName(), org.getType(), org.getHref(), description, catalogs, vdcs, networks,
-               tasksList, keysList);
+            tasksLists, keysList);
    }
 
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException {
-      Map<String, String> attributes = cleanseAttributes(attrs);
-      super.startElement(uri, localName, qName, attrs);
-      if (qName.equals("Link")) {
-         if (attributes.containsKey("type")) {
-             String type = attributes.get("type");
-             if (type != null && type.endsWith("keysList+xml")) {
-                 keysList = newReferenceType(attributes);
+      Map<String, String> attributes = SaxUtils.cleanseAttributes(attrs);
+      if (qName.endsWith("Org")) {
+         org = newReferenceType(attributes);
+      } else if (qName.endsWith("Link")) {
+         String type = attributes.get("type");
+         if (type != null) {
+            if (type.indexOf("vdc+xml") != -1) {
+               putReferenceType(vdcs, attributes);
+            } else if (type.indexOf("catalog+xml") != -1) {
+               putReferenceType(catalogs, attributes);
+            } else if (type.indexOf("tasksList+xml") != -1) {
+               putReferenceType(tasksLists, attributes);
+            } else if (type.indexOf("network+xml") != -1) {
+               putReferenceType(networks, attributes);
+            } else if (type != null && type.endsWith("keysList+xml")) {
+               keysList = newReferenceType(attributes);
             }
          }
+      } else {
+         taskHandler.startElement(uri, localName, qName, attrs);
       }
+
    }
 }
diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/xml/VAppExtendedInfoHandler.java b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/xml/VAppExtendedInfoHandler.java
index 5bf429f..0ed53cf 100644
--- a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/xml/VAppExtendedInfoHandler.java
+++ b/common/trmk/src/main/java/org/jclouds/vcloud/terremark/xml/VAppExtendedInfoHandler.java
@@ -20,16 +20,15 @@
 
 import java.net.URI;
 import java.util.Arrays;
-import java.util.ArrayList;
 import java.util.List;
 
 import javax.annotation.Resource;
 
 import org.jclouds.http.functions.ParseSax.HandlerWithResult;
 import org.jclouds.logging.Logger;
-import org.jclouds.vcloud.terremark.domain.VAppExtendedInfo;
 import org.jclouds.vcloud.terremark.domain.NetworkAdapter;
 import org.jclouds.vcloud.terremark.domain.Subnet;
+import org.jclouds.vcloud.terremark.domain.VAppExtendedInfo;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 
diff --git a/common/trmk/src/test/java/org/jclouds/vcloud/terremark/BaseTerremarkClientLiveTest.java b/common/trmk/src/test/java/org/jclouds/vcloud/terremark/BaseTerremarkClientLiveTest.java
new file mode 100644
index 0000000..1c25431
--- /dev/null
+++ b/common/trmk/src/test/java/org/jclouds/vcloud/terremark/BaseTerremarkClientLiveTest.java
@@ -0,0 +1,115 @@
+/**
+ *
+ * Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed 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.terremark;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.util.Properties;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import org.jclouds.Constants;
+import org.jclouds.compute.ComputeService;
+import org.jclouds.compute.ComputeServiceContextFactory;
+import org.jclouds.logging.log4j.config.Log4JLoggingModule;
+import org.jclouds.net.IPSocket;
+import org.jclouds.predicates.InetSocketAddressConnect;
+import org.jclouds.predicates.RetryablePredicate;
+import org.jclouds.rest.RestContextFactory;
+import org.jclouds.ssh.SshClient.Factory;
+import org.jclouds.ssh.jsch.config.JschSshClientModule;
+import org.testng.annotations.AfterGroups;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeGroups;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.inject.Guice;
+import com.google.inject.Module;
+
+/**
+ * 
+ * @author Adrian Cole
+ */
+@Test(groups = "live", enabled = true, singleThreaded = true)
+public abstract class BaseTerremarkClientLiveTest <T extends TerremarkVCloudClient>{
+   protected String prefix = System.getProperty("user.name");
+
+   protected ComputeService client;
+
+   protected String provider = "trmk-ecloud";
+   protected String identity;
+   protected String credential;
+   protected String endpoint;
+   protected String apiversion;
+
+   protected RetryablePredicate<IPSocket> socketTester;
+   protected Factory sshFactory;
+
+   @SuppressWarnings("unchecked")
+   protected T getApi() {
+      return (T) client.getContext().getProviderSpecificContext().getApi();
+   }
+
+   @BeforeClass
+   protected void setupCredentials() {
+      identity = checkNotNull(System.getProperty("test." + provider + ".identity"), "test." + provider + ".identity");
+      credential = System.getProperty("test." + provider + ".credential");
+      endpoint = System.getProperty("test." + provider + ".endpoint");
+      apiversion = System.getProperty("test." + provider + ".apiversion");
+   }
+
+   protected Properties setupProperties() {
+      Properties overrides = new Properties();
+      overrides.setProperty(Constants.PROPERTY_TRUST_ALL_CERTS, "true");
+      overrides.setProperty(Constants.PROPERTY_RELAX_HOSTNAME, "true");
+      overrides.setProperty(provider + ".identity", identity);
+      if (credential != null)
+         overrides.setProperty(provider + ".credential", credential);
+      if (endpoint != null)
+         overrides.setProperty(provider + ".endpoint", endpoint);
+      if (apiversion != null)
+         overrides.setProperty(provider + ".apiversion", apiversion);
+      return overrides;
+   }
+
+   @BeforeGroups(groups = { "live" })
+   public void setupClient() {
+      setupCredentials();
+      Properties overrides = setupProperties();
+      client = new ComputeServiceContextFactory().createContext(provider,
+               ImmutableSet.<Module> of(new Log4JLoggingModule()), overrides).getComputeService();
+      socketTester = new RetryablePredicate<IPSocket>(new InetSocketAddressConnect(), 300, 1, TimeUnit.SECONDS);
+      sshFactory = Guice.createInjector(getSshModule()).getInstance(Factory.class);
+   }
+
+   protected Properties setupRestProperties() {
+      return RestContextFactory.getPropertiesFromResource("/rest.properties");
+   }
+
+   protected JschSshClientModule getSshModule() {
+      return new JschSshClientModule();
+   }
+
+   @AfterGroups(groups = { "live" })
+   protected void cleanup() throws InterruptedException, ExecutionException, TimeoutException {
+      client.getContext().close();
+   }
+}
\ No newline at end of file
diff --git a/common/trmk/src/test/java/org/jclouds/vcloud/terremark/TerremarkClientLiveTest.java b/common/trmk/src/test/java/org/jclouds/vcloud/terremark/TerremarkClientLiveTest.java
index 8fbdcf1..74d6934 100644
--- a/common/trmk/src/test/java/org/jclouds/vcloud/terremark/TerremarkClientLiveTest.java
+++ b/common/trmk/src/test/java/org/jclouds/vcloud/terremark/TerremarkClientLiveTest.java
@@ -31,9 +31,9 @@
 import java.io.IOException;
 import java.net.URI;
 import java.util.List;
+import java.util.Map.Entry;
 import java.util.Properties;
 import java.util.Set;
-import java.util.Map.Entry;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
@@ -48,8 +48,8 @@
 import org.jclouds.predicates.SocketOpen;
 import org.jclouds.rest.RestContextFactory;
 import org.jclouds.ssh.SshClient;
-import org.jclouds.ssh.SshException;
 import org.jclouds.ssh.SshClient.Factory;
+import org.jclouds.ssh.SshException;
 import org.jclouds.ssh.jsch.config.JschSshClientModule;
 import org.jclouds.vcloud.VCloudExpressClientLiveTest;
 import org.jclouds.vcloud.VCloudExpressMediaType;
@@ -99,7 +99,14 @@
    protected VCloudExpressVApp clone;
    protected VDC vdc;
    public static final String PREFIX = System.getProperty("user.name") + "-terremark";
-
+   
+   @Test
+   public void testListOrgs() throws Exception {
+      for (ReferenceType org : tmClient.listOrgs()) {
+         assertNotNull(tmClient.getOrg(org.getHref()));
+      }
+   }
+   
    @Test
    public void testGetAllInternetServices() throws Exception {
       for (InternetService service : tmClient.getAllInternetServicesInVDC(tmClient.findVDCInOrgNamed(null, null)
diff --git a/common/trmk/src/test/java/org/jclouds/vcloud/terremark/xml/DataCenterHandlerTest.java b/common/trmk/src/test/java/org/jclouds/vcloud/terremark/xml/DataCenterHandlerTest.java
new file mode 100644
index 0000000..cc083dc
--- /dev/null
+++ b/common/trmk/src/test/java/org/jclouds/vcloud/terremark/xml/DataCenterHandlerTest.java
@@ -0,0 +1,47 @@
+/**
+ *
+ * Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed 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.terremark.xml;
+
+import static org.testng.Assert.assertEquals;
+
+import java.io.InputStream;
+
+import org.jclouds.http.functions.BaseHandlerTest;
+import org.jclouds.vcloud.terremark.domain.DataCenter;
+import org.testng.annotations.Test;
+
+/**
+ * Tests behavior of {@code DataCenterHandler}
+ * 
+ * @author Adrian Cole
+ */
+// NOTE:without testName, this will not call @Before* and fail w/NPE during
+// surefire
+@Test(groups = "unit", testName = "DataCenterHandlerTest")
+public class DataCenterHandlerTest extends BaseHandlerTest {
+
+   public void test() {
+      InputStream is = getClass().getResourceAsStream("/datacenter.xml");
+
+      DataCenter result = factory.create(injector.getInstance(DataCenterHandler.class)).parse(is);
+
+      DataCenter expects = DataCenter.builder().id("1").name("Terremark - Miami").code("MIA").build();
+      assertEquals(result.toString(), expects.toString());
+   }
+}
diff --git a/common/trmk/src/test/java/org/jclouds/vcloud/terremark/xml/DataCentersHandlerTest.java b/common/trmk/src/test/java/org/jclouds/vcloud/terremark/xml/DataCentersHandlerTest.java
new file mode 100644
index 0000000..f062d0e
--- /dev/null
+++ b/common/trmk/src/test/java/org/jclouds/vcloud/terremark/xml/DataCentersHandlerTest.java
@@ -0,0 +1,52 @@
+/**
+ *
+ * Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed 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.terremark.xml;
+
+import static org.testng.Assert.assertEquals;
+
+import java.io.InputStream;
+import java.util.Set;
+
+import org.jclouds.http.functions.BaseHandlerTest;
+import org.jclouds.vcloud.terremark.domain.DataCenter;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * Tests behavior of {@code DataCentersHandler}
+ * 
+ * @author Adrian Cole
+ */
+// NOTE:without testName, this will not call @Before* and fail w/NPE during
+// surefire
+@Test(groups = "unit", testName = "DataCentersHandlerTest")
+public class DataCentersHandlerTest extends BaseHandlerTest {
+
+   public void test() {
+      InputStream is = getClass().getResourceAsStream("/datacenters.xml");
+
+      Set<DataCenter> result = factory.create(injector.getInstance(DataCentersHandler.class)).parse(is);
+
+      ImmutableSet<DataCenter> expects = ImmutableSet.<DataCenter>of(DataCenter.builder().id("1").name("Terremark - Miami").code("MIA").build(),
+            DataCenter.builder().id("3670").name("Terremark - Culpeper").code("CUA").build());
+      assertEquals(result.toString(), expects.toString());
+   }
+
+}
diff --git a/common/trmk/src/test/java/org/jclouds/vcloud/terremark/xml/InternetServicesHandlerTest.java b/common/trmk/src/test/java/org/jclouds/vcloud/terremark/xml/InternetServicesHandlerTest.java
index 5e82e09..1e21480 100644
--- a/common/trmk/src/test/java/org/jclouds/vcloud/terremark/xml/InternetServicesHandlerTest.java
+++ b/common/trmk/src/test/java/org/jclouds/vcloud/terremark/xml/InternetServicesHandlerTest.java
@@ -46,11 +46,11 @@
       InputStream is = getClass().getResourceAsStream("/terremark/InternetServices.xml");
 
       Set<InternetService> result = factory.create(injector.getInstance(InternetServicesHandler.class)).parse(is);
-      assertEquals(result, ImmutableSet.of(new InternetService("IS_for_Jim2", URI
+      assertEquals(result.toString(), ImmutableSet.of(new InternetService("IS_for_Jim2", URI
                .create("https://services.vcloudexpress.terremark.com/api/v0.8/InternetServices/524"),
                new PublicIpAddress("10.1.22.159", URI
                         .create("https://services.vcloudexpress.terremark.com/api/v0.8/PublicIps/4208")), 45,
-               Protocol.HTTP, false, 1, "Some test service")));
+               Protocol.HTTP, false, 1, "Some test service")).toString());
    }
 
    public void test2() throws UnknownHostException {
diff --git a/common/trmk/src/test/java/org/jclouds/vcloud/terremark/xml/TerremarkOrgHandlerTest.java b/common/trmk/src/test/java/org/jclouds/vcloud/terremark/xml/TerremarkOrgHandlerTest.java
index 6731cc8..2a51fdb 100644
--- a/common/trmk/src/test/java/org/jclouds/vcloud/terremark/xml/TerremarkOrgHandlerTest.java
+++ b/common/trmk/src/test/java/org/jclouds/vcloud/terremark/xml/TerremarkOrgHandlerTest.java
@@ -78,9 +78,11 @@
       assertEquals(result.getVDCs(), ImmutableMap.of("Miami Environment 1", new ReferenceTypeImpl(
                "Miami Environment 1", VCloudExpressMediaType.VDC_XML, URI
                         .create("https://services.vcloudexpress.terremark.com/api/v0.8a-ext1.6/vdc/32"))));
-      assertEquals(result.getTasksList(), new ReferenceTypeImpl("Miami Environment 1 Tasks List", TASKSLIST_XML, URI
-               .create("https://services.vcloudexpress.terremark.com/api/v0.8a-ext1.6/vdc/32/tasksList")));
-      assertEquals(result.getKeysList(), new ReferenceTypeImpl("Keys", "application/vnd.tmrk.vcloudExpress.keysList+xml",
+      assertEquals(result.getTasksLists(), ImmutableMap.of(
+            "Miami Environment 1 Tasks List",
+            new ReferenceTypeImpl("Miami Environment 1 Tasks List", TASKSLIST_XML, URI
+                  .create("https://services.vcloudexpress.terremark.com/api/v0.8a-ext1.6/vdc/32/tasksList"))));
+      assertEquals(result.getKeys(), new ReferenceTypeImpl("Keys", "application/vnd.tmrk.vcloudExpress.keysList+xml",
                URI.create("https://services.vcloudexpress.terremark.com/api/v0.8a-ext1.6/extensions/org/48/keys")));
 
    }
diff --git a/common/trmk/src/test/resources/datacenter.xml b/common/trmk/src/test/resources/datacenter.xml
new file mode 100644
index 0000000..aba474e
--- /dev/null
+++ b/common/trmk/src/test/resources/datacenter.xml
@@ -0,0 +1,9 @@
+ <DataCenter>
+
+    <Code>MIA</Code>
+
+    <Id>1</Id>
+
+    <Name>Terremark - Miami</Name>
+
+</DataCenter>
\ No newline at end of file
diff --git a/common/trmk/src/test/resources/datacenters.xml b/common/trmk/src/test/resources/datacenters.xml
new file mode 100644
index 0000000..34aee40
--- /dev/null
+++ b/common/trmk/src/test/resources/datacenters.xml
@@ -0,0 +1,23 @@
+<DataCenterList xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
+
+  <DataCenter>
+
+    <Code>MIA</Code>
+
+    <Id>1</Id>
+
+    <Name>Terremark - Miami</Name>
+
+  </DataCenter>
+
+  <DataCenter>
+
+    <Code>CUA</Code>
+
+    <Id>3670</Id>
+
+    <Name>Terremark - Culpeper</Name>
+
+  </DataCenter>
+
+</DataCenterList>
\ No newline at end of file
diff --git a/compute/src/test/clojure/org/jclouds/compute_test.clj b/compute/src/test/clojure/org/jclouds/compute_test.clj
index f47e0cf..bb372fe 100644
--- a/compute/src/test/clojure/org/jclouds/compute_test.clj
+++ b/compute/src/test/clojure/org/jclouds/compute_test.clj
@@ -54,7 +54,6 @@
   (is (compute-service? (as-compute-service (compute-context *compute*)))))
 
 (deftest nodes-test
-  (is (empty? (nodes)))
   (is (create-node "fred" (build-template
          *compute* {} )))
   (is (= 1 (count (nodes))))
diff --git a/providers/trmk-ecloud/pom.xml b/providers/trmk-ecloud/pom.xml
index 6dc39c5..83b9580 100644
--- a/providers/trmk-ecloud/pom.xml
+++ b/providers/trmk-ecloud/pom.xml
@@ -159,7 +159,7 @@
                 <configuration>
                     <instructions>
                         <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
-                        <Export-Package>org.jclouds.vcloud.terremark.*;version="${project.version}"</Export-Package>
+                        <Export-Package>org.jclouds.vcloud.terremark.*;version="${project.version}",org.jclouds.terremark.ecloud.*;version="${project.version}"</Export-Package>
                         <Import-Package>org.jclouds.*;version="${project.version}",*</Import-Package>
                     </instructions>
                 </configuration>
diff --git a/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/domain/TerremarkECloudOrg.java b/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/domain/TerremarkECloudOrg.java
new file mode 100644
index 0000000..a0b5028
--- /dev/null
+++ b/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/domain/TerremarkECloudOrg.java
@@ -0,0 +1,27 @@
+package org.jclouds.terremark.ecloud.domain;
+
+import org.jclouds.vcloud.domain.ReferenceType;
+import org.jclouds.vcloud.terremark.domain.TerremarkOrg;
+import org.jclouds.vcloud.terremark.domain.internal.TerremarkOrgImpl;
+import org.jclouds.vcloud.terremark.endpoints.DataCenters;
+import org.jclouds.vcloud.terremark.endpoints.Tags;
+import org.jclouds.vcloud.terremark.endpoints.VAppCatalog;
+
+import com.google.inject.ImplementedBy;
+
+/**
+ * @author Adrian Cole
+ */
+@org.jclouds.vcloud.endpoints.Org
+@ImplementedBy(TerremarkOrgImpl.class)
+public interface TerremarkECloudOrg extends TerremarkOrg {
+
+   @DataCenters
+   ReferenceType getDataCenters();
+
+   @Tags
+   ReferenceType getTags();
+
+   @VAppCatalog
+   ReferenceType getVAppCatalog();
+}
\ No newline at end of file
diff --git a/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/domain/internal/TerremarkECloudOrgImpl.java b/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/domain/internal/TerremarkECloudOrgImpl.java
new file mode 100644
index 0000000..1a75fb8
--- /dev/null
+++ b/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/domain/internal/TerremarkECloudOrgImpl.java
@@ -0,0 +1,67 @@
+/**
+ *
+ * Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed 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.terremark.ecloud.domain.internal;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import java.net.URI;
+import java.util.Map;
+
+import org.jclouds.terremark.ecloud.domain.TerremarkECloudOrg;
+import org.jclouds.vcloud.domain.ReferenceType;
+import org.jclouds.vcloud.terremark.domain.internal.TerremarkOrgImpl;
+
+/**
+ * Locations of resources in a Terremark eCloud Org
+ * 
+ * @author Adrian Cole
+ * 
+ */
+public class TerremarkECloudOrgImpl extends TerremarkOrgImpl implements TerremarkECloudOrg {
+
+   private final ReferenceType dataCentersList;
+   private final ReferenceType deviceTags;
+   private final ReferenceType vAppCatalog;
+
+   public TerremarkECloudOrgImpl(String name, String type, URI id, String description,
+         Map<String, ReferenceType> catalogs, Map<String, ReferenceType> vdcs, Map<String, ReferenceType> networks,
+         Map<String, ReferenceType> tasksLists, ReferenceType keysList, ReferenceType deviceTags,
+         ReferenceType vAppCatalog, ReferenceType dataCentersList) {
+      super(name, type, id, name, catalogs, vdcs, networks, tasksLists, keysList);
+      this.deviceTags = checkNotNull(deviceTags, "deviceTags");
+      this.vAppCatalog = checkNotNull(vAppCatalog, "vAppCatalog");
+      this.dataCentersList = checkNotNull(dataCentersList, "dataCentersList");
+   }
+
+   @Override
+   public ReferenceType getDataCenters() {
+      return dataCentersList;
+   }
+
+   @Override
+   public ReferenceType getTags() {
+      return deviceTags;
+   }
+
+   @Override
+   public ReferenceType getVAppCatalog() {
+      return vAppCatalog;
+   }
+
+}
\ No newline at end of file
diff --git a/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/features/DataCenterOperationsAsyncClient.java b/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/features/DataCenterOperationsAsyncClient.java
new file mode 100644
index 0000000..cfac8b7
--- /dev/null
+++ b/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/features/DataCenterOperationsAsyncClient.java
@@ -0,0 +1,55 @@
+package org.jclouds.terremark.ecloud.features;
+
+import static org.jclouds.vcloud.terremark.TerremarkECloudMediaType.DATACENTERSLIST_XML;
+
+import java.net.URI;
+import java.util.Set;
+
+import javax.annotation.Nullable;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+
+import org.jclouds.rest.annotations.EndpointParam;
+import org.jclouds.rest.annotations.ExceptionParser;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.XMLResponseParser;
+import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404;
+import org.jclouds.terremark.ecloud.functions.OrgURIToDataCentersListEndpoint;
+import org.jclouds.vcloud.filters.SetVCloudTokenCookie;
+import org.jclouds.vcloud.terremark.domain.DataCenter;
+import org.jclouds.vcloud.terremark.domain.KeyPair;
+import org.jclouds.vcloud.terremark.xml.DataCentersHandler;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+/**
+ * 
+ * @see <a href=
+ *      "http://support.theenterprisecloud.com/kb/default.asp?id=960&Lang=1&SID="
+ *      />
+ * @see DataCenterOperationsClient
+ * 
+ * @author Adrian Cole
+ */
+@RequestFilters(SetVCloudTokenCookie.class)
+public interface DataCenterOperationsAsyncClient {
+
+   /**
+    * @see DataCenterOperationsClient#listDataCentersInOrg
+    */
+   @GET
+   @Consumes(DATACENTERSLIST_XML)
+   @XMLResponseParser(DataCentersHandler.class)
+   @ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
+   ListenableFuture<? extends Set<KeyPair>> listDataCentersInOrg(
+         @Nullable @EndpointParam(parser = OrgURIToDataCentersListEndpoint.class) URI org);
+
+   /**
+    * @see DataCenterOperationsClient#listDataCenters
+    */
+   @GET
+   @Consumes(DATACENTERSLIST_XML)
+   @XMLResponseParser(DataCentersHandler.class)
+   @ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
+   ListenableFuture<? extends Set<DataCenter>> listDataCenters(@EndpointParam URI dataCenters);
+}
diff --git a/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/features/DataCenterOperationsClient.java b/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/features/DataCenterOperationsClient.java
new file mode 100644
index 0000000..fcaf3cc
--- /dev/null
+++ b/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/features/DataCenterOperationsClient.java
@@ -0,0 +1,40 @@
+package org.jclouds.terremark.ecloud.features;
+
+import java.net.URI;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+import org.jclouds.concurrent.Timeout;
+import org.jclouds.vcloud.terremark.domain.DataCenter;
+
+/**
+ * Data Center Operations access to DataCenterOperations functionality in vCloud
+ * <p/>
+ * There are times where knowing a data center is necessary to complete certain
+ * operations (i.e. uploading a catalog item). The data centers for an
+ * organization are those data centers that contain at least one of the
+ * organization's environments.
+ * 
+ * @see DataCenterOperationsAsyncClient
+ * @author Adrian Cole
+ */
+@Timeout(duration = 300, timeUnit = TimeUnit.SECONDS)
+public interface DataCenterOperationsClient {
+
+   /**
+    * This call will get the list of data centers that contain at least one of
+    * the organization's environments.
+    * 
+    * 
+    * @return data centers
+    */
+   Set<DataCenter> listDataCentersInOrg(URI orgId);
+
+   /**
+    * This call will get the list of data centers by list id.
+    * 
+    * @return data centers
+    */
+   Set<DataCenter> listDataCenters(URI dataCentersList);
+
+}
diff --git a/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/features/TagOperationsAsyncClient.java b/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/features/TagOperationsAsyncClient.java
new file mode 100644
index 0000000..fc6d5b9
--- /dev/null
+++ b/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/features/TagOperationsAsyncClient.java
@@ -0,0 +1,53 @@
+package org.jclouds.terremark.ecloud.features;
+
+import static org.jclouds.vcloud.terremark.TerremarkECloudMediaType.TAGSLISTLIST_XML;
+
+import java.net.URI;
+import java.util.Map;
+
+import javax.annotation.Nullable;
+import javax.ws.rs.Consumes;
+import javax.ws.rs.GET;
+
+import org.jclouds.rest.annotations.EndpointParam;
+import org.jclouds.rest.annotations.ExceptionParser;
+import org.jclouds.rest.annotations.RequestFilters;
+import org.jclouds.rest.annotations.XMLResponseParser;
+import org.jclouds.rest.functions.ReturnEmptyMapOnNotFoundOr404;
+import org.jclouds.terremark.ecloud.functions.OrgURIToTagsListEndpoint;
+import org.jclouds.terremark.ecloud.xml.TagNameToUsageCountHandler;
+import org.jclouds.vcloud.filters.SetVCloudTokenCookie;
+
+import com.google.common.util.concurrent.ListenableFuture;
+
+/**
+ * 
+ * @see <a href=
+ *      "http://support.theenterprisecloud.com/kb/default.asp?id=954&Lang=1&SID="
+ *      />
+ * @see TagOperationsClient
+ * 
+ * @author Adrian Cole
+ */
+@RequestFilters(SetVCloudTokenCookie.class)
+public interface TagOperationsAsyncClient {
+
+   /**
+    * @see TagOperationsClient#getTagNameToUsageCountInOrg
+    */
+   @GET
+   @Consumes(TAGSLISTLIST_XML)
+   @XMLResponseParser(TagNameToUsageCountHandler.class)
+   @ExceptionParser(ReturnEmptyMapOnNotFoundOr404.class)
+   ListenableFuture<? extends Map<String, Integer>> getTagNameToUsageCountInOrg(
+         @Nullable @EndpointParam(parser = OrgURIToTagsListEndpoint.class) URI org);
+
+   /**
+    * @see TagOperationsClient#getTagNameToUsageCount
+    */
+   @GET
+   @Consumes(TAGSLISTLIST_XML)
+   @XMLResponseParser(TagNameToUsageCountHandler.class)
+   @ExceptionParser(ReturnEmptyMapOnNotFoundOr404.class)
+   ListenableFuture<? extends Map<String, Integer>> getTagNameToUsageCount(@EndpointParam URI tagList);
+}
diff --git a/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/features/TagOperationsClient.java b/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/features/TagOperationsClient.java
new file mode 100644
index 0000000..a17762b
--- /dev/null
+++ b/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/features/TagOperationsClient.java
@@ -0,0 +1,33 @@
+package org.jclouds.terremark.ecloud.features;
+
+import java.net.URI;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+import org.jclouds.concurrent.Timeout;
+
+/**
+ * Tag Based Operations
+ * <p/>
+ * 
+ * @see TagOperationsAsyncClient
+ * @author Adrian Cole
+ */
+@Timeout(duration = 300, timeUnit = TimeUnit.SECONDS)
+public interface TagOperationsClient {
+
+   /**
+    * This call returns the list of all tags belonging to the organization.
+    * 
+    * @return tags
+    */
+   Map<String, Integer> getTagNameToUsageCountInOrg(URI orgId);
+
+   /**
+    * This call returns the list of all tags by list id.
+    * 
+    * @return tags
+    */
+   Map<String, Integer> getTagNameToUsageCount(URI tagsList);
+
+}
diff --git a/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/functions/OrgURIToDataCentersListEndpoint.java b/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/functions/OrgURIToDataCentersListEndpoint.java
new file mode 100644
index 0000000..97c9b22
--- /dev/null
+++ b/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/functions/OrgURIToDataCentersListEndpoint.java
@@ -0,0 +1,51 @@
+/**
+ *
+ * Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed 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.terremark.ecloud.functions;
+
+import java.net.URI;
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.terremark.ecloud.domain.TerremarkECloudOrg;
+import org.jclouds.vcloud.domain.Org;
+import org.jclouds.vcloud.terremark.domain.TerremarkOrg;
+import org.jclouds.vcloud.terremark.functions.OrgURIToEndpoint;
+
+import com.google.common.base.Function;
+import com.google.common.base.Supplier;
+
+/**
+ * 
+ * @author Adrian Cole
+ */
+@Singleton
+public class OrgURIToDataCentersListEndpoint extends OrgURIToEndpoint implements Function<Object, URI> {
+   @Inject
+   public OrgURIToDataCentersListEndpoint(Supplier<Map<String, ? extends Org>> orgMap,
+         @org.jclouds.vcloud.endpoints.Org URI defaultUri) {
+      super(orgMap, defaultUri);
+   }
+
+   public URI getUriFromOrg(TerremarkOrg org) {
+      return TerremarkECloudOrg.class.cast(org).getDataCenters().getHref();
+   }
+
+}
\ No newline at end of file
diff --git a/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/functions/OrgURIToTagsListEndpoint.java b/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/functions/OrgURIToTagsListEndpoint.java
new file mode 100644
index 0000000..aeb35da
--- /dev/null
+++ b/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/functions/OrgURIToTagsListEndpoint.java
@@ -0,0 +1,51 @@
+/**
+ *
+ * Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed 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.terremark.ecloud.functions;
+
+import java.net.URI;
+import java.util.Map;
+
+import javax.inject.Inject;
+import javax.inject.Singleton;
+
+import org.jclouds.terremark.ecloud.domain.TerremarkECloudOrg;
+import org.jclouds.vcloud.domain.Org;
+import org.jclouds.vcloud.terremark.domain.TerremarkOrg;
+import org.jclouds.vcloud.terremark.functions.OrgURIToEndpoint;
+
+import com.google.common.base.Function;
+import com.google.common.base.Supplier;
+
+/**
+ * 
+ * @author Adrian Cole
+ */
+@Singleton
+public class OrgURIToTagsListEndpoint extends OrgURIToEndpoint implements Function<Object, URI> {
+   @Inject
+   public OrgURIToTagsListEndpoint(Supplier<Map<String, ? extends Org>> orgMap,
+         @org.jclouds.vcloud.endpoints.Org URI defaultUri) {
+      super(orgMap, defaultUri);
+   }
+
+   public URI getUriFromOrg(TerremarkOrg org) {
+      return TerremarkECloudOrg.class.cast(org).getTags().getHref();
+   }
+
+}
\ No newline at end of file
diff --git a/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/xml/TagNameToUsageCountHandler.java b/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/xml/TagNameToUsageCountHandler.java
new file mode 100644
index 0000000..c73fb8b
--- /dev/null
+++ b/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/xml/TagNameToUsageCountHandler.java
@@ -0,0 +1,61 @@
+/**
+ *
+ * Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed 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.terremark.ecloud.xml;
+
+import static org.jclouds.util.SaxUtils.currentOrNull;
+import static org.jclouds.util.SaxUtils.equalsOrSuffix;
+
+import java.util.Map;
+
+import org.jclouds.http.functions.ParseSax;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableMap.Builder;
+
+/**
+ * @author Adrian Cole
+ */
+public class TagNameToUsageCountHandler extends ParseSax.HandlerWithResult<Map<String, Integer>> {
+   protected StringBuilder currentText = new StringBuilder();
+
+   private Builder<String, Integer> builder = ImmutableMap.<String, Integer> builder();
+   private String name;
+
+   public Map<String, Integer> getResult() {
+      try {
+         return builder.build();
+      } finally {
+         builder = ImmutableMap.<String, Integer> builder();
+      }
+   }
+
+   @Override
+   public void endElement(String uri, String localName, String qName) {
+      if (equalsOrSuffix(qName, "Name")) {
+         name = currentOrNull(currentText);
+      } else if (equalsOrSuffix(qName, "UsageCount")) {
+         builder.put(name, new Integer(currentOrNull(currentText)));
+      }
+      currentText = new StringBuilder();
+   }
+
+   public void characters(char ch[], int start, int length) {
+      currentText.append(ch, start, length);
+   }
+}
diff --git a/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/xml/TerremarkECloudOrgHandler.java b/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/xml/TerremarkECloudOrgHandler.java
new file mode 100644
index 0000000..077220e
--- /dev/null
+++ b/providers/trmk-ecloud/src/main/java/org/jclouds/terremark/ecloud/xml/TerremarkECloudOrgHandler.java
@@ -0,0 +1,71 @@
+/**
+ *
+ * Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed 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.terremark.ecloud.xml;
+
+import static org.jclouds.util.SaxUtils.cleanseAttributes;
+import static org.jclouds.vcloud.util.Utils.newReferenceType;
+
+import java.util.Map;
+
+import javax.inject.Inject;
+
+import org.jclouds.terremark.ecloud.domain.TerremarkECloudOrg;
+import org.jclouds.terremark.ecloud.domain.internal.TerremarkECloudOrgImpl;
+import org.jclouds.vcloud.domain.ReferenceType;
+import org.jclouds.vcloud.terremark.xml.TerremarkOrgHandler;
+import org.jclouds.vcloud.xml.TaskHandler;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+/**
+ * @author Adrian Cole
+ */
+public class TerremarkECloudOrgHandler extends TerremarkOrgHandler {
+   @Inject
+   public TerremarkECloudOrgHandler(TaskHandler taskHandler) {
+      super(taskHandler);
+   }
+
+   private ReferenceType dataCentersList;
+   private ReferenceType deviceTags;
+   private ReferenceType vAppCatalog;
+
+   public TerremarkECloudOrg getResult() {
+      return new TerremarkECloudOrgImpl(org.getName(), org.getType(), org.getHref(), description, catalogs, vdcs,
+            networks, tasksLists, keysList, deviceTags, vAppCatalog, dataCentersList);
+   }
+
+   @Override
+   public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException {
+      Map<String, String> attributes = cleanseAttributes(attrs);
+      super.startElement(uri, localName, qName, attrs);
+      if (qName.equals("Link")) {
+         if (attributes.containsKey("type")) {
+            String type = attributes.get("type");
+            if (type != null && type.endsWith("dataCentersList+xml")) {
+               dataCentersList = newReferenceType(attributes);
+            } else if (type != null && type.endsWith("tagsList+xml")) {
+               deviceTags = newReferenceType(attributes);
+            } else if (type != null && type.endsWith("VAppCatalogList+xml")) {
+               vAppCatalog = newReferenceType(attributes);
+            }
+         }
+      }
+   }
+}
diff --git a/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClient.java b/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClient.java
index 76ddf1c..6e1c982 100644
--- a/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClient.java
+++ b/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClient.java
@@ -20,6 +20,7 @@
 
 import static javax.ws.rs.core.MediaType.APPLICATION_XML;
 import static org.jclouds.vcloud.VCloudMediaType.NETWORK_XML;
+import static org.jclouds.vcloud.VCloudMediaType.ORG_XML;
 import static org.jclouds.vcloud.terremark.TerremarkECloudMediaType.INTERNETSERVICESLIST_XML;
 import static org.jclouds.vcloud.terremark.TerremarkECloudMediaType.INTERNETSERVICE_XML;
 import static org.jclouds.vcloud.terremark.TerremarkECloudMediaType.IPADDRESS_LIST_XML;
@@ -38,6 +39,7 @@
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 
+import org.jclouds.rest.annotations.Delegate;
 import org.jclouds.rest.annotations.EndpointParam;
 import org.jclouds.rest.annotations.ExceptionParser;
 import org.jclouds.rest.annotations.MapBinder;
@@ -47,7 +49,12 @@
 import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404;
 import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
 import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404;
+import org.jclouds.terremark.ecloud.domain.TerremarkECloudOrg;
+import org.jclouds.terremark.ecloud.features.DataCenterOperationsAsyncClient;
+import org.jclouds.terremark.ecloud.features.TagOperationsAsyncClient;
+import org.jclouds.terremark.ecloud.xml.TerremarkECloudOrgHandler;
 import org.jclouds.vcloud.filters.SetVCloudTokenCookie;
+import org.jclouds.vcloud.functions.OrgNameToEndpoint;
 import org.jclouds.vcloud.functions.OrgNameVDCNameResourceEntityNameToEndpoint;
 import org.jclouds.vcloud.terremark.binders.BindCreateKeyToXmlPayload;
 import org.jclouds.vcloud.terremark.domain.InternetService;
@@ -56,8 +63,9 @@
 import org.jclouds.vcloud.terremark.domain.Protocol;
 import org.jclouds.vcloud.terremark.domain.PublicIpAddress;
 import org.jclouds.vcloud.terremark.domain.TerremarkNetwork;
-import org.jclouds.vcloud.terremark.domain.VAppExtendedInfo;
+import org.jclouds.vcloud.terremark.domain.TerremarkOrg;
 import org.jclouds.vcloud.terremark.domain.TerremarkOrgNetwork;
+import org.jclouds.vcloud.terremark.domain.VAppExtendedInfo;
 import org.jclouds.vcloud.terremark.functions.OrgURIToKeysListEndpoint;
 import org.jclouds.vcloud.terremark.functions.VDCURIToInternetServicesEndpoint;
 import org.jclouds.vcloud.terremark.functions.VDCURIToPublicIPsEndpoint;
@@ -84,7 +92,35 @@
  */
 @RequestFilters(SetVCloudTokenCookie.class)
 public interface TerremarkECloudAsyncClient extends TerremarkVCloudAsyncClient {
-
+   /**
+    * Provides asynchronous access to Data Center Operations.
+    * 
+    */
+   @Delegate
+   DataCenterOperationsAsyncClient getDataCenterOperationsClient();
+   
+   /**
+    * Provides asynchronous access to Tag Operations.
+    * 
+    */
+   @Delegate
+   TagOperationsAsyncClient getTagOperationsClient();
+  
+   @Override
+   @GET
+   @XMLResponseParser(TerremarkECloudOrgHandler.class)
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   @Consumes(ORG_XML)
+   ListenableFuture<? extends TerremarkECloudOrg> getOrg(@EndpointParam URI orgId);
+   
+   @Override
+   @GET
+   @XMLResponseParser(TerremarkECloudOrgHandler.class)
+   @ExceptionParser(ReturnNullOnNotFoundOr404.class)
+   @Consumes(ORG_XML)
+   ListenableFuture<? extends TerremarkOrg> findOrgNamed(
+            @Nullable @EndpointParam(parser = OrgNameToEndpoint.class) String orgName);
+   
    /**
     * @see TerremarkVCloudExpressClient#getAllInternetServices
     */
@@ -152,7 +188,7 @@
             @Nullable @EndpointParam(parser = OrgURIToKeysListEndpoint.class) URI org, String keyName);
 
    /**
-    * @see TerremarkVCloudExpressClient#listKeyPairsInOrgNamed
+    * @see TerremarkVCloudExpressClient#listKeyPairsInOrg
     */
    @GET
    @Consumes(KEYSLIST_XML)
@@ -262,4 +298,5 @@
    @XMLResponseParser(VAppExtendedInfoHandler.class)
    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
    ListenableFuture<? extends VAppExtendedInfo> getVAppExtendedInfo(@EndpointParam URI href);
+   
 }
diff --git a/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudClient.java b/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudClient.java
index cef8769..3259c2e 100644
--- a/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudClient.java
+++ b/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudClient.java
@@ -25,6 +25,10 @@
 import javax.annotation.Nullable;
 
 import org.jclouds.concurrent.Timeout;
+import org.jclouds.rest.annotations.Delegate;
+import org.jclouds.terremark.ecloud.domain.TerremarkECloudOrg;
+import org.jclouds.terremark.ecloud.features.DataCenterOperationsClient;
+import org.jclouds.terremark.ecloud.features.TagOperationsClient;
 import org.jclouds.vcloud.terremark.domain.IpAddress;
 import org.jclouds.vcloud.terremark.domain.PublicIpAddress;
 import org.jclouds.vcloud.terremark.domain.TerremarkNetwork;
@@ -35,11 +39,32 @@
  * Provides access to VCloud resources via their REST API.
  * <p/>
  * 
- * @see <a href= "http://support.theenterprisecloud.com/kb/default.asp?id=645&Lang=1&SID=" />
+ * @see <a href=
+ *      "http://support.theenterprisecloud.com/kb/default.asp?id=645&Lang=1&SID="
+ *      />
  * @author Adrian Cole
  */
 @Timeout(duration = 300, timeUnit = TimeUnit.SECONDS)
 public interface TerremarkECloudClient extends TerremarkVCloudClient {
+   /**
+    * Provides synchronous access to Data Center Operations.
+    * 
+    */
+   @Delegate
+   DataCenterOperationsClient getDataCenterOperationsClient();
+   
+   /**
+    * Provides synchronous access to Data Center Operations.
+    * 
+    */
+   @Delegate
+   TagOperationsClient getTagOperationsClient();
+   
+   /**
+    * {@inheritDoc}
+    */
+   @Override
+   TerremarkECloudOrg getOrg(URI orgId);
 
    /**
     * Allocate a new public IP
@@ -56,14 +81,16 @@
    TerremarkOrgNetwork getNetwork(URI network);
 
    TerremarkNetwork getTerremarkNetwork(URI network);
-   
+
    Set<IpAddress> getIpAddresses(URI network);
 
    /**
     * Returns extended information for the vApp.
-    *
-    * @param vApp The URI at which the vApp information is available.
-    * @return Extended vApp information like tags, long name, network adapter information.
+    * 
+    * @param vApp
+    *           The URI at which the vApp information is available.
+    * @return Extended vApp information like tags, long name, network adapter
+    *         information.
     */
    VAppExtendedInfo getVAppExtendedInfo(URI href);
 }
diff --git a/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudMediaType.java b/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudMediaType.java
index 95f527b..c1d39db 100644
--- a/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudMediaType.java
+++ b/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/TerremarkECloudMediaType.java
@@ -22,7 +22,7 @@
 
 /**
  * Resource Types used in Terremark eCloud
- *
+ * 
  * @see MediaType
  */
 public interface TerremarkECloudMediaType extends TerremarkVCloudMediaType {
@@ -66,6 +66,36 @@
     * "application/vnd.tmrk.ecloud.keysList+xml"
     */
    public final static MediaType KEYSLIST_XML_TYPE = new MediaType("application", "vnd.tmrk.ecloud.keysList+xml");
+   /**
+    * "application/vnd.tmrk.ecloud.tagsList+xml"
+    */
+   public final static String TAGSLISTLIST_XML = "application/vnd.tmrk.ecloud.tagsList+xml";
+
+   /**
+    * "application/vnd.tmrk.ecloud.tagsList+xml"
+    */
+   public final static MediaType TAGSLISTLIST_XML_TYPE = new MediaType("application", "vnd.tmrk.ecloud.tagsList+xml");
+   /**
+    * "application/vnd.tmrk.ecloud.VAppCatalogList+xml"
+    */
+   public final static String VAPPCATALOGLIST_XML = "application/vnd.tmrk.ecloud.VAppCatalogList+xml";
+
+   /**
+    * "application/vnd.tmrk.ecloud.VAppCatalogList+xml"
+    */
+   public final static MediaType VAPPCATALOGLIST_XML_TYPE = new MediaType("application",
+         "vnd.tmrk.ecloud.VAppCatalogList+xml");
+
+   /**
+    * "application/vnd.tmrk.ecloud.dataCentersList+xml"
+    */
+   public final static String DATACENTERSLIST_XML = "application/vnd.tmrk.ecloud.dataCentersList+xml";
+
+   /**
+    * "application/vnd.tmrk.ecloud.dataCentersList+xml"
+    */
+   public final static MediaType DATACENTERSLIST_XML_TYPE = new MediaType("application",
+         "vnd.tmrk.ecloud.dataCentersList+xml");
 
    /**
     * "application/vnd.tmrk.ecloud.ipAddressList+xml"
@@ -75,7 +105,8 @@
    /**
     * "application/vnd.tmrk.ecloud.ipAddressList+xml"
     */
-   public final static MediaType IPADDRESSES_LIST_XML_TYPE = new MediaType("application", "vnd.tmrk.ecloud.ipAddressList+xml");
+   public final static MediaType IPADDRESSES_LIST_XML_TYPE = new MediaType("application",
+         "vnd.tmrk.ecloud.ipAddressList+xml");
 
    /**
     * "application/vnd.tmrk.ecloud.vApp+xml"
diff --git a/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/compute/functions/TerremarkECloudParseOsFromVAppTemplateName.java b/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/compute/functions/TerremarkECloudParseOsFromVAppTemplateName.java
index 0d0d0b9..efd7cbe 100644
--- a/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/compute/functions/TerremarkECloudParseOsFromVAppTemplateName.java
+++ b/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/compute/functions/TerremarkECloudParseOsFromVAppTemplateName.java
@@ -29,7 +29,7 @@
 import javax.inject.Singleton;
 
 import org.jclouds.compute.domain.OperatingSystem;
-import org.jclouds.compute.domain.OperatingSystemBuilder;
+import org.jclouds.compute.domain.OperatingSystem.Builder;
 import org.jclouds.compute.domain.OsFamily;
 import org.jclouds.compute.util.ComputeServiceUtils;
 import org.jclouds.vcloud.compute.functions.ParseOsFromVAppTemplateName;
@@ -50,7 +50,7 @@
    @Override
    public OperatingSystem apply(String from) {
       checkNotNull(from, "vapp template name");
-      OperatingSystemBuilder builder = new OperatingSystemBuilder();
+      Builder builder = new OperatingSystem.Builder();
       builder.description(from);
       if (from.equals("-Windows 2003 Std. R2 SQL 2005 Std. (x64)"))
          System.out.print(';');
diff --git a/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkECloudRestClientModule.java b/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkECloudRestClientModule.java
index 257a280..3244de1 100644
--- a/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkECloudRestClientModule.java
+++ b/providers/trmk-ecloud/src/main/java/org/jclouds/vcloud/terremark/config/TerremarkECloudRestClientModule.java
@@ -29,6 +29,10 @@
 import org.jclouds.http.RequiresHttp;
 import org.jclouds.rest.ConfiguresRestClient;
 import org.jclouds.rest.ResourceNotFoundException;
+import org.jclouds.terremark.ecloud.features.DataCenterOperationsAsyncClient;
+import org.jclouds.terremark.ecloud.features.DataCenterOperationsClient;
+import org.jclouds.terremark.ecloud.features.TagOperationsAsyncClient;
+import org.jclouds.terremark.ecloud.features.TagOperationsClient;
 import org.jclouds.vcloud.VCloudExpressAsyncClient;
 import org.jclouds.vcloud.VCloudExpressClient;
 import org.jclouds.vcloud.domain.ReferenceType;
@@ -40,6 +44,7 @@
 import org.jclouds.vcloud.terremark.domain.TerremarkOrgNetwork;
 
 import com.google.common.base.Predicate;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 import com.google.inject.Injector;
 import com.google.inject.Provides;
@@ -54,8 +59,13 @@
 public class TerremarkECloudRestClientModule extends
          TerremarkRestClientModule<TerremarkECloudClient, TerremarkECloudAsyncClient> {
 
+   public static final Map<Class<?>, Class<?>> DELEGATE_MAP = ImmutableMap.<Class<?>, Class<?>> builder()//
+            .put(DataCenterOperationsClient.class, DataCenterOperationsAsyncClient.class)//
+            .put(TagOperationsClient.class, TagOperationsAsyncClient.class)//
+            .build();
+
    public TerremarkECloudRestClientModule() {
-      super(TerremarkECloudClient.class, TerremarkECloudAsyncClient.class);
+      super(TerremarkECloudClient.class, TerremarkECloudAsyncClient.class, DELEGATE_MAP);
    }
 
    @Provides
diff --git a/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/BaseTerremarkECloudAsyncClientTest.java b/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/BaseTerremarkECloudAsyncClientTest.java
new file mode 100644
index 0000000..097fa44
--- /dev/null
+++ b/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/BaseTerremarkECloudAsyncClientTest.java
@@ -0,0 +1,243 @@
+/**
+ *
+ * Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed 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.terremark.ecloud;
+
+import static org.jclouds.Constants.PROPERTY_API_VERSION;
+import static org.jclouds.Constants.PROPERTY_IDENTITY;
+import static org.testng.Assert.assertEquals;
+
+import java.net.URI;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.inject.Singleton;
+
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.RequiresHttp;
+import org.jclouds.rest.ConfiguresRestClient;
+import org.jclouds.rest.RestClientTest;
+import org.jclouds.rest.RestContextFactory;
+import org.jclouds.rest.RestContextSpec;
+import org.jclouds.terremark.ecloud.domain.internal.TerremarkECloudOrgImpl;
+import org.jclouds.vcloud.CommonVCloudClient;
+import org.jclouds.vcloud.VCloudExpressAsyncClientTest.VCloudRestClientModuleExtension.TestOrgCatalogItemSupplier;
+import org.jclouds.vcloud.VCloudExpressAsyncClientTest.VCloudRestClientModuleExtension.TestOrgCatalogSupplier;
+import org.jclouds.vcloud.VCloudVersionsAsyncClient;
+import org.jclouds.vcloud.config.CommonVCloudRestClientModule.OrgVDCSupplier;
+import org.jclouds.vcloud.domain.AllocationModel;
+import org.jclouds.vcloud.domain.Capacity;
+import org.jclouds.vcloud.domain.Org;
+import org.jclouds.vcloud.domain.ReferenceType;
+import org.jclouds.vcloud.domain.Task;
+import org.jclouds.vcloud.domain.VCloudSession;
+import org.jclouds.vcloud.domain.VDCStatus;
+import org.jclouds.vcloud.domain.internal.ReferenceTypeImpl;
+import org.jclouds.vcloud.filters.SetVCloudTokenCookie;
+import org.jclouds.vcloud.terremark.TerremarkECloudMediaType;
+import org.jclouds.vcloud.terremark.TerremarkVCloudMediaType;
+import org.jclouds.vcloud.terremark.config.TerremarkECloudRestClientModule;
+import org.jclouds.vcloud.terremark.domain.internal.TerremarkVDCImpl;
+
+import com.google.common.base.Function;
+import com.google.common.base.Supplier;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Maps;
+import com.google.inject.Injector;
+import com.google.inject.Module;
+
+/**
+ * @author Adrian Cole
+ */
+public abstract class BaseTerremarkECloudAsyncClientTest<T> extends RestClientTest<T> {
+
+   @RequiresHttp
+   @ConfiguresRestClient
+   protected static class TerremarkVCloudRestClientModuleExtension extends TerremarkECloudRestClientModule {
+      @Override
+      protected URI provideAuthenticationURI(VCloudVersionsAsyncClient versionService,
+            @Named(PROPERTY_API_VERSION) String version) {
+         return URI.create("https://vcloud/login");
+      }
+
+      @Override
+      protected void configure() {
+         super.configure();
+         bind(OrgNameToKeysListSupplier.class).to(TestOrgNameToKeysListSupplier.class);
+         bind(OrgMapSupplier.class).to(TestTerremarkOrgMapSupplier.class);
+         bind(OrgCatalogSupplier.class).to(TestOrgCatalogSupplier.class);
+         bind(OrgCatalogItemSupplier.class).to(TestOrgCatalogItemSupplier.class);
+         bind(OrgVDCSupplier.class).to(TestTerremarkOrgVDCSupplier.class);
+      }
+
+      @Singleton
+      public static class TestOrgNameToKeysListSupplier extends OrgNameToKeysListSupplier {
+         @Inject
+         protected TestOrgNameToKeysListSupplier(Supplier<VCloudSession> sessionSupplier) {
+            super(sessionSupplier, null);
+         }
+
+         @Override
+         public Map<String, ReferenceType> get() {
+            return Maps.transformValues(sessionSupplier.get().getOrgs(), new Function<ReferenceType, ReferenceType>() {
+
+               @Override
+               public ReferenceType apply(ReferenceType from) {
+                  return new ReferenceTypeImpl(from.getName(), TerremarkECloudMediaType.KEYSLIST_XML, URI.create(from
+                        .getHref().toASCIIString() + "/keysList"));
+               }
+            });
+         }
+      }
+
+      @Singleton
+      public static class TestTerremarkOrgMapSupplier extends OrgMapSupplier {
+         @Inject
+         protected TestTerremarkOrgMapSupplier() {
+            super(null, null);
+         }
+
+         @Override
+         public Map<String, Org> get() {
+            return ImmutableMap.<String, Org> of(
+                  "org",
+                  new TerremarkECloudOrgImpl("org", null,
+                        URI.create("https://vcloud.safesecureweb.com/api/v0.8/org/1"), null, ImmutableMap
+                              .<String, ReferenceType> of(
+                                    "catalog",
+                                    new ReferenceTypeImpl("catalog", TerremarkECloudMediaType.CATALOG_XML, URI
+                                          .create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1"))),
+                        ImmutableMap.<String, ReferenceType> of(
+                              "vdc",
+                              new ReferenceTypeImpl("vdc", TerremarkECloudMediaType.VDC_XML, URI
+                                    .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"))), ImmutableMap
+                              .<String, ReferenceType> of(), ImmutableMap.<String, ReferenceType> of(
+                              "tasksList",
+                              new ReferenceTypeImpl("tasksList", TerremarkECloudMediaType.TASKSLIST_XML, URI
+                                    .create("https://vcloud.safesecureweb.com/api/v0.8/tasksList/1"))),
+                        new ReferenceTypeImpl("keysList", TerremarkECloudMediaType.KEYSLIST_XML, URI
+                              .create("https://vcloud.safesecureweb.com/api/v0.8/keysList/1")), new ReferenceTypeImpl(
+                              "deviceTags", TerremarkECloudMediaType.TAGSLISTLIST_XML, URI
+                                    .create("https://vcloud.safesecureweb.com/api/v0.8/deviceTags/1")),
+                        new ReferenceTypeImpl("vappCatalog", TerremarkECloudMediaType.VAPPCATALOGLIST_XML, URI
+                              .create("https://vcloud.safesecureweb.com/api/v0.8/vappCatalog/1")),
+                        new ReferenceTypeImpl("dataCentersList", TerremarkECloudMediaType.DATACENTERSLIST_XML, URI
+                              .create("https://vcloud.safesecureweb.com/api/v0.8/datacentersList/1"))));
+         }
+      }
+
+      @Override
+      protected URI provideOrg(@org.jclouds.vcloud.endpoints.Org Iterable<ReferenceType> orgs) {
+         return URI.create("https://org");
+      }
+
+      @Override
+      protected String provideOrgName(@org.jclouds.vcloud.endpoints.Org Iterable<ReferenceType> orgs) {
+         return "org";
+      }
+
+      @Override
+      protected URI provideCatalog(Org org, @Named(PROPERTY_IDENTITY) String user, WriteableCatalog write) {
+         return URI.create("https://catalog");
+      }
+
+      @Override
+      protected Org provideOrg(CommonVCloudClient discovery) {
+         return null;
+      }
+
+      @Override
+      protected Iterable<ReferenceType> provideOrgs(Supplier<VCloudSession> cache, String user) {
+         return null;
+      }
+
+      @Override
+      protected URI provideDefaultTasksList(Org org) {
+         return URI.create("https://taskslist");
+      }
+
+      @Override
+      protected URI provideDefaultVDC(Org org, @org.jclouds.vcloud.endpoints.VDC String defaultVDC) {
+         return URI.create("https://vdc/1");
+      }
+
+      @Override
+      protected String provideDefaultVDCName(
+            @org.jclouds.vcloud.endpoints.VDC Supplier<Map<String, String>> vDCtoOrgSupplier) {
+         return "vdc";
+      }
+
+      @Override
+      protected URI provideDefaultNetwork(URI vdc, Injector injector) {
+         return URI.create("https://vcloud.safesecureweb.com/network/1990");
+      }
+   }
+
+   @Override
+   protected void checkFilters(HttpRequest request) {
+      assertEquals(request.getFilters().size(), 1);
+      assertEquals(request.getFilters().get(0).getClass(), SetVCloudTokenCookie.class);
+   }
+
+   @Override
+   protected Module createModule() {
+      return new TerremarkVCloudRestClientModuleExtension();
+   }
+
+   @Override
+   public RestContextSpec<?, ?> createContextSpec() {
+      return new RestContextFactory().createContextSpec("trmk-ecloud", "identity", "credential", new Properties());
+   }
+
+   @Singleton
+   public static class TestTerremarkOrgVDCSupplier extends OrgVDCSupplier {
+      @Inject
+      protected TestTerremarkOrgVDCSupplier() {
+         super(null, null);
+      }
+
+      @Override
+      public Map<String, Map<String, ? extends org.jclouds.vcloud.domain.VDC>> get() {
+         return ImmutableMap.<String, Map<String, ? extends org.jclouds.vcloud.domain.VDC>> of("org",
+
+         ImmutableMap.<String, org.jclouds.vcloud.domain.VDC> of(
+               "vdc",
+               new TerremarkVDCImpl("vdc", null, URI.create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"),
+                     VDCStatus.READY, null, "description", ImmutableSet.<Task> of(), AllocationModel.UNRECOGNIZED,
+                     new Capacity("MB", 0, 0, 0, 0), new Capacity("MB", 0, 0, 0, 0), new Capacity("MB", 0, 0, 0, 0),
+                     ImmutableMap.<String, ReferenceType> of(
+                           "vapp",
+                           new ReferenceTypeImpl("vapp", "application/vnd.vmware.vcloud.vApp+xml", URI
+                                 .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/188849-1")),
+                           "network",
+                           new ReferenceTypeImpl("network", "application/vnd.vmware.vcloud.vAppTemplate+xml", URI
+                                 .create("https://vcloud.safesecureweb.com/api/v0.8/vdcItem/2"))), ImmutableMap
+                           .<String, ReferenceType> of(), 0, 0, 0, false, new ReferenceTypeImpl("catalog",
+                           TerremarkVCloudMediaType.CATALOG_XML, URI
+                                 .create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1")),
+                     new ReferenceTypeImpl("publicIps", TerremarkVCloudMediaType.PUBLICIPSLIST_XML, URI
+                           .create("https://vcloud.safesecureweb.com/api/v0.8/publicIps/1")), new ReferenceTypeImpl(
+                           "internetServices", TerremarkVCloudMediaType.INTERNETSERVICESLIST_XML, URI
+                                 .create("https://vcloud.safesecureweb.com/api/v0.8/internetServices/1")))));
+      }
+   }
+
+}
\ No newline at end of file
diff --git a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/endpoints/KeysList.java b/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/BaseTerremarkECloudClientLiveTest.java
similarity index 62%
copy from common/trmk/src/main/java/org/jclouds/vcloud/terremark/endpoints/KeysList.java
copy to providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/BaseTerremarkECloudClientLiveTest.java
index 4d28e01..7da1548 100644
--- a/common/trmk/src/main/java/org/jclouds/vcloud/terremark/endpoints/KeysList.java
+++ b/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/BaseTerremarkECloudClientLiveTest.java
@@ -16,24 +16,16 @@
  * limitations under the License.
  * ====================================================================
  */
-package org.jclouds.vcloud.terremark.endpoints;
+package org.jclouds.terremark.ecloud;
 
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-import javax.inject.Qualifier;
+import org.jclouds.vcloud.terremark.BaseTerremarkClientLiveTest;
+import org.jclouds.vcloud.terremark.TerremarkECloudClient;
+import org.testng.annotations.Test;
 
 /**
- * Related to Terremark SSH Keys List.
- * 
  * @author Adrian Cole
- * 
  */
-@Retention(value = RetentionPolicy.RUNTIME)
-@Target(value = { ElementType.TYPE, ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
-@Qualifier
-public @interface KeysList {
+@Test(groups = "live", enabled = true, singleThreaded = true)
+public class BaseTerremarkECloudClientLiveTest extends BaseTerremarkClientLiveTest<TerremarkECloudClient> {
 
 }
\ No newline at end of file
diff --git a/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/features/DataCenterOperationsAsyncClientTest.java b/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/features/DataCenterOperationsAsyncClientTest.java
new file mode 100644
index 0000000..bbfb1dc
--- /dev/null
+++ b/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/features/DataCenterOperationsAsyncClientTest.java
@@ -0,0 +1,70 @@
+package org.jclouds.terremark.ecloud.features;
+
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.net.URI;
+
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404;
+import org.jclouds.rest.internal.RestAnnotationProcessor;
+import org.jclouds.terremark.ecloud.BaseTerremarkECloudAsyncClientTest;
+import org.jclouds.terremark.ecloud.features.DataCenterOperationsAsyncClient;
+import org.jclouds.vcloud.terremark.xml.DataCentersHandler;
+import org.testng.annotations.Test;
+
+import com.google.inject.TypeLiteral;
+
+/**
+ * Tests behavior of {@code DataCenterOperationsAsyncClient}
+ * 
+ * @author Adrian Cole
+ */
+// NOTE:without testName, this will not call @Before* and fail w/NPE during
+// surefire
+@Test(groups = "unit", testName = "DataCenterOperationsAsyncClientTest")
+public class DataCenterOperationsAsyncClientTest extends
+      BaseTerremarkECloudAsyncClientTest<DataCenterOperationsAsyncClient> {
+
+   @Override
+   protected TypeLiteral<RestAnnotationProcessor<DataCenterOperationsAsyncClient>> createTypeLiteral() {
+      return new TypeLiteral<RestAnnotationProcessor<DataCenterOperationsAsyncClient>>() {
+      };
+   }
+
+   public void testlistDataCenters() throws SecurityException, NoSuchMethodException, IOException {
+      Method method = DataCenterOperationsAsyncClient.class.getMethod("listDataCenters", URI.class);
+      HttpRequest request = processor
+            .createRequest(
+                  method,
+                  URI.create("https://services.enterprisecloud.terremark.com/api/v0.8b-ext2.8/extensions/org/1910324/dataCenters"));
+
+      assertRequestLineEquals(request,
+            "GET https://services.enterprisecloud.terremark.com/api/v0.8b-ext2.8/extensions/org/1910324/dataCenters HTTP/1.1");
+      assertNonPayloadHeadersEqual(request, "Accept: application/vnd.tmrk.ecloud.dataCentersList+xml\n");
+      assertPayloadEquals(request, null, null, false);
+
+      assertResponseParserClassEquals(method, request, ParseSax.class);
+      assertSaxResponseParserClassEquals(method, DataCentersHandler.class);
+      assertExceptionParserClassEquals(method, ReturnEmptySetOnNotFoundOr404.class);
+
+      checkFilters(request);
+   }
+
+   public void testlistDataCentersInOrg() throws SecurityException, NoSuchMethodException, IOException {
+      Method method = DataCenterOperationsAsyncClient.class.getMethod("listDataCentersInOrg", URI.class);
+      HttpRequest request = processor.createRequest(method,
+            URI.create("https://vcloud.safesecureweb.com/api/v0.8/org/1"));
+
+      assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/datacentersList/1 HTTP/1.1");
+      assertNonPayloadHeadersEqual(request, "Accept: application/vnd.tmrk.ecloud.dataCentersList+xml\n");
+      assertPayloadEquals(request, null, null, false);
+
+      assertResponseParserClassEquals(method, request, ParseSax.class);
+      assertSaxResponseParserClassEquals(method, DataCentersHandler.class);
+      assertExceptionParserClassEquals(method, ReturnEmptySetOnNotFoundOr404.class);
+
+      checkFilters(request);
+   }
+
+}
diff --git a/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/features/DataCenterOperationsClientLiveTest.java b/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/features/DataCenterOperationsClientLiveTest.java
new file mode 100644
index 0000000..68a90e8
--- /dev/null
+++ b/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/features/DataCenterOperationsClientLiveTest.java
@@ -0,0 +1,45 @@
+/**
+ *
+ * Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed 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.terremark.ecloud.features;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+import org.jclouds.terremark.ecloud.BaseTerremarkECloudClientLiveTest;
+import org.jclouds.terremark.ecloud.domain.TerremarkECloudOrg;
+import org.jclouds.vcloud.domain.ReferenceType;
+import org.testng.annotations.Test;
+
+/**
+ * @author Adrian Cole
+ */
+@Test(groups = "live", enabled = true, singleThreaded = true, testName = "DataCenterOperationsClientLiveTest")
+public class DataCenterOperationsClientLiveTest extends BaseTerremarkECloudClientLiveTest {
+   @Test
+   public void testListDataCentersInOrg() throws Exception {
+      for (ReferenceType response : getApi().listOrgs()) {
+         TerremarkECloudOrg org = getApi().getOrg(response.getHref());
+         assertNotNull(response);
+         assertNotNull(response.getName());
+         assertNotNull(response.getHref());
+         assertEquals(getApi().getDataCenterOperationsClient().listDataCentersInOrg(org.getHref()), getApi()
+               .getDataCenterOperationsClient().listDataCenters(org.getDataCenters().getHref()));
+      }
+   }
+}
\ No newline at end of file
diff --git a/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/features/TagOperationsAsyncClientTest.java b/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/features/TagOperationsAsyncClientTest.java
new file mode 100644
index 0000000..285de75
--- /dev/null
+++ b/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/features/TagOperationsAsyncClientTest.java
@@ -0,0 +1,68 @@
+package org.jclouds.terremark.ecloud.features;
+
+import java.io.IOException;
+import java.lang.reflect.Method;
+import java.net.URI;
+
+import org.jclouds.http.HttpRequest;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.rest.functions.ReturnEmptyMapOnNotFoundOr404;
+import org.jclouds.rest.internal.RestAnnotationProcessor;
+import org.jclouds.terremark.ecloud.BaseTerremarkECloudAsyncClientTest;
+import org.jclouds.terremark.ecloud.xml.TagNameToUsageCountHandler;
+import org.testng.annotations.Test;
+
+import com.google.inject.TypeLiteral;
+
+/**
+ * Tests behavior of {@code TagOperationsAsyncClient}
+ * 
+ * @author Adrian Cole
+ */
+// NOTE:without testName, this will not call @Before* and fail w/NPE during
+// surefire
+@Test(groups = "unit", testName = "TagOperationsAsyncClientTest")
+public class TagOperationsAsyncClientTest extends BaseTerremarkECloudAsyncClientTest<TagOperationsAsyncClient> {
+
+   @Override
+   protected TypeLiteral<RestAnnotationProcessor<TagOperationsAsyncClient>> createTypeLiteral() {
+      return new TypeLiteral<RestAnnotationProcessor<TagOperationsAsyncClient>>() {
+      };
+   }
+
+   public void testgetTagNameToUsageCount() throws SecurityException, NoSuchMethodException, IOException {
+      Method method = TagOperationsAsyncClient.class.getMethod("getTagNameToUsageCount", URI.class);
+      HttpRequest request = processor
+            .createRequest(
+                  method,
+                  URI.create("https://services.enterprisecloud.terremark.com/api/v0.8b-ext2.8/extensions/org/1910324/deviceTags"));
+
+      assertRequestLineEquals(request,
+            "GET https://services.enterprisecloud.terremark.com/api/v0.8b-ext2.8/extensions/org/1910324/deviceTags HTTP/1.1");
+      assertNonPayloadHeadersEqual(request, "Accept: application/vnd.tmrk.ecloud.tagsList+xml\n");
+      assertPayloadEquals(request, null, null, false);
+
+      assertResponseParserClassEquals(method, request, ParseSax.class);
+      assertSaxResponseParserClassEquals(method, TagNameToUsageCountHandler.class);
+      assertExceptionParserClassEquals(method, ReturnEmptyMapOnNotFoundOr404.class);
+
+      checkFilters(request);
+   }
+
+   public void testgetTagNameToUsageCountInOrg() throws SecurityException, NoSuchMethodException, IOException {
+      Method method = TagOperationsAsyncClient.class.getMethod("getTagNameToUsageCountInOrg", URI.class);
+      HttpRequest request = processor.createRequest(method,
+            URI.create("https://vcloud.safesecureweb.com/api/v0.8/org/1"));
+
+      assertRequestLineEquals(request, "GET https://vcloud.safesecureweb.com/api/v0.8/deviceTags/1 HTTP/1.1");
+      assertNonPayloadHeadersEqual(request, "Accept: application/vnd.tmrk.ecloud.tagsList+xml\n");
+      assertPayloadEquals(request, null, null, false);
+
+      assertResponseParserClassEquals(method, request, ParseSax.class);
+      assertSaxResponseParserClassEquals(method, TagNameToUsageCountHandler.class);
+      assertExceptionParserClassEquals(method, ReturnEmptyMapOnNotFoundOr404.class);
+
+      checkFilters(request);
+   }
+
+}
diff --git a/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/features/TagOperationsClientLiveTest.java b/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/features/TagOperationsClientLiveTest.java
new file mode 100644
index 0000000..b8f537c
--- /dev/null
+++ b/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/features/TagOperationsClientLiveTest.java
@@ -0,0 +1,45 @@
+/**
+ *
+ * Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed 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.terremark.ecloud.features;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+import org.jclouds.terremark.ecloud.BaseTerremarkECloudClientLiveTest;
+import org.jclouds.terremark.ecloud.domain.TerremarkECloudOrg;
+import org.jclouds.vcloud.domain.ReferenceType;
+import org.testng.annotations.Test;
+
+/**
+ * @author Adrian Cole
+ */
+@Test(groups = "live", enabled = true, singleThreaded = true, testName = "TagOperationsClientLiveTest")
+public class TagOperationsClientLiveTest extends BaseTerremarkECloudClientLiveTest {
+   @Test
+   public void testListTagsInOrg() throws Exception {
+      for (ReferenceType response : getApi().listOrgs()) {
+         TerremarkECloudOrg org = getApi().getOrg(response.getHref());
+         assertNotNull(response);
+         assertNotNull(response.getName());
+         assertNotNull(response.getHref());
+         assertEquals(getApi().getTagOperationsClient().getTagNameToUsageCountInOrg(org.getHref()), getApi()
+               .getTagOperationsClient().getTagNameToUsageCount(org.getTags().getHref()));
+      }
+   }
+}
\ No newline at end of file
diff --git a/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/xml/TagNameToUsageCountHandlerTest.java b/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/xml/TagNameToUsageCountHandlerTest.java
new file mode 100644
index 0000000..0e6e946
--- /dev/null
+++ b/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/xml/TagNameToUsageCountHandlerTest.java
@@ -0,0 +1,73 @@
+package org.jclouds.terremark.ecloud.xml;
+
+/**
+ *
+ * Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed 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.
+ * ====================================================================
+ */
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.testng.Assert.assertEquals;
+
+import java.io.InputStream;
+import java.util.Map;
+import java.util.Properties;
+
+import org.jclouds.http.functions.BaseHandlerTest;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.http.functions.config.SaxParserModule;
+import org.jclouds.vcloud.terremark.TerremarkVCloudPropertiesBuilder;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.inject.Guice;
+import com.google.inject.name.Names;
+
+/**
+ * Tests behavior of {@code TagNameToUsageCountHandler}
+ * 
+ * @author Adrian Cole
+ */
+// NOTE:without testName, this will not call @Before* and fail w/NPE during
+// surefire
+@Test(groups = "unit", testName = "TagNameToUsageCountHandlerTest")
+public class TagNameToUsageCountHandlerTest extends BaseHandlerTest {
+   @Override
+   @BeforeTest
+   protected void setUpInjector() {
+      injector = Guice.createInjector(new SaxParserModule() {
+         @Override
+         public void configure() {
+            super.configure();
+            Properties props = new Properties();
+            Names.bindProperties(binder(),
+                  checkNotNull(new TerremarkVCloudPropertiesBuilder(props).build(), "properties"));
+         }
+      });
+      factory = injector.getInstance(ParseSax.Factory.class);
+      assert factory != null;
+   }
+
+   public void testApplyInputStream() {
+
+      InputStream is = getClass().getResourceAsStream("/deviceTags.xml");
+
+      Map<String, Integer> result = factory.create(injector.getInstance(TagNameToUsageCountHandler.class)).parse(is);
+      assertEquals(result, ImmutableMap.<String, Integer> of("Tag1", 1, "Tag2", 5, "Tag3", 12));
+
+   }
+}
diff --git a/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/xml/TerremarkECloudOrgHandlerTest.java b/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/xml/TerremarkECloudOrgHandlerTest.java
new file mode 100644
index 0000000..45377d3
--- /dev/null
+++ b/providers/trmk-ecloud/src/test/java/org/jclouds/terremark/ecloud/xml/TerremarkECloudOrgHandlerTest.java
@@ -0,0 +1,131 @@
+package org.jclouds.terremark.ecloud.xml;
+
+/**
+ *
+ * Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
+ *
+ * ====================================================================
+ * Licensed 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.
+ * ====================================================================
+ */
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.testng.Assert.assertEquals;
+
+import java.io.InputStream;
+import java.net.URI;
+import java.util.Properties;
+
+import org.jclouds.http.functions.BaseHandlerTest;
+import org.jclouds.http.functions.ParseSax;
+import org.jclouds.http.functions.config.SaxParserModule;
+import org.jclouds.terremark.ecloud.domain.TerremarkECloudOrg;
+import org.jclouds.vcloud.VCloudExpressMediaType;
+import org.jclouds.vcloud.domain.internal.ReferenceTypeImpl;
+import org.jclouds.vcloud.terremark.TerremarkVCloudPropertiesBuilder;
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.inject.Guice;
+import com.google.inject.name.Names;
+
+/**
+ * Tests behavior of {@code TerremarkECloudOrgHandler}
+ * 
+ * @author Adrian Cole
+ */
+// NOTE:without testName, this will not call @Before* and fail w/NPE during
+// surefire
+@Test(groups = "unit", testName = "TerremarkECloudOrgHandlerTest")
+public class TerremarkECloudOrgHandlerTest extends BaseHandlerTest {
+   @Override
+   @BeforeTest
+   protected void setUpInjector() {
+      injector = Guice.createInjector(new SaxParserModule() {
+         @Override
+         public void configure() {
+            super.configure();
+            Properties props = new Properties();
+            Names.bindProperties(binder(),
+                  checkNotNull(new TerremarkVCloudPropertiesBuilder(props).build(), "properties"));
+         }
+      });
+      factory = injector.getInstance(ParseSax.Factory.class);
+      assert factory != null;
+   }
+
+   public void testApplyInputStream() {
+
+      InputStream is = getClass().getResourceAsStream("/org-ecloud.xml");
+
+      TerremarkECloudOrg result = (TerremarkECloudOrg) factory.create(
+            injector.getInstance(TerremarkECloudOrgHandler.class)).parse(is);
+      assertEquals(result.getName(), "Cloud Conscious, LLC");
+      assertEquals(result.getHref(),
+            URI.create("https://services.enterprisecloud.terremark.com/api/v0.8b-ext2.8/org/1910324"));
+
+      assertEquals(result.getVDCs(), ImmutableMap.of(
+            "Cloud Conscious LLC - MIA",
+            new ReferenceTypeImpl("Cloud Conscious LLC - MIA", VCloudExpressMediaType.VDC_XML, URI
+                  .create("https://services.enterprisecloud.terremark.com/api/v0.8b-ext2.8/vdc/1155")),
+            "Cloud Conscious LLC - AMA",
+            new ReferenceTypeImpl("Cloud Conscious LLC - AMA", VCloudExpressMediaType.VDC_XML, URI
+                  .create("https://services.enterprisecloud.terremark.com/api/v0.8b-ext2.8/vdc/1169"))));
+
+      assertEquals(result.getCatalogs(), ImmutableMap.of(
+            "Cloud Conscious LLC - MIA Catalog",
+            new ReferenceTypeImpl("Cloud Conscious LLC - MIA Catalog", VCloudExpressMediaType.CATALOG_XML, URI
+                  .create("https://services.enterprisecloud.terremark.com/api/v0.8b-ext2.8/vdc/1155/catalog")),
+            "Cloud Conscious LLC - AMA Catalog",
+            new ReferenceTypeImpl("Cloud Conscious LLC - AMA Catalog", VCloudExpressMediaType.CATALOG_XML, URI
+                  .create("https://services.enterprisecloud.terremark.com/api/v0.8b-ext2.8/vdc/1169/catalog"))));
+
+      assertEquals(result.getTasksLists(), ImmutableMap.of(
+            "Cloud Conscious LLC - MIA Tasks List",
+            new ReferenceTypeImpl("Cloud Conscious LLC - MIA Tasks List", VCloudExpressMediaType.TASKSLIST_XML, URI
+                  .create("https://services.enterprisecloud.terremark.com/api/v0.8b-ext2.8/vdc/1155/tasksList")),
+            "Cloud Conscious LLC - AMA Tasks List",
+            new ReferenceTypeImpl("Cloud Conscious LLC - AMA Tasks List", VCloudExpressMediaType.TASKSLIST_XML, URI
+                  .create("https://services.enterprisecloud.terremark.com/api/v0.8b-ext2.8/vdc/1169/tasksList"))));
+
+      assertEquals(
+            result.getKeys(),
+            new ReferenceTypeImpl(
+                  "Keys",
+                  "application/vnd.tmrk.ecloud.keysList+xml",
+                  URI.create("https://services.enterprisecloud.terremark.com/api/v0.8b-ext2.8/extensions/org/1910324/keys")));
+
+      assertEquals(
+            result.getTags(),
+            new ReferenceTypeImpl(
+                  "Device Tags",
+                  "application/vnd.tmrk.ecloud.tagsList+xml",
+                  URI.create("https://services.enterprisecloud.terremark.com/api/v0.8b-ext2.8/extensions/org/1910324/deviceTags")));
+
+      assertEquals(
+            result.getVAppCatalog(),
+            new ReferenceTypeImpl(
+                  "VApp Catalog",
+                  "application/vnd.tmrk.ecloud.VAppCatalogList+xml",
+                  URI.create("https://services.enterprisecloud.terremark.com/api/v0.8b-ext2.8/extensions/org/1910324/vappCatalog")));
+      
+      assertEquals(
+            result.getDataCenters(),
+            new ReferenceTypeImpl(
+                  "DataCenters",
+                  "application/vnd.tmrk.ecloud.dataCentersList+xml",
+                  URI.create("https://services.enterprisecloud.terremark.com/api/v0.8b-ext2.8/extensions/org/1910324/dataCenters")));
+
+   }
+}
diff --git a/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java b/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java
index 808eb5a..2bd5757 100644
--- a/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java
+++ b/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/TerremarkECloudAsyncClientTest.java
@@ -18,56 +18,27 @@
  */
 package org.jclouds.vcloud.terremark;
 
-import static org.jclouds.Constants.PROPERTY_API_VERSION;
-import static org.jclouds.Constants.PROPERTY_IDENTITY;
 import static org.jclouds.vcloud.terremark.options.AddInternetServiceOptions.Builder.disabled;
-import static org.testng.Assert.assertEquals;
 
 import java.io.IOException;
 import java.lang.reflect.Method;
 import java.net.URI;
-import java.util.Map;
-import java.util.Properties;
 
-import javax.inject.Inject;
-import javax.inject.Named;
-import javax.inject.Singleton;
 
 import org.jclouds.http.HttpRequest;
-import org.jclouds.http.RequiresHttp;
 import org.jclouds.http.functions.ParseSax;
 import org.jclouds.http.functions.ReleasePayloadAndReturn;
-import org.jclouds.rest.ConfiguresRestClient;
 import org.jclouds.rest.ResourceNotFoundException;
-import org.jclouds.rest.RestClientTest;
-import org.jclouds.rest.RestContextFactory;
-import org.jclouds.rest.RestContextSpec;
 import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404;
 import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
 import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404;
 import org.jclouds.rest.internal.RestAnnotationProcessor;
+import org.jclouds.terremark.ecloud.BaseTerremarkECloudAsyncClientTest;
 import org.jclouds.util.Strings2;
-import org.jclouds.vcloud.CommonVCloudClient;
-import org.jclouds.vcloud.VCloudVersionsAsyncClient;
-import org.jclouds.vcloud.VCloudExpressAsyncClientTest.VCloudRestClientModuleExtension.TestOrgCatalogItemSupplier;
-import org.jclouds.vcloud.VCloudExpressAsyncClientTest.VCloudRestClientModuleExtension.TestOrgCatalogSupplier;
-import org.jclouds.vcloud.config.CommonVCloudRestClientModule.OrgVDCSupplier;
-import org.jclouds.vcloud.domain.AllocationModel;
-import org.jclouds.vcloud.domain.Capacity;
-import org.jclouds.vcloud.domain.Org;
-import org.jclouds.vcloud.domain.ReferenceType;
-import org.jclouds.vcloud.domain.Task;
-import org.jclouds.vcloud.domain.VCloudSession;
-import org.jclouds.vcloud.domain.VDCStatus;
-import org.jclouds.vcloud.domain.internal.ReferenceTypeImpl;
 import org.jclouds.vcloud.domain.network.NetworkConfig;
-import org.jclouds.vcloud.filters.SetVCloudTokenCookie;
 import org.jclouds.vcloud.functions.ParseTaskFromLocationHeader;
 import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions;
-import org.jclouds.vcloud.terremark.config.TerremarkECloudRestClientModule;
 import org.jclouds.vcloud.terremark.domain.Protocol;
-import org.jclouds.vcloud.terremark.domain.internal.TerremarkOrgImpl;
-import org.jclouds.vcloud.terremark.domain.internal.TerremarkVDCImpl;
 import org.jclouds.vcloud.terremark.options.AddInternetServiceOptions;
 import org.jclouds.vcloud.terremark.options.AddNodeOptions;
 import org.jclouds.vcloud.terremark.options.TerremarkInstantiateVAppTemplateOptions;
@@ -87,23 +58,24 @@
 import org.jclouds.vcloud.xml.VCloudExpressVAppHandler;
 import org.testng.annotations.Test;
 
-import com.google.common.base.Function;
-import com.google.common.base.Supplier;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Maps;
-import com.google.inject.Injector;
-import com.google.inject.Module;
 import com.google.inject.TypeLiteral;
 
+
 /**
  * Tests behavior of {@code TerremarkECloudAsyncClient}
  * 
  * @author Adrian Cole
  */
 // NOTE:without testName, this will not call @Before* and fail w/NPE during surefire
-@Test(groups = "unit", sequential = true, testName = "TerremarkECloudAsyncClientTest")
-public class TerremarkECloudAsyncClientTest extends RestClientTest<TerremarkECloudAsyncClient> {
+@Test(groups = "unit", singleThreaded = true, testName = "TerremarkECloudAsyncClientTest")
+public class TerremarkECloudAsyncClientTest extends BaseTerremarkECloudAsyncClientTest<TerremarkECloudAsyncClient> {
+
+   @Override
+   protected TypeLiteral<RestAnnotationProcessor<TerremarkECloudAsyncClient>> createTypeLiteral() {
+      return new TypeLiteral<RestAnnotationProcessor<TerremarkECloudAsyncClient>>() {
+      };
+   }
+   
    public void testNetwork() throws SecurityException, NoSuchMethodException, IOException {
       Method method = TerremarkECloudAsyncClient.class.getMethod("getNetwork", URI.class);
       HttpRequest request = processor.createRequest(method,
@@ -559,173 +531,4 @@
 
       checkFilters(request);
    }
-
-   @Override
-   protected void checkFilters(HttpRequest request) {
-      assertEquals(request.getFilters().size(), 1);
-      assertEquals(request.getFilters().get(0).getClass(), SetVCloudTokenCookie.class);
-   }
-
-   @Override
-   protected TypeLiteral<RestAnnotationProcessor<TerremarkECloudAsyncClient>> createTypeLiteral() {
-      return new TypeLiteral<RestAnnotationProcessor<TerremarkECloudAsyncClient>>() {
-      };
-   }
-
-   @Override
-   protected Module createModule() {
-      return new TerremarkVCloudRestClientModuleExtension();
-   }
-
-   @Override
-   public RestContextSpec<?, ?> createContextSpec() {
-      return new RestContextFactory().createContextSpec("trmk-ecloud", "identity", "credential", new Properties());
-   }
-
-   @RequiresHttp
-   @ConfiguresRestClient
-   protected static class TerremarkVCloudRestClientModuleExtension extends TerremarkECloudRestClientModule {
-      @Override
-      protected URI provideAuthenticationURI(VCloudVersionsAsyncClient versionService,
-            @Named(PROPERTY_API_VERSION) String version) {
-         return URI.create("https://vcloud/login");
-      }
-
-      @Override
-      protected void configure() {
-         super.configure();
-         bind(OrgNameToKeysListSupplier.class).to(TestOrgNameToKeysListSupplier.class);
-         bind(OrgMapSupplier.class).to(TestTerremarkOrgMapSupplier.class);
-         bind(OrgCatalogSupplier.class).to(TestOrgCatalogSupplier.class);
-         bind(OrgCatalogItemSupplier.class).to(TestOrgCatalogItemSupplier.class);
-         bind(OrgVDCSupplier.class).to(TestTerremarkOrgVDCSupplier.class);
-      }
-
-      @Singleton
-      public static class TestOrgNameToKeysListSupplier extends OrgNameToKeysListSupplier {
-         @Inject
-         protected TestOrgNameToKeysListSupplier(Supplier<VCloudSession> sessionSupplier) {
-            super(sessionSupplier, null);
-         }
-
-         @Override
-         public Map<String, ReferenceType> get() {
-            return Maps.transformValues(sessionSupplier.get().getOrgs(), new Function<ReferenceType, ReferenceType>() {
-
-               @Override
-               public ReferenceType apply(ReferenceType from) {
-                  return new ReferenceTypeImpl(from.getName(), TerremarkECloudMediaType.KEYSLIST_XML, URI.create(from
-                        .getHref().toASCIIString() + "/keysList"));
-               }
-            });
-         }
-      }
-
-      @Singleton
-      public static class TestTerremarkOrgMapSupplier extends OrgMapSupplier {
-         @Inject
-         protected TestTerremarkOrgMapSupplier() {
-            super(null, null);
-         }
-
-         @Override
-         public Map<String, Org> get() {
-            return ImmutableMap.<String, Org> of(
-                  "org",
-                  new TerremarkOrgImpl("org", null, URI.create("https://vcloud.safesecureweb.com/api/v0.8/org/1"),
-                        null, ImmutableMap.<String, ReferenceType> of(
-                              "catalog",
-                              new ReferenceTypeImpl("catalog", TerremarkECloudMediaType.CATALOG_XML, URI
-                                    .create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1"))), ImmutableMap
-                              .<String, ReferenceType> of(
-                                    "vdc",
-                                    new ReferenceTypeImpl("vdc", TerremarkECloudMediaType.VDC_XML, URI
-                                          .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"))), ImmutableMap
-                              .<String, ReferenceType> of(), new ReferenceTypeImpl("tasksList",
-                              TerremarkECloudMediaType.TASKSLIST_XML, URI
-                                    .create("https://vcloud.safesecureweb.com/api/v0.8/tasksList/1")),
-                        new ReferenceTypeImpl("keysList", TerremarkECloudMediaType.KEYSLIST_XML, URI
-                              .create("https://vcloud.safesecureweb.com/api/v0.8/keysList/1"))));
-         }
-      }
-
-      @Override
-      protected URI provideOrg(@org.jclouds.vcloud.endpoints.Org Iterable<ReferenceType> orgs) {
-         return URI.create("https://org");
-      }
-
-      @Override
-      protected String provideOrgName(@org.jclouds.vcloud.endpoints.Org Iterable<ReferenceType> orgs) {
-         return "org";
-      }
-
-      @Override
-      protected URI provideCatalog(Org org, @Named(PROPERTY_IDENTITY) String user, WriteableCatalog write) {
-         return URI.create("https://catalog");
-      }
-
-      @Override
-      protected Org provideOrg(CommonVCloudClient discovery) {
-         return null;
-      }
-
-      @Override
-      protected Iterable<ReferenceType> provideOrgs(Supplier<VCloudSession> cache, @Named(PROPERTY_IDENTITY) String user) {
-         return null;
-      }
-
-      @Override
-      protected URI provideDefaultTasksList(Org org) {
-         return URI.create("https://taskslist");
-      }
-
-      @Override
-      protected URI provideDefaultVDC(Org org, @org.jclouds.vcloud.endpoints.VDC String defaultVDC) {
-         return URI.create("https://vdc/1");
-      }
-
-      @Override
-      protected String provideDefaultVDCName(
-            @org.jclouds.vcloud.endpoints.VDC Supplier<Map<String, String>> vDCtoOrgSupplier) {
-         return "vdc";
-      }
-
-      @Override
-      protected URI provideDefaultNetwork(URI vdc, Injector injector) {
-         return URI.create("https://vcloud.safesecureweb.com/network/1990");
-      }
-   }
-
-   @Singleton
-   public static class TestTerremarkOrgVDCSupplier extends OrgVDCSupplier {
-      @Inject
-      protected TestTerremarkOrgVDCSupplier() {
-         super(null, null);
-      }
-
-      @Override
-      public Map<String, Map<String, ? extends org.jclouds.vcloud.domain.VDC>> get() {
-         return ImmutableMap.<String, Map<String, ? extends org.jclouds.vcloud.domain.VDC>> of("org",
-
-         ImmutableMap.<String, org.jclouds.vcloud.domain.VDC> of(
-               "vdc",
-               new TerremarkVDCImpl("vdc", null, URI.create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"),
-                     VDCStatus.READY, null, "description", ImmutableSet.<Task> of(), AllocationModel.UNRECOGNIZED,
-                     new Capacity("MB", 0, 0, 0, 0), new Capacity("MB", 0, 0, 0, 0), new Capacity("MB", 0, 0, 0, 0),
-                     ImmutableMap.<String, ReferenceType> of(
-                           "vapp",
-                           new ReferenceTypeImpl("vapp", "application/vnd.vmware.vcloud.vApp+xml", URI
-                                 .create("https://vcloud.safesecureweb.com/api/v0.8/vApp/188849-1")),
-                           "network",
-                           new ReferenceTypeImpl("network", "application/vnd.vmware.vcloud.vAppTemplate+xml", URI
-                                 .create("https://vcloud.safesecureweb.com/api/v0.8/vdcItem/2"))), ImmutableMap
-                           .<String, ReferenceType> of(), 0, 0, 0, false, new ReferenceTypeImpl("catalog",
-                           TerremarkVCloudMediaType.CATALOG_XML, URI
-                                 .create("https://vcloud.safesecureweb.com/api/v0.8/catalog/1")),
-                     new ReferenceTypeImpl("publicIps", TerremarkVCloudMediaType.PUBLICIPSLIST_XML, URI
-                           .create("https://vcloud.safesecureweb.com/api/v0.8/publicIps/1")), new ReferenceTypeImpl(
-                           "internetServices", TerremarkVCloudMediaType.INTERNETSERVICESLIST_XML, URI
-                                 .create("https://vcloud.safesecureweb.com/api/v0.8/internetServices/1")))));
-      }
-   }
 }
diff --git a/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/compute/functions/TerremarkECloudParseOsFromVAppTemplateNameTest.java b/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/compute/functions/TerremarkECloudParseOsFromVAppTemplateNameTest.java
index d96827f..284ff1b 100644
--- a/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/compute/functions/TerremarkECloudParseOsFromVAppTemplateNameTest.java
+++ b/providers/trmk-ecloud/src/test/java/org/jclouds/vcloud/terremark/compute/functions/TerremarkECloudParseOsFromVAppTemplateNameTest.java
@@ -24,7 +24,7 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.jclouds.compute.domain.OperatingSystemBuilder;
+import org.jclouds.compute.domain.OperatingSystem;
 import org.jclouds.compute.domain.OsFamily;
 import org.jclouds.compute.reference.ComputeServiceConstants;
 import org.jclouds.http.functions.ParseSax;
@@ -66,100 +66,100 @@
       assertEquals(Sets.newLinkedHashSet(Iterables.transform(names, function)), ImmutableSet.of(
 
       // CentOS 5 (x64)
-               new OperatingSystemBuilder().family(OsFamily.CENTOS).version("5.0").description("CentOS 5 (x64)")
+               new OperatingSystem.Builder().family(OsFamily.CENTOS).version("5.0").description("CentOS 5 (x64)")
                         .is64Bit(true).build(),
                // CentOS 5 (x86)
-               new OperatingSystemBuilder().family(OsFamily.CENTOS).version("5.0").description("CentOS 5 (x86)")
+               new OperatingSystem.Builder().family(OsFamily.CENTOS).version("5.0").description("CentOS 5 (x86)")
                         .is64Bit(false).build(),
                // CentOS 5.5 x32
-               new OperatingSystemBuilder().family(OsFamily.CENTOS).version("5.5").description("CentOS 5.5 x32")
+               new OperatingSystem.Builder().family(OsFamily.CENTOS).version("5.5").description("CentOS 5.5 x32")
                         .is64Bit(false).build(),
                // CentOS 5.5 x64
-               new OperatingSystemBuilder().family(OsFamily.CENTOS).version("5.5").description("CentOS 5.5 x64")
+               new OperatingSystem.Builder().family(OsFamily.CENTOS).version("5.5").description("CentOS 5.5 x64")
                         .is64Bit(true).build(),
                // Red Hat Enterprise Linux 5 (x64)
-               new OperatingSystemBuilder().family(OsFamily.RHEL).version("5.0").description(
+               new OperatingSystem.Builder().family(OsFamily.RHEL).version("5.0").description(
                         "Red Hat Enterprise Linux 5 (x64)").is64Bit(true).build(),
                // Red Hat Enterprise Linux 5 (x86)
-               new OperatingSystemBuilder().family(OsFamily.RHEL).version("5.0").description(
+               new OperatingSystem.Builder().family(OsFamily.RHEL).version("5.0").description(
                         "Red Hat Enterprise Linux 5 (x86)").is64Bit(false).build(),
                // Red Hat Enterprise Linux 5.5 x32
-               new OperatingSystemBuilder().family(OsFamily.RHEL).version("5.5").description(
+               new OperatingSystem.Builder().family(OsFamily.RHEL).version("5.5").description(
                         "Red Hat Enterprise Linux 5.5 x32").is64Bit(false).build(),
                // Red Hat Enterprise Linux 5.5 x64
-               new OperatingSystemBuilder().family(OsFamily.RHEL).version("5.5").description(
+               new OperatingSystem.Builder().family(OsFamily.RHEL).version("5.5").description(
                         "Red Hat Enterprise Linux 5.5 x64").is64Bit(true).build(),
                // Sun Solaris 10 (x64)
-               new OperatingSystemBuilder().family(OsFamily.SOLARIS).version("10").description("Sun Solaris 10 (x64)")
+               new OperatingSystem.Builder().family(OsFamily.SOLARIS).version("10").description("Sun Solaris 10 (x64)")
                         .is64Bit(true).build(),
                // Ubuntu 8.04 LTS (x64)
-               new OperatingSystemBuilder().family(OsFamily.UBUNTU).version("8.04")
+               new OperatingSystem.Builder().family(OsFamily.UBUNTU).version("8.04")
                         .description("Ubuntu 8.04 LTS (x64)").is64Bit(true).build(),
                // Ubuntu 8.04 LTS (x86)
-               new OperatingSystemBuilder().family(OsFamily.UBUNTU).version("8.04")
+               new OperatingSystem.Builder().family(OsFamily.UBUNTU).version("8.04")
                         .description("Ubuntu 8.04 LTS (x86)").is64Bit(false).build(),
                // Ubuntu Server 10.04 x32
-               new OperatingSystemBuilder().family(OsFamily.UBUNTU).version("10.04").description(
+               new OperatingSystem.Builder().family(OsFamily.UBUNTU).version("10.04").description(
                         "Ubuntu Server 10.04 x32").is64Bit(false).build(),
                // Ubuntu Server 10.04 x64
-               new OperatingSystemBuilder().family(OsFamily.UBUNTU).version("10.04").description(
+               new OperatingSystem.Builder().family(OsFamily.UBUNTU).version("10.04").description(
                         "Ubuntu Server 10.04 x64").is64Bit(true).build(),
                // -Windows 2003 Std. R2 SQL 2005 Std. (x64)
-               new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2003 R2").description(
+               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2003 R2").description(
                         "-Windows 2003 Std. R2 SQL 2005 Std. (x64)").is64Bit(true).build(),
                // -Windows 2003 Std. R2 SQL 2008 Std. (x64)
-               new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2003 R2").description(
+               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2003 R2").description(
                         "-Windows 2003 Std. R2 SQL 2008 Std. (x64)").is64Bit(true).build(),
                // -Windows 2008 R2 Std wSQL 2008 R2 Std (x64)
-               new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2008 R2").description(
+               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2008 R2").description(
                         "-Windows 2008 R2 Std wSQL 2008 R2 Std (x64)").is64Bit(true).build(),
                // -Windows 2008 R2 Std wSQL 2008 R2 Web (x64)
-               new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2008 R2").description(
+               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2008 R2").description(
                         "-Windows 2008 R2 Std wSQL 2008 R2 Web (x64)").is64Bit(true).build(),
                // -Windows 2008 Std wSQL 2008 Std (x64)
-               new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2008").description(
+               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2008").description(
                         "-Windows 2008 Std wSQL 2008 Std (x64)").is64Bit(true).build(),
                // -Windows 2008 Std wSQL 2008 Web (x64)
-               new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2008").description(
+               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2008").description(
                         "-Windows 2008 Std wSQL 2008 Web (x64)").is64Bit(true).build(),
                // -Windows Server 2003 R2 Enterprise Edition (x64)
-               new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2003 R2").description(
+               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2003 R2").description(
                         "-Windows Server 2003 R2 Enterprise Edition (x64)").is64Bit(true).build(),
                // -Windows Server 2003 R2 Enterprise Edition (x86)
-               new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2003 R2").description(
+               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2003 R2").description(
                         "-Windows Server 2003 R2 Enterprise Edition (x86)").is64Bit(false).build(),
                // -Windows Server 2003 R2 Standard Edition (x64)
-               new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2003 R2").description(
+               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2003 R2").description(
                         "-Windows Server 2003 R2 Standard Edition (x64)").is64Bit(true).build(),
                // -Windows Server 2003 R2 Standard Edition (x86)
-               new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2003 R2").description(
+               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2003 R2").description(
                         "-Windows Server 2003 R2 Standard Edition (x86)").is64Bit(false).build(),
                // -Windows Server 2008 Enterprise Edition (x64)
-               new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2008").description(
+               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2008").description(
                         "-Windows Server 2008 Enterprise Edition (x64)").is64Bit(true).build(),
                // -Windows Server 2008 Enterprise Edition (x86)
-               new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2008").description(
+               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2008").description(
                         "-Windows Server 2008 Enterprise Edition (x86)").is64Bit(false).build(),
                // -Windows Server 2008 R2 Enterprise Edition (x64)
-               new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2008 R2").description(
+               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2008 R2").description(
                         "-Windows Server 2008 R2 Enterprise Edition (x64)").is64Bit(true).build(),
                // -Windows Server 2008 R2 Standard Edition (x64)
-               new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2008 R2").description(
+               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2008 R2").description(
                         "-Windows Server 2008 R2 Standard Edition (x64)").is64Bit(true).build(),
                // -Windows Server 2008 R2 Web Edition (x64)
-               new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2008 R2").description(
+               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2008 R2").description(
                         "-Windows Server 2008 R2 Web Edition (x64)").is64Bit(true).build(),
                // -Windows Server 2008 Standard Edition (x64)
-               new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2008").description(
+               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2008").description(
                         "-Windows Server 2008 Standard Edition (x64)").is64Bit(true).build(),
                // -Windows Server 2008 Standard Edition (x86)
-               new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2008").description(
+               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2008").description(
                         "-Windows Server 2008 Standard Edition (x86)").is64Bit(false).build(),
                // -Windows Server 2008 Web Edition (x64)
-               new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2008").description(
+               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2008").description(
                         "-Windows Server 2008 Web Edition (x64)").is64Bit(true).build(),
                // -Windows Server 2008 Web Edition (x86)
-               new OperatingSystemBuilder().family(OsFamily.WINDOWS).version("2008").description(
+               new OperatingSystem.Builder().family(OsFamily.WINDOWS).version("2008").description(
                         "-Windows Server 2008 Web Edition (x86)").is64Bit(false).build()
 
       ));
diff --git a/providers/trmk-ecloud/src/test/resources/deviceTags.xml b/providers/trmk-ecloud/src/test/resources/deviceTags.xml
new file mode 100644
index 0000000..232a49f
--- /dev/null
+++ b/providers/trmk-ecloud/src/test/resources/deviceTags.xml
@@ -0,0 +1,27 @@
+<Tags xmlns="urn:tmrk:eCloudExtensions-2.8" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
+
+  <Tag>
+
+    <Name>Tag1</Name>
+
+    <UsageCount>1</UsageCount>
+
+  </Tag>
+
+  <Tag>
+
+    <Name>Tag2</Name>
+
+    <UsageCount>5</UsageCount>
+
+  </Tag>
+
+  <Tag>
+
+    <Name>Tag3</Name>
+
+    <UsageCount>12</UsageCount>
+
+  </Tag>
+
+</Tags>
\ No newline at end of file
diff --git a/providers/trmk-ecloud/src/test/resources/org-ecloud.xml b/providers/trmk-ecloud/src/test/resources/org-ecloud.xml
new file mode 100644
index 0000000..74888a9
--- /dev/null
+++ b/providers/trmk-ecloud/src/test/resources/org-ecloud.xml
@@ -0,0 +1,12 @@
+<Org href="https://services.enterprisecloud.terremark.com/api/v0.8b-ext2.8/org/1910324" name="Cloud Conscious, LLC" xmlns="http://www.vmware.com/vcloud/v0.8" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+  <Link rel="down" href="https://services.enterprisecloud.terremark.com/api/v0.8b-ext2.8/vdc/1155" type="application/vnd.vmware.vcloud.vdc+xml" name="Cloud Conscious LLC - MIA"/>
+  <Link rel="down" href="https://services.enterprisecloud.terremark.com/api/v0.8b-ext2.8/vdc/1169" type="application/vnd.vmware.vcloud.vdc+xml" name="Cloud Conscious LLC - AMA"/>
+  <Link rel="down" href="https://services.enterprisecloud.terremark.com/api/v0.8b-ext2.8/vdc/1169/catalog" type="application/vnd.vmware.vcloud.catalog+xml" name="Cloud Conscious LLC - AMA Catalog"/>
+  <Link rel="down" href="https://services.enterprisecloud.terremark.com/api/v0.8b-ext2.8/vdc/1155/catalog" type="application/vnd.vmware.vcloud.catalog+xml" name="Cloud Conscious LLC - MIA Catalog"/>
+  <Link rel="down" href="https://services.enterprisecloud.terremark.com/api/v0.8b-ext2.8/vdc/1169/tasksList" type="application/vnd.vmware.vcloud.tasksList+xml" name="Cloud Conscious LLC - AMA Tasks List"/>
+  <Link rel="down" href="https://services.enterprisecloud.terremark.com/api/v0.8b-ext2.8/vdc/1155/tasksList" type="application/vnd.vmware.vcloud.tasksList+xml" name="Cloud Conscious LLC - MIA Tasks List"/>
+  <Link rel="down" href="https://services.enterprisecloud.terremark.com/api/v0.8b-ext2.8/extensions/org/1910324/keys" type="application/vnd.tmrk.ecloud.keysList+xml" name="Keys"/>
+  <Link rel="down" href="https://services.enterprisecloud.terremark.com/api/v0.8b-ext2.8/extensions/org/1910324/deviceTags" type="application/vnd.tmrk.ecloud.tagsList+xml" name="Device Tags"/>
+  <Link rel="down" href="https://services.enterprisecloud.terremark.com/api/v0.8b-ext2.8/extensions/org/1910324/vappCatalog" type="application/vnd.tmrk.ecloud.VAppCatalogList+xml" name="VApp Catalog"/>
+  <Link rel="down" href="https://services.enterprisecloud.terremark.com/api/v0.8b-ext2.8/extensions/org/1910324/dataCenters" type="application/vnd.tmrk.ecloud.dataCentersList+xml" name="DataCenters"/>
+</Org>
diff --git a/providers/trmk-vcloudexpress/src/test/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressAsyncClientTest.java b/providers/trmk-vcloudexpress/src/test/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressAsyncClientTest.java
index 4c91476..395bdcd 100644
--- a/providers/trmk-vcloudexpress/src/test/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressAsyncClientTest.java
+++ b/providers/trmk-vcloudexpress/src/test/java/org/jclouds/vcloud/terremark/TerremarkVCloudExpressAsyncClientTest.java
@@ -48,9 +48,9 @@
 import org.jclouds.rest.internal.RestAnnotationProcessor;
 import org.jclouds.util.Strings2;
 import org.jclouds.vcloud.CommonVCloudClient;
-import org.jclouds.vcloud.VCloudVersionsAsyncClient;
 import org.jclouds.vcloud.VCloudExpressAsyncClientTest.VCloudRestClientModuleExtension.TestOrgCatalogItemSupplier;
 import org.jclouds.vcloud.VCloudExpressAsyncClientTest.VCloudRestClientModuleExtension.TestOrgCatalogSupplier;
+import org.jclouds.vcloud.VCloudVersionsAsyncClient;
 import org.jclouds.vcloud.domain.AllocationModel;
 import org.jclouds.vcloud.domain.Capacity;
 import org.jclouds.vcloud.domain.Catalog;
@@ -718,9 +718,10 @@
                                     "vdc",
                                     new ReferenceTypeImpl("vdc", TerremarkVCloudExpressMediaType.VDC_XML, URI
                                           .create("https://vcloud.safesecureweb.com/api/v0.8/vdc/1"))), ImmutableMap
-                              .<String, ReferenceType> of(), new ReferenceTypeImpl("tasksList",
-                              TerremarkVCloudExpressMediaType.TASKSLIST_XML, URI
-                                    .create("https://vcloud.safesecureweb.com/api/v0.8/tasksList/1")),
+                              .<String, ReferenceType> of(), ImmutableMap.<String, ReferenceType> of(
+                              "tasksList",
+                              new ReferenceTypeImpl("tasksList", TerremarkVCloudExpressMediaType.TASKSLIST_XML, URI
+                                    .create("https://vcloud.safesecureweb.com/api/v0.8/tasksList/1"))),
                         new ReferenceTypeImpl("keysList", TerremarkVCloudExpressMediaType.KEYSLIST_XML, URI
                               .create("https://vcloud.safesecureweb.com/api/v0.8/keysList/1"))));
          }