[ONOS-6199] Huawei driver create and instance delete.

Change-Id: I61e1a8518e9bd2a1a5ed9430052a3e6d3233f148
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 = [