diff --git a/src/main/java/org/opencord/cordvtn/api/node/CordVtnNode.java b/src/main/java/org/opencord/cordvtn/api/node/CordVtnNode.java
index d4339df..153eed3 100644
--- a/src/main/java/org/opencord/cordvtn/api/node/CordVtnNode.java
+++ b/src/main/java/org/opencord/cordvtn/api/node/CordVtnNode.java
@@ -20,6 +20,7 @@
 import com.google.common.collect.Sets;
 import org.onlab.packet.TpPort;
 import org.onosproject.net.DeviceId;
+import org.opencord.cordvtn.api.net.CidrAddr;
 
 import java.util.Comparator;
 import java.util.Objects;
@@ -37,9 +38,9 @@
 public final class CordVtnNode {
 
     private final String hostname;
-    private final NetworkAddress hostMgmtIp;
-    private final NetworkAddress localMgmtIp;
-    private final NetworkAddress dataIp;
+    private final CidrAddr hostMgmtIp;
+    private final CidrAddr localMgmtIp;
+    private final CidrAddr dataIp;
     private final Optional<TpPort> ovsdbPort;
     private final SshAccessInfo sshInfo;
     private final DeviceId integrationBridgeId;
@@ -65,9 +66,9 @@
      * @param state cordvtn node state
      */
     private CordVtnNode(String hostname,
-                        NetworkAddress hostMgmtIp,
-                        NetworkAddress localMgmtIp,
-                        NetworkAddress dataIp,
+                        CidrAddr hostMgmtIp,
+                        CidrAddr localMgmtIp,
+                        CidrAddr dataIp,
                         Optional<TpPort> ovsdbPort,
                         SshAccessInfo sshInfo,
                         DeviceId integrationBridgeId,
@@ -117,7 +118,7 @@
      *
      * @return network address
      */
-    public NetworkAddress hostMgmtIp() {
+    public CidrAddr hostMgmtIp() {
         return this.hostMgmtIp;
     }
 
@@ -126,7 +127,7 @@
      *
      * @return network address
      */
-    public NetworkAddress localMgmtIp() {
+    public CidrAddr localMgmtIp() {
         return this.localMgmtIp;
     }
 
@@ -135,7 +136,7 @@
      *
      * @return network address
      */
-    public NetworkAddress dataIp() {
+    public CidrAddr dataIp() {
         return this.dataIp;
     }
 
@@ -286,9 +287,9 @@
      */
     public static final class Builder {
         private String hostname;
-        private NetworkAddress hostMgmtIp;
-        private NetworkAddress localMgmtIp;
-        private NetworkAddress dataIp;
+        private CidrAddr hostMgmtIp;
+        private CidrAddr localMgmtIp;
+        private CidrAddr dataIp;
         private Optional<TpPort> ovsdbPort =
                 Optional.of(TpPort.tpPort(DEFAULT_OVSDB_PORT));
         private SshAccessInfo sshInfo;
@@ -344,7 +345,7 @@
          * @param hostMgmtIp host management netework ip address
          * @return cordvtn node builder
          */
-        public Builder hostMgmtIp(NetworkAddress hostMgmtIp) {
+        public Builder hostMgmtIp(CidrAddr hostMgmtIp) {
             checkNotNull(hostMgmtIp);
             this.hostMgmtIp = hostMgmtIp;
             return this;
@@ -357,7 +358,7 @@
          * @return cordvtn node builder
          */
         public Builder hostMgmtIp(String cidr) {
-            this.hostMgmtIp = NetworkAddress.valueOf(cidr);
+            this.hostMgmtIp = CidrAddr.valueOf(cidr);
             return this;
         }
 
@@ -367,7 +368,7 @@
          * @param localMgmtIp local management network ip address
          * @return cordvtn node builder
          */
-        public Builder localMgmtIp(NetworkAddress localMgmtIp) {
+        public Builder localMgmtIp(CidrAddr localMgmtIp) {
             checkNotNull(localMgmtIp);
             this.localMgmtIp = localMgmtIp;
             return this;
@@ -380,7 +381,7 @@
          * @return cordvtn node builder
          */
         public Builder localMgmtIp(String cidr) {
-            this.localMgmtIp = NetworkAddress.valueOf(cidr);
+            this.localMgmtIp = CidrAddr.valueOf(cidr);
             return this;
         }
 
@@ -390,7 +391,7 @@
          * @param dataIp data network ip address
          * @return cordvtn node builder
          */
-        public Builder dataIp(NetworkAddress dataIp) {
+        public Builder dataIp(CidrAddr dataIp) {
             checkNotNull(dataIp);
             this.dataIp = dataIp;
             return this;
@@ -403,7 +404,7 @@
          * @return cordvtn node builder
          */
         public Builder dataIp(String cidr) {
-            this.dataIp = NetworkAddress.valueOf(cidr);
+            this.dataIp = CidrAddr.valueOf(cidr);
             return this;
         }
 
diff --git a/src/main/java/org/opencord/cordvtn/api/node/NetworkAddress.java b/src/main/java/org/opencord/cordvtn/api/node/NetworkAddress.java
deleted file mode 100644
index 93bcb7a..0000000
--- a/src/main/java/org/opencord/cordvtn/api/node/NetworkAddress.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.opencord.cordvtn.api.node;
-
-import com.google.common.base.MoreObjects;
-import org.onlab.packet.IpAddress;
-import org.onlab.packet.IpPrefix;
-
-import java.util.Objects;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-/**
- * Representation of a network address, which consists of IP address and prefix.
- */
-public final class NetworkAddress {
-    private final IpAddress ip;
-    private final IpPrefix prefix;
-
-    /**
-     * Constructor for a given IP address and prefix.
-     *
-     * @param ip ip address
-     * @param prefix ip prefix
-     */
-    public NetworkAddress(IpAddress ip, IpPrefix prefix) {
-        this.ip = ip;
-        this.prefix = prefix;
-    }
-
-    /**
-     * Converts a CIDR notation string into a network address.
-     *
-     * @param cidr cidr
-     * @return network address
-     * @throws IllegalArgumentException if the cidr is not valid
-     */
-    public static NetworkAddress valueOf(String cidr) {
-        checkArgument(cidr.contains("/"));
-
-        IpAddress ipAddress = IpAddress.valueOf(cidr.split("/")[0]);
-        IpPrefix ipPrefix = IpPrefix.valueOf(cidr);
-
-        return new NetworkAddress(ipAddress, ipPrefix);
-    }
-
-    /**
-     * Returns the IP address value of the network address.
-     *
-     * @return ip address
-     */
-    public IpAddress ip() {
-        return this.ip;
-    }
-
-    /**
-     * Returns the IP prefix value of the network address.
-     *
-     * @return ip prefix
-     */
-    public IpPrefix prefix() {
-        return this.prefix;
-    }
-
-    /**
-     * Converts a network address to a CIDR notation.
-     *
-     * @return cidr notation string
-     */
-    public String cidr() {
-        return ip.toString() + "/" + prefix.prefixLength();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-
-        if (obj instanceof NetworkAddress) {
-            NetworkAddress that = (NetworkAddress) obj;
-            if (Objects.equals(ip, that.ip) && Objects.equals(prefix, that.prefix)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(ip, prefix);
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(getClass())
-                .add("IpAddress", ip)
-                .add("IpPrefix", prefix)
-                .toString();
-    }
-}
