diff --git a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtnConfig.java b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtnConfig.java
index ec83432..a44ec21 100644
--- a/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtnConfig.java
+++ b/apps/cordvtn/src/main/java/org/onosproject/cordvtn/CordVtnConfig.java
@@ -18,6 +18,7 @@
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
+import org.onlab.packet.Ip4Address;
 import org.onlab.packet.IpAddress;
 import org.onlab.packet.MacAddress;
 import org.onlab.packet.TpPort;
@@ -29,7 +30,6 @@
 import java.util.Map;
 import java.util.Set;
 
-import static com.google.common.base.Preconditions.checkNotNull;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -45,11 +45,12 @@
     public static final String GATEWAY_MAC = "gatewayMac";
     public static final String LOCAL_MANAGEMENT_IP = "localManagementIp";
     public static final String OVSDB_PORT = "ovsdbPort";
+
     public static final String SSH_PORT = "sshPort";
     public static final String SSH_USER = "sshUser";
     public static final String SSH_KEY_FILE = "sshKeyFile";
-    public static final String CORDVTN_NODES = "nodes";
 
+    public static final String CORDVTN_NODES = "nodes";
     public static final String HOSTNAME = "hostname";
     public static final String HOST_MANAGEMENT_IP = "hostManagementIp";
     public static final String DATA_PLANE_IP = "dataPlaneIp";
@@ -61,31 +62,70 @@
      *
      * @return set of CordVtnNodeConfig or null
      */
