diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultVAppTemplateRecord.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultVAppTemplateRecord.java
new file mode 100644
index 0000000000..ebd4067765
--- /dev/null
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/domain/query/QueryResultVAppTemplateRecord.java
@@ -0,0 +1,368 @@
+/**
+ * Licensed to jclouds, Inc. (jclouds) under one or more
+ * contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. jclouds licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.jclouds.vcloud.director.v1_5.domain.query;
+
+import static com.google.common.base.Objects.equal;
+
+import java.util.Date;
+
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlRootElement;
+import javax.xml.bind.annotation.XmlType;
+
+import com.google.common.base.Objects;
+import com.google.common.base.Objects.ToStringHelper;
+
+/**
+ * Represents the results from a Datastore vCloud query as a record.
+ *
+ *
+ * <complexType name="QueryResultDatastoreRecordType" />
+ *
+ *
+ * @author grkvlt@apache.org
+ */
+@XmlRootElement(name = "VAppTemplateRecord")
+@XmlType(name = "QueryResultVAppTemplateRecordType")
+public class QueryResultVAppTemplateRecord extends QueryResultRecordType {
+
+ public static Builder> builder() {
+ return new ConcreteBuilder();
+ }
+
+ @Override
+ public Builder> toBuilder() {
+ return builder().fromQueryResultDatastoreRecord(this);
+ }
+
+ private static class ConcreteBuilder extends Builder {
+ }
+
+ public static class Builder> extends QueryResultRecordType.Builder {
+
+ private String ownerName;
+ private String catalogName;
+ private Boolean isPublished;
+ private String name;
+ private String vdc;
+ private String vdcName;
+ private String org;
+ private Date creationDate;
+ private Boolean isBusy;
+ private Boolean isGoldMaster;
+ private Boolean isEnabled;
+ private String status;
+ private Boolean isDeployed;
+
+ /**
+ * @see QueryResultVAppTemplateRecord#getOwnerName()
+ */
+ public B ownerName(String ownerName) {
+ this.ownerName = ownerName;
+ return self();
+ }
+
+ /**
+ * @see QueryResultVAppTemplateRecord#getCatalogName()
+ */
+ public B catalogName(String catalogName) {
+ this.catalogName = catalogName;
+ return self();
+ }
+
+ /**
+ * @see QueryResultVAppTemplateRecord#isPublished()
+ */
+ public B isPublished(Boolean val) {
+ this.isPublished = val;
+ return self();
+ }
+
+ /**
+ * @see QueryResultVAppTemplateRecord#getName()
+ */
+ public B name(String name) {
+ this.name = name;
+ return self();
+ }
+
+ /**
+ * @see QueryResultVAppTemplateRecord#getVdc()
+ */
+ public B vdc(String val) {
+ this.vdc = val;
+ return self();
+ }
+
+ /**
+ * @see QueryResultVAppTemplateRecord#getVdcName()
+ */
+ public B vdcName(String val) {
+ this.vdcName = val;
+ return self();
+ }
+
+ /**
+ * @see QueryResultVAppTemplateRecord#getOrg()
+ */
+ public B org(String val) {
+ this.org = val;
+ return self();
+ }
+
+ /**
+ * @see QueryResultVAppTemplateRecord#getCreationDate()
+ */
+ public B creationDate(Date val) {
+ this.creationDate = val;
+ return self();
+ }
+
+ /**
+ * @see QueryResultVAppTemplateRecord#isBusy()
+ */
+ public B isBusy(Boolean val) {
+ this.isBusy = val;
+ return self();
+ }
+
+ /**
+ * @see QueryResultVAppTemplateRecord#isGoldMaster()
+ */
+ public B isGoldMaster(Boolean val) {
+ this.isGoldMaster = val;
+ return self();
+ }
+
+ /**
+ * @see QueryResultVAppTemplateRecord#isEnabled()
+ */
+ public B isEnabled(Boolean isEnabled) {
+ this.isPublished = isEnabled;
+ return self();
+ }
+
+ /**
+ * @see QueryResultVAppTemplateRecord#getStatus()
+ */
+ public B status(String val) {
+ this.status = val;
+ return self();
+ }
+
+ /**
+ * @see QueryResultVAppTemplateRecord#isDeployed()
+ */
+ public B isDeployed(Boolean val) {
+ this.isDeployed = val;
+ return self();
+ }
+
+ @Override
+ public QueryResultVAppTemplateRecord build() {
+ return new QueryResultVAppTemplateRecord(this);
+ }
+
+ public B fromQueryResultDatastoreRecord(QueryResultVAppTemplateRecord in) {
+ return fromQueryResultRecordType(in)
+ .ownerName(in.getOwnerName())
+ .catalogName(in.getCatalogName())
+ .name(in.getName())
+ .isPublished(in.isPublished())
+ .vdc(in.getVdc())
+ .vdcName(in.getVdcName())
+ .org(in.getOrg())
+ .creationDate(in.getCreationDate())
+ .isBusy(in.isBusy())
+ .isGoldMaster(in.isGoldMaster())
+ .isEnabled(in.isEnabled())
+ .status(in.getStatus())
+ .isDeployed(in.isDeployed());
+ }
+ }
+
+ private QueryResultVAppTemplateRecord(Builder> builder) {
+ super(builder);
+ this.ownerName = builder.ownerName;
+ this.catalogName = builder.catalogName;
+ this.isPublished = builder.isPublished;
+ this.name = builder.name;
+ this.vdc = builder.vdc;
+ this.vdcName = builder.vdcName;
+ this.org = builder.org;
+ this.creationDate = builder.creationDate;
+ this.isBusy = builder.isBusy;
+ this.isGoldMaster = builder.isGoldMaster;
+ this.isEnabled = builder.isEnabled;
+ this.status = builder.status;
+ this.isDeployed = builder.isDeployed;
+ }
+
+ private QueryResultVAppTemplateRecord() {
+ // for JAXB
+ }
+
+ @XmlAttribute
+ private String ownerName;
+ @XmlAttribute
+ private String catalogName;
+ @XmlAttribute
+ private Boolean isPublished;
+ @XmlAttribute
+ private String name;
+ @XmlAttribute
+ private String vdc;
+ @XmlAttribute
+ private String vdcName;
+ @XmlAttribute
+ private String org;
+ @XmlAttribute
+ private Date creationDate;
+ @XmlAttribute
+ private Boolean isBusy;
+ @XmlAttribute
+ private Boolean isGoldMaster;
+ @XmlAttribute
+ private Boolean isEnabled;
+ @XmlAttribute
+ private String status;
+ @XmlAttribute
+ private Boolean isDeployed;
+
+ /**
+ * Owner name.
+ */
+ public String getOwnerName() {
+ return ownerName;
+ }
+
+ /**
+ * Catalog name.
+ */
+ public String getCatalogName() {
+ return catalogName;
+ }
+
+ /**
+ * Shows whether it is in published catalog.
+ */
+ public boolean isPublished() {
+ return isPublished;
+ }
+
+ /**
+ * Gets the value of the name property.
+ *
+ * @return possible object is {@link String }
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * vDC reference or id
+ */
+ public String getVdc() {
+ return vdc;
+ }
+
+ /**
+ * vDC name
+ */
+ public String getVdcName() {
+ return vdcName;
+ }
+
+ /**
+ * Organization reference or id
+ */
+ public String getOrg() {
+ return org;
+ }
+
+ /**
+ * Creation date
+ */
+ public Date getCreationDate() {
+ return creationDate;
+ }
+
+ /**
+ * Shows whether it is busy
+ */
+ public Boolean isBusy() {
+ return isBusy;
+ }
+
+ /**
+ * Shows whether Vapp template is marked as a gold master
+ */
+ public Boolean isGoldMaster() {
+ return isGoldMaster;
+ }
+
+ /**
+ * Shows whether vDC is enabled
+ */
+ public Boolean isEnabled() {
+ return isEnabled;
+ }
+
+ /**
+ * Vapp template status
+ */
+ public String getStatus() {
+ return status;
+ }
+
+ /**
+ * Shows whether it is deployed
+ */
+ public Boolean isDeployed() {
+ return isDeployed;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o)
+ return true;
+ if (o == null || getClass() != o.getClass())
+ return false;
+ QueryResultVAppTemplateRecord that = QueryResultVAppTemplateRecord.class.cast(o);
+ return super.equals(that) && equal(ownerName, that.ownerName) && equal(catalogName, that.catalogName)
+ && equal(isPublished, that.isPublished) && equal(name, that.name) && equal(vdc, that.vdc) && equal(vdcName, that.vdcName)
+ && equal(org, that.org) && equal(creationDate, that.creationDate) && equal(isBusy, that.isBusy)
+ && equal(isGoldMaster, that.isGoldMaster) && equal(isEnabled, that.isEnabled) && equal(status, that.status)
+ && equal(isDeployed, that.isDeployed);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hashCode(super.hashCode(), ownerName, catalogName, isPublished, name, vdc, vdcName, org, creationDate, isBusy, isGoldMaster, isEnabled, status, isDeployed);
+ }
+
+ @Override
+ public ToStringHelper string() {
+ return super.string().add("name", name).add("ownerName", ownerName).add("catalogName", catalogName)
+ .add("isPublished", isPublished()).add("vdc", vdc).add("vdcName", vdcName).add("org", org)
+ .add("creationDate", creationDate).add("isBusy", isBusy).add("isGoldMaster", isGoldMaster)
+ .add("isEnabled", isEnabled).add("status", status).add("isDeployed", isDeployed);
+ }
+
+}
diff --git a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/QueryClient.java b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/QueryClient.java
index 7d8d907379..e65f46e032 100644
--- a/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/QueryClient.java
+++ b/labs/vcloud-director/src/main/java/org/jclouds/vcloud/director/v1_5/features/QueryClient.java
@@ -40,6 +40,8 @@ import org.jclouds.vcloud.director.v1_5.domain.query.VAppReferences;
@Timeout(duration = 180, timeUnit = TimeUnit.SECONDS)
public interface QueryClient {
+ // TODO Add a typed object for filter syntax, or at least a fluent builder
+
/**
* REST API query {@link Link} list.
*