diff --git a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnPort.java b/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnPort.java
index 9a22552..9dae6e9 100644
--- a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnPort.java
+++ b/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnPort.java
@@ -16,12 +16,15 @@
 package org.onosproject.xosclient.api;
 
 import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableMap;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.MacAddress;
 
 import java.util.Map;
 import java.util.Objects;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
 /**
  * Representation of port in a CORD VTN controlled network, it can be for VM
  * or container.
@@ -36,23 +39,12 @@
     // TODO remove this when XOS provides vSG information
     private final Map<IpAddress, MacAddress> addressPairs;
 
-
-    /**
-     * Creates a new vtn port with the specified entities.
-     *
-     * @param id vtn port id
-     * @param name vtn port name
-     * @param serviceId id of the service this port is in
-     * @param mac mac address
-     * @param ip ip address
-     * @param addressPairs ip and mac pairs of nested container
-     */
-    public VtnPort(VtnPortId id,
-                        String name,
-                        VtnServiceId serviceId,
-                        MacAddress mac,
-                        IpAddress ip,
-                        Map<IpAddress, MacAddress> addressPairs) {
+   private VtnPort(VtnPortId id,
+                   String name,
+                   VtnServiceId serviceId,
+                   MacAddress mac,
+                   IpAddress ip,
+                   Map<IpAddress, MacAddress> addressPairs) {
         this.id = id;
         this.name = name;
         this.serviceId = serviceId;
@@ -143,4 +135,161 @@
                 .add("addressPairs", addressPairs)
                 .toString();
     }
+
+    /**
+     * Returns a new vtn port builder instance.
+     *
+     * @return new vtn port builder
+     */
+    public static final Builder builder() {
+        return new Builder();
+    }
+
+    /**
+     * Builder of VTN port entities.
+     */
+    public static final class Builder {
+
+        private VtnPortId id;
+        private String name;
+        private VtnServiceId serviceId;
+        private MacAddress mac;
+        private IpAddress ip;
+        // TODO remove this when XOS provides vSG information
+        private Map<IpAddress, MacAddress> addressPairs;
+
+        private Builder() {
+        }
+
+        /**
+         * Builds an immutable VTN port.
+         *
+         * @return vtn port instance
+         */
+        public VtnPort build() {
+            checkNotNull(id, "VTN port ID cannot be null");
+            checkNotNull(serviceId, "VTN port service ID cannot be null");
+            checkNotNull(mac, "VTN port MAC address cannot be null");
+            checkNotNull(ip, "VTN port IP address cannot be null");
+            addressPairs = addressPairs == null ? ImmutableMap.of() : addressPairs;
+
+            return new VtnPort(id,
+                               name,
+                               serviceId,
+                               mac,
+                               ip,
+                               addressPairs);
+        }
+
+        /**
+         * Returns VTN port builder with the supplied port ID.
+         *
+         * @param id port identifier
+         * @return vtn port builder
+         */
+        public Builder id(VtnPortId id) {
+            this.id = id;
+            return this;
+        }
+
+        /**
+         * Returns VTN port builder with the supplied port name.
+         * Port name can be null.
+         *
+         * @param name port name
+         * @return vtn port builder
+         */
+        public Builder name(String name) {
+            this.name = name;
+            return this;
+        }
+
+        /**
+         * Returns VTN port builder with the supplied service ID.
+         *
+         * @param serviceId vtn port service id
+         * @return vtn port builder
+         */
+        public Builder serviceId(VtnServiceId serviceId) {
+            this.serviceId = serviceId;
+            return this;
+        }
+
+        /**
+         * Returns VTN port builder with the supplied MAC address.
+         *
+         * @param mac mac address
+         * @return vtn port builder
+         */
+        public Builder mac(MacAddress mac) {
+            if (mac == null) {
+                final String msg = "VTN port MAC address cannot be null";
+                throw new IllegalArgumentException(msg);
+            }
+            this.mac = mac;
+            return this;
+        }
+
+        /**
+         * Returns VTN port builder with the supplied MAC address.
+         *
+         * @param mac mac address as a string
+         * @return vtn port builder
+         */
+        public Builder mac(String mac) {
+            try {
+                return mac(MacAddress.valueOf(mac));
+            } catch (IllegalArgumentException | NullPointerException e) {
+                final String msg = "Malformed MAC address string " + mac +
+                        " for VTN port MAC address";
+                throw new IllegalArgumentException(msg);
+            }
+        }
+
+        /**
+         * Returns VTN port builder with the supplied IP address.
+         *
+         * @param ip ip address
+         * @return vtn port builder
+         */
+        public Builder ip(IpAddress ip) {
+            if (ip == null) {
+                final String msg = "VTN port IP address cannot be null";
+                throw new IllegalArgumentException(msg);
+            }
+            this.ip = ip;
+            return this;
+        }
+
+        /**
+         * Returns VTN port builder with the supplied IP address.
+         *
+         * @param ip ip address as a string
+         * @return vtn port builder
+         */
+        public Builder ip(String ip) {
+            try {
+                return ip(IpAddress.valueOf(ip));
+            } catch (IllegalArgumentException | NullPointerException e) {
+                final String msg = "Malformed IP address string " + ip +
+                        " for VTN port IP address";
+                throw new IllegalArgumentException(msg);
+            }
+        }
+
+        /**
+         * Returns VTN port builder with the supplied address pairs.
+         *
+         * @param addressPairs address pairs
+         * @return vtn port builder
+         */
+        public Builder addressPairs(Map<IpAddress, MacAddress> addressPairs) {
+            if (addressPairs == null) {
+                final String msg = "VTN address pairs cannot be null";
+                throw new IllegalArgumentException(msg);
+            }
+            this.addressPairs = addressPairs;
+            return this;
+        }
+    }
 }
