diff --git a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnService.java b/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnService.java
index ec33b9f..3e7b100 100644
--- a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnService.java
+++ b/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnService.java
@@ -16,7 +16,8 @@
 package org.onosproject.xosclient.api;
 
 import com.google.common.base.MoreObjects;
-import com.google.common.collect.Sets;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableSet;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.IpPrefix;
 import org.onosproject.xosclient.api.VtnServiceApi.NetworkType;
@@ -25,6 +26,7 @@
 import java.util.Objects;
 import java.util.Set;
 
+import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
@@ -42,37 +44,24 @@
     private final Set<VtnServiceId> providerServices;
     private final Set<VtnServiceId> tenantServices;
 
-    /**
-     * Creates a new VTN service with the specified entities.
-     *
-     * @param id service id
-     * @param name user friendly name
-     * @param serviceType service type
-     * @param networkType network type
-     * @param vni vni of this service network
-     * @param subnet service network subnet range
-     * @param serviceIp service ip for indirect service access
-     * @param providerServices provider services
-     * @param tenantServices tenant services
-     */
-    public VtnService(VtnServiceId id,
-                      String name,
-                      ServiceType serviceType,
-                      NetworkType networkType,
-                      long vni,
-                      IpPrefix subnet,
-                      IpAddress serviceIp,
-                      Set<VtnServiceId> providerServices,
-                      Set<VtnServiceId> tenantServices) {
-        this.id = checkNotNull(id);
+    private VtnService(VtnServiceId id,
+                       String name,
+                       ServiceType serviceType,
+                       NetworkType networkType,
+                       long vni,
+                       IpPrefix subnet,
+                       IpAddress serviceIp,
+                       Set<VtnServiceId> providerServices,
+                       Set<VtnServiceId> tenantServices) {
+        this.id = id;
         this.name = name;
         this.serviceType = serviceType;
         this.networkType = networkType;
         this.vni = vni;
-        this.subnet = checkNotNull(subnet);
-        this.serviceIp = checkNotNull(serviceIp);
-        this.providerServices = providerServices == null ? Sets.newHashSet() : providerServices;
-        this.tenantServices = tenantServices == null ? Sets.newHashSet() : tenantServices;
+        this.subnet = subnet;
+        this.serviceIp = serviceIp;
+        this.providerServices = providerServices;
+        this.tenantServices = tenantServices;
     }
 
     /**
@@ -187,4 +176,231 @@
                 .add("tenantServices", tenantServices)
                 .toString();
     }
+
+    /**
+     * Returns a new builder instance.
+     *
+     * @return new builder
+     */
+    public static final Builder build() {
+        return new Builder();
+    }
+
+    /**
+     * Builder of VTN service entities.
+     */
+    public static final class Builder {
+
+        private VtnServiceId id;
+        private String name;
+        private ServiceType serviceType;
+        private NetworkType networkType;
+        private long vni = -1;
+        private IpPrefix subnet;
+        private IpAddress serviceIp;
+        private Set<VtnServiceId> providerServices;
+        private Set<VtnServiceId> tenantServices;
+
+        private Builder() {
+        }
+
+        /**
+         * Builds an immutable VTN service.
+         *
+         * @return vtn service instance
+         */
+        public VtnService build() {
+            checkNotNull(id, "VTN service ID cannot be null");
+            checkArgument(!Strings.isNullOrEmpty(name), "VTN service name cannot be null");
+            checkNotNull(serviceType, "VTN service type cannot be null");
+            checkNotNull(networkType, "VTN network type cannot be null");
+            checkArgument(vni > 0, "VTN network VNI is not set");
+            checkNotNull(subnet, "VTN subnet cannot be null");
+            checkNotNull(serviceIp, "VTN service IP cannot be null");
+
+            providerServices = providerServices == null ? ImmutableSet.of() : providerServices;
+            tenantServices = tenantServices == null ? ImmutableSet.of() : tenantServices;
+
+            return new VtnService(id,
+                                  name,
+                                  serviceType,
+                                  networkType,
+                                  vni,
+                                  subnet,
+                                  serviceIp,
+                                  providerServices,
+                                  tenantServices);
+        }
+
+        /**
+         * Returns VTN service builder with the supplied service ID.
+         *
+         * @param id service identifier
+         * @return vtn service builder
+         */
+        public Builder id(VtnServiceId id) {
+            this.id = id;
+            return this;
+        }
+
+        /**
+         * Returns VTN service builder with the supplied service name.
+         *
+         * @param name service name
+         * @return vtn service builder
+         */
+        public Builder name(String name) {
+            if (Strings.isNullOrEmpty(name)) {
+                final String msg = "VTN service name cannot be null";
+                throw new IllegalArgumentException(msg);
+            }
+            this.name = name;
+            return this;
+        }
+
+        /**
+         * Returns VTN service builder with the supplied service type.
+         *
+         * @param serviceType service type
+         * @return vtn service builder
+         */
+        public Builder serviceType(ServiceType serviceType) {
+            this.serviceType = serviceType;
+            return this;
+        }
+
+        /**
+         * Returns VTN service builder with the supplied network type.
+         *
+         * @param networkType network type
+         * @return vtn service builder
+         */
+        public Builder networkType(NetworkType networkType) {
+            this.networkType = networkType;
+            return this;
+        }
+
+        /**
+         * Returns VTN service builder with the supplied VNI.
+         *
+         * @param vni vni of the service network
+         * @return vtn service builder
+         */
+        public Builder vni(long vni) {
+            if (vni < 0 || vni > 16777215) {
+                final String msg = "VNI " + vni + " is out of range";
+                throw new IllegalArgumentException(msg);
+            }
+            this.vni = vni;
+            return this;
+        }
+
+        /**
+         * Returns VTN service builder with the supplied VNI.
+         *
+         * @param vni vni of the service network as a string
+         * @return vtn service builder
+         */
+        public Builder vni(String vni) {
+            try {
+                return vni(Long.parseLong(vni));
+            } catch (NumberFormatException | NullPointerException e) {
+                final String msg = "Malformed number string " + vni +
+                        " for VTN network VNI";
+                throw new IllegalArgumentException(msg);
+            }
+        }
+
+        /**
+         * Returns VTN service builder with the supplied subnet.
+         *
+         * @param subnet subnet of the service network
+         * @return vtn service builder
+         */
+        public Builder subnet(IpPrefix subnet) {
+            if (subnet == null) {
+                final String msg = "VTN service subnet is null";
+                throw new IllegalArgumentException(msg);
+            }
+            this.subnet = subnet;
+            return this;
+        }
+
+        /**
+         * Returns VTN service builder with the supplied subnet.
+         *
+         * @param subnet subnet of the service network as a string
+         * @return vtn service builder
+         */
+        public Builder subnet(String subnet) {
+            try {
+                return subnet(IpPrefix.valueOf(subnet));
+            } catch (IllegalArgumentException | NullPointerException e) {
+                final String msg = "Malformed IP prefix string " + subnet +
+                        " for VTN service subnet";
+                throw new IllegalArgumentException(msg);
+            }
+        }
+
+        /**
+         * Returns VTN service builder with the supplied service IP address.
+         *
+         * @param serviceIp service ip address
+         * @return vtn service builder
+         */
+        public Builder serviceIp(IpAddress serviceIp) {
+            if (serviceIp == null) {
+                final String msg = "VTN service IP cannot be null";
+                throw new IllegalArgumentException(msg);
+            }
+            this.serviceIp = serviceIp;
+            return this;
+        }
+
+        /**
+         * Returns VTN service builder with the supplied service IP address.
+         *
+         * @param serviceIp service ip address as a string
+         * @return vtn service builder
+         */
+        public Builder serviceIp(String serviceIp) {
+            try {
+                return serviceIp(IpAddress.valueOf(serviceIp));
+            } catch (IllegalArgumentException | NullPointerException e) {
+                final String msg = "Malformed IP address string " + serviceIp +
+                        " for VTN service IP address";
+                throw new IllegalArgumentException(msg);
+            }
+        }
+
+        /**
+         * Returns VTN service builder with the supplied provider services.
+         *
+         * @param pServices provider services
+         * @return vtn service builder
+         */
+        public Builder providerServices(Set<VtnServiceId> pServices) {
+            if (pServices == null) {
+                final String msg = "Provider services cannot be null";
+                throw new IllegalArgumentException(msg);
+            }
+            this.providerServices = pServices;
+            return this;
+        }
+
+        /**
+         * Returns VTN service builder with the supplied tenant services.
+         *
+         * @param tServices tenant services
+         * @return vtn service builder
+         */
+        public Builder tenantServices(Set<VtnServiceId> tServices) {
+            if (tServices == null) {
+                final String msg = "Tenant services cannot be null";
+                throw new IllegalArgumentException(msg);
+            }
+            this.tenantServices = tServices;
+            return this;
+        }
+    }
 }
