diff --git a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/BgpModelIdLevel.java b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/BgpModelIdLevel.java
index 334f2fe..05ee2bb 100644
--- a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/BgpModelIdLevel.java
+++ b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/BgpModelIdLevel.java
@@ -35,5 +35,10 @@
     /**
      * Requested model id level is device list.
      */
-    DEVICE
+    DEVICE,
+
+    /**
+     * Requested model id level is VPN list.
+     */
+    VPN
 }
diff --git a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/DeviceInfo.java b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/DeviceInfo.java
index 648d556..a45cc68 100644
--- a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/DeviceInfo.java
+++ b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/DeviceInfo.java
@@ -17,7 +17,7 @@
 package org.onosproject.l3vpn.netl3vpn;
 
 import org.onosproject.net.DeviceId;
-import org.onosproject.net.behaviour.L3vpnConfig;
+import org.onosproject.net.behaviour.L3VpnConfig;
 import org.onosproject.net.driver.DriverHandler;
 import org.onosproject.net.driver.DriverService;
 import org.onosproject.yang.model.ModelObjectData;
@@ -158,7 +158,7 @@
      */
     public ModelObjectData processCreateInstance(DriverService driverSvc,
                                                  ModelObjectData modelData) {
-        L3vpnConfig config = getL3VpnConfig(driverSvc);
+        L3VpnConfig config = getL3VpnConfig(driverSvc);
         return (ModelObjectData) config.createInstance(modelData);
     }
 
@@ -173,7 +173,7 @@
      */
     public ModelObjectData processCreateInterface(DriverService driverSvc,
                                                   ModelObjectData modData) {
-        L3vpnConfig config = getL3VpnConfig(driverSvc);
+        L3VpnConfig config = getL3VpnConfig(driverSvc);
         return (ModelObjectData) config.bindInterface(modData);
     }
 
@@ -190,7 +190,7 @@
     public ModelObjectData processCreateBgpInfo(DriverService driverSvc,
                                                 BgpInfo bgpInfo,
                                                 BgpDriverInfo driverInfo) {
-        L3vpnConfig config = getL3VpnConfig(driverSvc);
+        L3VpnConfig config = getL3VpnConfig(driverSvc);
         return (ModelObjectData) config.createBgpInfo(bgpInfo, driverInfo);
     }
 
@@ -205,7 +205,7 @@
      */
     public ModelObjectData processDeleteInstance(DriverService driverSvc,
                                                  ModelObjectData modData) {
-        L3vpnConfig config = getL3VpnConfig(driverSvc);
+        L3VpnConfig config = getL3VpnConfig(driverSvc);
         return (ModelObjectData) config.deleteInstance(modData);
     }
 
@@ -237,8 +237,8 @@
     public ModelObjectData processDeleteBgpInfo(DriverService driverSvc,
                                                 BgpInfo bgpInfo,
                                                 BgpDriverInfo driverInfo) {
-        // TODO: Need to call the behaviour.
-        return null;
+        L3VpnConfig config = getL3VpnConfig(driverSvc);
+        return (ModelObjectData) config.deleteBgpInfo(bgpInfo, driverInfo);
     }
 
     /**
@@ -247,8 +247,8 @@
      * @param driverSvc driver service
      * @return L3VPN config
      */
-    private L3vpnConfig getL3VpnConfig(DriverService driverSvc) {
+    private L3VpnConfig getL3VpnConfig(DriverService driverSvc) {
         DriverHandler handler = driverSvc.createHandler(deviceId);
-        return handler.behaviour(L3vpnConfig.class);
+        return handler.behaviour(L3VpnConfig.class);
     }
 }
diff --git a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/DistributedNetL3VpnStore.java b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/DistributedNetL3VpnStore.java
index 6debaf4..09c2f6a 100644
--- a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/DistributedNetL3VpnStore.java
+++ b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/DistributedNetL3VpnStore.java
@@ -198,7 +198,7 @@
     public void addInterfaceInfo(AccessInfo accessInfo, InterfaceInfo intInfo) {
         checkNotNull(accessInfo, ACCESS_INFO_NULL);
         checkNotNull(intInfo, INT_INFO_NULL);
-        intInfoMap.putIfAbsent(accessInfo, intInfo);
+        intInfoMap.put(accessInfo, intInfo);
     }
 
     @Override
diff --git a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/NetL3vpnManager.java b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/NetL3VpnManager.java
similarity index 94%
rename from apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/NetL3vpnManager.java
rename to apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/NetL3VpnManager.java
index 4dc9165..67c6237 100644
--- a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/NetL3vpnManager.java
+++ b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/NetL3VpnManager.java
@@ -142,14 +142,16 @@
 import static org.onosproject.l3vpn.netl3vpn.impl.NetL3VpnUtil.getModIdForSites;
 import static org.onosproject.l3vpn.netl3vpn.impl.NetL3VpnUtil.getResourceData;
 import static org.onosproject.l3vpn.netl3vpn.impl.NetL3VpnUtil.getRole;
