diff --git a/extensions/pppoe/scripts/apps/netcfgConsolidator/NetcfgConfig.json b/extensions/pppoe/scripts/apps/netcfgConsolidator/NetcfgConfig.json
new file mode 100755
index 0000000..fe6de73
--- /dev/null
+++ b/extensions/pppoe/scripts/apps/netcfgConsolidator/NetcfgConfig.json
@@ -0,0 +1 @@
+{"OnosIP":"10.100.198.201"}
diff --git a/extensions/pppoe/scripts/apps/netcfgConsolidator/NetcfgConsolidator.js b/extensions/pppoe/scripts/apps/netcfgConsolidator/NetcfgConsolidator.js
new file mode 100755
index 0000000..498575c
--- /dev/null
+++ b/extensions/pppoe/scripts/apps/netcfgConsolidator/NetcfgConsolidator.js
@@ -0,0 +1,50 @@
+/**
+ * NetcfgConsolidator - Contains PPPoE device report functions
+ */
+var jsonServer = require('json-server')
+var server = jsonServer.create()
+var router = jsonServer.router('db.json')
+var middlewares = jsonServer.defaults()
+var fs=require('fs');
+var __dirname = "/usr/local/lib/node_modules"
+var sendOper = require(__dirname + '/addAndDeleteApList')
+// Set default middlewares (logger, static, cors and no-cache)
+server.use(middlewares)
+
+server.post('/:device',function(req,res){
+    console.log("device:"+req.params.device);
+    var device = req.params.device;
+    var str = device.split(":");
+    console.log("str:"+str);
+    console.log("enter post");
+    console.log("port:"+str[2]);
+    var netcfgDbObj = {};
+    var testjson = {"ip":str[1],"port":parseInt(str[2]),"protocol": "http"};
+    netcfgDbObj = JSON.parse(fs.readFileSync(__dirname + '/netconfigdb.json'));
+    console.log(JSON.stringify(netcfgDbObj));
+    var resProm = sendOper.addApList(netcfgDbObj,testjson,device);
+    console.log(resProm);
+    var data =  {"state":"Add data success."};
+    res.jsonp(data)
+
+
+})
+server.delete('/:device',function(req,res){
+    var device = req.params.device;
+    console.log("device:"+device);
+    var str = device.split(":");
+    console.log("enter delte");
+    var netcfgDbObj = {};
+    var testjson = {"ip":str[1],"port":str[2],"protocol": "http"};
+    console.log(testjson);
+    netcfgDbObj = JSON.parse(fs.readFileSync(__dirname + '/netconfigdb.json'));
+    var resProm = sendOper.deleteApList(netcfgDbObj,testjson,device);
+    console.log(resProm);
+    var data =  {"state":"Delete data success."}
+    res.jsonp(data)
+})
+
+server.use(router)
+server.listen(24000, function () {
+    console.log('NETCFG-Consolidator Server is running')
+})
diff --git a/extensions/pppoe/scripts/apps/netcfgConsolidator/addAndDeleteApList.js b/extensions/pppoe/scripts/apps/netcfgConsolidator/addAndDeleteApList.js
new file mode 100755
index 0000000..bf05873
--- /dev/null
+++ b/extensions/pppoe/scripts/apps/netcfgConsolidator/addAndDeleteApList.js
@@ -0,0 +1,123 @@
+/**
+ * addAndDeleteApList - Contains PPPoE device report functions
+ */
+var fs=require('fs');
+var Promise = require('bluebird');
+var request = Promise.promisifyAll(require('request'));
+var __dirname = "/usr/local/lib/node_modules";
+module.exports={
+    addApList:function(netcfgDbObj,testjson,device){
+        console.log("add ap list!");
+        var APList = netcfgDbObj.apps['org.onosproject.restsb'].devices;
+        var DeviceList = netcfgDbObj.devices;
+        DeviceList[device] = { "basic": { "driver": "rest-pppoe" } };
+        var flag = true;
+        for(var i = 0;i< APList.length;i++) {
+            if((testjson.ip == APList[i].ip) && (testjson.port == APList[i].port)) {
+                flag = false;
+            }
+        }
+        if(flag) {
+            APList.push(testjson);
+        }
+        var APListObj = {"devices": DeviceList,"apps":{"org.onosproject.restsb":{"devices":APList}}};
+        console.log("add test!!!!")
+        console.log(JSON.stringify(APListObj));
+        console.log("add test!!!!");
+        fs.writeFile(__dirname + '/netconfigdb.json', JSON.stringify(APListObj), function(err) {
+            if (err) {
+                throw err;
+            }
+            console.log('Saved.');
+        });
+        console.log("Add one data,and report to ONOS!");
+        var config = JSON.parse(fs.readFileSync(__dirname + '/NetcfgConfig.json'));
+        console.log(config);
+        var waitTimeout = 10000;
+        setTimeout(function() {
+            console.log("Delayed POST reqeust: Add AP List!");
+            request({
+                url: "http://"+config.OnosIP+":8182/onos/v1/network/configuration/",
+                method: "POST",
+                json: true,   // <--Very important!!!
+                body: APListObj,
+                auth: {
+                    username: 'onos',
+                    password: 'rocks'
+                }
+            }, function (error, response, body){
+                console.log(error);
+                //console.log(response);
+            });
+        }, waitTimeout);
+        var rep =  {"status":true};
+        return rep;
+    },
+    deleteApList:function(netcfgDbObj,testjson,device){
+        console.log("delete ap list!");
+        var APList =  netcfgDbObj.apps['org.onosproject.restsb'].devices;
+        var DeviceList = netcfgDbObj.devices;
+        delete DeviceList[device];
+        var tempList = new Array();
+        for (var i = 0;i< APList.length;i++) {
+            if((testjson.ip == APList[i].ip) && (testjson.port == APList[i].port)) {
+
+            } else {
+                tempList.push(APList[i]);
+            }
+        }
+        var APListObj = {"devices": DeviceList,"apps":{"org.onosproject.restsb":{"devices":tempList}}};
+        console.log("delete test!!!!")
+        console.log(JSON.stringify(APListObj));
+        console.log("delete test!!!!");
+        fs.writeFile(__dirname + '/netconfigdb.json', JSON.stringify(APListObj), function(err) {
+            if (err) {
+                throw err;
+            }
+            console.log('Saved.');
+        });
+        console.log("Delete one data,and report to ONOS!");
+        var config = JSON.parse(fs.readFileSync(__dirname + '/NetcfgConfig.json'));
+        console.log(config);
+        request({
+            url: "http://"+config.OnosIP+":8182/onos/v1/network/configuration/devices/"+device,
+            method: "DELETE",
+            json: true,   // <--Very important!!!
+            auth: {
+                username: 'onos',
+                password: 'rocks'
+            }
+        }, function (error, response, body){
+            console.log(error);
+            // console.log(response);
+        });
+        request({
+            url: "http://"+config.OnosIP+":8182/onos/v1/network/configuration/",
+            method: "POST",
+            json: true,   // <--Very important!!!
+            body: APListObj,
+            auth: {
+                username: 'onos',
+                password: 'rocks'
+            }
+        }, function (error, response, body){
+            console.log(error);
+        });
+        var rep =  {"status":true};
+        return rep;
+    },
+    deleteReportOnos:function(){
+        var netcfgDbObj = {};
+        var APList = new Array();
+        var tempList = new Array();
+        netcfgDbObj = JSON.parse(fs.readFileSync(__dirname + '/netconfigdb.json'));
+        APList = netcfgDbObj.AP;
+        for(var i = 0;i < APList.length; i++) {
+            if(APList[i].status === "Available") {
+                tempList.push(APList[i]);
+            }
+        }
+        var data = {"AP":tempList};
+        //report onos
+    }
+}
diff --git a/extensions/pppoe/scripts/apps/netcfgConsolidator/netconfigdb.json b/extensions/pppoe/scripts/apps/netcfgConsolidator/netconfigdb.json
new file mode 100755
index 0000000..19c5bb8
--- /dev/null
+++ b/extensions/pppoe/scripts/apps/netcfgConsolidator/netconfigdb.json
@@ -0,0 +1 @@
+{"devices": {},"apps":{"org.onosproject.restsb":{"devices":[]}}}
