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>
