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 4198ee8..648d556 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,6 +17,8 @@
 package org.onosproject.l3vpn.netl3vpn;
 
 import org.onosproject.net.DeviceId;
+import org.onosproject.net.behaviour.L3vpnConfig;
+import org.onosproject.net.driver.DriverHandler;
 import org.onosproject.net.driver.DriverService;
 import org.onosproject.yang.model.ModelObjectData;
 
@@ -156,8 +158,8 @@
      */
     public ModelObjectData processCreateInstance(DriverService driverSvc,
                                                  ModelObjectData modelData) {
-        // TODO: Need to call the behaviour.
-        return null;
+        L3vpnConfig config = getL3VpnConfig(driverSvc);
+        return (ModelObjectData) config.createInstance(modelData);
     }
 
     /**
@@ -171,8 +173,8 @@
      */
     public ModelObjectData processCreateInterface(DriverService driverSvc,
                                                   ModelObjectData modData) {
-        // TODO: Need to call the behaviour.
-        return null;
+        L3vpnConfig config = getL3VpnConfig(driverSvc);
+        return (ModelObjectData) config.bindInterface(modData);
     }
 
     /**
@@ -188,8 +190,8 @@
     public ModelObjectData processCreateBgpInfo(DriverService driverSvc,
                                                 BgpInfo bgpInfo,
                                                 BgpDriverInfo driverInfo) {
-        // TODO: Need to call the behaviour.
-        return null;
+        L3vpnConfig config = getL3VpnConfig(driverSvc);
+        return (ModelObjectData) config.createBgpInfo(bgpInfo, driverInfo);
     }
 
     /**
@@ -202,9 +204,9 @@
      * @return driver instance model object data
      */
     public ModelObjectData processDeleteInstance(DriverService driverSvc,
-                                          ModelObjectData modData) {
-        // TODO: Need to call the behaviour.
-        return null;
+                                                 ModelObjectData modData) {
+        L3vpnConfig config = getL3VpnConfig(driverSvc);
+        return (ModelObjectData) config.deleteInstance(modData);
     }
 
     /**
@@ -217,7 +219,7 @@
      * @return driver interface model object data
      */
     public ModelObjectData processDeleteInterface(DriverService driverSvc,
-                                           ModelObjectData objectData) {
+                                                  ModelObjectData objectData) {
         // TODO: Need to call the behaviour.
         return null;
     }
@@ -233,9 +235,20 @@
      * @return driver BGP model object data
      */
     public ModelObjectData processDeleteBgpInfo(DriverService driverSvc,
-                                         BgpInfo bgpInfo,
-                                         BgpDriverInfo driverInfo) {
+                                                BgpInfo bgpInfo,
+                                                BgpDriverInfo driverInfo) {
         // TODO: Need to call the behaviour.
         return null;
     }