-    public Set<CordVtnNodeConfig> cordVtnNodes() {
-        Set<CordVtnNodeConfig> nodes = Sets.newHashSet();
+    public Set<CordVtnNode> cordVtnNodes() {
 
+        Set<CordVtnNode> nodes = Sets.newHashSet();
         JsonNode jsonNodes = object.get(CORDVTN_NODES);
         if (jsonNodes == null) {
+            log.debug("No CORD VTN nodes found");
             return null;
         }
 
-        jsonNodes.forEach(jsonNode -> {
+        for (JsonNode jsonNode : jsonNodes) {
             try {
-                nodes.add(new CordVtnNodeConfig(
-                        jsonNode.path(HOSTNAME).asText(),
-                        NetworkAddress.valueOf(jsonNode.path(HOST_MANAGEMENT_IP).asText()),
-                        NetworkAddress.valueOf(jsonNode.path(DATA_PLANE_IP).asText()),
-                        jsonNode.path(DATA_PLANE_INTF).asText(),
-                        DeviceId.deviceId(jsonNode.path(BRIDGE_ID).asText())));
+                NetworkAddress hostMgmt = NetworkAddress.valueOf(getConfig(jsonNode, HOST_MANAGEMENT_IP));
+                NetworkAddress localMgmt = NetworkAddress.valueOf(getConfig(object, LOCAL_MANAGEMENT_IP));
+                if (hostMgmt.prefix().contains(localMgmt.prefix()) ||
+                        localMgmt.prefix().contains(hostMgmt.prefix())) {
+                    log.error("hostMamt and localMgmt cannot be overlapped, skip this node");
+                    continue;
+                }
+
+                Ip4Address hostMgmtIp = hostMgmt.ip().getIp4Address();
+                SshAccessInfo sshInfo = new SshAccessInfo(
+                        hostMgmtIp,
+                        TpPort.tpPort(Integer.parseInt(getConfig(object, SSH_PORT))),
+                        getConfig(object, SSH_USER), getConfig(object, SSH_KEY_FILE));
+
+                String hostname = getConfig(jsonNode, HOSTNAME);
+                CordVtnNode newNode = new CordVtnNode(
+                        hostname, hostMgmt, localMgmt,
+                        NetworkAddress.valueOf(getConfig(jsonNode, DATA_PLANE_IP)),
+                        TpPort.tpPort(Integer.parseInt(getConfig(object, OVSDB_PORT))),
+                        sshInfo,
+                        DeviceId.deviceId(getConfig(jsonNode, BRIDGE_ID)),
+                        getConfig(jsonNode, DATA_PLANE_INTF));
+
+                log.info("Successfully read {} from the config", hostname);
+                nodes.add(newNode);
             } catch (IllegalArgumentException | NullPointerException e) {
-                log.error("Failed to read {}", e.toString());
+                log.error("{}", e.toString());
             }
-        });
+        }
 
         return nodes;
     }
 
     /**
+     * Returns value of a given path. If the path is missing, show log and return
+     * null.
+     *
+     * @param path path
+     * @return value or null
+     */
+    private String getConfig(JsonNode jsonNode, String path) {
+        jsonNode = jsonNode.path(path);
+
+        if (jsonNode.isMissingNode()) {
+            log.error("{} is not configured", path);
+            return null;
+        } else {
+            log.debug("{} : {}", path, jsonNode.asText());
+            return jsonNode.asText();
+        }
+    }
+
+    /**
      * Returns private network gateway MAC address.
      *
      * @return mac address, or null
@@ -112,7 +152,7 @@
     public Map<IpAddress, MacAddress> publicGateways() {
         JsonNode jsonNodes = object.get(PUBLIC_GATEWAYS);
         if (jsonNodes == null) {
-            return null;
+            return Maps.newHashMap();
         }
 
         Map<IpAddress, MacAddress> publicGateways = Maps.newHashMap();
@@ -128,155 +168,5 @@
 
         return publicGateways;
     }
-
-    /**
-     * Returns local management network address.
-     *
-     * @return network address
-     */
-    public NetworkAddress localMgmtIp() {
-        JsonNode jsonNode = object.get(LOCAL_MANAGEMENT_IP);
-        if (jsonNode == null) {
-            return null;
-        }
-
-        try {
-            return NetworkAddress.valueOf(jsonNode.asText());
-        } catch (IllegalArgumentException e) {
-            log.error("Wrong address format {}", jsonNode.asText());
-            return null;
-        }
-    }
-
-    /**
-     * Returns the port number used for OVSDB connection.
-     *
-     * @return port number, or null
-     */
-    public TpPort ovsdbPort() {
-        JsonNode jsonNode = object.get(OVSDB_PORT);
-        if (jsonNode == null) {
-            return null;
-        }
-
-        try {
-            return TpPort.tpPort(jsonNode.asInt());
-        } catch (IllegalArgumentException e) {
-            log.error("Wrong TCP port format {}", jsonNode.asText());
-            return null;
-        }
-    }
-
-    /**
-     * Returns the port number used for SSH connection.
-     *
-     * @return port number, or null
-     */
-    public TpPort sshPort() {
-        JsonNode jsonNode = object.get(SSH_PORT);
-        if (jsonNode == null) {
-            return null;
-        }
-
-        try {
-            return TpPort.tpPort(jsonNode.asInt());
-        } catch (IllegalArgumentException e) {
-            log.error("Wrong TCP port format {}", jsonNode.asText());
-            return null;
-        }
-    }
-
-    /**
-     * Returns the user name for SSH connection.
-     *
-     * @return user name, or null
-     */
-    public String sshUser() {
-        JsonNode jsonNode = object.get(SSH_USER);
-        if (jsonNode == null) {
-            return null;
-        }
-
-        return jsonNode.asText();
-    }
-
-    /**
-     * Returns the private key file for SSH connection.
-     *
-     * @return file path, or null
-     */
-    public String sshKeyFile() {
-        JsonNode jsonNode = object.get(SSH_KEY_FILE);
-        if (jsonNode == null) {
-            return null;
-        }
-
-        return jsonNode.asText();
-    }
-
-    /**
-     * Configuration for CordVtn node.
-     */
-    public static class CordVtnNodeConfig {
-
-        private final String hostname;
-        private final NetworkAddress hostMgmtIp;
-        private final NetworkAddress dpIp;
-        private final String dpIntf;
-        private final DeviceId bridgeId;
-
-        public CordVtnNodeConfig(String hostname, NetworkAddress hostMgmtIp, NetworkAddress dpIp,
-                                 String dpIntf, DeviceId bridgeId) {
-            this.hostname = checkNotNull(hostname);
-            this.hostMgmtIp = checkNotNull(hostMgmtIp);
-            this.dpIp = checkNotNull(dpIp);
-            this.dpIntf = checkNotNull(dpIntf);
-            this.bridgeId = checkNotNull(bridgeId);
-        }
-
-        /**
-         * Returns hostname of the node.
-         *
-         * @return hostname
-         */
-        public String hostname() {
-            return this.hostname;
-        }
-
-        /**
-         * Returns the host management network address of the node.
-         *
-         * @return management network address
-         */
-        public NetworkAddress hostMgmtIp() {
-            return this.hostMgmtIp;
-        }
-
-        /**
-         * Returns the data plane network address.
-         *
-         * @return network address
-         */
-        public NetworkAddress dpIp() {
-            return this.dpIp;
-        }
-
-        /**
-         * Returns the data plane interface name.
-         *
-         * @return interface name
-         */
-        public String dpIntf() {
-            return this.dpIntf;
-        }
-
-        /**
-         * Returns integration bridge id of the node.
-         *
-         * @return device id
-         */
-        public DeviceId bridgeId() {
-            return this.bridgeId;
-        }
-    }
 }
+
