diff --git a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sExternalNetwork.java b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sExternalNetwork.java
index cc19ff7..fd174d7 100644
--- a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sExternalNetwork.java
+++ b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sExternalNetwork.java
@@ -29,12 +29,14 @@
     private final IpAddress extBridgeIp;
     private final IpAddress extGatewayIp;
     private final MacAddress extGatewayMac;
+    private final String extIntf;
 
     protected DefaultK8sExternalNetwork(IpAddress extBridgeIp, IpAddress extGatewayIp,
-                                        MacAddress extGatewayMac) {
+                                        MacAddress extGatewayMac, String extIntf) {
         this.extBridgeIp = extBridgeIp;
         this.extGatewayIp = extGatewayIp;
         this.extGatewayMac = extGatewayMac;
+        this.extIntf = extIntf;
     }
 
     @Override
@@ -52,6 +54,11 @@
         return extGatewayMac;
     }
 
+    @Override
+    public String extIntf() {
+        return extIntf;
+    }
+
     /**
      * Returns new builder instance.
      *
@@ -71,12 +78,13 @@
         }
         DefaultK8sExternalNetwork that = (DefaultK8sExternalNetwork) o;
         return extBridgeIp.equals(that.extBridgeIp) &&
-                extGatewayIp.equals(that.extGatewayIp);
+                extGatewayIp.equals(that.extGatewayIp) &&
+                extIntf.equals(that.extIntf);
     }
 
     @Override
     public int hashCode() {
-        return Objects.hash(extBridgeIp, extGatewayIp, extGatewayMac);
+        return Objects.hash(extBridgeIp, extGatewayIp, extGatewayMac, extIntf);
     }
 
     @Override
@@ -85,6 +93,7 @@
                 .add("extBridgeIp", extBridgeIp)
                 .add("extGatewayIp", extGatewayIp)
                 .add("extGatewayMac", extGatewayMac)
+                .add("extIntf", extIntf)
                 .toString();
     }
 
@@ -93,6 +102,7 @@
         private IpAddress extBridgeIp;
         private IpAddress extGatewayIp;
         private MacAddress extGatewayMac;
+        private String extIntf;
 
         // private constructor not intended to use from external
         private Builder() {
@@ -100,7 +110,7 @@
 
         @Override
         public K8sExternalNetwork build() {
-            return new DefaultK8sExternalNetwork(extBridgeIp, extGatewayIp, extGatewayMac);
+            return new DefaultK8sExternalNetwork(extBridgeIp, extGatewayIp, extGatewayMac, extIntf);
         }
 
         @Override
@@ -120,5 +130,11 @@
             this.extGatewayMac = extGatewayMac;
             return this;
         }
+
+        @Override
+        public Builder extIntf(String extIntf) {
+            this.extIntf = extIntf;
+            return this;
+        }
     }
 }
diff --git a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sNode.java b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sNode.java
index 9613bef..b73c118 100644
--- a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sNode.java
+++ b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/DefaultK8sNode.java
@@ -80,8 +80,8 @@
     private final DeviceId tunBridge;
     private final IpAddress managementIp;
     private final IpAddress dataIp;
+    private final IpAddress nodeIp;
     private final K8sNodeState state;
-    private final String extIntf;
     private final K8sExternalNetwork extNetwork;
     private final String podCidr;
 
@@ -101,9 +101,9 @@
      * @param extBridge         external bridge
      * @param localBridge       local bridge
      * @param tunBridge         tunnel bridge
-     * @param extIntf           external interface
      * @param managementIp      management IP address
      * @param dataIp            data IP address
+     * @param nodeIp            node IP address
      * @param state             node state
      * @param extNetwork        external network
      * @param podCidr           POD CIDR
@@ -111,8 +111,8 @@
     protected DefaultK8sNode(String clusterName, String hostname, Type type,
                              int segmentId, Mode mode, DeviceId intgBridge,
                              DeviceId extBridge, DeviceId localBridge,
-                             DeviceId tunBridge, String extIntf, IpAddress managementIp,
-                             IpAddress dataIp, K8sNodeState state,
+                             DeviceId tunBridge, IpAddress managementIp,
+                             IpAddress dataIp, IpAddress nodeIp, K8sNodeState state,
                              K8sExternalNetwork extNetwork, String podCidr) {
         this.clusterName = clusterName;
         this.hostname = hostname;
@@ -123,9 +123,9 @@
         this.extBridge = extBridge;
         this.localBridge = localBridge;
         this.tunBridge = tunBridge;
-        this.extIntf = extIntf;
         this.managementIp = managementIp;
         this.dataIp = dataIp;
+        this.nodeIp = nodeIp;
         this.state = state;
         this.extNetwork = extNetwork;
         this.podCidr = podCidr;
@@ -220,7 +220,7 @@
 
     @Override
     public String extIntf() {
-        return extIntf;
+        return extNetwork.extIntf();
     }
 
     @Override
@@ -235,13 +235,14 @@
                 .extBridge(extBridge)
                 .localBridge(localBridge)
                 .tunBridge(tunBridge)
-                .extIntf(extIntf)
                 .managementIp(managementIp)
                 .dataIp(dataIp)
+                .nodeIp(nodeIp)
                 .state(state)
                 .extBridgeIp(extNetwork.extBridgeIp())
                 .extGatewayIp(extNetwork.extGatewayIp())
                 .extGatewayMac(extNetwork.extGatewayMac())
+                .extIntf(extNetwork.extIntf())
                 .podCidr(podCidr)
                 .build();
     }
@@ -258,13 +259,14 @@
                 .extBridge(deviceId)
                 .localBridge(localBridge)
                 .tunBridge(tunBridge)
-                .extIntf(extIntf)
                 .managementIp(managementIp)
                 .dataIp(dataIp)
+                .nodeIp(nodeIp)
                 .state(state)
                 .extBridgeIp(extNetwork.extBridgeIp())
                 .extGatewayIp(extNetwork.extGatewayIp())
                 .extGatewayMac(extNetwork.extGatewayMac())
+                .extIntf(extNetwork.extIntf())
                 .podCidr(podCidr)
                 .build();
     }
@@ -281,13 +283,14 @@
                 .extBridge(extBridge)
                 .localBridge(deviceId)
                 .tunBridge(tunBridge)
-                .extIntf(extIntf)
                 .managementIp(managementIp)
                 .dataIp(dataIp)
+                .nodeIp(nodeIp)
                 .state(state)
                 .extBridgeIp(extNetwork.extBridgeIp())
                 .extGatewayIp(extNetwork.extGatewayIp())
                 .extGatewayMac(extNetwork.extGatewayMac())
+                .extIntf(extNetwork.extIntf())
                 .podCidr(podCidr)
                 .build();
     }
@@ -304,13 +307,14 @@
                 .extBridge(extBridge)
                 .localBridge(localBridge)
                 .tunBridge(deviceId)
-                .extIntf(extIntf)
                 .managementIp(managementIp)
                 .dataIp(dataIp)
+                .nodeIp(nodeIp)
                 .state(state)
                 .extBridgeIp(extNetwork.extBridgeIp())
                 .extGatewayIp(extNetwork.extGatewayIp())
                 .extGatewayMac(extNetwork.extGatewayMac())
+                .extIntf(extNetwork.extIntf())
                 .podCidr(podCidr)
                 .build();
     }
@@ -326,6 +330,11 @@
     }
 
     @Override
+    public IpAddress nodeIp() {
+        return nodeIp;
+    }
+
+    @Override
     public K8sNodeState state() {
         return state;
     }
@@ -347,13 +356,14 @@
                 .extBridge(extBridge)
                 .localBridge(localBridge)
                 .tunBridge(tunBridge)
-                .extIntf(extIntf)
                 .managementIp(managementIp)
                 .dataIp(dataIp)
+                .nodeIp(nodeIp)
                 .state(newState)
                 .extBridgeIp(extNetwork.extBridgeIp())
                 .extGatewayIp(extNetwork.extGatewayIp())
                 .extGatewayMac(extNetwork.extGatewayMac())
+                .extIntf(extNetwork.extIntf())
                 .podCidr(podCidr)
                 .build();
     }
@@ -370,13 +380,14 @@
                 .extBridge(extBridge)
                 .localBridge(localBridge)
                 .tunBridge(tunBridge)
-                .extIntf(extIntf)
                 .managementIp(managementIp)
                 .dataIp(dataIp)
+                .nodeIp(nodeIp)
                 .state(state)
                 .extBridgeIp(extNetwork.extBridgeIp())
                 .extGatewayIp(extNetwork.extGatewayIp())
                 .extGatewayMac(newMac)
+                .extIntf(extNetwork.extIntf())
                 .podCidr(podCidr)
                 .build();
     }
@@ -516,7 +527,7 @@
 
     @Override
     public PortNumber extIntfPortNum() {
-        if (this.extIntf == null) {
+        if (this.extIntf() == null) {
             return null;
         }
         return portNumber(extBridge, extIntf());
@@ -807,9 +818,9 @@
                     extBridge.equals(that.extBridge) &&
                     localBridge.equals(that.localBridge) &&
                     tunBridge.equals(that.tunBridge) &&
-                    extIntf.equals(that.extIntf) &&
                     managementIp.equals(that.managementIp) &&
                     dataIp.equals(that.dataIp) &&
+                    nodeIp.equals(that.nodeIp) &&
                     extNetwork.equals(that.extNetwork) &&
                     podCidr.equals(that.podCidr) &&
                     state == that.state;
@@ -821,7 +832,7 @@
     @Override
     public int hashCode() {
         return Objects.hash(clusterName, hostname, type, segmentId, mode, intgBridge, extBridge,
-                localBridge, tunBridge, extIntf, managementIp, dataIp, state, extNetwork, podCidr);
+                localBridge, tunBridge, managementIp, dataIp, nodeIp, state, extNetwork, podCidr);
     }
 
     @Override
@@ -836,13 +847,14 @@
                 .add("extBridge", extBridge)
                 .add("localBridge", localBridge)
                 .add("tunBridge", tunBridge)
-                .add("extIntf", extIntf)
                 .add("managementIp", managementIp)
                 .add("dataIp", dataIp)
+                .add("nodeIp", nodeIp)
                 .add("state", state)
                 .add("extBridgeIp", extNetwork.extBridgeIp())
                 .add("extGatewayIp", extNetwork.extGatewayIp())
                 .add("extGatewayMac", extNetwork.extGatewayMac())
+                .add("extIntf", extNetwork.extIntf())
                 .add("podCidr", podCidr)
                 .toString();
     }
@@ -902,10 +914,12 @@
                 .extIntf(node.extIntf())
                 .managementIp(node.managementIp())
                 .dataIp(node.dataIp())
+                .nodeIp(node.nodeIp())
                 .state(node.state())
                 .extBridgeIp(node.extBridgeIp())
                 .extGatewayIp(node.extGatewayIp())
                 .extGatewayMac(node.extGatewayMac())
+                .extIntf(node.extIntf())
                 .podCidr(node.podCidr());
     }
 
@@ -922,6 +936,7 @@
         private DeviceId tunBridge;
         private IpAddress managementIp;
         private IpAddress dataIp;
+        private IpAddress nodeIp;
         private K8sNodeState state;
         private K8sApiConfig apiConfig;
         private String extIntf;
@@ -940,6 +955,7 @@
             checkArgument(type != null, NOT_NULL_MSG, "type");
             checkArgument(state != null, NOT_NULL_MSG, "state");
             checkArgument(managementIp != null, NOT_NULL_MSG, "management IP");
+            checkArgument(nodeIp != null, NOT_NULL_MSG, "node IP");
 
             if (StringUtils.isEmpty(clusterName)) {
                 clusterName = DEFAULT_CLUSTER_NAME;
@@ -953,6 +969,7 @@
                     .extBridgeIp(extBridgeIp)
                     .extGatewayIp(extGatewayIp)
                     .extGatewayMac(extGatewayMac)
+                    .extIntf(extIntf)
                     .build();
 
             return new DefaultK8sNode(clusterName,
@@ -964,9 +981,9 @@
                     extBridge,
                     localBridge,
                     tunBridge,
-                    extIntf,
                     managementIp,
                     dataIp,
+                    nodeIp,
                     state,
                     extNetwork,
                     podCidr);
@@ -1027,12 +1044,6 @@
         }
 
         @Override
-        public Builder extIntf(String intf) {
-            this.extIntf = intf;
-            return this;
-        }
-
-        @Override
         public Builder managementIp(IpAddress managementIp) {
             this.managementIp = managementIp;
             return this;
@@ -1045,6 +1056,12 @@
         }
 
         @Override
+        public Builder nodeIp(IpAddress nodeIp) {
+            this.nodeIp = nodeIp;
+            return this;
+        }
+
+        @Override
         public Builder state(K8sNodeState state) {
             this.state = state;
             return this;
@@ -1069,6 +1086,12 @@
         }
 
         @Override
+        public Builder extIntf(String intf) {
+            this.extIntf = intf;
+            return this;
+        }
+
+        @Override
         public Builder podCidr(String podCidr) {
             this.podCidr = podCidr;
             return this;
diff --git a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sExternalNetwork.java b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sExternalNetwork.java
index 3462ad0..6649837 100644
--- a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sExternalNetwork.java
+++ b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sExternalNetwork.java
@@ -45,6 +45,13 @@
     MacAddress extGatewayMac();
 
     /**
+     * Returns the external interface name.
+     *
+     * @return interface name
+     */
+    String extIntf();
+
+    /**
      * Builder of new network entity.
      */
     interface Builder {
@@ -57,27 +64,35 @@
         K8sExternalNetwork build();
 
         /**
-         * Returns kubernetes node builder with supplied external bridge IP.
+         * Returns kubernetes external network builder with supplied external bridge IP.
          *
          * @param extBridgeIp external bridge IP
-         * @return kubernetes node builder
+         * @return kubernetes external network builder
          */
         Builder extBridgeIp(IpAddress extBridgeIp);
 
         /**
-         * Returns kubernetes node builder with supplied gateway IP.
+         * Returns kubernetes external network builder with supplied gateway IP.
          *
          * @param extGatewayIp external gateway IP
-         * @return kubernetes node builder
+         * @return kubernetes external network builder
          */
         Builder extGatewayIp(IpAddress extGatewayIp);
 
         /**
-         * Returns kubernetes node builder with supplied external gateway MAC.
+         * Returns kubernetes external network builder with supplied external gateway MAC.
          *
          * @param extGatewayMac external gateway MAC address
-         * @return kubernetes node builder
+         * @return kubernetes external network builder
          */
         Builder extGatewayMac(MacAddress extGatewayMac);
+
+        /**
+         * Returns kubernetes external network builder with supplied external interface.
+         *
+         * @param extIntf external interface name
+         * @return kubernetes external network builder
+         */
+        Builder extIntf(String extIntf);
     }
 }
diff --git a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNode.java b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNode.java
index 6631e55..eabb13a 100644
--- a/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNode.java
+++ b/apps/k8s-node/api/src/main/java/org/onosproject/k8snode/api/K8sNode.java
@@ -187,6 +187,13 @@
     IpAddress dataIp();
 
     /**
+     * Returns the kubernetes node IP address.
+     *
+     * @return ip address; null if node has no IP address
+     */
+    IpAddress nodeIp();
+
+    /**
      * Returns the initialization state of the node.
      *
      * @return node state
@@ -647,6 +654,14 @@
         Builder dataIp(IpAddress dataIp);
 
         /**
+         * Returns the kubernetes node builder with supplied node IP address.
+         *
+         * @param nodeIp node IP address
+         * @return kubernetes node builder
+         */
+        Builder nodeIp(IpAddress nodeIp);
+
+        /**
          * Returns kubernetes node builder with supplied node state.
          *
          * @param state kubernetes node state