+
+    /**
+     * Returns the L3VPN config instance from the behaviour.
+     *
+     * @param driverSvc driver service
+     * @return L3VPN config
+     */
+    private L3vpnConfig getL3VpnConfig(DriverService driverSvc) {
+        DriverHandler handler = driverSvc.createHandler(deviceId);
+        return handler.behaviour(L3vpnConfig.class);
+    }
 }
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
index ca16eca..4dc9165 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
@@ -147,7 +147,6 @@
 
 /**
  * The IETF net l3vpn manager implementation.
- * // TODO: Implementation of the manager class.
  */
 @Component(immediate = true)
 public class NetL3vpnManager {
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
new file mode 100644
index 0000000..751316d
--- /dev/null
+++ b/core/api/src/main/java/org/onosproject/net/behaviour/L3vpnConfig.java
@@ -0,0 +1,81 @@
+/*
+ * 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.net.behaviour;
+
+import org.onosproject.net.driver.HandlerBehaviour;
+
+/**
+ * Behaviour for handling various drivers for l3vpn configurations.
+ */
+public interface L3vpnConfig extends HandlerBehaviour {
+
+    /**
+     * Create virtual routing forwarding instance on requested device with
+     * given standard device model object data.
+     *
+     * @param objectData standard device model object data
+     * @return device model object data
+     */
+    Object createInstance(Object objectData);
+
+    /**
+     * Binds requested virtual routing forwarding instance to interface on the
+     * requested device with given standard device model object data.
+     *
+     * @param objectData standard device model object data
+     * @return device model object data
+     */
+    Object bindInterface(Object objectData);
+
+    /**
+     * Deletes virtual routing forwarding instance on requested device with
+     * given standard device model object data.
+     *
+     * @param objectData standard device model object data
+     * @return device model object data
+     */
+    Object deleteInstance(Object objectData);
+
+    /**
+     * Unbinds requested virtual routing forwarding instance to interface on the
+     * requested device with given standard device model object data.
+     *
+     * @param objectData standard device model object data
+     * @return device model object data
+     */
+    Object unbindInterface(Object objectData);
+
+    /**
+     * Creates BGP routing protocol info on requested device with given
+     * BGP info object.
+     *
+     * @param bgpInfo   BGP info object
+     * @param bgpConfig BGP driver config
+     * @return device model object data
+     */
+    Object createBgpInfo(Object bgpInfo, Object bgpConfig);
+
+    /**
+     * Deletes BGP routing protocol info on requested device with given
+     * BGP info object.
+     *
+     * @param bgpInfo   BGP info object
+     * @param bgpConfig BGP driver config
+     * @return device model object data
+     */
+    Object deleteBgpInfo(Object bgpInfo, Object bgpConfig);
+}
diff --git a/drivers/huawei/BUCK b/drivers/huawei/BUCK
new file mode 100644
index 0000000..bc5f34c
--- /dev/null
+++ b/drivers/huawei/BUCK
@@ -0,0 +1,16 @@
+BUNDLES = [
+  '//drivers/huawei/yangmodel:onos-drivers-huawei-yangmodel',
+  '//drivers/huawei/driver:onos-drivers-huawei-driver',
+]
+
+onos_app(
+  app_name = 'org.onosproject.drivers.huawei',
+  title = 'Huawei Device Drivers',
+  category = 'Drivers',
+  url = 'http://onosproject.org',
+  description = 'ONOS Huawei Device Drivers application.',
+  included_bundles = BUNDLES,
+  required_apps = [
+    'org.onosproject.netconf'
+  ],
+)
\ No newline at end of file
diff --git a/drivers/huawei/driver/BUCK b/drivers/huawei/driver/BUCK
new file mode 100644
index 0000000..9f44ff7
--- /dev/null
+++ b/drivers/huawei/driver/BUCK
@@ -0,0 +1,25 @@
+COMPILE_DEPS = [
+  '//lib:CORE_DEPS',
+  '//lib:org.apache.servicemix.bundles.dom4j',
+  '//apps/l3vpn/yangmodel:onos-apps-l3vpn-yangmodel',
+  '//drivers/utilities:onos-drivers-utilities',
+  '//protocols/netconf/api:onos-protocols-netconf-api',
+  '//apps/l3vpn/netl3vpn:onos-apps-l3vpn-netl3vpn',
+  '//drivers/huawei/yangmodel:onos-drivers-huawei-yangmodel',
+  '//apps/config:onos-apps-config',
+  '//lib:onos-yang-model',
+  '//lib:onos-yang-runtime',
+]
+
+TEST_DEPS = [
+  '//lib:TEST_ADAPTERS',
+  '//utils/osgi:onlab-osgi-tests',
+]
+
+osgi_jar_with_tests(
+  name = 'onos-drivers-huawei-driver',
+  deps = COMPILE_DEPS,
+  test_deps = TEST_DEPS,
+  resources_root = 'src/main/resources',
+  resources = glob(['src/main/resources/**']),
+)
\ No newline at end of file
diff --git a/drivers/huawei/driver/pom.xml b/drivers/huawei/driver/pom.xml
new file mode 100644
index 0000000..2665e2d
--- /dev/null
+++ b/drivers/huawei/driver/pom.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         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>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.7</source>
+                    <target>1.7</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <parent>
+        <groupId>org.onosproject</groupId>
+        <artifactId>onos-drivers-huawei</artifactId>
+        <version>1.10.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>onos-drivers-huawei-driver</artifactId>
+    <packaging>pom</packaging>
+
+    <description>Huawei driver implementation</description>
+    <properties>
+        <yang-tool-version>1.12.0-b7</yang-tool-version>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-drivers-utilities</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-l3vpn-netl3vpn</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-l3vpn-yangmodel</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-yang-model</artifactId>
+            <version>${yang-tool-version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-drivers-huawei-yangmodel</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-netconf-api</artifactId>
+            <version>1.10.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.onosproject</groupId>
+            <artifactId>onos-app-yang</artifactId>
+            <version>1.10.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.servicemix.bundles</groupId>
+            <artifactId>org.apache.servicemix.bundles.dom4j</artifactId>
+            <version>1.6.1_5</version>
+        </dependency>
+    </dependencies>
+</project>
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
new file mode 100644
index 0000000..8472ed4
--- /dev/null
+++ b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/BgpConstructionUtil.java
@@ -0,0 +1,319 @@
+/*
+ * 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.l3vpn.netl3vpn.BgpDriverInfo;
+import org.onosproject.l3vpn.netl3vpn.BgpInfo;
+import org.onosproject.l3vpn.netl3vpn.BgpModelIdLevel;
+import org.onosproject.l3vpn.netl3vpn.ProtocolInfo;
+import org.onosproject.l3vpn.netl3vpn.RouteProtocol;
+import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.DefaultDevices;
+import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.Devices;
+import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.DefaultDevice;
+import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.Device;
+import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.DeviceKeys;
+import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.Bgp;
+import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.DefaultBgp;
+import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.Bgpcomm;
+import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.DefaultBgpcomm;
+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.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.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;
+import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.bgpvrfaf.importroutes.DefaultImportRoute;
+import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.bgpvrfaf.importroutes.ImportRoute;
+import org.onosproject.yang.gen.v1.ne.bgpcomm.type.rev20141225.nebgpcommtype.BgpcommImRouteProtocol;
+import org.onosproject.yang.gen.v1.ne.bgpcomm.type.rev20141225.nebgpcommtype.bgpcommimrouteprotocol.BgpcommImRouteProtocolEnum;
+import org.onosproject.yang.model.InnerModelObject;
+import org.onosproject.yang.model.ModelObjectData;
+import org.onosproject.yang.model.ModelObjectId;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import static org.onosproject.drivers.huawei.DriverUtil.UNSUPPORTED_MODEL_LVL;
+import static org.onosproject.drivers.huawei.DriverUtil.getData;
+import static org.onosproject.yang.gen.v1.ne.bgpcomm.type.rev20141225.nebgpcommtype.BgpcommPrefixType.of;
+import static org.onosproject.yang.gen.v1.ne.bgpcomm.type.rev20141225.nebgpcommtype.bgpcommimrouteprotocol.BgpcommImRouteProtocolEnum.DIRECT;
+import static org.onosproject.yang.gen.v1.ne.bgpcomm.type.rev20141225.nebgpcommtype.bgpcommimrouteprotocol.BgpcommImRouteProtocolEnum.OSPF;
+import static org.onosproject.yang.gen.v1.ne.bgpcomm.type.rev20141225.nebgpcommtype.bgpcommimrouteprotocol.BgpcommImRouteProtocolEnum.RIP;
+import static org.onosproject.yang.gen.v1.ne.bgpcomm.type.rev20141225.nebgpcommtype.bgpcommimrouteprotocol.BgpcommImRouteProtocolEnum.RIPNG;
+import static org.onosproject.yang.gen.v1.ne.bgpcomm.type.rev20141225.nebgpcommtype.bgpcommimrouteprotocol.BgpcommImRouteProtocolEnum.STATIC;
+import static org.onosproject.yang.gen.v1.ne.bgpcomm.type.rev20141225.nebgpcommtype.bgpcommprefixtype.BgpcommPrefixTypeEnum.IPV4UNI;
+import static org.onosproject.yang.gen.v1.ne.bgpcomm.type.rev20141225.nebgpcommtype.bgpcommprefixtype.BgpcommPrefixTypeEnum.IPV6UNI;
+
+/**
+ * Representation of utility for BGP creation and deletion.
+ */
+public final class BgpConstructionUtil {
+
+    /**
+     * Error message for unsupported protocol type.
+     */
+    private static final String UNSUPPORTED_PRO_TYPE = "Unsupported route " +
+            "protocol type is found.";
+
+    // No instantiation.
+    private BgpConstructionUtil() {
+    }
+
+    /**
+     * Returns the created model object data of BGP info of huawei device
+     * from the standard model object data.
+     *
+     * @param bgpInfo device BGP info
+     * @param config  BGP driver info
+     * @return driver model object data
+     */
+    static ModelObjectData getCreateBgp(BgpInfo bgpInfo,
+                                        BgpDriverInfo config) {
+        String devId = config.devId();
+        BgpModelIdLevel modIdLevel = config.modIdLevel();
+
+        Bgp bgp = new DefaultBgp();
+        Bgpcomm bgpBuilder = new DefaultBgpcomm();
+        BgpVrfs bgpVrfs = new DefaultBgpVrfs();
+        BgpVrf bgpVrf = new DefaultBgpVrf();
+        BgpVrfAfs bgpVrfAfs = new DefaultBgpVrfAfs();
+        List<BgpVrf> bgpVrfList = new LinkedList<>();
+
+        bgpVrf.vrfName(bgpInfo.vpnName());
+        Map<RouteProtocol, ProtocolInfo> proMap = bgpInfo.protocolInfo();
+        addRouteProtocol(proMap, bgpVrfAfs);
+
+        bgpVrf.bgpVrfAfs(bgpVrfAfs);
+        bgpVrfList.add(bgpVrf);
+        bgpVrfs.bgpVrf(bgpVrfList);
+        bgpBuilder.bgpVrfs(bgpVrfs);
+        bgp.bgpcomm(bgpBuilder);
+        return getModObjData(modIdLevel, bgp, devId, bgpVrf);
+    }
+
+    /**
+     * Adds route protocol from the standard device model to the BGP address
+     * family respectively.
+     *
+     * @param proMap    protocol map
+     * @param bgpVrfAfs BGP address family
+     */
+    private static void addRouteProtocol(Map<RouteProtocol, ProtocolInfo> proMap,
+                                         BgpVrfAfs bgpVrfAfs) {
+        BgpVrfAf ipv4 = new DefaultBgpVrfAf();
+        ImportRoutes ipv4Routes = new DefaultImportRoutes();
+        ipv4.afType(of(IPV4UNI));
+
+        BgpVrfAf ipv6 = new DefaultBgpVrfAf();
+        ImportRoutes ipv6Routes = new DefaultImportRoutes();
+        ipv6.afType(of(IPV6UNI));
+        for (Map.Entry<RouteProtocol, ProtocolInfo> info : proMap.entrySet()) {
+            RouteProtocol protocol = info.getKey();
+            ProtocolInfo proInfo = info.getValue();
+            if (proInfo.isIpv4Af()) {
+                addImportRoute(ipv4Routes, proInfo, protocol);
+            }
+            if (proInfo.isIpv6Af()) {
+                addImportRoute(ipv6Routes, proInfo, protocol);
+            }
+        }
+        if (ipv4Routes.importRoute() != null &&
+                !ipv4Routes.importRoute().isEmpty()) {
+            addToBgpVrf(ipv4Routes, ipv4, bgpVrfAfs);
+        }
+        if (ipv6Routes.importRoute() != null &&
+                !ipv6Routes.importRoute().isEmpty()) {
+            addToBgpVrf(ipv6Routes, ipv6, bgpVrfAfs);
+        }
+    }
+
+    /**
+     * Adds the routes to BGP VRF in driver model.
+     *
+     * @param routes    routes
+     * @param vrfAf     VRF address family
+     * @param bgpVrfAfs BGP address family
+     */
+    private static void addToBgpVrf(ImportRoutes routes, BgpVrfAf vrfAf,
+                                    BgpVrfAfs bgpVrfAfs) {
+        List<BgpVrfAf> ipList = new LinkedList<>();
+        vrfAf.importRoutes(routes);
+        ipList.add(vrfAf);
+        bgpVrfAfs.bgpVrfAf(ipList);
+    }
+
+    /**
+     * Adds the import route to the routes, according to the protocol info
+     * from the standard device model.
+     *
+     * @param routes   routes object
+     * @param proInfo  protocol info
+     * @param protocol route protocol
+     */
+    private static void addImportRoute(ImportRoutes routes, ProtocolInfo proInfo,
+                                       RouteProtocol protocol) {
+        List<ImportRoute> routeList = new LinkedList<>();
+        ImportRoute route = buildAfBgp(proInfo, protocol);
+        routeList.add(route);
+        routes.importRoute(routeList);
+    }
+
+    /**
+     * Builds the import route details from the route protocol and the
+     * process id.
+     *
+     * @param proInfo  protocol info
+     * @param protocol route protocol
+     * @return import route object
+     */
+    private static ImportRoute buildAfBgp(ProtocolInfo proInfo,
+                                          RouteProtocol protocol) {
+        BgpcommImRouteProtocolEnum rpEnum = getProtocolType(protocol);
+        ImportRoute impRoute = new DefaultImportRoute();
+        impRoute.importProcessId(proInfo.processId());
+        impRoute.importProtocol(BgpcommImRouteProtocol.of(rpEnum));
+        return impRoute;
+    }
+
+    /**
+     * Returns the huawei route protocol corresponding to standard device
+     * route protocol.
+     *
+     * @param protocol device route protocol
+     * @return driver route protocol
+     */
+    private static BgpcommImRouteProtocolEnum getProtocolType(RouteProtocol protocol) {
+        switch (protocol) {
+            case DIRECT:
+                return DIRECT;
+
+            case OSPF:
+                return OSPF;
+
+            case RIP:
+                return RIP;
+
+            case RIP_NG:
+                return RIPNG;
+
+            case STATIC:
+                return STATIC;
+
+            case BGP:
+            case VRRP:
+            default:
+                throw new IllegalArgumentException(UNSUPPORTED_PRO_TYPE);
+        }
+    }
+
+    /**
+     * Returns the driver model object data, according to the levels it has
+     * to be constructed.
+     *
+     * @param modIdLevel model id level
+     * @param bgp        driver BGP object
+     * @param devId      device id
+     * @param bgpVrf     driver BGP VRF object
+     * @return model object data
+     */
+    public static ModelObjectData getModObjData(BgpModelIdLevel modIdLevel,
+                                                Bgp bgp, String devId,
+                                                BgpVrf bgpVrf) {
+        switch (modIdLevel) {
+            case ROOT:
+                return getRootModObj(bgp, devId);
+
+            case DEVICES:
+                return getDevicesModObj(bgp, devId);
+
+            case DEVICE:
+                return getDevModObj(bgpVrf, devId);
+
+            default:
+                throw new IllegalArgumentException(UNSUPPORTED_MODEL_LVL);
+        }
+    }
+
+    /**
+     * Returns the driver model object data with device in model object id,
+     * till BGP VRF.
+     *
+     * @param bgpVrf BGP VRF object
+     * @param devId  device id
+     * @return model object data
+     */
+    private static ModelObjectData getDevModObj(BgpVrf bgpVrf, String devId) {
+        DeviceKeys key = new DeviceKeys();
+        key.deviceid(devId);
+        ModelObjectId id = ModelObjectId.builder()
+                .addChild(DefaultDevices.class)
+                .addChild(DefaultDevice.class, key)
+                .addChild(DefaultBgp.class)
+                .addChild(DefaultBgpcomm.class)
+                .addChild(DefaultBgpVrfs.class).build();
+        return getData(id, (InnerModelObject) bgpVrf);
+    }
+
+    /**
+     * Returns the driver model object data with devices in model object id.
+     *
+     * @param bgp   BGP object
+     * @param devId device id
+     * @return model object data
+     */
+    private static ModelObjectData getDevicesModObj(Bgp bgp, String devId) {
+        ModelObjectId modelId = ModelObjectId.builder()
+                .addChild(DefaultDevices.class).build();
+        Device device = getDevInfo(bgp, devId);
+        return getData(modelId, (InnerModelObject) device);
+    }
+
+    /**
+     * Returns the driver root model object without model object id.
+     *
+     * @param bgp   driver BGP
+     * @param devId device id
+     * @return model object data
+     */
+    private static ModelObjectData getRootModObj(Bgp bgp, String devId) {
+        Devices devices = new DefaultDevices();
+        List<Device> devList = new LinkedList<>();
+        Device device = getDevInfo(bgp, devId);
+        devList.add(device);
+        devices.device(devList);
+        return getData(null, (InnerModelObject) devices);
+    }
+
+    /**
+     * Returns the driver BGP from the device object.
+     *
+     * @param bgp   BGP object
+     * @param devId device id
+     * @return device object
+     */
+    private static Device getDevInfo(Bgp bgp, String devId) {
+        Device device = new DefaultDevice();
+        device.deviceid(devId);
+        device.bgp(bgp);
+        return device;
+    }
+}
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
new file mode 100644
index 0000000..d7b8e40
--- /dev/null
+++ b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/DriverUtil.java
@@ -0,0 +1,221 @@
+/*
+ * 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.ne.l3vpn.api.rev20141225.nel3vpnapi.DefaultDevices;
+import org.onosproject.yang.model.AtomicPath;
+import org.onosproject.yang.model.DefaultModelObjectData;
+import org.onosproject.yang.model.InnerModelObject;
+import org.onosproject.yang.model.ModelObject;
+import org.onosproject.yang.model.ModelObjectData;
+import org.onosproject.yang.model.ModelObjectId;
+import org.onosproject.yang.model.MultiInstanceNode;
+
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Representation of utility for huawei driver.
+ */
+public final class DriverUtil {
+
+    /**
+     * Static constant value for devices.
+     */
+    static final String CONS_DEVICES = "Devices";
+
+    /**
+     * Error message for YANG model registry service not found.
+     */
+    static final String SERVICE_NOT_FOUND = "Service required for huawei " +
+            "driver is not found.";
+
+    /**
+     * Error message for object from the standard device model being null.
+     */
+    static final String OBJECT_NULL = "Object from device model cannot be null";
+
+    /**
+     * Error message for device object under devices from the standard model
+     * being null.
+     */
+    static final String DEVICE_NULL = "Device object from the devices of " +
+            "standard device model cannot be null";
+
+    /**
+     * Error message for device object under devices from the standard model
+     * being null.
+     */
+    static final String INS_NULL = "Instance object from the instances of " +
+            "standard device model cannot be null";
+
+    /**
+     * Error message for unsupported model id level.
+     */
+    static final String UNSUPPORTED_MODEL_LVL = "The model id level is not " +
+            "supported";
+
+    /**
+     * Error message for failure of device info retrieval.
+     */
+    static final String DEV_INFO_FAILURE = "Failed to retrieve device info.";
+
+    /**
+     * Error message for failure of interface info retrieval.
+     */
+    static final String INT_INFO_FAILURE = "Failed to retrieve Interfaces";
+
+    /**
+     * RPC message header.
+     */
+    static final String RPC_MSG = "<rpc message-id=\"101\" xmlns=\"urn:ietf:" +
+            "params:xml:ns:netconf:base:1.0\">";
+
+    /**
+     * RPC get message.
+     */
+    static final String RPC_GET = "<get>";
+
+    /**
+     * RPC subtree filter message.
+     */
+    static final String RPC_FILTER = "<filter type=\"subtree\">";
+
+    /**
+     * RPC system message with namespace.
+     */
+    static final String RPC_SYS = "<system xmlns=\"http://www.huawei.com/" +
+            "netconf/vrp\" format-version=\"1.0\" content-version=\"1.0\"/>";
+
+    /**
+     * RPC ifm message with namespace.
+     */
+    static final String RPC_IFM = "<ifm xmlns=\"http://www.huawei.com" +
+            "/netconf/vrp\" format-version=\"1.0\" content-version=\"1.0\">";
+
+    /**
+     * RPC interfaces message.
+     */
+    static final String RPC_IFS = "<interfaces/>";
+
+    /**
+     * RPC ifm message.
+     */
+    static final String RPC_CLOSE_IFM = "</ifm>";
+
+    /**
+     * RPC filter close message.
+     */
+    static final String RPC_CLOSE_FILTER = "</filter>";
+
+    /**
+     * RPC close message.
+     */
+    static final String RPC_CLOSE = "</rpc>";
+
+    /**
+     * RPC get close message.
+     */
+    static final String RPC_CLOSE_GET = "</get>";
+
+    /**
+     * Static constant for slash.
+     */
+    static final String SLASH = "/";
+
+    /**
+     * Static constant for devices name.
+     */
+    static final String DEVICES = "devices";
+
+    /**
+     * Static constant for devices namespace.
+     */
+    static final String NAMESPACE = "ne-l3vpn-api";
+
+    /**
+     * Error message for model object id having more than two objects.
+     */
+    private static final String MODEL_OBJ_ID_LIMIT = "The model object id " +
+            "must not have more than two objects.";
+
+    // No instantiation.
+    private DriverUtil() {
+    }
+
+    /**
+     * Returns the device id from the model object id. If model object id is
+     * 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
+     * @return device id
+     */
+    static String getIdFromModId(ModelObjectId id) {
+        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);
+        }
+    }
+
+    /**
+     * Returns the first object from the model object data. If no objects are
+     * present then it returns null.
+     *
+     * @param modData model object data
+     * @return object
+     */
+    static Object getObjFromModData(ModelObjectData modData) {
+        List<ModelObject> obj = modData.modelObjects();
+        Iterator<ModelObject> it = obj.iterator();
+        if (it.hasNext()) {
+            return it.next();
+        }
+        return null;
+    }
+
+    /**
+     * Returns the model object id for with the devices object added to it.
+     *
+     * @return model object id
+     */
+    static ModelObjectId getModObjIdDriDevices() {
+        return ModelObjectId.builder().addChild(DefaultDevices.class).build();
+    }
+
+    /**
+     * Returns model object data built from the object that has to be added
+     * and the model object id.
+     *
+     * @param id  model object id
+     * @param obj object
+     * @return model object data
+     */
+    static ModelObjectData getData(ModelObjectId id, InnerModelObject obj) {
+        return DefaultModelObjectData.builder().addModelObject(obj)
+                .identifier(id).build();
+    }
+}
diff --git a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiDeviceDescription.java b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiDeviceDescription.java
new file mode 100644
index 0000000..575d051
--- /dev/null
+++ b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiDeviceDescription.java
@@ -0,0 +1,183 @@
+/*
+ * 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 com.google.common.collect.ImmutableList;
+import org.onosproject.net.Device;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.device.DefaultDeviceDescription;
+import org.onosproject.net.device.DeviceDescription;
+import org.onosproject.net.device.DeviceDescriptionDiscovery;
+import org.onosproject.net.device.DeviceService;
+import org.onosproject.net.device.PortDescription;
+import org.onosproject.net.driver.AbstractHandlerBehaviour;
+import org.onosproject.netconf.NetconfController;
+import org.onosproject.netconf.NetconfException;
+import org.onosproject.netconf.NetconfSession;
+import org.slf4j.Logger;
+
+import java.io.IOException;
+import java.util.List;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.drivers.huawei.DriverUtil.DEV_INFO_FAILURE;
+import static org.onosproject.drivers.huawei.DriverUtil.INT_INFO_FAILURE;
+import static org.onosproject.drivers.huawei.DriverUtil.RPC_CLOSE_IFM;
+import static org.onosproject.drivers.huawei.DriverUtil.RPC_IFS;
+import static org.onosproject.drivers.huawei.DriverUtil.RPC_CLOSE;
+import static org.onosproject.drivers.huawei.DriverUtil.RPC_CLOSE_FILTER;
+import static org.onosproject.drivers.huawei.DriverUtil.RPC_CLOSE_GET;
+import static org.onosproject.drivers.huawei.DriverUtil.RPC_FILTER;
+import static org.onosproject.drivers.huawei.DriverUtil.RPC_GET;
+import static org.onosproject.drivers.huawei.DriverUtil.RPC_IFM;
+import static org.onosproject.drivers.huawei.DriverUtil.RPC_MSG;
+import static org.onosproject.drivers.huawei.DriverUtil.RPC_SYS;
+import static org.onosproject.net.Device.Type.ROUTER;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Representation of device information and ports via NETCONF for huawei
+ * routers.
+ */
+public class HuaweiDeviceDescription extends AbstractHandlerBehaviour
+        implements DeviceDescriptionDiscovery {
+
+    private final Logger log = getLogger(getClass());
+
+    /**
+     * Constructs huawei device description.
+     */
+    public HuaweiDeviceDescription() {
+    }
+
+    /**
+     * Discovers device details, for huawei device by getting the system
+     * information.
+     *
+     * @return device description
+     */
+    @Override
+    public DeviceDescription discoverDeviceDetails() {
+        NetconfSession session = getNetconfSession();
+        String sysInfo;
+        try {
+            sysInfo = session.get(getVersionReq());
+        } catch (IOException e) {
+            throw new IllegalArgumentException(
+                    new NetconfException(DEV_INFO_FAILURE));
+        }
+
+        String[] details = parseSysInfoXml(sysInfo);
+        DeviceService devSvc = checkNotNull(handler().get(DeviceService.class));
+        DeviceId devId = handler().data().deviceId();
+        Device dev = devSvc.getDevice(devId);
+        return new DefaultDeviceDescription(dev.id().uri(), ROUTER,
+                                            details[0], details[1],
+                                            details[2], details[3],
+                                            dev.chassisId());
+    }
+
+    /**
+     * Discovers interface details, for huawei device.
+     *
+     * @return port list
+     */
+    @Override
+    public List<PortDescription> discoverPortDetails() {
+        NetconfSession session = getNetconfSession();
+        String interfaces;
+        try {
+            interfaces = session.get(getInterfacesReq());
+        } catch (IOException e) {
+            throw new IllegalArgumentException(
+                    new NetconfException(INT_INFO_FAILURE));
+        }
+        return ImmutableList.copyOf(parseInterfaceXml(interfaces));
+    }
+
+    /**
+     * Returns the NETCONF session of the device.
+     *
+     * @return session
+     */
+    private NetconfSession getNetconfSession() {
+        NetconfController controller = checkNotNull(
+                handler().get(NetconfController.class));
+        return controller.getDevicesMap().get(handler().data().deviceId())
+                .getSession();
+    }
+
+    /**
+     * Returns the rpc request message for fetching system details in huawei
+     * device.
+     *
+     * @return rpc request message
+     */
+    private String getVersionReq() {
+        StringBuilder rpc = new StringBuilder(RPC_MSG);
+        rpc.append(RPC_GET);
+        rpc.append(RPC_FILTER);
+        rpc.append(RPC_SYS);
+        rpc.append(RPC_CLOSE_FILTER);
+        rpc.append(RPC_CLOSE_GET);
+        rpc.append(RPC_CLOSE);
+        return rpc.toString();
+    }
+
+    /**
+     * Parses system info received from huawei device.
+     *
+     * @param sysInfo system info
+     * @return parsed values
+     */
+    private String[] parseSysInfoXml(String sysInfo) {
+        HuaweiXmlParser parser = new HuaweiXmlParser(sysInfo);
+        parser.parseSysInfo();
+        return parser.getInfo();
+    }
+
+    /**
+     * Returns the rpc request message for fetching interface details in
+     * huawei device.
+     *
+     * @return rpc request message
+     */
+    private String getInterfacesReq() {
+        StringBuilder rpc = new StringBuilder(RPC_MSG);
+        rpc.append(RPC_GET);
+        rpc.append(RPC_FILTER);
+        rpc.append(RPC_IFM);
+        rpc.append(RPC_IFS);
+        rpc.append(RPC_CLOSE_IFM);
+        rpc.append(RPC_CLOSE_FILTER);
+        rpc.append(RPC_CLOSE_GET);
+        rpc.append(RPC_CLOSE);
+        return rpc.toString();
+    }
+
+    /**
+     * Parses interfaces received from huawei device.
+     *
+     * @param interfaces interfaces
+     * @return port list
+     */
+    private List<PortDescription> parseInterfaceXml(String interfaces) {
+        HuaweiXmlParser parser = new HuaweiXmlParser(interfaces);
+        parser.parseInterfaces();
+        return parser.getPorts();
+    }
+}
diff --git a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiDriversLoader.java b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiDriversLoader.java
new file mode 100644
index 0000000..2a6fa0a
--- /dev/null
+++ b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiDriversLoader.java
@@ -0,0 +1,30 @@
+/*
+ * 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.apache.felix.scr.annotations.Component;
+import org.onosproject.net.driver.AbstractDriverLoader;
+
+/**
+ * Loader for Huawei device drivers.
+ */
+@Component(immediate = true)
+public class HuaweiDriversLoader extends AbstractDriverLoader {
+    public HuaweiDriversLoader() {
+        super("/huawei-drivers.xml");
+    }
+}
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
new file mode 100644
index 0000000..5a663e4
--- /dev/null
+++ b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiL3vpnConfig.java
@@ -0,0 +1,186 @@
+/*
+ * 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.onlab.osgi.ServiceNotFoundException;
+import org.onosproject.config.DynamicConfigService;
+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.driver.AbstractHandlerBehaviour;
+import org.onosproject.yang.gen.v1.l3vpn.comm.type.rev20141225.NeL3VpncommType;
+import org.onosproject.yang.gen.v1.ne.bgpcomm.rev20141225.NeBgpcomm;
+import org.onosproject.yang.gen.v1.ne.bgpcomm.type.rev20141225.NeBgpcommType;
+import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.NeL3VpnApi;
+import org.onosproject.yang.gen.v1.ne.l3vpn.comm.rev20141225.NeL3Vpncomm;
+import org.onosproject.yang.model.DataNode;
+import org.onosproject.yang.model.ModelObjectData;
+import org.onosproject.yang.model.ResourceId;
+import org.onosproject.yang.model.YangModel;
+import org.onosproject.yang.model.YangModuleId;
+import org.onosproject.yang.runtime.DefaultAppModuleInfo;
+import org.onosproject.yang.runtime.ModelRegistrationParam;
+import org.onosproject.yang.runtime.YangModelRegistry;
+
+import java.util.Iterator;
+
+import static org.onosproject.drivers.huawei.BgpConstructionUtil.getCreateBgp;
+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.IntConstructionUtil.getCreateInt;
+import static org.onosproject.yang.runtime.DefaultModelRegistrationParam.builder;
+import static org.onosproject.yang.runtime.helperutils.YangApacheUtils.getYangModel;
+
+/**
+ * Configures l3vpn on Huawei devices.
+ */
+public class HuaweiL3vpnConfig extends AbstractHandlerBehaviour
+        implements L3vpnConfig {
+
+    /**
+     * YANG model registry.
+     */
+    protected YangModelRegistry modelRegistry;
+
+    /**
+     * Dynamic config service.
+     */
+    protected DynamicConfigService configService;
+
+    /**
+     * Constructs huawei L3VPN config.
+     */
+    public HuaweiL3vpnConfig() {
+    }
+
+    /**
+     * Takes the YANG model registry service and registers the driver YANG.
+     * If service is not available it throws exception.
+     */
+    private void init() {
+        try {
+            modelRegistry = handler().get(YangModelRegistry.class);
+            configService = handler().get(DynamicConfigService.class);
+            registerModel();
+        } catch (ServiceNotFoundException e) {
+            throw new ServiceNotFoundException(SERVICE_NOT_FOUND);
+        }
+    }
+
+    /**
+     * Registers the huawei generated classes to the YANG model.
+     */
+    private void registerModel() {
+        YangModel model = getYangModel(NeBgpcomm.class);
+        Iterator<YangModuleId> it = model.getYangModulesId().iterator();
+
+        //Create model registration param.
+        ModelRegistrationParam.Builder b = builder().setYangModel(model);
+        YangModuleId id;
+        while (it.hasNext()) {
+            id = it.next();
+            switch (id.moduleName()) {
+                case "ne-bgpcomm":
+                    b.addAppModuleInfo(id, new DefaultAppModuleInfo(
+                            NeBgpcomm.class, null));
+                    break;
+                case "ne-bgpcomm-type":
+                    b.addAppModuleInfo(id, new DefaultAppModuleInfo(
+                            NeBgpcommType.class, null));
+                    break;
+                case "ne-l3vpn-api":
+                    b.addAppModuleInfo(id, new DefaultAppModuleInfo(
+                            NeL3VpnApi.class, null));
+                    break;
+                case "ne-l3vpncomm":
+                    b.addAppModuleInfo(id, new DefaultAppModuleInfo(
+                            NeL3Vpncomm.class, null));
+                    break;
+                case "ne-l3vpncomm-type":
+                    b.addAppModuleInfo(id, new DefaultAppModuleInfo(
+                            NeL3VpncommType.class, null));
+                    break;
+                default:
+                    break;
+            }
+        }
+        ModelRegistrationParam regParam = b.build();
+        modelRegistry.registerModel(regParam);
+    }
+
+    @Override
+    public Object createInstance(Object objectData) {
+        if (modelRegistry == null) {
+            init();
+        }
+        return getCreateVpnIns((ModelObjectData) objectData,
+                               isDevicesPresent());
+    }
+
+    @Override
+    public Object bindInterface(Object objectData) {
+        return getCreateInt((ModelObjectData) objectData);
+    }
+
+    @Override
+    public Object createBgpInfo(Object bgpInfo, Object bgpConfig) {
+        return getCreateBgp((BgpInfo) bgpInfo, (BgpDriverInfo) bgpConfig);
+    }
+
+
+    @Override
+    public Object deleteInstance(Object objectData) {
+        return InsConstructionUtil.getDeleteVpnIns((ModelObjectData) objectData);
+    }
+
+    @Override
+    public Object unbindInterface(Object objectData) {
+        //TODO:To be committed.
+        return null;
+    }
+
+    @Override
+    public Object deleteBgpInfo(Object bgpInfo, Object bgpConfig) {
+        //TODO:To be committed.
+        return null;
+    }
+
+    /**
+     * Returns true if devices, which is the root node present in store;
+     * false otherwise.
+     *
+     * @return true if devices available; false otherwise
+     */
+    private boolean isDevicesPresent() {
+        ResourceId resId = ResourceId.builder()
+                .addBranchPointSchema(SLASH, null)
+                .addBranchPointSchema(DEVICES, NAMESPACE).build();
+        try {
+            DataNode node = configService.readNode(resId, null);
+            if (node != null) {
+                return true;
+            }
+        } catch (FailedException e) {
+            return false;
+        }
+        return false;
+    }
+}
diff --git a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiXmlParser.java b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiXmlParser.java
new file mode 100644
index 0000000..eb62992
--- /dev/null
+++ b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/HuaweiXmlParser.java
@@ -0,0 +1,201 @@
+/*
+ * 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.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.DocumentHelper;
+import org.dom4j.Element;
+import org.onosproject.net.DefaultAnnotations;
+import org.onosproject.net.device.DefaultPortDescription;
+import org.onosproject.net.device.PortDescription;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+
+import static org.onosproject.net.AnnotationKeys.PORT_NAME;
+import static org.onosproject.net.Port.Type.COPPER;
+import static org.onosproject.net.PortNumber.portNumber;
+
+/**
+ * Created by root1 on 27/3/17.
+ */
+public class HuaweiXmlParser {
+
+    private static final String DATA = "data";
+    private static final String IFM = "ifm";
+    private static final String IFS = "interfaces";
+    private static final String IF = "interface";
+    private static final String IF_TYPE = "ifPhyType";
+    private static final String IF_STAT = "ifPhyStatus";
+    private static final String IF_NUM = "ifNumber";
+    private static final String IF_SPEED = "ifOperSpeed";
+    private static final String IF_NAME = "ifName";
+    private static final String UP = "up";
+    private static final String DYN_INFO = "ifDynamicInfo";
+    private static final String DELIMITER = "/";
+    private static final String SYS = "system";
+    private static final String SYS_INFO = "systemInfo";
+    private static final String SYS_NAME = "sysName";
+    private static final String PDT_VER = "productVer";
+    private static final String PLATFORM_VER = "platformVer";
+    private static final String SYS_ID = "sysObjectId";
+
+    private static final String DEV_PARSE_ERR = "Unable to parse the received" +
+            " xml reply for system details from the huawei device";
+    private static final String INT_PARSE_ERR = "Unable to parse the received" +
+            " xml reply for interface details from the huawei device";
+    private static final String P_NAME_INVALID = "Invalid port name.";
+
+    //TODO: All type of interfaces has to be added.
+    private static final List INTERFACES = Arrays.asList(
+            "MEth", "LoopBack", "Ethernet", "POS", "GigabitEthernet");
+
+    private List<PortDescription> ports = new ArrayList<>();
+    private String xml;
+    private int portInc;
+    private String[] info = new String[4];
+
+    /**
+     * Constructs huawei XML parser with xml reply.
+     *
+     * @param xml xml reply
+     */
+    public HuaweiXmlParser(String xml) {
+        this.xml = xml;
+    }
+
+    /**
+     * Returns the system info.
+     *
+     * @return system info
+     */
+    String[] getInfo() {
+        return info;
+    }
+
+    /**
+     * Returns the port list.
+     *
+     * @return port list
+     */
+    List<PortDescription> getPorts() {
+        return ports;
+    }
+
+    /**
+     * Parses system info xml reply.
+     */
+    void parseSysInfo() {
+        Document doc;
+        try {
+            doc = DocumentHelper.parseText(xml);
+        } catch (DocumentException e) {
+            throw new IllegalArgumentException(DEV_PARSE_ERR);
+        }
+
+        Element root = doc.getRootElement();
+        Element parent = root.element(DATA).element(SYS).element(SYS_INFO);
+        info[0] = parent.element(SYS_NAME).getText();
+        info[1] = parent.element(PDT_VER).getText();
+        info[2] = parent.element(PLATFORM_VER).getText();
+        info[3] = parent.element(SYS_ID).getText();
+    }
+
+    /**
+     * Parses interface xml reply and creates ports to be updated.
+     */
+    void parseInterfaces() {
+        Document doc;
+        try {
+            doc = DocumentHelper.parseText(xml);
+        } catch (DocumentException e) {
+            throw new IllegalArgumentException(INT_PARSE_ERR);
+        }
+        Element root = doc.getRootElement();
+        Element parent = root.element(DATA).element(IFM).element(IFS);
+        Iterator itr = parent.elementIterator(IF);
+
+        while (itr.hasNext()) {
+            Element ifElement = (Element) itr.next();
+            addPorts(ifElement);
+        }
+    }
+
+    /**
+     * Adds port information to the port list from the xml reply.
+     *
+     * @param ifElement interface element
+     */
+    private void addPorts(Element ifElement) {
+        String ifType = ifElement.element(IF_TYPE).getText();
+
+        if (INTERFACES.contains(ifType)) {
+            Element info = ifElement.element(DYN_INFO);
+            String status = info.element(IF_STAT).getText();
+            String port = getPortNum(ifElement.element(IF_NUM).getText());
+            String speed = info.element(IF_SPEED).getText();
+            String ifName = ifElement.element(IF_NAME).getText();
+
+            boolean isEnabled = false;
+            if (status.equals(UP)) {
+                isEnabled = true;
+            }
+
+            Long portSpeed = 0L;
+            if (!speed.isEmpty()) {
+                portSpeed = Long.valueOf(speed);
+            }
+
+            DefaultAnnotations annotations = DefaultAnnotations.builder()
+                    .set(PORT_NAME, ifName).build();
+            ports.add(new DefaultPortDescription(portNumber(port), isEnabled,
+                                                 COPPER, portSpeed,
+                                                 annotations));
+        }
+    }
+
+    /**
+     * Returns port number from the port name. As many type of port can have
+     * same port number, each port number will be prepended with a incrementing
+     * number to make it unique in the list.
+     *
+     * @param portName port name
+     * @return port number
+     */
+    private String getPortNum(String portName) {
+        String port;
+        if (!portName.contains(DELIMITER)) {
+            portInc++;
+            port = String.valueOf(portInc) + portName;
+        } else if (portName.indexOf(DELIMITER) > 0) {
+            try {
+                port = portName.substring(
+                        portName.lastIndexOf(DELIMITER) + 1);
+                portInc++;
+                port = String.valueOf(portInc) + port;
+            } catch (StringIndexOutOfBoundsException e) {
+                throw new IllegalArgumentException(P_NAME_INVALID);
+            }
+        } else {
+            throw new IllegalArgumentException(P_NAME_INVALID);
+        }
+        return port;
+    }
+}
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
new file mode 100644
index 0000000..918c5fd
--- /dev/null
+++ b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/InsConstructionUtil.java
@@ -0,0 +1,481 @@
+/*
+ * 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.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.DefaultDevice;
+import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.DeviceKeys;
+import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.DefaultL3Vpn;
+import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.L3Vpn;
+import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.l3vpn.DefaultL3Vpncomm;
+import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.l3vpn.L3Vpncomm;
+import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.DefaultL3VpnInstances;
+import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.L3VpnInstances;
+import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.DefaultL3VpnInstance;
+import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.L3VpnInstance;
+import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.L3VpnInstanceKeys;
+import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.l3vpninstance.DefaultVpnInstAfs;
+import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.l3vpninstance.VpnInstAfs;
+import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.l3vpninstance.vpninstafs.DefaultVpnInstAf;
+import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.l3vpninstance.vpninstafs.VpnInstAf;
+import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.l3vpninstance.vpninstafs.vpninstaf.DefaultVpnTargets;
+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.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;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.bgp.l3vpn.rev20160909.ietfbgpl3vpn.routetargetset.rts.RtTypeEnum;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.instance.rev20160623.ietfnetworkinstance.DefaultDevices;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.instance.rev20160623.ietfnetworkinstance.devices.Device;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.instance.rev20160623.ietfnetworkinstance.devices.device.NetworkInstances;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.instance.rev20160623.ietfnetworkinstance.devices.device.networkinstances.DefaultNetworkInstance;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.instance.rev20160623.ietfnetworkinstance.devices.device.networkinstances.NetworkInstance;
+import org.onosproject.yang.model.InnerModelObject;
+import org.onosproject.yang.model.ModelObjectData;
+import org.onosproject.yang.model.ModelObjectId;
+
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+import static org.onosproject.drivers.huawei.DriverUtil.CONS_DEVICES;
+import static org.onosproject.drivers.huawei.DriverUtil.DEVICE_NULL;
+import static org.onosproject.drivers.huawei.DriverUtil.INS_NULL;
+import static org.onosproject.drivers.huawei.DriverUtil.OBJECT_NULL;
+import static org.onosproject.drivers.huawei.DriverUtil.UNSUPPORTED_MODEL_LVL;
+import static org.onosproject.drivers.huawei.DriverUtil.getData;
+import static org.onosproject.drivers.huawei.DriverUtil.getIdFromModId;
+import static org.onosproject.drivers.huawei.DriverUtil.getModObjIdDriDevices;
+import static org.onosproject.drivers.huawei.DriverUtil.getObjFromModData;
+import static org.onosproject.drivers.huawei.ModelIdLevel.DEVICE;
+import static org.onosproject.drivers.huawei.ModelIdLevel.DEVICES;
+import static org.onosproject.drivers.huawei.ModelIdLevel.ROOT;
+import static org.onosproject.yang.gen.v1.l3vpn.comm.type.rev20141225.nel3vpncommtype.L3VpncommonL3VpnPrefixType.of;
+import static org.onosproject.yang.gen.v1.l3vpn.comm.type.rev20141225.nel3vpncommtype.L3VpncommonVrfRtType.fromString;
+import static org.onosproject.yang.gen.v1.l3vpn.comm.type.rev20141225.nel3vpncommtype.l3vpncommonl3vpnprefixtype.L3VpncommonL3VpnPrefixTypeEnum.IPV4UNI;
+import static org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.bgp.l3vpn.rev20160909.ietfbgpl3vpn.routetargetset.rts.RtTypeEnum.BOTH;
+
+/**
+ * Representation of utility for instance creation and deletion.
+ */
+public final class InsConstructionUtil {
+
+    /**
+     * Static constant for route target export.
+     */
+    private static final String EXP_COMM = "export_extcommunity";
+
+    /**
+     * Static constant for route target import.
+     */
+    private static final String IMP_COMM = "import_extcommunity";
+
+    /**
+     * Error message for unsupported RT type.
+     */
+    private static final String UNSUPPORTED_RT_TYPE = "The RT type is not " +
+            "supported";
+
+    // No instantiation.
+    private InsConstructionUtil() {
+    }
+
+    /**
+     * Returns the created model object data of VPN instance of huawei device
+     * from the standard model object data.
+     *
+     * @param modObj     model object data
+     * @param isDevAvail if devices available
+     * @return driver model object data
+     */
+    static ModelObjectData getCreateVpnIns(ModelObjectData modObj,
+                                           boolean isDevAvail) {
+        ModelIdLevel modIdLvl = DEVICE;
+        String id = getIdFromModId(modObj.identifier());
+        Object obj = getObjFromModData(modObj);
+
+        if (obj == null) {
+            throw new IllegalArgumentException(OBJECT_NULL);
+        }
+
+        if (id == null) {
+            id = getDevIdFromRootObj(obj);
+            obj = getObjFromRootObj(obj);
+            if (isDevAvail) {
+                modIdLvl = DEVICES;
+            } else {
+                modIdLvl = ROOT;
+            }
+        } else if (id.equals(CONS_DEVICES)) {
+            modIdLvl = DEVICES;
+            id = ((Device) obj).deviceid();
+            obj = ((Device) obj).networkInstances();
+        }
+        org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi
+                .DefaultDevices devices = getDriverDevices(
+                id, (NetworkInstances) obj);
+        return getCreateModObjData(modIdLvl, id, devices);
+    }
+
+    /**
+     * Returns the driver model object data, according to the levels it has
+     * to be constructed.
+     *
+     * @param modIdLvl model id level
+     * @param devId    device id
+     * @param devices  devices object
+     * @return model object data
+     */
+    private static ModelObjectData getCreateModObjData(ModelIdLevel modIdLvl,
+                                                       String devId,
+                                                       org.onosproject.yang.gen
+                                                               .v1.ne.l3vpn.api
+                                                               .rev20141225
+                                                               .nel3vpnapi
+                                                               .DefaultDevices
+                                                               devices) {
+        ModelObjectId id;
+        List<org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi
+                .devices.Device> devList = devices.device();
+        Iterator<org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi
+                .devices.Device> it = devList.iterator();
+        org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi
+                .devices.Device device = it.next();
+        Iterator<L3VpnInstance> instIt = device.l3Vpn().l3Vpncomm()
+                .l3VpnInstances().l3VpnInstance().iterator();
+        L3VpnInstance ins = instIt.next();
+
+        switch (modIdLvl) {
+
+            case ROOT:
+                return getData(null, devices);
+
+            case DEVICES:
+                id = getModObjIdDriDevices();
+                return getData(id, (InnerModelObject) device);
+
+            case DEVICE:
+                id = getModelObjIdForIns(devId).build();
+                return getData(id, (InnerModelObject) ins);
+
+            default:
+                throw new IllegalArgumentException(UNSUPPORTED_MODEL_LVL);
+        }
+    }
+
+    /**
+     * Returns the devices object of the huawei VPN instance model. This
+     * constructs all the required information in the device for L3VPN
+     * instance creation.
+     *
+     * @param id  device id
+     * @param obj network instances object
+     * @return driver VPN instance's devices
+     */
+    private static org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225
+            .nel3vpnapi.DefaultDevices getDriverDevices(String id,
+                                                        NetworkInstances obj) {
+
+        org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.
+                DefaultDevices devices = new org.onosproject.yang.gen.v1.ne
+                .l3vpn.api.rev20141225.nel3vpnapi.DefaultDevices();
+        org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices
+                .Device device = new org.onosproject.yang.gen.v1.ne.l3vpn.api
+                .rev20141225.nel3vpnapi.devices.DefaultDevice();
+
+        L3Vpn l3Vpn = new DefaultL3Vpn();
+        L3Vpncomm l3VpnComm = new DefaultL3Vpncomm();
+        L3VpnInstances instances = new DefaultL3VpnInstances();
+        L3VpnInstance ins = new DefaultL3VpnInstance();
+        List<L3VpnInstance> insList = new LinkedList<>();
+        List<org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi
+                .devices.Device> devList = new LinkedList<>();
+
+        createDriIns(obj, ins);
+        insList.add(ins);
+        instances.l3VpnInstance(insList);
+        l3VpnComm.l3VpnInstances(instances);
+        l3Vpn.l3Vpncomm(l3VpnComm);
+
+        device.deviceid(id);
+        device.l3Vpn(l3Vpn);
+        devList.add(device);
+        devices.device(devList);
+        return devices;
+    }
+
+    /**
+     * Creates driver instance value from standard device instance.
+     *
+     * @param ins    standard device instance
+     * @param driIns driver instance
+     */
+    private static void createDriIns(NetworkInstances ins,
+                                     L3VpnInstance driIns) {
+        NetworkInstance networkInstance = ins.networkInstance().iterator()
+                .next();
+        driIns.vrfName(networkInstance.name());
+        DefaultAugmentedNiNetworkInstance augIns =
+                ((DefaultNetworkInstance) networkInstance).augmentation(
+                        DefaultAugmentedNiNetworkInstance.class);
+        VpnInstAfs vpnInstAfs = processL3VpnAf(augIns.l3Vpn());
+        driIns.vpnInstAfs(vpnInstAfs);
+    }
+
+    /**
+     * Returns the device id from the root object.
+     *
+     * @param obj root object
+     * @return device id
+     */
+    private static String getDevIdFromRootObj(Object obj) {
+        Device dev = getDevFromRootObj(obj);
+        return dev.deviceid();
+    }
+
+    /**
+     * Returns the first device from the root object. If no device is
+     * present, it returns null.
+     *
+     * @param obj root object
+     * @return device object
+     */
+    private static Device getDevFromRootObj(Object obj) {
+        List<Device> deviceList = ((DefaultDevices) obj).device();
+        Iterator<Device> it = deviceList.iterator();
+        if (it.hasNext()) {
+            return it.next();
+        }
+        throw new IllegalArgumentException(DEVICE_NULL);
+    }
+
+    /**
+     * Returns the network instances object from the root object.
+     *
+     * @param obj root object
+     * @return network instances
+     */
+    private static NetworkInstances getObjFromRootObj(Object obj) {
+        Device dev = getDevFromRootObj(obj);
+        return dev.networkInstances();
+    }
+
+    /**
+     * Returns model object id builder that has to be constructed for driver
+     * instance level addition, with the device id.
+     *
+     * @param id device id
+     * @return model object id
+     */
+    private static ModelObjectId.Builder getModelObjIdForIns(String id) {
+        ModelObjectId.Builder device = getModObjIdDriDevice(id);
+        return device.addChild(DefaultL3Vpn.class)
+                .addChild(DefaultL3Vpncomm.class)
+                .addChild(DefaultL3VpnInstances.class);
+    }
+
+    /**
+     * Processes standard device model L3VPN address family and returns the
+     * driver L3VPN address family.
+     *
+     * @param l3Vpn standard device L3VPN
+     * @return driver address family
+     */
+    private static VpnInstAfs processL3VpnAf(org.onosproject.yang.gen.v1.urn
+                                                     .ietf.params.xml.ns.yang
+                                                     .ietf.bgp.l3vpn.rev20160909
+                                                     .ietfbgpl3vpn.devices
+                                                     .device.networkinstances
+                                                     .networkinstance
+                                                     .augmentedninetworkinstance
+                                                     .L3Vpn l3Vpn) {
+        // TODO: Need to handle the ipv6 case
+        Unicast ipv4Unicast = l3Vpn.ipv4().unicast();
+        VpnInstAfs vpnInstAfs = new DefaultVpnInstAfs();
+        VpnInstAf vpnInstAf = new DefaultVpnInstAf();
+        VpnTargets vpnTargets = new DefaultVpnTargets();
+        List<VpnInstAf> afList = new LinkedList<>();
+
+        vpnInstAf.vrfRd(l3Vpn.routeDistinguisher().config().rd());
+        vpnInstAf.afType(of(IPV4UNI));
+
+        List<Rts> rts = ipv4Unicast.routeTargets().config().rts();
+        addVpnTarget(vpnTargets, rts);
+
+        vpnInstAf.vpnTargets(vpnTargets);
+        afList.add(vpnInstAf);
+        vpnInstAfs.vpnInstAf(afList);
+        return vpnInstAfs;
+    }
+
+    /**
+     * Adds VPN target to the target list from the list of RTs available in
+     * the standard device model.
+     *
+     * @param vpnTgts VPN targets
+     * @param rts     rts
+     */
+    private static void addVpnTarget(VpnTargets vpnTgts, List<Rts> rts) {
+        List<VpnTarget> tgtList = new LinkedList<>();
+        for (Rts rt : rts) {
+            if (rt == null) {
+                continue;
+            }
+            if (rt.rtType() == BOTH) {
+                VpnTarget expTgt = addRt(rt.rt(), EXP_COMM);
+                VpnTarget impTgt = addRt(rt.rt(), IMP_COMM);
+                tgtList.add(expTgt);
+                tgtList.add(impTgt);
+            } else {
+                String rtType = getRtVal(rt.rtType());
+                VpnTarget tgt = addRt(rt.rt(), rtType);
+                tgtList.add(tgt);
+            }
+        }
+        vpnTgts.vpnTarget(tgtList);
+    }
+
+    /**
+     * Returns the RT value according to the RT type available.
+     *
+     * @param type RT type
+     * @return RT value
+     */
+    private static String getRtVal(RtTypeEnum type) {
+        switch (type) {
+
+            case EXPORT:
+                return EXP_COMM;
+
+            case IMPORT:
+                return IMP_COMM;
+
+            default:
+                throw new IllegalArgumentException(UNSUPPORTED_RT_TYPE);
+        }
+    }
+
+    /**
+     * Adds RT to the VPN target with the RT value and RT type.
+     *
+     * @param rt     RT value
+     * @param rtType RT type
+     * @return VPN target
+     */
+    private static VpnTarget addRt(String rt, String rtType) {
+        VpnTarget vpnTarget = new DefaultVpnTarget();
+        vpnTarget.vrfRtvalue(rt);
+        vpnTarget.vrfRttype(fromString(rtType));
+        return vpnTarget;
+    }
+
+    /**
+     * Returns the deletable model object data of VPN instance of huawei device
+     * from the standard model object data.
+     *
+     * @param modObj model object data
+     * @return driver model object data
+     */
+    static Object getDeleteVpnIns(ModelObjectData modObj) {
+        ModelIdLevel modIdLvl = DEVICE;
+        String id = getIdFromModId(modObj.identifier());
+        Object obj = getObjFromModData(modObj);
+
+        if (obj == null) {
+            throw new IllegalArgumentException(OBJECT_NULL);
+        }
+
+        if (id == null) {
+            modIdLvl = ROOT;
+            id = getDevIdFromRootObj(obj);
+            obj = getObjFromRootObj(obj);
+        } else if (id.equals(CONS_DEVICES)) {
+            modIdLvl = DEVICES;
+            id = ((Device) obj).deviceid();
+            obj = ((Device) obj).networkInstances();
+        }
+        List<NetworkInstance> ins = ((NetworkInstances) obj).networkInstance();
+        Iterator<NetworkInstance> it = ins.iterator();
+        NetworkInstance instance;
+        if (it.hasNext()) {
+            instance = it.next();
+        } else {
+            throw new IllegalArgumentException(INS_NULL);
+        }
+        return getDelModObjData(modIdLvl, id, instance.name());
+    }
+
+    /**
+     * Returns the driver model object data for delete, according to the
+     * levels it has to be constructed.
+     *
+     * @param modIdLvl model id level
+     * @param id       device id
+     * @param name     VPN name
+     * @return driver model object data
+     */
+    private static ModelObjectData getDelModObjData(ModelIdLevel modIdLvl,
+                                                    String id, String name) {
+        ModelObjectId modId;
+        switch (modIdLvl) {
+            case ROOT:
+                modId = getModObjIdDriDevices();
+                break;
+
+            case DEVICES:
+                modId = getModObjIdDriDevice(id).build();
+                break;
+
+            case DEVICE:
+                modId = getModObjIdDriVpn(id, name);
+                break;
+
+            default:
+                throw new IllegalArgumentException(UNSUPPORTED_MODEL_LVL);
+        }
+        return getData(modId, null);
+    }
+
+    /**
+     * Returns the model object id, with device id and VPN name.
+     *
+     * @param id   device id
+     * @param name VPN name
+     * @return model object id
+     */
+    private static ModelObjectId getModObjIdDriVpn(String id, String name) {
+        ModelObjectId.Builder ins = getModelObjIdForIns(id);
+        L3VpnInstanceKeys key = new L3VpnInstanceKeys();
+        key.vrfName(name);
+        return ins.addChild(DefaultL3VpnInstance.class, key).build();
+    }
+
+    /**
+     * Returns the model object id builder of the driver with respect to device.
+     *
+     * @param id device id
+     * @return model object id builder
+     */
+    private static ModelObjectId.Builder getModObjIdDriDevice(String id) {
+        DeviceKeys key = new DeviceKeys();
+        key.deviceid(id);
+        return ModelObjectId.builder()
+                .addChild(org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225
+                                  .nel3vpnapi.DefaultDevices.class)
+                .addChild(DefaultDevice.class, key);
+    }
+}
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
new file mode 100644
index 0000000..da4a85c
--- /dev/null
+++ b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/IntConstructionUtil.java
@@ -0,0 +1,238 @@
+/*
+ * 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.l3vpn.comm.type.rev20141225.nel3vpncommtype.Ipv4Address;
+import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.DeviceKeys;
+import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.DefaultL3Vpn;
+import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.l3vpn.DefaultL3Vpncomm;
+import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.DefaultL3VpnInstances;
+import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.DefaultL3VpnInstance;
+import org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.L3VpnInstanceKeys;
+import org.onosproject.yang.gen.v1.ne.l3vpn.comm.rev20141225.nel3vpncomm.l3vpnifs.DefaultL3VpnIfs;
+import org.onosproject.yang.gen.v1.ne.l3vpn.comm.rev20141225.nel3vpncomm.l3vpnifs.L3VpnIfs;
+import org.onosproject.yang.gen.v1.ne.l3vpn.comm.rev20141225.nel3vpncomm.l3vpnifs.l3vpnifs.DefaultL3VpnIf;
+import org.onosproject.yang.gen.v1.ne.l3vpn.comm.rev20141225.nel3vpncomm.l3vpnifs.l3vpnifs.L3VpnIf;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev20140508.ietfinterfaces.DefaultDevices;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev20140508.ietfinterfaces.devices.Device;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev20140508.ietfinterfaces.devices.device.Interfaces;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev20140508.ietfinterfaces.devices.device.interfaces.DefaultYangAutoPrefixInterface;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev20140508.ietfinterfaces.devices.device.interfaces.YangAutoPrefixInterface;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.Ipv4;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.ipv4.Address;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.ipv4.address.subnet.PrefixLength;
+import org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.network.instance.rev20160623.ietfnetworkinstance.devices.device.interfaces.yangautoprefixinterface.DefaultAugmentedIfInterface;
+import org.onosproject.yang.model.InnerModelObject;
+import org.onosproject.yang.model.ModelObjectData;
+import org.onosproject.yang.model.ModelObjectId;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+import static org.onosproject.drivers.huawei.DriverUtil.DEVICE_NULL;
+import static org.onosproject.drivers.huawei.DriverUtil.OBJECT_NULL;
+import static org.onosproject.drivers.huawei.DriverUtil.getData;
+import static org.onosproject.drivers.huawei.DriverUtil.getIdFromModId;
+import static org.onosproject.drivers.huawei.DriverUtil.getObjFromModData;
+import static org.onosproject.yang.gen.v1.l3vpn.comm.type.rev20141225.nel3vpncommtype.Ipv4Address.fromString;
+
+/**
+ * Representation of utility for interface creation and deletion.
+ */
+public final class IntConstructionUtil {
+
+    /**
+     * Error message for illegal length of mask.
+     */
+    private static final String ILLEGAL_MASK_LENGTH = "Illegal length of mask" +
+            " is not allowed.";
+
+    // No instantiation.
+    private IntConstructionUtil() {
+    }
+
+    /**
+     * Returns the created model object data of VPN bounded interface of huawei
+     * device from the standard model object data.
+     *
+     * @param modObj model object data
+     * @return driver interface model object data
+     */
+    static ModelObjectData getCreateInt(ModelObjectData modObj) {
+        boolean isModIdAvail = true;
+        String id = getIdFromModId(modObj.identifier());
+        Object obj = getObjFromModData(modObj);
+        if (id == null) {
+            isModIdAvail = false;
+            id = getIdFromRootObj(obj);
+            obj = getObjFromDevObj(obj);
+        }
+        if (obj == null) {
+            throw new IllegalArgumentException(OBJECT_NULL);
+        }
+        List<YangAutoPrefixInterface> intList = ((Interfaces) obj)
+                .yangAutoPrefixInterface();
+        YangAutoPrefixInterface l3Int = intList.get(0);
+        DefaultAugmentedIfInterface ifInt =
+                ((DefaultYangAutoPrefixInterface) l3Int).augmentation(
+                        DefaultAugmentedIfInterface.class);
+        String insName = ifInt.bindNetworkInstanceName();
+        L3VpnIfs l3VpnIfs = getDriverInterfaces(l3Int);
+        return getDriModObj(id, insName, l3VpnIfs, isModIdAvail);
+    }
+
+    /**
+     * Returns the driver model object data, according to the levels it has
+     * to be constructed.
+     *
+     * @param id           device id
+     * @param insName      VPN name
+     * @param l3VpnIfs     driver VPN if object
+     * @param isModIdAvail model id availability
+     * @return driver model object data
+     */
+    private static ModelObjectData getDriModObj(String id, String insName,
+                                                L3VpnIfs l3VpnIfs,
+                                                boolean isModIdAvail) {
+        List<L3VpnIf> intList = l3VpnIfs.l3VpnIf();
+        Iterator<L3VpnIf> it = intList.iterator();
+        L3VpnIf l3VpnIf = it.next();
+        ModelObjectData data;
+        ModelObjectId.Builder objId = getModIdBuilder(id, insName);
+        if (isModIdAvail) {
+            objId.addChild(DefaultL3VpnIfs.class);
+            data = getData(objId.build(), (InnerModelObject) l3VpnIf);
+        } else {
+            data = getData(objId.build(), (InnerModelObject) l3VpnIfs);
+        }
+        return data;
+    }
+
+    private static ModelObjectId.Builder getModIdBuilder(String id,
+                                                         String vpnName) {
+        DeviceKeys key = new DeviceKeys();
+        key.deviceid(id);
+        L3VpnInstanceKeys insKey = new L3VpnInstanceKeys();
+        insKey.vrfName(vpnName);
+        return ModelObjectId.builder()
+                .addChild(org.onosproject.yang.gen.v1.ne.l3vpn.api.rev20141225
+                                  .nel3vpnapi.DefaultDevices.class)
+                .addChild(org.onosproject.yang.gen.v1.ne.l3vpn.api
+                                  .rev20141225.nel3vpnapi.devices
+                                  .DefaultDevice.class, key)
+                .addChild(DefaultL3Vpn.class)
+                .addChild(DefaultL3Vpncomm.class)
+                .addChild(DefaultL3VpnInstances.class)
+                .addChild(DefaultL3VpnInstance.class, insKey);
+    }
+
+    /**
+     * Returns the driver interfaces from the standard device model interfaces.
+     *
+     * @param ifs standard device model interfaces
+     * @return driver interfaces
+     */
+    private static L3VpnIfs getDriverInterfaces(YangAutoPrefixInterface ifs) {
+        L3VpnIfs l3VpnIfs = new DefaultL3VpnIfs();
+        L3VpnIf l3VpnIf = new DefaultL3VpnIf();
+        List<L3VpnIf> l3VpnIfList = new LinkedList<>();
+        l3VpnIf.ifName(ifs.name());
+        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.ip
+                .rev20140616.ietfip.devices.device.interfaces
+                .yangautoprefixinterface.DefaultAugmentedIfInterface ipAug =
+                ((DefaultYangAutoPrefixInterface) ifs).augmentation(
+                        org.onosproject.yang.gen.v1.urn.ietf.params.xml.ns.yang
+                                .ietf.ip.rev20140616.ietfip.devices.device
+                                .interfaces.yangautoprefixinterface
+                                .DefaultAugmentedIfInterface.class);
+
+        if (ipAug != null && ipAug.ipv4() != null) {
+            Ipv4 ipAddress = ipAug.ipv4();
+            for (Address add : ipAddress.address()) {
+                Ipv4Address v4Add = fromString(add.ip().ipv4Address()
+                                                       .toString());
+                Ipv4Address subnet = fromString(getSubnet(
+                        ((PrefixLength) add.subnet()).prefixLength()));
+                l3VpnIf.ipv4Addr(v4Add);
+                l3VpnIf.subnetMask(subnet);
+            }
+        }
+        l3VpnIfList.add(l3VpnIf);
+        l3VpnIfs.l3VpnIf(l3VpnIfList);
+        return l3VpnIfs;
+    }
+
+    /**
+     * Returns the device id from the root object.
+     *
+     * @param obj root object
+     * @return device id
+     */
+    private static String getIdFromRootObj(Object obj) {
+        Device dev = getDevFromRootObj(obj);
+        return dev.deviceid();
+    }
+
+    /**
+     * Returns the device from the root object.
+     *
+     * @param obj root object
+     * @return device object
+     */
+    private static Device getDevFromRootObj(Object obj) {
+        List<Device> deviceList = ((DefaultDevices) obj).device();
+        Iterator<Device> it = deviceList.iterator();
+        if (it.hasNext()) {
+            return it.next();
+        }
+        throw new IllegalArgumentException(DEVICE_NULL);
+    }
+
+    /**
+     * Returns the interfaces object from the root object.
+     *
+     * @param obj root object
+     * @return interfaces object
+     */
+    private static Interfaces getObjFromDevObj(Object obj) {
+        Device dev = getDevFromRootObj(obj);
+        return dev.interfaces();
+    }
+
+    /**
+     * Returns the subnet address from the mask value.
+     *
+     * @param mask mask value
+     * @return subnet address
+     */
+    private static String getSubnet(short mask) {
+        int value = 0xffffffff << (32 - mask);
+        byte[] bytes = new byte[]{
+                (byte) (value >>> 24), (byte) (value >> 16 & 0xff),
+                (byte) (value >> 8 & 0xff), (byte) (value & 0xff)};
+        InetAddress netAdd;
+        try {
+            netAdd = InetAddress.getByAddress(bytes);
+        } catch (UnknownHostException e) {
+            throw new IllegalArgumentException(ILLEGAL_MASK_LENGTH);
+        }
+        return netAdd.getHostAddress();
+    }
+}
diff --git a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/ModelIdLevel.java b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/ModelIdLevel.java
new file mode 100644
index 0000000..4802660
--- /dev/null
+++ b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/ModelIdLevel.java
@@ -0,0 +1,38 @@
+/*
+ * 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;
+
+/**
+ * Represents the model id level of the VPN instance.
+ */
+public enum ModelIdLevel {
+
+    /**
+     * Requested model id level is not present, representing top node.
+     */
+    ROOT,
+
+    /**
+     * Requested model id level is devices container.
+     */
+    DEVICE,
+
+    /**
+     * Requested model id level is device list.
+     */
+    DEVICES
+}
diff --git a/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/package-info.java b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/package-info.java
new file mode 100644
index 0000000..2b4e8d0
--- /dev/null
+++ b/drivers/huawei/driver/src/main/java/org/onosproject/drivers/huawei/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * 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 for Huawei device drivers.
+ */
+package org.onosproject.drivers.huawei;
\ No newline at end of file
diff --git a/drivers/huawei/driver/src/main/resources/huawei-drivers.xml b/drivers/huawei/driver/src/main/resources/huawei-drivers.xml
new file mode 100644
index 0000000..ea6ec48
--- /dev/null
+++ b/drivers/huawei/driver/src/main/resources/huawei-drivers.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+<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.device.DeviceDescriptionDiscovery"
+                   impl="org.onosproject.drivers.huawei.HuaweiDeviceDescription"/>
+    </driver>
+</drivers>
diff --git a/drivers/huawei/pom.xml b/drivers/huawei/pom.xml
new file mode 100644
index 0000000..b8ae78e
--- /dev/null
+++ b/drivers/huawei/pom.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         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>
+
+    <parent>
+        <groupId>org.onosproject</groupId>
+        <artifactId>onos-drivers-general</artifactId>
+        <version>1.10.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>onos-drivers-huawei</artifactId>
+    <packaging>pom</packaging>
+
+    <modules>
+        <module>driver</module>
+        <module>yangmodel</module>
+    </modules>
+
+    <description>L3VPN YANG Application</description>
+</project>
diff --git a/drivers/huawei/yangmodel/BUCK b/drivers/huawei/yangmodel/BUCK
new file mode 100644
index 0000000..e69ca9d
--- /dev/null
+++ b/drivers/huawei/yangmodel/BUCK
@@ -0,0 +1,13 @@
+COMPILE_DEPS = [
+  '//lib:CORE_DEPS',
+  '//lib:onos-yang-model',
+]
+
+yang_osgi_jar(
+  deps = COMPILE_DEPS,
+  name = 'onos-drivers-huawei-yangmodel',
+  srcs = glob(['src/main/**/*.yang']),
+  visibility = [
+    'PUBLIC'
+  ],
+)
\ No newline at end of file
diff --git a/drivers/huawei/yangmodel/pom.xml b/drivers/huawei/yangmodel/pom.xml
new file mode 100644
index 0000000..ca28572
--- /dev/null
+++ b/drivers/huawei/yangmodel/pom.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ 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.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         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>
+        <artifactId>onos-drivers-huawei</artifactId>
+        <version>1.10.0-SNAPSHOT</version>
+        <relativePath>../pom.xml</relativePath>
+    </parent>
+
+    <artifactId>onos-drivers-huawei-yangmodel</artifactId>
+    <packaging>bundle</packaging>
+
+    <description>Huawei L3VPN YANG model</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>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.7</source>
+                    <target>1.7</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
diff --git a/drivers/huawei/yangmodel/src/main/yang/ne-bgpcomm-type.yang b/drivers/huawei/yangmodel/src/main/yang/ne-bgpcomm-type.yang
new file mode 100644
index 0000000..28f98e4
--- /dev/null
+++ b/drivers/huawei/yangmodel/src/main/yang/ne-bgpcomm-type.yang
@@ -0,0 +1,115 @@
+/*
+WARNING:
+This yang model is just for fuction ONOS opensource project demo purpose only,
+And is subject to change in future, Huawei does not commit provide compatibilty
+in commercial product.
+*/
+module ne-bgpcomm-type {
+    namespace "ne-bgpcomm-type";
+    prefix bgpcomm-type;
+    organization "Huawei Technologies Co., Ltd";
+    contact "Huawei Industrial Base
+     Bantian, Longgang
+     Shenzhen 518129
+     People's Republic of China
+     Website: http://www.huawei.com
+     Email: support@huawei.com";
+    description "ne-bgpcomm-type yang";
+    revision "2014-12-25" {
+        description "Initial version";
+    }
+    typedef bgpcommImRouteProtocol {
+        type enumeration {
+            enum "direct" {
+                value 0;
+                description "direct:";
+            }
+            enum "ospf" {
+                value 1;
+                description "ospf:";
+            }
+            enum "isis" {
+                value 2;
+                description "isis:";
+            }
+            enum "static" {
+                value 3;
+                description "static:";
+            }
+            enum "rip" {
+                value 4;
+                description "rip:";
+            }
+            enum "ospfv3" {
+                value 5;
+                description "ospfv3:";
+            }
+            enum "ripng" {
+                value 6;
+                description "ripng:";
+            }
+            enum "unr" {
+                value 7;
+                description "unr:";
+            }
+            enum "op-route" {
+                value 8;
+                description "op-route:";
+            }
+        }
+        description "";
+    }
+    typedef bgpcommPrefixType {
+        type enumeration {
+            enum "ipv4uni" {
+                value 0;
+                description "ipv4uni:";
+            }
+            enum "ipv4multi" {
+                value 1;
+                description "ipv4multi:";
+            }
+            enum "ipv4vpn" {
+                value 2;
+                description "ipv4vpn:";
+            }
+            enum "ipv6uni" {
+                value 3;
+                description "ipv6uni:";
+            }
+            enum "ipv6vpn" {
+                value 4;
+                description "ipv6vpn:";
+            }
+            enum "ipv4flow" {
+                value 5;
+                description "ipv4flow:";
+            }
+            enum "l2vpnad" {
+                value 6;
+                description "l2vpnad:";
+            }
+            enum "mvpn" {
+                value 7;
+                description "mvpn:";
+            }
+            enum "evpn" {
+                value 8;
+                description "evpn:";
+            }
+            enum "ipv4vpnmcast" {
+                value 9;
+                description "ipv4vpnmcast:";
+            }
+            enum "ls" {
+                value 10;
+                description "ls:";
+            }
+            enum "mdt" {
+                value 11;
+                description "mdt:";
+            }
+        }
+        description "";
+    }
+}
diff --git a/drivers/huawei/yangmodel/src/main/yang/ne-bgpcomm.yang b/drivers/huawei/yangmodel/src/main/yang/ne-bgpcomm.yang
new file mode 100644
index 0000000..b0bb113
--- /dev/null
+++ b/drivers/huawei/yangmodel/src/main/yang/ne-bgpcomm.yang
@@ -0,0 +1,77 @@
+/*
+WARNING:
+This yang model is just for fuction ONOS opensource project demo purpose only,
+And is subject to change in future, Huawei does not commit provide compatibilty
+in commercial product.
+*/
+module ne-bgpcomm {
+    namespace "ne-bgpcomm";
+    prefix bgpcomm;
+    import ne-bgpcomm-type {
+        prefix bgpcomm-type;
+    }
+    organization "Huawei Technologies Co., Ltd";
+    contact "Huawei Industrial Base
+     Bantian, Longgang
+     Shenzhen 518129
+     People's Republic of China
+     Website: http://www.huawei.com
+     Email: support@huawei.com";
+    description "ne-bgpcomm yang";
+    revision "2014-12-25" {
+        description "Initial version";
+    }
+
+    container devices {
+        list device {
+            key deviceid;
+            leaf deviceid {
+                type string;
+            }
+            container bgp {
+                container bgpcomm {
+                    description "";
+                    container bgpVrfs {
+                        description "";
+                        list bgpVrf {
+                            key "vrfName";
+                            description "BGP instance class";
+                            leaf vrfName {
+                                description "Specifies the name of the VPN in stance.
+                                It is a string of 1 to 31 case-sensitive characters.";
+                                type string;
+                            }
+                            container bgpVrfAFs {
+                                description "";
+                                list bgpVrfAF {
+                                    key "afType";
+                                    description "IPv4 unicast Address family class for
+                                    BGP instance";
+                                    leaf afType {
+                                        type "bgpcomm-type:bgpcommPrefixType";
+                                        description "Address family";
+                                    }
+                                    container importRoutes {
+                                        description "";
+                                        list importRoute {
+                                            key "importProtocol importProcessId";
+                                            description "Import route class";
+                                            leaf importProtocol {
+                                                type "bgpcomm-type:bgpcommImRouteProtocol";
+                                                description "Specifies the protocol from
+                                                which routes are imported.";
+                                            }
+                                            leaf importProcessId {
+                                                type "string";
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/drivers/huawei/yangmodel/src/main/yang/ne-l3vpn-api.yang b/drivers/huawei/yangmodel/src/main/yang/ne-l3vpn-api.yang
new file mode 100644
index 0000000..5b0181c
--- /dev/null
+++ b/drivers/huawei/yangmodel/src/main/yang/ne-l3vpn-api.yang
@@ -0,0 +1,82 @@
+/*
+WARNING:
+This yang model is just for fuction ONOS opensource project demo purpose only,
+And is subject to change in future, Huawei does not commit provide compatibilty
+in commercial product.
+*/
+module ne-l3vpn-api {
+    namespace "ne-l3vpn-api";
+    prefix l3vpn-api;
+    import ne-l3vpncomm-type {
+        prefix l3vpncomm-type;
+    }
+    import ne-l3vpncomm {
+        prefix l3vpncomm;
+    }
+    organization "Huawei Technologies Co., Ltd";
+    contact "Huawei Industrial Base
+        Bantian, Longgang
+        Shenzhen 518129
+        People's Republic of China
+        Website: http://www.huawei.com
+        Email: support@huawei.com";
+    description "VRP V800R010 Schema";
+    revision "2014-12-25" {
+        reference "Huawei VRPV8 Schema";
+    }
+    container devices {
+        list device {
+            key deviceid;
+            leaf deviceid {
+                type string;
+            }
+            container l3vpn {
+                container l3vpncomm {
+                    container l3vpnInstances {
+                    description "";
+                        list l3vpnInstance {
+                            key "vrfName";
+                            leaf vrfName {
+                                type string;
+                            }
+                            leaf vrfDescription {
+                                type string;
+                            }
+                            uses l3vpncomm:l3vpnIfs;
+                            container vpnInstAFs {
+                                description "";
+                                list vpnInstAF {
+                                    key "afType";
+                                    description "Address family";
+                                    leaf afType {
+                                        type "l3vpncomm-type:l3vpncommonL3vpnPrefixType";
+                                        description "Address family";
+                                    }
+                                    leaf vrfRD {
+                                        when "vrfName != '_public_'";
+                                        type "string";
+                                        description "route-distinguisher.";
+                                    }
+                                    container vpnTargets {
+                                        description "";
+                                        list vpnTarget {
+                                            must "vrfName != '_public_' and vpnTarget = '0'";
+                                            key "vrfRTValue vrfRTType";
+                                            description "L3vpn vpntarget configure class";
+                                            leaf vrfRTValue {
+                                                type "string";
+                                            }
+                                            leaf vrfRTType {
+                                                type "l3vpncomm-type:l3vpncommonVrfRtType";
+                                            }
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/drivers/huawei/yangmodel/src/main/yang/ne-l3vpncomm-type.yang b/drivers/huawei/yangmodel/src/main/yang/ne-l3vpncomm-type.yang
new file mode 100644
index 0000000..3e4e10c
--- /dev/null
+++ b/drivers/huawei/yangmodel/src/main/yang/ne-l3vpncomm-type.yang
@@ -0,0 +1,54 @@
+/*
+WARNING:
+This yang model is just for fuction ONOS opensource project demo purpose only,
+And is subject to change in future, Huawei does not commit provide compatibilty
+in commercial product.
+*/
+module ne-l3vpncomm-type {
+    namespace "l3vpn-comm-type";
+    prefix l3vpncomm-type;
+    organization "Huawei Technologies Co., Ltd";
+    contact "Huawei Industrial Base
+        Bantian, Longgang
+        Shenzhen 518129
+        People's Republic of China
+        Website: http://www.huawei.com
+        Email: support@huawei.com";
+    description "";
+    revision "2014-12-25" {
+        description "Initial version";
+    }
+    typedef l3vpncommonL3vpnPrefixType {
+        type enumeration {
+            enum "ipv4uni" {
+                value 0;
+                description "ipv4uni:";
+            }
+            enum "ipv6uni" {
+                value 1;
+                description "ipv6uni:";
+            }
+        }
+        description "";
+        }
+        typedef l3vpncommonVrfRtType {
+            type enumeration {
+                enum "export_extcommunity" {
+                    value 0;
+                    description "export-extcommunity:";
+                }
+                enum "import_extcommunity" {
+                    value 1;
+                    description "import-extcommunity:";
+                }
+            }
+            description "";
+        }
+        typedef ipv4Address {
+        type string {
+            length "0..255";
+            pattern "((([1-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}
+            ([1-9]?[0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]))";
+        }
+    }
+}
diff --git a/drivers/huawei/yangmodel/src/main/yang/ne-l3vpncomm.yang b/drivers/huawei/yangmodel/src/main/yang/ne-l3vpncomm.yang
new file mode 100644
index 0000000..b03c382
--- /dev/null
+++ b/drivers/huawei/yangmodel/src/main/yang/ne-l3vpncomm.yang
@@ -0,0 +1,49 @@
+/*
+WARNING:
+This yang model is just for fuction ONOS opensource project demo purpose only,
+And is subject to change in future, Huawei does not commit provide compatibilty
+in commercial product.
+*/
+module ne-l3vpncomm {
+    namespace "ne-l3vpn-comm";
+    prefix "l3vpncomm";
+    import ne-l3vpncomm-type {
+        prefix l3vpncomm-type;
+    }
+    organization "Huawei Technologies Co., Ltd";
+    contact "Huawei Industrial Base
+        Bantian, Longgang
+        Shenzhen 518129
+        People's Republic of China
+        Website: http://www.huawei.com
+        Email: support@huawei.com";
+    description "";
+    revision "2014-12-25" {
+        description "Initial version";
+    }
+    grouping l3vpnIfs {
+        container l3vpnIfs {
+        description "";
+            list l3vpnIf {
+                key "ifName";
+                description "interface Name.";
+                leaf ifName {
+                    type string;
+                    description "interface Name";
+                }
+                leaf ipv4Addr {
+                    when "subnetMask != null";
+                    mandatory "true";
+                    type "l3vpncomm-type:ipv4Address";
+                    description "Interface Address.";
+                }
+                leaf subnetMask {
+                    when "ipv4Addr != null";
+                    mandatory "true";
+                    type "l3vpncomm-type:ipv4Address";
+                    description "Interface address mask.";
+                }
+            }
+        }
+    }
+}
diff --git a/drivers/pom.xml b/drivers/pom.xml
index 5e73f4c..f68076b 100644
--- a/drivers/pom.xml
+++ b/drivers/pom.xml
@@ -48,6 +48,7 @@
         <module>juniper</module>
         <module>lisp</module>
         <module>flowspec</module>
+        <module>huawei</module>
     </modules>
 
     <!--<properties>
diff --git a/modules.defs b/modules.defs
index 161bd25..7c19b40 100644
--- a/modules.defs
+++ b/modules.defs
@@ -95,6 +95,7 @@
     '//drivers/juniper:onos-drivers-juniper-oar',
     '//drivers/lisp:onos-drivers-lisp-oar',
     '//drivers/flowspec:onos-drivers-flowspec-oar',
+    '//drivers/huawei:onos-drivers-huawei-oar',
 ]
 
 ONOS_PROVIDERS = [
