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>