diff --git a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnPortId.java b/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnPortId.java
index ef2416b..eaf7ac1 100644
--- a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnPortId.java
+++ b/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnPortId.java
@@ -36,7 +36,7 @@
      * @return instance port id
      */
     public static VtnPortId of(String id) {
-        checkArgument(!Strings.isNullOrEmpty(id));
+        checkArgument(!Strings.isNullOrEmpty(id), "VTN port ID cannot be null");
         return new VtnPortId(id);
     }
 }
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;
+        }
+    }
 }
diff --git a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnServiceId.java b/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnServiceId.java
index 5850696..6fc4a43 100644
--- a/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnServiceId.java
+++ b/apps/xosclient/src/main/java/org/onosproject/xosclient/api/VtnServiceId.java
@@ -15,9 +15,10 @@
  */
 package org.onosproject.xosclient.api;
 
+import com.google.common.base.Strings;
 import org.onlab.util.Identifier;
 
-import static com.google.common.base.Preconditions.checkNotNull;
+import static com.google.common.base.Preconditions.checkArgument;
 
 /**
  * Representation of VTN service identifier.
@@ -39,7 +40,7 @@
      * @return CordServiceId
      */
     public static VtnServiceId of(String id) {
-        checkNotNull(id);
+        checkArgument(!Strings.isNullOrEmpty(id), "VTN service ID cannot be null");
         return new VtnServiceId(id);
     }
 }
diff --git a/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/DefaultVtnPortApi.java b/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/DefaultVtnPortApi.java
index a7329d4..8054dfe 100644
--- a/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/DefaultVtnPortApi.java
+++ b/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/DefaultVtnPortApi.java
@@ -119,12 +119,14 @@
                 pair -> addressPairs.put(IpAddress.valueOf(pair.getIpAddress()),
                                          MacAddress.valueOf(pair.getMacAddress())));
 
-        return new VtnPort(VtnPortId.of(osPort.getId()),
-                           osPort.getName(),
-                           VtnServiceId.of(osPort.getNetworkId()),
-                           MacAddress.valueOf(osPort.getMacAddress()),
-                           IpAddress.valueOf(ipAddr.getIpAddress()),
-                           addressPairs);
+        return VtnPort.builder()
+                .id(VtnPortId.of(osPort.getId()))
+                .name(osPort.getName())
+                .serviceId(VtnServiceId.of(osPort.getNetworkId()))
+                .mac(osPort.getMacAddress())
+                .ip(ipAddr.getIpAddress())
+                .addressPairs(addressPairs)
+                .build();
     }
 
     // TODO remove this when XOS provides this information
diff --git a/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/DefaultVtnServiceApi.java b/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/DefaultVtnServiceApi.java
index 84c366f6..25f5740 100644
--- a/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/DefaultVtnServiceApi.java
+++ b/apps/xosclient/src/main/java/org/onosproject/xosclient/impl/DefaultVtnServiceApi.java
@@ -19,8 +19,6 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.google.common.base.Strings;
 import com.google.common.collect.Sets;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.IpPrefix;
 import org.onosproject.xosclient.api.OpenStackAccess;
 import org.onosproject.xosclient.api.VtnServiceApi;
 import org.onosproject.xosclient.api.XosAccess;
@@ -146,15 +144,17 @@
             return null;
         }
 
-        return new VtnService(serviceId,
-                              osNet.getName(),
-                              serviceType(osNet.getName()),
-                              networkType(osNet.getName()),
-                              Long.parseLong(osNet.getProviderSegID()),
-                              IpPrefix.valueOf(osSubnet.getCidr()),
-                              IpAddress.valueOf(osSubnet.getGateway()),
-                              providerServices(serviceId),
-                              tenantServices(serviceId));
+        return VtnService.build()
+                .id(serviceId)
+                .name(osNet.getName())
+                .serviceType(serviceType(osNet.getName()))
+                .networkType(networkType(osNet.getName()))
+                .vni(osNet.getProviderSegID())
+                .subnet(osSubnet.getCidr())
+                .serviceIp(osSubnet.getGateway())
+                .providerServices(providerServices(serviceId))
+                .tenantServices(tenantServices(serviceId))
+                .build();
     }
 
     // TODO remove this when XOS provides this information
@@ -177,7 +177,7 @@
 
     // TODO remove this when XOS provides this information
     private NetworkType networkType(String netName) {
-        checkArgument(!Strings.isNullOrEmpty(netName));
+        checkArgument(!Strings.isNullOrEmpty(netName), "VTN network name cannot be null");
 
         String name = netName.toUpperCase();
         if (name.contains(PUBLIC.name())) {
@@ -193,7 +193,7 @@
 
     // TODO remove this when XOS provides this information
     private ServiceType serviceType(String netName) {
-        checkArgument(!Strings.isNullOrEmpty(netName));
+        checkArgument(!Strings.isNullOrEmpty(netName), "VTN network name cannot be null");
 
         String name = netName.toUpperCase();
         if (name.contains(VSG.name())) {
