diff --git a/drivers/huawei/BUILD b/drivers/huawei/BUILD
deleted file mode 100644
index bb473bc..0000000
--- a/drivers/huawei/BUILD
+++ /dev/null
@@ -1,45 +0,0 @@
-COMPILE_DEPS = CORE_DEPS + ONOS_YANG + [
-    "@onos_yang_runtime//jar",
-    "//models/l3vpn:onos-models-l3vpn",
-    "//models/huawei:onos-models-huawei",
-    "//drivers/utilities:onos-drivers-utilities",
-    "//protocols/netconf/api:onos-protocols-netconf-api",
-    "//apps/l3vpn:onos-apps-l3vpn",
-    "//apps/config:onos-apps-config",
-    "//apps/yang:onos-apps-yang",
-    "//models/common:onos-models-common",
-]
-
-APPS = [
-    "org.onosproject.yang",
-    "org.onosproject.yang-gui",
-    "org.onosproject.config",
-    "org.onosproject.restconf",
-    "org.onosproject.protocols.restconfserver",
-    "org.onosproject.netconf",
-    "org.onosproject.netconfsb",
-    "org.onosproject.models.common",
-    "org.onosproject.models.l3vpn",
-    "org.onosproject.l3vpn",
-    "org.onosproject.models.huawei",
-]
-
-TEST_DEPS = TEST_ADAPTERS + [
-    "//utils/osgi:onlab-osgi-tests",
-]
-
-osgi_jar_with_tests(
-    resources = glob(["src/main/resources/**"]),
-    resources_root = "src/main/resources",
-    test_deps = TEST_DEPS,
-    deps = COMPILE_DEPS,
-)
-
-onos_app(
-    app_name = "org.onosproject.drivers.huawei",
-    category = "Drivers",
-    description = "Adds support for Huawei devices.",
-    required_apps = APPS,
-    title = "Huawei Drivers",
-    url = "http://onosproject.org",
-)
diff --git a/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/BgpConstructionUtil.java b/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/BgpConstructionUtil.java
deleted file mode 100644
index b385252..0000000
--- a/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/BgpConstructionUtil.java
+++ /dev/null
@@ -1,441 +0,0 @@
-/*
- * Copyright 2017-present Open Networking Foundation
- *
- * 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.ModelIdLevel;
-import org.onosproject.l3vpn.netl3vpn.ProtocolInfo;
-import org.onosproject.l3vpn.netl3vpn.RouteProtocol;
-import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.DefaultDevices;
-import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.Devices;
-import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.DefaultDevice;
-import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.Device;
-import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.DeviceKeys;
-import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.Bgp;
-import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.DefaultBgp;
-import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.Bgpcomm;
-import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.DefaultBgpcomm;
-import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.BgpVrfs;
-import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.DefaultBgpVrfs;
-import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.BgpVrf;
-import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.BgpVrfKeys;
-import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.DefaultBgpVrf;
-import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.BgpVrfAfs;
-import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.DefaultBgpVrfAfs;
-import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.BgpVrfAf;
-import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.BgpVrfAfKeys;
-import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.DefaultBgpVrfAf;
-import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.bgpvrfaf.DefaultImportRoutes;
-import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.bgpvrfaf.ImportRoutes;
-import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.bgpvrfaf.importroutes.DefaultImportRoute;
-import org.onosproject.yang.gen.v1.nebgpcomm.rev20141225.nebgpcomm.devices.device.bgp.bgpcomm.bgpvrfs.bgpvrf.bgpvrfafs.bgpvrfaf.importroutes.ImportRoute;
-import org.onosproject.yang.gen.v1.nebgpcommtype.rev20141225.nebgpcommtype.BgpcommImRouteProtocol;
-import org.onosproject.yang.gen.v1.nebgpcommtype.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.nebgpcommtype.rev20141225.nebgpcommtype.BgpcommPrefixType.of;
-import static org.onosproject.yang.gen.v1.nebgpcommtype.rev20141225.nebgpcommtype.bgpcommimrouteprotocol.BgpcommImRouteProtocolEnum.DIRECT;
-import static org.onosproject.yang.gen.v1.nebgpcommtype.rev20141225.nebgpcommtype.bgpcommimrouteprotocol.BgpcommImRouteProtocolEnum.OSPF;
-import static org.onosproject.yang.gen.v1.nebgpcommtype.rev20141225.nebgpcommtype.bgpcommimrouteprotocol.BgpcommImRouteProtocolEnum.RIP;
-import static org.onosproject.yang.gen.v1.nebgpcommtype.rev20141225.nebgpcommtype.bgpcommimrouteprotocol.BgpcommImRouteProtocolEnum.RIPNG;
-import static org.onosproject.yang.gen.v1.nebgpcommtype.rev20141225.nebgpcommtype.bgpcommimrouteprotocol.BgpcommImRouteProtocolEnum.STATIC;
-import static org.onosproject.yang.gen.v1.nebgpcommtype.rev20141225.nebgpcommtype.bgpcommprefixtype.BgpcommPrefixTypeEnum.IPV4UNI;
-import static org.onosproject.yang.gen.v1.nebgpcommtype.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();
-        ModelIdLevel 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();
-        ImportRoute route = addRouteProtocol(proMap, bgpVrfAfs);
-
-        bgpVrf.bgpVrfAfs(bgpVrfAfs);
-        bgpVrfList.add(bgpVrf);
-        bgpVrfs.bgpVrf(bgpVrfList);
-        bgpBuilder.bgpVrfs(bgpVrfs);
-        bgp.bgpcomm(bgpBuilder);
-        return getModObjData(modIdLevel, bgp, devId, bgpVrf, route);
-    }
-
-    /**
-     * Adds route protocol from the standard device model to the BGP address
-     * family respectively.
-     * //TODO: IPV6 has to be handled.
-     *
-     * @param proMap    protocol map
-     * @param bgpVrfAfs BGP address family
-     * @return import route
-     */
-    private static ImportRoute addRouteProtocol(Map<RouteProtocol, ProtocolInfo> proMap,
-                                                BgpVrfAfs bgpVrfAfs) {
-        BgpVrfAf ipv4 = new DefaultBgpVrfAf();
-        ImportRoutes ipv4Routes = new DefaultImportRoutes();
-        ipv4.afType(of(IPV4UNI));
-
-        ImportRoute route = null;
-
-        BgpVrfAf ipv6 = new DefaultBgpVrfAf();
-        ImportRoutes ipv6Routes = new DefaultImportRoutes();
-        ipv6.afType(of(IPV6UNI));
-        for (Map.Entry<RouteProtocol, ProtocolInfo> info : proMap.entrySet()) {
-            RouteProtocol protocol = info.getKey();
-            ProtocolInfo proInfo = info.getValue();
-            if (proInfo.isIpv4Af()) {
-                route = 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);
-        }
-        return route;
-    }
-
-    /**
-     * 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
-     * @return import route object
-     */
-    private static ImportRoute addImportRoute(ImportRoutes routes,
-                                              ProtocolInfo proInfo,
-                                              RouteProtocol protocol) {
-        List<ImportRoute> routeList = new LinkedList<>();
-        ImportRoute route = buildAfBgp(proInfo, protocol);
-        routeList.add(route);
-        routes.importRoute(routeList);
-        return route;
-    }
-
-    /**
-     * 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
-     * @param route      import route object
-     * @return model object data
-     */
-    public static ModelObjectData getModObjData(ModelIdLevel modIdLevel,
-                                                Bgp bgp, String devId,
-                                                BgpVrf bgpVrf, ImportRoute route) {
-        switch (modIdLevel) {
-
-            case VPN:
-                return getRouteProModObj(bgpVrf.vrfName(), route, devId);
-
-            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 model object data of route protocol.
-     *
-     * @param vpnName VPN name
-     * @param route   import route
-     * @param devId   device id
-     * @return model object data
-     */
-    private static ModelObjectData getRouteProModObj(String vpnName,
-                                                     ImportRoute route,
-                                                     String devId) {
-        DeviceKeys key = new DeviceKeys();
-        key.deviceid(devId);
-        BgpVrfKeys vpnKey = new BgpVrfKeys();
-        vpnKey.vrfName(vpnName);
-        BgpVrfAfKeys afKey = new BgpVrfAfKeys();
-        afKey.afType(of(IPV4UNI));
-        ModelObjectId id = ModelObjectId.builder()
-                .addChild(DefaultDevices.class)
-                .addChild(DefaultDevice.class, key)
-                .addChild(DefaultBgp.class)
-                .addChild(DefaultBgpcomm.class)
-                .addChild(DefaultBgpVrfs.class)
-                .addChild(DefaultBgpVrf.class, vpnKey)
-                .addChild(DefaultBgpVrfAfs.class)
-                .addChild(DefaultBgpVrfAf.class, afKey)
-                .addChild(DefaultImportRoutes.class).build();
-        return getData(id, (InnerModelObject) route);
-    }
-
-    /**
-     * Returns the driver model object data with device in model object id,
-     * till BGP VRF.
-     *
-     * @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;
-    }
-
-    /**
-     * Returns the BGP model object data for deletion.
-     *
-     * @param bgpInfo   BGP info
-     * @param bgpConfig BGP driver config
-     * @return model object data
-     */
-    static ModelObjectData getDeleteBgp(BgpInfo bgpInfo,
-                                        BgpDriverInfo bgpConfig) {
-        ModelIdLevel modIdLvl = bgpConfig.modIdLevel();
-        switch (modIdLvl) {
-            case ROOT:
-                return getDelRootModObj();
-
-            case DEVICES:
-                return getDelDevicesModObj(bgpConfig.devId());
-
-            case DEVICE:
-                return getDelDeviceModObj(bgpConfig.devId(), bgpInfo.vpnName());
-
-            default:
-                throw new IllegalArgumentException(UNSUPPORTED_MODEL_LVL);
-        }
-    }
-
-    /**
-     * Returns the model object data with respect to device level.
-     *
-     * @param devId   device id
-     * @param vpnName VPN name
-     * @return model object data
-     */
-    private static ModelObjectData getDelDeviceModObj(String devId,
-                                                      String vpnName) {
-        DeviceKeys devKeys = new DeviceKeys();
-        devKeys.deviceid(devId);
-        BgpVrfKeys vpnKey = new BgpVrfKeys();
-        vpnKey.vrfName(vpnName);
-        ModelObjectId modelId = ModelObjectId.builder()
-                .addChild(DefaultDevices.class)
-                .addChild(DefaultDevice.class, devKeys)
-                .addChild(DefaultBgp.class)
-                .addChild(DefaultBgpcomm.class)
-                .addChild(DefaultBgpVrfs.class)
-                .addChild(DefaultBgpVrf.class, vpnKey).build();
-        DefaultBgpVrfAfs afs = new DefaultBgpVrfAfs();
-        return getData(modelId, afs);
-    }
-
-    /**
-     * Returns the model object data with respect to root level.
-     *
-     * @return model object data
-     */
-    private static ModelObjectData getDelRootModObj() {
-        DefaultDevice device = new DefaultDevice();
-        ModelObjectId modelId = ModelObjectId.builder().addChild(
-                DefaultDevices.class).build();
-        return getData(modelId, device);
-    }
-
-    /**
-     * Returns the model object data for devices level.
-     *
-     * @param id device id
-     * @return model object data
-     */
-    private static ModelObjectData getDelDevicesModObj(String id) {
-        DeviceKeys devKeys = new DeviceKeys();
-        devKeys.deviceid(id);
-        ModelObjectId modelId = ModelObjectId.builder()
-                .addChild(DefaultDevices.class)
-                .addChild(DefaultDevice.class, devKeys).build();
-        DefaultBgp bgp = new DefaultBgp();
-        return getData(modelId, bgp);
-    }
-}
diff --git a/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/DriverUtil.java b/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/DriverUtil.java
deleted file mode 100644
index b7b0fae..0000000
--- a/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/DriverUtil.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * Copyright 2017-present Open Networking Foundation
- *
- * 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.nel3vpnapi.rev20141225.nel3vpnapi.DefaultDevices;
-import org.onosproject.yang.gen.v1.ietfinterfaces.rev20140508.ietfinterfaces.devices.DeviceKeys;
-import org.onosproject.yang.model.AtomicPath;
-import org.onosproject.yang.model.DefaultModelObjectData;
-import org.onosproject.yang.model.InnerModelObject;
-import org.onosproject.yang.model.KeyInfo;
-import org.onosproject.yang.model.ModelObject;
-import org.onosproject.yang.model.ModelObjectData;
-import org.onosproject.yang.model.ModelObjectId;
-import org.onosproject.yang.model.MultiInstanceNode;
-
-import java.util.Iterator;
-import java.util.List;
-
-import static org.onosproject.drivers.huawei.L3VpnUtil.getDevIdFromIns;
-
-/**
- * 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><interface><ifPhyType>Ethernet" +
-            "</ifPhyType><ifName></ifName><ifNumber></ifNumber>" +
-            "<ifDynamicInfo></ifDynamicInfo><ifStatistics></ifStatistics>" +
-            "</interface></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 id
-     * @param isIns if for VPN instance
-     * @return device id
-     */
-    static String getIdFromModId(ModelObjectId id, boolean isIns) {
-        if (id == null) {
-            return null;
-        }
-        List<AtomicPath> paths = id.atomicPaths();
-        int size = paths.size();
-
-        switch (size) {
-            case 1:
-                return CONS_DEVICES;
-
-            case 2:
-                return getDevId(paths, isIns);
-
-            default:
-                throw new IllegalArgumentException(MODEL_OBJ_ID_LIMIT);
-        }
-    }
-
-    /**
-     * Returns the device id from the model object id's key info.
-     *
-     * @param paths atomic path list
-     * @param isIns if VPN instance
-     * @return device id
-     */
-    private static String getDevId(List<AtomicPath> paths, boolean isIns) {
-        MultiInstanceNode info = (MultiInstanceNode) paths.get(1);
-        KeyInfo key = info.key();
-        if (!isIns) {
-            return ((DeviceKeys) key).deviceid();
-        }
-        return getDevIdFromIns(key);
-    }
-
-    /**
-     * Returns the first object from the model object data. If no objects are
-     * present then it returns null.
-     *
-     * @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/src/main/java/org/onosproject/drivers/huawei/HuaweiDeviceDescription.java b/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/HuaweiDeviceDescription.java
deleted file mode 100644
index 5162b48..0000000
--- a/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/HuaweiDeviceDescription.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Copyright 2017-present Open Networking Foundation
- *
- * 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.apache.commons.lang.StringUtils;
-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.device.PortStatistics;
-import org.onosproject.net.device.PortStatisticsDiscovery;
-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.util.Collection;
-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.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_CLOSE_IFM;
-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_IFS;
-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 PortStatisticsDiscovery, 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 (NetconfException 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() {
-        return ImmutableList.copyOf(parseInterfaceXml(getInterfaces()));
-    }
-
-    /**
-     * 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();
-    }
-
-    @Override
-    public Collection<PortStatistics> discoverPortStatistics() {
-        String interfaces = getInterfaces();
-        if (StringUtils.isNotBlank(interfaces)) {
-            Collection<PortStatistics> portStats = getPortStatistics(interfaces);
-            return ImmutableList.copyOf(portStats);
-        }
-        return null;
-    }
-
-    private String getInterfaces() {
-        NetconfSession session = getNetconfSession();
-        String interfaces = null;
-        try {
-            interfaces = session.get(getInterfacesReq());
-        } catch (NetconfException e) {
-            log.info("Failed to retrive interface {} ", e.getMessage());
-        }
-        return interfaces;
-    }
-
-    private Collection<PortStatistics> getPortStatistics(String ifs) {
-        HuaweiXmlParser parser = new HuaweiXmlParser(ifs);
-        return parser.parsePortsStatistics(handler().data().deviceId());
-    }
-}
diff --git a/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/HuaweiDriversLoader.java b/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/HuaweiDriversLoader.java
deleted file mode 100644
index 79f1b9e..0000000
--- a/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/HuaweiDriversLoader.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2017-present Open Networking Foundation
- *
- * 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.osgi.service.component.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/src/main/java/org/onosproject/drivers/huawei/HuaweiL3VpnConfig.java b/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/HuaweiL3VpnConfig.java
deleted file mode 100644
index 2c08d36..0000000
--- a/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/HuaweiL3VpnConfig.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Copyright 2017-present Open Networking Foundation
- *
- * 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.l3vpn.netl3vpn.L3VpnConfig;
-import org.onosproject.l3vpn.netl3vpn.TunnelInfo;
-import org.onosproject.net.driver.AbstractHandlerBehaviour;
-import org.onosproject.yang.model.DataNode;
-import org.onosproject.yang.model.ModelObjectData;
-import org.onosproject.yang.model.ResourceId;
-import org.onosproject.yang.runtime.YangModelRegistry;
-
-import static org.onosproject.drivers.huawei.BgpConstructionUtil.getCreateBgp;
-import static org.onosproject.drivers.huawei.BgpConstructionUtil.getDeleteBgp;
-import static org.onosproject.drivers.huawei.DriverUtil.DEVICES;
-import static org.onosproject.drivers.huawei.DriverUtil.NAMESPACE;
-import static org.onosproject.drivers.huawei.DriverUtil.SERVICE_NOT_FOUND;
-import static org.onosproject.drivers.huawei.DriverUtil.SLASH;
-import static org.onosproject.drivers.huawei.InsConstructionUtil.getCreateVpnIns;
-import static org.onosproject.drivers.huawei.InsConstructionUtil.getDeleteVpnIns;
-import static org.onosproject.drivers.huawei.IntConstructionUtil.getCreateInt;
-import static org.onosproject.drivers.huawei.TnlConstructionUtil.getBindTnl;
-import static org.onosproject.drivers.huawei.TnlConstructionUtil.getCreateTnl;
-import static org.onosproject.drivers.huawei.TnlConstructionUtil.getCreateTnlDev;
-import static org.onosproject.drivers.huawei.TnlConstructionUtil.getCreateTnlPol;
-import static org.onosproject.drivers.huawei.TnlConstructionUtil.getDeleteTnl;
-
-/**
- * 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);
-        } catch (ServiceNotFoundException e) {
-            throw new ServiceNotFoundException(SERVICE_NOT_FOUND);
-        }
-    }
-
-    @Override
-    public ModelObjectData createInstance(ModelObjectData objectData) {
-        if (modelRegistry == null) {
-            init();
-        }
-        return getCreateVpnIns(objectData, isDevicesPresent());
-    }
-
-    @Override
-    public ModelObjectData bindInterface(ModelObjectData objectData) {
-        return getCreateInt(objectData);
-    }
-
-    @Override
-    public ModelObjectData createBgpInfo(BgpInfo bgpInfo,
-                                         BgpDriverInfo bgpConfig) {
-        return getCreateBgp(bgpInfo, bgpConfig);
-    }
-
-    @Override
-    public ModelObjectData createTnlDev(TunnelInfo tnlInfo) {
-        return getCreateTnlDev(tnlInfo);
-    }
-
-    @Override
-    public ModelObjectData createTnlPol(TunnelInfo tnlInfo) {
-        return getCreateTnlPol(tnlInfo);
-    }
-
-    @Override
-    public ModelObjectData createTnl(TunnelInfo tnlInfo) {
-        return getCreateTnl(tnlInfo);
-    }
-
-    @Override
-    public ModelObjectData bindTnl(TunnelInfo tnlInfo) {
-        return getBindTnl(tnlInfo);
-    }
-
-    @Override
-    public ModelObjectData deleteInstance(ModelObjectData objectData) {
-        return getDeleteVpnIns(objectData);
-    }
-
-    @Override
-    public ModelObjectData unbindInterface(ModelObjectData objectData) {
-        //TODO:To be committed.
-        return null;
-    }
-
-    @Override
-    public ModelObjectData deleteTnl(TunnelInfo tnlInfo) {
-        return getDeleteTnl(tnlInfo);
-    }
-
-    @Override
-    public ModelObjectData deleteBgpInfo(BgpInfo bgpInfo,
-                                         BgpDriverInfo bgpConfig) {
-        return getDeleteBgp(bgpInfo, bgpConfig);
-    }
-
-    /**
-     * 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/src/main/java/org/onosproject/drivers/huawei/HuaweiXmlParser.java b/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/HuaweiXmlParser.java
deleted file mode 100644
index 159d180..0000000
--- a/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/HuaweiXmlParser.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * Copyright 2017-present Open Networking Foundation
- *
- * 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.Lists;
-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.DeviceId;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.device.DefaultPortDescription;
-import org.onosproject.net.device.DefaultPortStatistics;
-import org.onosproject.net.device.PortDescription;
-import org.onosproject.net.device.PortStatistics;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-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;
-
-/**
- * Representation of Huawei XML parser.
- */
-public final 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_STATS = "ifStatistics";
-    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 P_RCVD = "receivePacket";
-    private static final String P_SENT = "sendPacket";
-    private static final String B_RCVD = "receiveByte";
-    private static final String B_SENT = "sendByte";
-    private static final String RX_DROP = "rcvDropPacket";
-    private static final String TX_DROP = "sendDropPacket";
-    private static final String RX_ERROR = "rcvErrorPacket";
-    private static final String TX_ERROR = "sendErrorPacket";
-
-    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", "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() {
-        Iterator itr = getInterfaceIterator();
-        while (itr.hasNext()) {
-            Element ifElement = (Element) itr.next();
-            addPorts(ifElement);
-        }
-    }
-
-    private Iterator getInterfaceIterator() {
-        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);
-        return parent.elementIterator(IF);
-    }
-
-    /**
-     * 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(DefaultPortDescription.builder()
-                      .withPortNumber(portNumber(port))
-                      .isEnabled(isEnabled)
-                      .type(COPPER)
-                      .portSpeed(portSpeed)
-                      .annotations(annotations)
-                      .build());
-        }
-    }
-
-    /**
-     * 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.contains(DELIMITER)) {
-            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;
-    }
-
-    /**
-     * Returns port statistics information for a device.
-     *
-     * @param deviceId device for which port statistics to be fetched
-     * @return port statistics
-     */
-    Collection<PortStatistics> parsePortsStatistics(DeviceId deviceId) {
-        Collection<PortStatistics> pss = Lists.newArrayList();
-        Iterator itr = getInterfaceIterator();
-        while (itr.hasNext()) {
-            Element ifElement = (Element) itr.next();
-            pss.add(getPortStatistics(ifElement, deviceId));
-        }
-        return pss;
-    }
-
-    private PortStatistics getPortStatistics(Element ifElement, DeviceId id) {
-        String ifType = ifElement.element(IF_TYPE).getText();
-
-        DefaultPortStatistics.Builder builder = DefaultPortStatistics.builder();
-
-        if (INTERFACES.contains(ifType)) {
-            int port = Integer.parseInt(getPortNum(ifElement.element(IF_NUM)
-                                                           .getText()));
-            Element statInfo = ifElement.element(IF_STATS);
-            long packetReceived = Long.parseLong(statInfo.element(P_RCVD)
-                                                         .getText());
-            long packetSent = Long.parseLong(statInfo.element(P_SENT).getText());
-            long bytesReceived = Long.parseLong(statInfo.element(B_RCVD)
-                                                        .getText());
-            long bytesSent = Long.parseLong(statInfo.element(B_SENT).getText());
-            long packetsRxDropped = Long.parseLong(statInfo.element(RX_DROP)
-                                                           .getText());
-            long packetsTxDropped = Long.parseLong(statInfo.element(TX_DROP)
-                                                           .getText());
-            long packetsRxErrors = Long.parseLong(statInfo.element(RX_ERROR)
-                                                          .getText());
-            long packetsTxErrors = Long.parseLong(statInfo.element(TX_ERROR)
-                                                          .getText());
-
-            return builder.setDeviceId(id)
-                    .setPort(PortNumber.portNumber(port))
-                    .setPacketsReceived(packetReceived)
-                    .setPacketsSent(packetSent)
-                    .setBytesReceived(bytesReceived)
-                    .setBytesSent(bytesSent)
-                    .setPacketsRxDropped(packetsRxDropped)
-                    .setPacketsRxErrors(packetsRxErrors)
-                    .setPacketsTxDropped(packetsTxDropped)
-                    .setPacketsTxErrors(packetsTxErrors).build();
-        }
-        return builder.build();
-    }
-}
diff --git a/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/InsConstructionUtil.java b/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/InsConstructionUtil.java
deleted file mode 100644
index eb7fedf..0000000
--- a/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/InsConstructionUtil.java
+++ /dev/null
@@ -1,483 +0,0 @@
-/*
- * Copyright 2017-present Open Networking Foundation
- *
- * 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.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn.devices.device.networkinstances.networkinstance.DefaultAugmentedNiNetworkInstance;
-import org.onosproject.yang.gen.v1.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn.l3vpnvrfparams.ipv4.Unicast;
-import org.onosproject.yang.gen.v1.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn.routetargetset.Rts;
-import org.onosproject.yang.gen.v1.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn.routetargetset.rts.RtTypeEnum;
-import org.onosproject.yang.gen.v1.ietfnetworkinstance.rev20160623.ietfnetworkinstance.DefaultDevices;
-import org.onosproject.yang.gen.v1.ietfnetworkinstance.rev20160623.ietfnetworkinstance.devices.Device;
-import org.onosproject.yang.gen.v1.ietfnetworkinstance.rev20160623.ietfnetworkinstance.devices.device.NetworkInstances;
-import org.onosproject.yang.gen.v1.ietfnetworkinstance.rev20160623.ietfnetworkinstance.devices.device.networkinstances.DefaultNetworkInstance;
-import org.onosproject.yang.gen.v1.ietfnetworkinstance.rev20160623.ietfnetworkinstance.devices.device.networkinstances.NetworkInstance;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.DefaultDevice;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.DeviceKeys;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.DefaultL3Vpn;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.L3Vpn;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.l3vpn.DefaultL3Vpncomm;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.l3vpn.L3Vpncomm;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.DefaultL3VpnInstances;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.L3VpnInstances;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.DefaultL3VpnInstance;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.L3VpnInstance;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.L3VpnInstanceKeys;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.l3vpninstance.DefaultVpnInstAfs;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.l3vpninstance.VpnInstAfs;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.l3vpninstance.vpninstafs.DefaultVpnInstAf;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.l3vpninstance.vpninstafs.VpnInstAf;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.l3vpninstance.vpninstafs.vpninstaf.DefaultVpnTargets;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.l3vpninstance.vpninstafs.vpninstaf.VpnTargets;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.l3vpninstance.vpninstafs.vpninstaf.vpntargets.DefaultVpnTarget;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.l3vpninstance.vpninstafs.vpninstaf.vpntargets.VpnTarget;
-import org.onosproject.yang.gen.v1.nel3vpncomm.rev20141225.nel3vpncomm.l3vpnifs.DefaultL3VpnIfs;
-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.ietfbgpl3vpn.rev20160909.ietfbgpl3vpn.routetargetset.rts.RtTypeEnum.BOTH;
-import static org.onosproject.yang.gen.v1.nel3vpncommtype.rev20141225.nel3vpncommtype.L3VpncommonL3VpnPrefixType.of;
-import static org.onosproject.yang.gen.v1.nel3vpncommtype.rev20141225.nel3vpncommtype.L3VpncommonVrfRtType.fromString;
-import static org.onosproject.yang.gen.v1.nel3vpncommtype.rev20141225.nel3vpncommtype.l3vpncommonl3vpnprefixtype.L3VpncommonL3VpnPrefixTypeEnum.IPV4UNI;
-
-/**
- * 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(), true);
-        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.nel3vpnapi.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.nel3vpnapi
-                                                               .rev20141225
-                                                               .nel3vpnapi
-                                                               .DefaultDevices
-                                                               devices) {
-        ModelObjectId id;
-        List<org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi
-                .devices.Device> devList = devices.device();
-        Iterator<org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi
-                .devices.Device> it = devList.iterator();
-        org.onosproject.yang.gen.v1.nel3vpnapi.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.nel3vpnapi.rev20141225
-            .nel3vpnapi.DefaultDevices getDriverDevices(String id,
-                                                        NetworkInstances obj) {
-
-        org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.
-                DefaultDevices devices = new org.onosproject.yang.gen.v1
-                .nel3vpnapi.rev20141225.nel3vpnapi.DefaultDevices();
-        org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices
-                .Device device = new org.onosproject.yang.gen.v1.nel3vpnapi
-                .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.nel3vpnapi.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
-                                                     .ietfbgpl3vpn.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 ModelObjectData getDeleteVpnIns(ModelObjectData modObj) {
-        ModelIdLevel modIdLvl = DEVICE;
-        String id = getIdFromModId(modObj.identifier(), true);
-        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();
-                DefaultDevice device = new DefaultDevice();
-                return getData(modId, device);
-
-            case DEVICES:
-                DefaultL3Vpn l3Vpn = new DefaultL3Vpn();
-                modId = getModObjIdDriDevice(id).build();
-                return getData(modId, l3Vpn);
-
-            case DEVICE:
-                DefaultL3VpnIfs l3VpnIfs = new DefaultL3VpnIfs();
-                modId = getModObjIdDriVpn(id, name);
-                return getData(modId, l3VpnIfs);
-
-            default:
-                throw new IllegalArgumentException(UNSUPPORTED_MODEL_LVL);
-        }
-    }
-
-    /**
-     * 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
-     */
-    static ModelObjectId.Builder getModObjIdDriDevice(String id) {
-        DeviceKeys key = new DeviceKeys();
-        key.deviceid(id);
-        return ModelObjectId.builder()
-                .addChild(org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225
-                                  .nel3vpnapi.DefaultDevices.class)
-                .addChild(DefaultDevice.class, key);
-    }
-}
diff --git a/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/IntConstructionUtil.java b/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/IntConstructionUtil.java
deleted file mode 100644
index d4c7a6f..0000000
--- a/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/IntConstructionUtil.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * Copyright 2017-present Open Networking Foundation
- *
- * 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.ietfinterfaces.rev20140508.ietfinterfaces.DefaultDevices;
-import org.onosproject.yang.gen.v1.ietfinterfaces.rev20140508.ietfinterfaces.devices.Device;
-import org.onosproject.yang.gen.v1.ietfinterfaces.rev20140508.ietfinterfaces.devices.device.Interfaces;
-import org.onosproject.yang.gen.v1.ietfinterfaces.rev20140508.ietfinterfaces.devices.device.interfaces.DefaultYangAutoPrefixInterface;
-import org.onosproject.yang.gen.v1.ietfinterfaces.rev20140508.ietfinterfaces.devices.device.interfaces.YangAutoPrefixInterface;
-import org.onosproject.yang.gen.v1.ietfip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.Ipv4;
-import org.onosproject.yang.gen.v1.ietfip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.ipv4.Address;
-import org.onosproject.yang.gen.v1.ietfip.rev20140616.ietfip.devices.device.interfaces.yangautoprefixinterface.augmentedifinterface.ipv4.address.subnet.PrefixLength;
-import org.onosproject.yang.gen.v1.ietfnetworkinstance.rev20160623.ietfnetworkinstance.devices.device.interfaces.yangautoprefixinterface.DefaultAugmentedIfInterface;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.DeviceKeys;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.DefaultL3Vpn;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.l3vpn.DefaultL3Vpncomm;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.DefaultL3VpnInstances;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.DefaultL3VpnInstance;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.L3VpnInstanceKeys;
-import org.onosproject.yang.gen.v1.nel3vpncomm.rev20141225.nel3vpncomm.l3vpnifs.DefaultL3VpnIfs;
-import org.onosproject.yang.gen.v1.nel3vpncomm.rev20141225.nel3vpncomm.l3vpnifs.L3VpnIfs;
-import org.onosproject.yang.gen.v1.nel3vpncomm.rev20141225.nel3vpncomm.l3vpnifs.l3vpnifs.DefaultL3VpnIf;
-import org.onosproject.yang.gen.v1.nel3vpncomm.rev20141225.nel3vpncomm.l3vpnifs.l3vpnifs.L3VpnIf;
-import org.onosproject.yang.gen.v1.nel3vpncommtype.rev20141225.nel3vpncommtype.Ipv4Address;
-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.nel3vpncommtype.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(), false);
-        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.nel3vpnapi.rev20141225
-                                  .nel3vpnapi.DefaultDevices.class)
-                .addChild(org.onosproject.yang.gen.v1.nel3vpnapi.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.ietfip
-                .rev20140616.ietfip.devices.device.interfaces
-                .yangautoprefixinterface.DefaultAugmentedIfInterface ipAug =
-                ((DefaultYangAutoPrefixInterface) ifs).augmentation(
-                        org.onosproject.yang.gen.v1.ietfip.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/src/main/java/org/onosproject/drivers/huawei/L3VpnUtil.java b/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/L3VpnUtil.java
deleted file mode 100644
index c072cd6..0000000
--- a/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/L3VpnUtil.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2017-present Open Networking Foundation
- *
- * 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.ietfnetworkinstance.rev20160623.ietfnetworkinstance.devices.DeviceKeys;
-import org.onosproject.yang.model.KeyInfo;
-
-/**
- * Representation of utility for huawei driver's L3VPN.
- */
-public final class L3VpnUtil {
-
-    // No instantiation.
-    private L3VpnUtil() {
-    }
-
-    /**
-     * Returns the device id from the instance key.
-     *
-     * @param key instance key
-     * @return device id
-     */
-    static String getDevIdFromIns(KeyInfo key) {
-        return ((DeviceKeys) key).deviceid();
-    }
-}
diff --git a/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/ModelIdLevel.java b/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/ModelIdLevel.java
deleted file mode 100644
index 3827d0a..0000000
--- a/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/ModelIdLevel.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright 2017-present Open Networking Foundation
- *
- * 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/src/main/java/org/onosproject/drivers/huawei/TnlConstructionUtil.java b/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/TnlConstructionUtil.java
deleted file mode 100644
index 1ba29dd..0000000
--- a/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/TnlConstructionUtil.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * Copyright 2017-present Open Networking Foundation
- *
- * 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.TunnelInfo;
-import org.onosproject.yang.gen.v1.nel3vpncommtype.rev20141225.nel3vpncommtype.Ipv4Address;
-import org.onosproject.yang.gen.v1.nel3vpncommtype.rev20141225.nel3vpncommtype.L3VpncommonL3VpnPrefixType;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.DefaultL3Vpn;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.l3vpn.DefaultL3Vpncomm;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.DefaultL3VpnInstances;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.DefaultL3VpnInstance;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.L3VpnInstanceKeys;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.l3vpninstance.DefaultVpnInstAfs;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.l3vpninstance.vpninstafs.DefaultVpnInstAf;
-import org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.l3vpninstance.vpninstafs.VpnInstAfKeys;
-import org.onosproject.yang.gen.v1.netnlm.rev20141225.netnlm.DefaultDevices;
-import org.onosproject.yang.gen.v1.netnlm.rev20141225.netnlm.Devices;
-import org.onosproject.yang.gen.v1.netnlm.rev20141225.netnlm.devices.DefaultDevice;
-import org.onosproject.yang.gen.v1.netnlm.rev20141225.netnlm.devices.Device;
-import org.onosproject.yang.gen.v1.netnlm.rev20141225.netnlm.devices.DeviceKeys;
-import org.onosproject.yang.gen.v1.netnlm.rev20141225.netnlm.devices.device.DefaultTnlm;
-import org.onosproject.yang.gen.v1.netnlm.rev20141225.netnlm.devices.device.Tnlm;
-import org.onosproject.yang.gen.v1.netnlm.rev20141225.netnlm.devices.device.tnlm.DefaultTunnelPolicys;
-import org.onosproject.yang.gen.v1.netnlm.rev20141225.netnlm.devices.device.tnlm.TunnelPolicys;
-import org.onosproject.yang.gen.v1.netnlm.rev20141225.netnlm.devices.device.tnlm.tunnelpolicys.DefaultTunnelPolicy;
-import org.onosproject.yang.gen.v1.netnlm.rev20141225.netnlm.devices.device.tnlm.tunnelpolicys.TunnelPolicy;
-import org.onosproject.yang.gen.v1.netnlm.rev20141225.netnlm.devices.device.tnlm.tunnelpolicys.TunnelPolicyKeys;
-import org.onosproject.yang.gen.v1.netnlm.rev20141225.netnlm.devices.device.tnlm.tunnelpolicys.tunnelpolicy.DefaultTpNexthops;
-import org.onosproject.yang.gen.v1.netnlm.rev20141225.netnlm.devices.device.tnlm.tunnelpolicys.tunnelpolicy.TpNexthops;
-import org.onosproject.yang.gen.v1.netnlm.rev20141225.netnlm.devices.device.tnlm.tunnelpolicys.tunnelpolicy.tpnexthops.DefaultTpNexthop;
-import org.onosproject.yang.gen.v1.netnlm.rev20141225.netnlm.devices.device.tnlm.tunnelpolicys.tunnelpolicy.tpnexthops.TpNexthop;
-import org.onosproject.yang.gen.v1.netnlm.rev20141225.netnlm.devices.device.tnlm.tunnelpolicys.tunnelpolicy.tpnexthops.tpnexthop.DefaultTpTunnels;
-import org.onosproject.yang.gen.v1.netnlm.rev20141225.netnlm.devices.device.tnlm.tunnelpolicys.tunnelpolicy.tpnexthops.tpnexthop.TpTunnels;
-import org.onosproject.yang.gen.v1.netnlm.rev20141225.netnlm.devices.device.tnlm.tunnelpolicys.tunnelpolicy.tpnexthops.tpnexthop.tptunnels.DefaultTpTunnel;
-import org.onosproject.yang.gen.v1.netnlm.rev20141225.netnlm.devices.device.tnlm.tunnelpolicys.tunnelpolicy.tpnexthops.tpnexthop.tptunnels.TpTunnel;
-import org.onosproject.yang.gen.v1.netnlmtype.rev20141225.netnlmtype.tnlmbasetnlpolicytype.TnlmbaseTnlPolicyTypeEnum;
-import org.onosproject.yang.model.DefaultModelObjectData;
-import org.onosproject.yang.model.InnerModelObject;
-import org.onosproject.yang.model.LeafModelObject;
-import org.onosproject.yang.model.ModelObjectData;
-import org.onosproject.yang.model.ModelObjectId.Builder;
-
-import static org.onosproject.drivers.huawei.DriverUtil.UNSUPPORTED_MODEL_LVL;
-import static org.onosproject.drivers.huawei.DriverUtil.getData;
-import static org.onosproject.drivers.huawei.InsConstructionUtil.getModObjIdDriDevice;
-import static org.onosproject.l3vpn.netl3vpn.ModelIdLevel.TP_HOP;
-import static org.onosproject.yang.gen.v1.nel3vpncommtype.rev20141225.nel3vpncommtype.l3vpncommonl3vpnprefixtype.L3VpncommonL3VpnPrefixTypeEnum.IPV4UNI;
-import static org.onosproject.yang.gen.v1.nel3vpnapi.rev20141225.nel3vpnapi.devices.device.l3vpn.l3vpncomm.l3vpninstances.l3vpninstance.vpninstafs.VpnInstAf.LeafIdentifier.TNLPOLICYNAME;
-import static org.onosproject.yang.gen.v1.netnlmtype.rev20141225.netnlmtype.TnlmbaseTnlPolicyType.of;
-import static org.onosproject.yang.model.ModelObjectId.builder;
-
-/**
- * Representation of utility for tunnel creation and deletion.
- */
-public final class TnlConstructionUtil {
-
-    /**
-     * Error message for unsupported device type.
-     */
-    private static final String UNSUPPORTED_DEV_TYPE = "Levels other than " +
-            "devices and device are not permitted.";
-
-    /**
-     * Error message for unsupported tunnel policy type.
-     */
-    private static final String UNSUPPORTED_TNL_POL_TYPE = "Levels other" +
-            " than tnlm and tnl policy are not permitted.";
-
-    // No instantiation.
-    private TnlConstructionUtil() {
-    }
-
-    /**
-     * Returns the created model object data of devices or device level from
-     * the tunnel info.
-     *
-     * @param tnlInfo tunnel info
-     * @return driver model object data
-     */
-    static ModelObjectData getCreateTnlDev(TunnelInfo tnlInfo) {
-        Device device = new DefaultDevice();
-        device.deviceid(tnlInfo.devId());
-
-        switch (tnlInfo.level()) {
-            case DEVICES:
-                Devices devices = new DefaultDevices();
-                devices.addToDevice(device);
-                return getData(null, (InnerModelObject) devices);
-
-            case DEVICE:
-                Builder id = getDevicesId();
-                return getData(id.build(), (InnerModelObject) device);
-
-            default:
-                throw new IllegalArgumentException(UNSUPPORTED_DEV_TYPE);
-        }
-    }
-
-    /**
-     * Returns the created model object data of tunnel policy from the tunnel
-     * info.
-     *
-     * @param tnlInfo tunnel info
-     * @return driver model object data
-     */
-    static ModelObjectData getCreateTnlPol(TunnelInfo tnlInfo) {
-        Builder id = getDeviceId(tnlInfo.devId());
-        TunnelPolicy tnlPol = new DefaultTunnelPolicy();
-        tnlPol.tnlPolicyName(tnlInfo.polName());
-        tnlPol.tnlPolicyType(of(TnlmbaseTnlPolicyTypeEnum.of(2)));
-
-        switch (tnlInfo.level()) {
-            case TNL_M:
-                Tnlm tnlm = new DefaultTnlm();
-                TunnelPolicys tnlPolicys = new DefaultTunnelPolicys();
-                tnlPolicys.addToTunnelPolicy(tnlPol);
-                tnlm.tunnelPolicys(tnlPolicys);
-                return getData(id.build(), (InnerModelObject) tnlm);
-
-            case TNL_POL:
-                id = getTunnelPolicysId(id);
-                return getData(id.build(), (InnerModelObject) tnlPol);
-
-            default:
-                throw new IllegalArgumentException(UNSUPPORTED_TNL_POL_TYPE);
-        }
-    }
-
-    /**
-     * Returns the created model object data of tunnel from the tunnel info.
-     *
-     * @param tnlInfo tunnel info
-     * @return driver model object data
-     */
-    static ModelObjectData getCreateTnl(TunnelInfo tnlInfo) {
-        TunnelPolicyKeys key = new TunnelPolicyKeys();
-        key.tnlPolicyName(tnlInfo.polName());
-
-        Builder id = getDeviceId(tnlInfo.devId());
-        id = getTunnelPolicysId(id);
-        id = id.addChild(DefaultTunnelPolicy.class, key);
-        TpNexthop tpHop = new DefaultTpNexthop();
-        TpTunnels tunnels = new DefaultTpTunnels();
-        TpTunnel tunnel = new DefaultTpTunnel();
-        tunnel.tunnelName(tnlInfo.tnlName());
-        tunnel.autoTunnel(true);
-        tunnels.addToTpTunnel(tunnel);
-        tpHop.tpTunnels(tunnels);
-        tpHop.nexthopIpaddr(Ipv4Address.of(tnlInfo.desIp()));
-
-        if (tnlInfo.level() == TP_HOP) {
-            id.addChild(DefaultTpNexthops.class);
-            return getData(id.build(), (InnerModelObject) tpHop);
-        } else {
-            TpNexthops tpHops = new DefaultTpNexthops();
-            tpHops.addToTpNexthop(tpHop);
-            return getData(id.build(), (InnerModelObject) tpHops);
-        }
-    }
-
-    /**
-     * Returns the created model object data of binding the tunnel policy to
-     * the VPN from the tunnel policy name and device id.
-     *
-     * @param tnlInfo tunnel info
-     * @return driver model object data
-     */
-    static ModelObjectData getBindTnl(TunnelInfo tnlInfo) {
-        L3VpnInstanceKeys vpnKey = new L3VpnInstanceKeys();
-        vpnKey.vrfName(tnlInfo.polName());
-        VpnInstAfKeys afKeys = new VpnInstAfKeys();
-        afKeys.afType(L3VpncommonL3VpnPrefixType.of(IPV4UNI));
-
-        Builder id = getModObjIdDriDevice(tnlInfo.devId());
-        id.addChild(DefaultL3Vpn.class);
-        id.addChild(DefaultL3Vpncomm.class);
-        id.addChild(DefaultL3VpnInstances.class);
-        id.addChild(DefaultL3VpnInstance.class, vpnKey);
-        id.addChild(DefaultVpnInstAfs.class);
-        id.addChild(DefaultVpnInstAf.class, afKeys);
-
-        LeafModelObject leaf = new LeafModelObject();
-        leaf.leafIdentifier(TNLPOLICYNAME);
-        leaf.addValue(tnlInfo.polName());
-        return DefaultModelObjectData.builder().addModelObject(leaf)
-                .identifier(id.build()).build();
-    }
-
-    /**
-     * Returns the driver model object data for delete, according to the
-     * levels it has to be constructed for tunnel policy.
-     *
-     * @param tnlInfo tunnel info
-     * @return driver model object data
-     */
-    static ModelObjectData getDeleteTnl(TunnelInfo tnlInfo) {
-        Builder id = getDeviceId(tnlInfo.devId());
-        switch (tnlInfo.level()) {
-            case DEVICES:
-                return getData(getDevicesId().build(), new DefaultDevice());
-
-            case DEVICE:
-                return getData(id.build(), new DefaultTnlm());
-
-            case TNL_POL:
-                id = getTunnelPolicysId(id);
-                TunnelPolicyKeys polKey = new TunnelPolicyKeys();
-                polKey.tnlPolicyName(tnlInfo.polName());
-                id = id.addChild(DefaultTunnelPolicy.class, polKey);
-                return getData(id.build(), new DefaultTpNexthops());
-
-            default:
-                throw new IllegalArgumentException(UNSUPPORTED_MODEL_LVL);
-        }
-    }
-
-    /**
-     * Returns the model object id of tunnel with devices and device.
-     *
-     * @param id device id
-     * @return model object id
-     */
-    private static Builder getDeviceId(String id) {
-        DeviceKeys devId = new DeviceKeys();
-        devId.deviceid(id);
-        return getDevicesId().addChild(DefaultDevice.class, devId);
-    }
-
-    /**
-     * Returns the model object id of tunnel with devices.
-     *
-     * @return model object id
-     */
-    private static Builder getDevicesId() {
-        return builder().addChild(DefaultDevices.class);
-    }
-
-    /**
-     * Returns the model object id of tunnel policies.
-     *
-     * @param id model object id
-     * @return model object id with tunnel policies
-     */
-    public static Builder getTunnelPolicysId(Builder id) {
-        return id.addChild(DefaultTnlm.class)
-                .addChild(DefaultTunnelPolicys.class);
-    }
-}
diff --git a/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/package-info.java b/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/package-info.java
deleted file mode 100644
index b03bd5a..0000000
--- a/drivers/huawei/src/main/java/org/onosproject/drivers/huawei/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2017-present Open Networking Foundation
- *
- * 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/src/main/resources/huawei-drivers.xml b/drivers/huawei/src/main/resources/huawei-drivers.xml
deleted file mode 100644
index 0ec590d..0000000
--- a/drivers/huawei/src/main/resources/huawei-drivers.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2017-present Open Networking Foundation
-  ~
-  ~ 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.l3vpn.netl3vpn.L3VpnConfig"
-                   impl="org.onosproject.drivers.huawei.HuaweiL3VpnConfig"/>
-        <behaviour api="org.onosproject.net.device.DeviceDescriptionDiscovery"
-                   impl="org.onosproject.drivers.huawei.HuaweiDeviceDescription"/>
-        <behaviour api="org.onosproject.net.device.PortStatisticsDiscovery"
-                   impl="org.onosproject.drivers.huawei.HuaweiDeviceDescription"/>
-    </driver>
-</drivers>
diff --git a/tools/build/publish-target-list b/tools/build/publish-target-list
index c27a4f5..bc73690 100644
--- a/tools/build/publish-target-list
+++ b/tools/build/publish-target-list
@@ -31,7 +31,6 @@
     //protocols/grpc/utils:onos-protocols-grpc-utils
     //protocols/gnmi/api:onos-protocols-gnmi-api
     //protocols/gnoi/api:onos-protocols-gnoi-api
-    //protocols/isis/api:onos-protocols-isis-api
     //protocols/lisp/api:onos-protocols-lisp-api
     //protocols/lisp/msg:onos-protocols-lisp-msg
     //protocols/netconf/api:onos-protocols-netconf-api