+import static org.onosproject.l3vpn.netl3vpn.impl.NetL3VpnUtil.getVpnBgpDelModObj;
 import static org.onosproject.l3vpn.netl3vpn.impl.NetL3VpnUtil.getVpnCreateModObj;
+import static org.onosproject.l3vpn.netl3vpn.impl.NetL3VpnUtil.getVpnDelModObj;
 import static org.onosproject.yang.runtime.helperutils.YangApacheUtils.getYangModel;
 
 /**
  * The IETF net l3vpn manager implementation.
  */
 @Component(immediate = true)
-public class NetL3vpnManager {
+public class NetL3VpnManager {
 
     private static final String APP_ID = "org.onosproject.app.l3vpn";
     private static final String L3_VPN_ID_TOPIC = "l3vpn-id";
@@ -569,6 +571,7 @@
         InterfaceInfo interInfo = new InterfaceInfo(info, portName,
                                                     instance.vpnName());
         l3VpnStore.addInterfaceInfo(accInfo, interInfo);
+        l3VpnStore.addVpnIns(instance.vpnName(), instance);
     }
 
     /**
@@ -645,7 +648,6 @@
         Map<AccessInfo, InterfaceInfo> intMap = l3VpnStore.getInterfaceInfo();
         generateRdRt(inst, role);
         DeviceInfo info = new DeviceInfo(id);
-        inst.addDevInfo(id, info);
 
         NetworkInstances instances = createInstance(inst, role, ip);
         ModelObjectData devMod = getVpnCreateModObj(intMap, instances,
@@ -655,6 +657,7 @@
         ResourceData resData = modelConverter.createDataNode(driMod);
         addToStore(resData);
         l3VpnStore.addVpnIns(inst.vpnName(), inst);
+        inst.addDevInfo(id, info);
         return info;
     }
 
@@ -871,7 +874,7 @@
         Interfaces interfaces = createInterface(pName, ins.vpnName(),
                                                 connect);
         ModelObjectData devMod = getIntCreateModObj(
-                intMap, interfaces, info.deviceId().toString());
+                info.ifNames(), interfaces, info.deviceId().toString());
         ModelObjectData driMod = info.processCreateInterface(driverService,
                                                              devMod);
         ResourceData resData = modelConverter.createDataNode(driMod);
@@ -896,7 +899,7 @@
         if (intBgp != null) {
             intBgp.vpnName(name);
             BgpDriverInfo config = getBgpCreateConfigObj(
-                    bgpMap, info.deviceId().toString());
+                    bgpMap, info.deviceId().toString(), info.bgpInfo(), intBgp);
             ModelObjectData driData = info.processCreateBgpInfo(
                     driverService, intBgp, config);
             l3VpnStore.addBgpInfo(info.bgpInfo(), info.deviceId());
@@ -965,24 +968,47 @@
      */
     private void deleteVpnInstance(VpnInstance instance, boolean isIntDeleted) {
         Map<DeviceId, DeviceInfo> devices = instance.devInfo();
-        for (Map.Entry<DeviceId, DeviceInfo> device : devices.entrySet()) {
-            Map<AccessInfo, InterfaceInfo> intMap =
-                    l3VpnStore.getInterfaceInfo();
-            NetworkInstances ins = deleteInstance(instance.vpnName());
-            DeviceInfo dev = device.getValue();
-
-            ModelObjectData devMod = getVpnCreateModObj(
-                    intMap, ins, dev.deviceId().toString());
-            ModelObjectData driMod = dev.processDeleteInstance(driverService,
-                                                               devMod);
-            ResourceData resData = modelConverter.createDataNode(driMod);
-            deleteFromStore(resData);
-            if (!isIntDeleted) {
-                //TODO: Remove from store.
-                remInterfaceFromMap(dev);
+        if (devices != null) {
+            for (Map.Entry<DeviceId, DeviceInfo> device : devices.entrySet()) {
+                NetworkInstances ins = deleteInstance(instance.vpnName());
+                DeviceInfo dev = device.getValue();
+                if (!isIntDeleted) {
+                    remVpnBgp(dev);
+                    remInterfaceFromMap(dev);
+                }
+                Map<AccessInfo, InterfaceInfo> intMap =
+                        l3VpnStore.getInterfaceInfo();
+                String id = dev.deviceId().toString();
+                ModelObjectData devMod = getVpnDelModObj(intMap, ins, id);
+                ModelObjectData driMod = dev.processDeleteInstance(
+                        driverService, devMod);
+                ResourceData resData = modelConverter.createDataNode(driMod);
+                deleteFromStore(resData);
             }
+            l3VpnStore.removeVpnInstance(instance.vpnName());
         }
-        l3VpnStore.removeVpnInstance(instance.vpnName());
+    }
+
+    /**
+     * Removes the BGP information for that complete VPN instance.
+     *
+     * @param dev device info
+     */
+    private void remVpnBgp(DeviceInfo dev) {
+        BgpInfo devBgp = dev.bgpInfo();
+        if (devBgp != null) {
+            l3VpnStore.removeBgpInfo(devBgp);
+            BgpInfo delInfo = new BgpInfo();
+            delInfo.vpnName(devBgp.vpnName());
+            String id = dev.deviceId().toString();
+            Map<BgpInfo, DeviceId> bgpMap = l3VpnStore.getBgpInfo();
+            BgpDriverInfo driConfig = getVpnBgpDelModObj(bgpMap, id);
+            ModelObjectData driData = dev.processDeleteBgpInfo(
+                    driverService, delInfo, driConfig);
+            ResourceData resData = modelConverter.createDataNode(driData);
+            deleteFromStore(resData);
+            l3VpnStore.removeBgpInfo(devBgp);
+        }
     }
 
     /**
@@ -993,7 +1019,7 @@
      */
     private void deleteFromStore(ResourceData resData) {
         if (resData != null) {
-            configService.deleteNode(resData.resourceId());
+            configService.deleteNodeRecursive(resData.resourceId());
         }
     }
 
@@ -1005,8 +1031,10 @@
      */
     private void remInterfaceFromMap(DeviceInfo deviceInfo) {
         List<AccessInfo> accesses = deviceInfo.accesses();
-        for (AccessInfo access : accesses) {
-            l3VpnStore.removeInterfaceInfo(access);
+        if (accesses != null) {
+            for (AccessInfo access : accesses) {
+                l3VpnStore.removeInterfaceInfo(access);
+            }
         }
         deviceInfo.ifNames(null);
         deviceInfo.accesses(null);
diff --git a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/NetL3VpnUtil.java b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/NetL3VpnUtil.java
index a713fc3..5875fe7 100644
--- a/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/NetL3VpnUtil.java
+++ b/apps/l3vpn/netl3vpn/src/main/java/org/onosproject/l3vpn/netl3vpn/impl/NetL3VpnUtil.java
@@ -49,6 +49,7 @@
 import static org.onosproject.l3vpn.netl3vpn.BgpModelIdLevel.DEVICE;
 import static org.onosproject.l3vpn.netl3vpn.BgpModelIdLevel.DEVICES;
 import static org.onosproject.l3vpn.netl3vpn.BgpModelIdLevel.ROOT;
+import static org.onosproject.l3vpn.netl3vpn.BgpModelIdLevel.VPN;
 import static org.onosproject.l3vpn.netl3vpn.VpnType.ANY_TO_ANY;
 import static org.onosproject.l3vpn.netl3vpn.VpnType.HUB;
 import static org.onosproject.l3vpn.netl3vpn.VpnType.SPOKE;
@@ -385,16 +386,15 @@
     /**
      * Returns the interface create model object data.
      *
-     * @param intMap interface map
-     * @param ifs    interface instance
-     * @param id     device id
+     * @param ifNames interfaces
+     * @param ifs     interface instance
+     * @param id      device id
      * @return interface model object data
      */
-    static ModelObjectData getIntCreateModObj(Map<AccessInfo, InterfaceInfo> intMap,
+    static ModelObjectData getIntCreateModObj(List<String> ifNames,
                                               Interfaces ifs, String id) {
         ModelObjectData modData;
-        boolean intAdded = isDevIdPresent(intMap, id);
-        if (intAdded) {
+        if (ifNames.size() > 1) {
             modData = buildIntModDataDevice(id, ifs);
         } else {
             modData = buildIntModDataRoot(id, ifs);
@@ -439,15 +439,20 @@
      *
      * @param bgpMap BGP map
      * @param id     device id
-     * @return driver config info
+     * @param devBgp device BGP info
+     * @param intBgp interface BGP info
+     * @return BGP driver config
      */
     static BgpDriverInfo getBgpCreateConfigObj(Map<BgpInfo, DeviceId> bgpMap,
-                                               String id) {
+                                               String id, BgpInfo devBgp,
+                                               BgpInfo intBgp) {
         boolean isDevIdPresent = isDevIdBgpPresent(bgpMap, id);
         BgpDriverInfo info;
-        if (isDevIdPresent) {
+        if (devBgp != intBgp) {
+            //TODO: With ipv6 BGP it has to be changed
+            info = new BgpDriverInfo(VPN, id);
+        } else if (isDevIdPresent) {
             info = new BgpDriverInfo(DEVICE, id);
-
         } else if (bgpMap.size() != 0) {
             info = new BgpDriverInfo(DEVICES, id);
         } else {
@@ -473,4 +478,48 @@
         }
         return false;
     }
+
+    /**
+     * Returns the model object data for VPN instance deletion.
+     *
+     * @param intMap interface map
+     * @param ins    VPN instance
+     * @param id     device id
+     * @return model object data
+     */
+    static ModelObjectData getVpnDelModObj(Map<AccessInfo, InterfaceInfo> intMap,
+                                           NetworkInstances ins,
+                                           String id) {
+        boolean isDevIdPresent = isDevIdPresent(intMap, id);
+        ModelObjectData modData;
+        if (intMap.size() == 0) {
+            modData = buildInsModDataRoot(id, ins);
+        } else if (isDevIdPresent) {
+            modData = buildInsModDataDevice(id, ins);
+        } else {
+            modData = buildInsModDataDevices(id, ins);
+        }
+        return modData;
+    }
+
+    /**
+     * Returns the BGP driver info for VPN BGP instance deletion.
+     *
+     * @param bgpMap BGP map
+     * @param id     device id
+     * @return BGP driver info
+     */
+    static BgpDriverInfo getVpnBgpDelModObj(Map<BgpInfo, DeviceId> bgpMap,
+                                            String id) {
+        boolean isDevIdPresent = isDevIdBgpPresent(bgpMap, id);
+        BgpDriverInfo driInfo;
+        if (bgpMap.size() == 0) {
+            driInfo = new BgpDriverInfo(ROOT, id);
+        } else if (isDevIdPresent) {
+            driInfo = new BgpDriverInfo(DEVICE, id);
+        } else {
+            driInfo = new BgpDriverInfo(DEVICES, id);
+        }
+        return driInfo;
+    }
 }
diff --git a/apps/l3vpn/yangmodel/pom.xml b/apps/l3vpn/yangmodel/pom.xml
index ae2a75c..841a3cf 100644
--- a/apps/l3vpn/yangmodel/pom.xml
+++ b/apps/l3vpn/yangmodel/pom.xml
@@ -18,13 +18,6 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
-    <dependencies>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-yang-model</artifactId>
-            <version>1.12.0-b7</version>
-        </dependency>
-    </dependencies>
 
     <parent>
         <groupId>org.onosproject</groupId>
@@ -37,21 +30,4 @@
     <packaging>bundle</packaging>
 
     <description>IETF L3VPN YANG models</description>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.onosproject</groupId>
-                <artifactId>onos-yang-compiler-maven-plugin</artifactId>
-                <version>1.12.0-b7</version>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>yang2java</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
 </project>
diff --git a/core/api/src/main/java/org/onosproject/net/behaviour/L3vpnConfig.java b/core/api/src/main/java/org/onosproject/net/behaviour/L3VpnConfig.java
similarity index 97%
rename from core/api/src/main/java/org/onosproject/net/behaviour/L3vpnConfig.java
rename to core/api/src/main/java/org/onosproject/net/behaviour/L3VpnConfig.java
index 751316d..b710006 100644
--- a/core/api/src/main/java/org/onosproject/net/behaviour/L3vpnConfig.java
+++ b/core/api/src/main/java/org/onosproject/net/behaviour/L3VpnConfig.java
@@ -21,7 +21,7 @@
 /**
  * Behaviour for handling various drivers for l3vpn configurations.
  */
-public interface L3vpnConfig extends HandlerBehaviour {
+public interface L3VpnConfig extends HandlerBehaviour {
 
     /**
      * Create virtual routing forwarding instance on requested device with
diff --git a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/BgpConstructionUtil.java b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/BgpConstructionUtil.java
index 8472ed4..85e4da6 100644
--- a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/BgpConstructionUtil.java
+++ b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/BgpConstructionUtil.java
@@ -33,10 +33,12 @@
 import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.BgpVrfs;
 import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.DefaultBgpVrfs;
 import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.BgpVrf;
+import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.BgpVrfKeys;
 import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.DefaultBgpVrf;
 import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.BgpVrfAfs;
 import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.DefaultBgpVrfAfs;
 import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.BgpVrfAf;
+import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.BgpVrfAfKeys;
 import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.DefaultBgpVrfAf;
 import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.bgpvrfaf.DefaultImportRoutes;
 import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.bgpvrfaf.ImportRoutes;
@@ -100,29 +102,33 @@
 
         bgpVrf.vrfName(bgpInfo.vpnName());
         Map<RouteProtocol, ProtocolInfo> proMap = bgpInfo.protocolInfo();
-        addRouteProtocol(proMap, bgpVrfAfs);
+        ImportRoute route = addRouteProtocol(proMap, bgpVrfAfs);
 
         bgpVrf.bgpVrfAfs(bgpVrfAfs);
         bgpVrfList.add(bgpVrf);
         bgpVrfs.bgpVrf(bgpVrfList);
         bgpBuilder.bgpVrfs(bgpVrfs);
         bgp.bgpcomm(bgpBuilder);
-        return getModObjData(modIdLevel, bgp, devId, bgpVrf);
+        return getModObjData(modIdLevel, bgp, devId, bgpVrf, route);
     }
 
     /**
      * Adds route protocol from the standard device model to the BGP address
      * family respectively.
+     * //TODO: IPV6 has to be handled.
      *
      * @param proMap    protocol map
      * @param bgpVrfAfs BGP address family
+     * @return import route
      */
-    private static void addRouteProtocol(Map<RouteProtocol, ProtocolInfo> proMap,
-                                         BgpVrfAfs bgpVrfAfs) {
+    private static ImportRoute addRouteProtocol(Map<RouteProtocol, ProtocolInfo> proMap,
+                                                BgpVrfAfs bgpVrfAfs) {
         BgpVrfAf ipv4 = new DefaultBgpVrfAf();
         ImportRoutes ipv4Routes = new DefaultImportRoutes();
         ipv4.afType(of(IPV4UNI));
 
+        ImportRoute route = null;
+
         BgpVrfAf ipv6 = new DefaultBgpVrfAf();
         ImportRoutes ipv6Routes = new DefaultImportRoutes();
         ipv6.afType(of(IPV6UNI));
@@ -130,7 +136,7 @@
             RouteProtocol protocol = info.getKey();
             ProtocolInfo proInfo = info.getValue();
             if (proInfo.isIpv4Af()) {
-                addImportRoute(ipv4Routes, proInfo, protocol);
+                route = addImportRoute(ipv4Routes, proInfo, protocol);
             }
             if (proInfo.isIpv6Af()) {
                 addImportRoute(ipv6Routes, proInfo, protocol);
@@ -144,6 +150,7 @@
                 !ipv6Routes.importRoute().isEmpty()) {
             addToBgpVrf(ipv6Routes, ipv6, bgpVrfAfs);
         }
+        return route;
     }
 
     /**
@@ -168,13 +175,16 @@
      * @param routes   routes object
      * @param proInfo  protocol info
      * @param protocol route protocol
+     * @return import route object
      */
-    private static void addImportRoute(ImportRoutes routes, ProtocolInfo proInfo,
-                                       RouteProtocol protocol) {
+    private static ImportRoute addImportRoute(ImportRoutes routes,
+                                              ProtocolInfo proInfo,
+                                              RouteProtocol protocol) {
         List<ImportRoute> routeList = new LinkedList<>();
         ImportRoute route = buildAfBgp(proInfo, protocol);
         routeList.add(route);
         routes.importRoute(routeList);
+        return route;
     }
 
     /**
@@ -233,12 +243,17 @@
      * @param bgp        driver BGP object
      * @param devId      device id
      * @param bgpVrf     driver BGP VRF object
+     * @param route      import route object
      * @return model object data
      */
     public static ModelObjectData getModObjData(BgpModelIdLevel modIdLevel,
                                                 Bgp bgp, String devId,
-                                                BgpVrf bgpVrf) {
+                                                BgpVrf bgpVrf, ImportRoute route) {
         switch (modIdLevel) {
+
+            case VPN:
+                return getRouteProModObj(bgpVrf.vrfName(), route, devId);
+
             case ROOT:
                 return getRootModObj(bgp, devId);
 
@@ -254,6 +269,36 @@
     }
 
     /**
+     * Returns the model object data of route protocol.
+     *
+     * @param vpnName VPN name
+     * @param route   import route
+     * @param devId   device id
+     * @return model object data
+     */
+    private static ModelObjectData getRouteProModObj(String vpnName,
+                                                     ImportRoute route,
+                                                     String devId) {
+        DeviceKeys key = new DeviceKeys();
+        key.deviceid(devId);
+        BgpVrfKeys vpnKey = new BgpVrfKeys();
+        vpnKey.vrfName(vpnName);
+        BgpVrfAfKeys afKey = new BgpVrfAfKeys();
+        afKey.afType(of(IPV4UNI));
+        ModelObjectId id = ModelObjectId.builder()
+                .addChild(DefaultDevices.class)
+                .addChild(DefaultDevice.class, key)
+                .addChild(DefaultBgp.class)
+                .addChild(DefaultBgpcomm.class)
+                .addChild(DefaultBgpVrfs.class)
+                .addChild(DefaultBgpVrf.class, vpnKey)
+                .addChild(DefaultBgpVrfAfs.class)
+                .addChild(DefaultBgpVrfAf.class, afKey)
+                .addChild(DefaultImportRoutes.class).build();
+        return getData(id, (InnerModelObject) route);
+    }
+
+    /**
      * Returns the driver model object data with device in model object id,
      * till BGP VRF.
      *
@@ -316,4 +361,81 @@
         device.bgp(bgp);
         return device;
     }
+
+    /**
+     * Returns the BGP model object data for deletion.
+     *
+     * @param bgpInfo   BGP info
+     * @param bgpConfig BGP driver config
+     * @return model object data
+     */
+    static ModelObjectData getDeleteBgp(BgpInfo bgpInfo,
+                                        BgpDriverInfo bgpConfig) {
+        BgpModelIdLevel modIdLvl = bgpConfig.modIdLevel();
+        switch (modIdLvl) {
+            case ROOT:
+                return getDelRootModObj();
+
+            case DEVICES:
+                return getDelDevicesModObj(bgpConfig.devId());
+
+            case DEVICE:
+                return getDelDeviceModObj(bgpConfig.devId(), bgpInfo.vpnName());
+
+            default:
+                throw new IllegalArgumentException(UNSUPPORTED_MODEL_LVL);
+        }
+    }
+
+    /**
+     * Returns the model object data with respect to device level.
+     *
+     * @param devId   device id
+     * @param vpnName VPN name
+     * @return model object data
+     */
+    private static ModelObjectData getDelDeviceModObj(String devId,
+                                                      String vpnName) {
+        DeviceKeys devKeys = new DeviceKeys();
+        devKeys.deviceid(devId);
+        BgpVrfKeys vpnKey = new BgpVrfKeys();
+        vpnKey.vrfName(vpnName);
+        ModelObjectId modelId = ModelObjectId.builder()
+                .addChild(DefaultDevices.class)
+                .addChild(DefaultDevice.class, devKeys)
+                .addChild(DefaultBgp.class)
+                .addChild(DefaultBgpcomm.class)
+                .addChild(DefaultBgpVrfs.class)
+                .addChild(DefaultBgpVrf.class, vpnKey).build();
+        DefaultBgpVrfAfs afs = new DefaultBgpVrfAfs();
+        return getData(modelId, afs);
+    }
+
+    /**
+     * Returns the model object data with respect to root level.
+     *
+     * @return model object data
+     */
+    private static ModelObjectData getDelRootModObj() {
+        DefaultDevice device = new DefaultDevice();
+        ModelObjectId modelId = ModelObjectId.builder().addChild(
+                DefaultDevices.class).build();
+        return getData(modelId, device);
+    }
+
+    /**
+     * Returns the model object data for devices level.
+     *
+     * @param id device id
+     * @return model object data
+     */
+    private static ModelObjectData getDelDevicesModObj(String id) {
+        DeviceKeys devKeys = new DeviceKeys();
+        devKeys.deviceid(id);
+        ModelObjectId modelId = ModelObjectId.builder()
+                .addChild(DefaultDevices.class)
+                .addChild(DefaultDevice.class, devKeys).build();
+        DefaultBgp bgp = new DefaultBgp();
+        return getData(modelId, bgp);
+    }
 }
diff --git a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/DriverUtil.java b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/DriverUtil.java
index edeffef..af997c4 100644
--- a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/DriverUtil.java
+++ b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/DriverUtil.java
@@ -17,9 +17,11 @@
 package org.onosproject.drivers.huawei;
 
 import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.DefaultDevices;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev20140508.ietfinterfaces.devices.DeviceKeys;
 import org.onosproject.yang.model.AtomicPath;
 import org.onosproject.yang.model.DefaultModelObjectData;
 import org.onosproject.yang.model.InnerModelObject;
+import org.onosproject.yang.model.KeyInfo;
 import org.onosproject.yang.model.ModelObject;
 import org.onosproject.yang.model.ModelObjectData;
 import org.onosproject.yang.model.ModelObjectId;
@@ -28,6 +30,8 @@
 import java.util.Iterator;
 import java.util.List;
 
+import static org.onosproject.drivers.huawei.L3VpnUtil.getDevIdFromIns;
+
 /**
  * Representation of utility for huawei driver.
  */
@@ -164,26 +168,46 @@
      * not present then null is returned. If only one path is available in
      * the list then devices value is returned.
      *
-     * @param id model object data
+     * @param id    model object id
+     * @param isIns if for VPN instance
      * @return device id
      */
-    static String getIdFromModId(ModelObjectId id) {
+    static String getIdFromModId(ModelObjectId id, boolean isIns) {
         if (id == null) {
             return null;
         }
-
         List<AtomicPath> paths = id.atomicPaths();
         int size = paths.size();
-        if (size == 1) {
-            return CONS_DEVICES;
-        } else if (size == 2) {
-            return ((MultiInstanceNode) paths.get(1)).key().toString();
-        } else {
-            throw new IllegalArgumentException(MODEL_OBJ_ID_LIMIT);
+
+        switch (size) {
+            case 1:
+                return CONS_DEVICES;
+
+            case 2:
+                return getDevId(paths, isIns);
+
+            default:
+                throw new IllegalArgumentException(MODEL_OBJ_ID_LIMIT);
         }
     }
 
     /**
+     * Returns the device id from the model object id's key info.
+     *
+     * @param paths atomic path list
+     * @param isIns if VPN instance
+     * @return device id
+     */
+    private static String getDevId(List<AtomicPath> paths, boolean isIns) {
+        MultiInstanceNode info = (MultiInstanceNode) paths.get(1);
+        KeyInfo key = info.key();
+        if (!isIns) {
+            return ((DeviceKeys) key).deviceid();
+        }
+        return getDevIdFromIns(key);
+    }
+
+    /**
      * Returns the first object from the model object data. If no objects are
      * present then it returns null.
      *
diff --git a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiL3vpnConfig.java b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiL3VpnConfig.java
similarity index 92%
rename from drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiL3vpnConfig.java
rename to drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiL3VpnConfig.java
index 5a663e4..300e480 100644
--- a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiL3vpnConfig.java
+++ b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiL3VpnConfig.java
@@ -21,7 +21,7 @@
 import org.onosproject.config.FailedException;
 import org.onosproject.l3vpn.netl3vpn.BgpDriverInfo;
 import org.onosproject.l3vpn.netl3vpn.BgpInfo;
-import org.onosproject.net.behaviour.L3vpnConfig;
+import org.onosproject.net.behaviour.L3VpnConfig;
 import org.onosproject.net.driver.AbstractHandlerBehaviour;
 import org.onosproject.yang.gen.v1.l3vpn.comm.type.rev20141225.NeL3VpncommType;
 import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.NeBgpcomm;
@@ -40,11 +40,13 @@
 import java.util.Iterator;
 
 import static org.onosproject.drivers.huawei.BgpConstructionUtil.getCreateBgp;
+import static org.onosproject.drivers.huawei.BgpConstructionUtil.getDeleteBgp;
 import static org.onosproject.drivers.huawei.DriverUtil.DEVICES;
 import static org.onosproject.drivers.huawei.DriverUtil.NAMESPACE;
 import static org.onosproject.drivers.huawei.DriverUtil.SERVICE_NOT_FOUND;
 import static org.onosproject.drivers.huawei.DriverUtil.SLASH;
 import static org.onosproject.drivers.huawei.InsConstructionUtil.getCreateVpnIns;
+import static org.onosproject.drivers.huawei.InsConstructionUtil.getDeleteVpnIns;
 import static org.onosproject.drivers.huawei.IntConstructionUtil.getCreateInt;
 import static org.onosproject.yang.runtime.DefaultModelRegistrationParam.builder;
 import static org.onosproject.yang.runtime.helperutils.YangApacheUtils.getYangModel;
@@ -52,8 +54,8 @@
 /**
  * Configures l3vpn on Huawei devices.
  */
-public class HuaweiL3vpnConfig extends AbstractHandlerBehaviour
-        implements L3vpnConfig {
+public class HuaweiL3VpnConfig extends AbstractHandlerBehaviour
+        implements L3VpnConfig {
 
     /**
      * YANG model registry.
@@ -68,7 +70,7 @@
     /**
      * Constructs huawei L3VPN config.
      */
-    public HuaweiL3vpnConfig() {
+    public HuaweiL3VpnConfig() {
     }
 
     /**
@@ -148,7 +150,7 @@
 
     @Override
     public Object deleteInstance(Object objectData) {
-        return InsConstructionUtil.getDeleteVpnIns((ModelObjectData) objectData);
+        return getDeleteVpnIns((ModelObjectData) objectData);
     }
 
     @Override
@@ -159,8 +161,7 @@
 
     @Override
     public Object deleteBgpInfo(Object bgpInfo, Object bgpConfig) {
-        //TODO:To be committed.
-        return null;
+        return getDeleteBgp((BgpInfo) bgpInfo, (BgpDriverInfo) bgpConfig);
     }
 
     /**
diff --git a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/InsConstructionUtil.java b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/InsConstructionUtil.java
index 918c5fd..6e13c34 100644
--- a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/InsConstructionUtil.java
+++ b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/InsConstructionUtil.java
@@ -35,6 +35,7 @@
 import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.l3vpninstance.vpninstafs.vpninstaf.VpnTargets;
 import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.l3vpninstance.vpninstafs.vpninstaf.vpntargets.DefaultVpnTarget;
 import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.l3vpninstance.vpninstafs.vpninstaf.vpntargets.VpnTarget;
+import org.onosproject.yang.gen.v1.ne.l3vpn.comm.rev20141225.nel3vpncomm.l3vpnifs.DefaultL3VpnIfs;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.bgp.l3vpn.rev20160909.ietfbgpl3vpn.devices.device.networkinstances.networkinstance.DefaultAugmentedNiNetworkInstance;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.bgp.l3vpn.rev20160909.ietfbgpl3vpn.l3vpnvrfparams.ipv4.Unicast;
 import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.bgp.l3vpn.rev20160909.ietfbgpl3vpn.routetargetset.Rts;
@@ -105,7 +106,7 @@
     static ModelObjectData getCreateVpnIns(ModelObjectData modObj,
                                            boolean isDevAvail) {
         ModelIdLevel modIdLvl = DEVICE;
-        String id = getIdFromModId(modObj.identifier());
+        String id = getIdFromModId(modObj.identifier(), true);
         Object obj = getObjFromModData(modObj);
 
         if (obj == null) {
@@ -392,7 +393,7 @@
      */
     static Object getDeleteVpnIns(ModelObjectData modObj) {
         ModelIdLevel modIdLvl = DEVICE;
-        String id = getIdFromModId(modObj.identifier());
+        String id = getIdFromModId(modObj.identifier(), true);
         Object obj = getObjFromModData(modObj);
 
         if (obj == null) {
@@ -434,20 +435,22 @@
         switch (modIdLvl) {
             case ROOT:
                 modId = getModObjIdDriDevices();
-                break;
+                DefaultDevice device = new DefaultDevice();
+                return getData(modId, device);
 
             case DEVICES:
+                DefaultL3Vpn l3Vpn = new DefaultL3Vpn();
                 modId = getModObjIdDriDevice(id).build();
-                break;
+                return getData(modId, l3Vpn);
 
             case DEVICE:
+                DefaultL3VpnIfs l3VpnIfs = new DefaultL3VpnIfs();
                 modId = getModObjIdDriVpn(id, name);
-                break;
+                return getData(modId, l3VpnIfs);
 
             default:
                 throw new IllegalArgumentException(UNSUPPORTED_MODEL_LVL);
         }
-        return getData(modId, null);
     }
 
     /**
diff --git a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/IntConstructionUtil.java b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/IntConstructionUtil.java
index da4a85c..bfd182a 100644
--- a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/IntConstructionUtil.java
+++ b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/IntConstructionUtil.java
@@ -77,7 +77,7 @@
      */
     static ModelObjectData getCreateInt(ModelObjectData modObj) {
         boolean isModIdAvail = true;
-        String id = getIdFromModId(modObj.identifier());
+        String id = getIdFromModId(modObj.identifier(), false);
         Object obj = getObjFromModData(modObj);
         if (id == null) {
             isModIdAvail = false;
diff --git a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/L3VpnUtil.java b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/L3VpnUtil.java
new file mode 100644
index 0000000..a0f04ce
--- /dev/null
+++ b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/L3VpnUtil.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2017-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.onosproject.drivers.huawei;
+
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.instance.rev20160623.ietfnetworkinstance.devices.DeviceKeys;
+import org.onosproject.yang.model.KeyInfo;
+
+/**
+ * Representation of utility for huawei driver's L3VPN.
+ */
+public final class L3VpnUtil {
+
+    // No instantiation.
+    private L3VpnUtil() {
+    }
+
+    /**
+     * Returns the device id from the instance key.
+     *
+     * @param key instance key
+     * @return device id
+     */
+    static String getDevIdFromIns(KeyInfo key) {
+        return ((DeviceKeys) key).deviceid();
+    }
+}
diff --git a/drivers/huawei/driver/src/main/resources/huawei-drivers.xml b/drivers/huawei/driver/src/main/resources/huawei-drivers.xml
index 35a1302..6918877 100644
--- a/drivers/huawei/driver/src/main/resources/huawei-drivers.xml
+++ b/drivers/huawei/driver/src/main/resources/huawei-drivers.xml
@@ -17,8 +17,8 @@
 <drivers>
     <driver name="huawei" extends="" manufacturer="Huawei"
             hwVersion="" swVersion="">
-        <behaviour api="org.onosproject.net.behaviour.L3vpnConfig"
-                   impl="org.onosproject.drivers.huawei.HuaweiL3vpnConfig"/>
+        <behaviour api="org.onosproject.net.behaviour.L3VpnConfig"
+                   impl="org.onosproject.drivers.huawei.HuaweiL3VpnConfig"/>
         <behaviour api="org.onosproject.net.device.DeviceDescriptionDiscovery"
                    impl="org.onosproject.drivers.huawei.HuaweiDeviceDescription"/>
         <behaviour api="org.onosproject.net.device.PortStatisticsDiscovery"
diff --git a/drivers/pom.xml b/drivers/pom.xml
index f68076b..5e73f4c 100644
--- a/drivers/pom.xml
+++ b/drivers/pom.xml
@@ -48,7 +48,6 @@
         <module>juniper</module>
         <module>lisp</module>
         <module>flowspec</module>
-        <module>huawei</module>
     </modules>
 
     <!--<properties>
