diff --git a/extensions/pppoe/scripts/apps/pppoeMgmt/httpServer.js b/extensions/pppoe/scripts/apps/pppoeMgmt/httpServer.js
new file mode 100755
index 0000000..d384268
--- /dev/null
+++ b/extensions/pppoe/scripts/apps/pppoeMgmt/httpServer.js
@@ -0,0 +1,162 @@
+/**
+ * httpServer - HTTP server for user's credential
+ */
+var express = require('express');
+var path = require('path');
+var http  = require('http');
+var https = require('https');
+var radiusOper = require('./startClient');
+var body_parser = require('body-parser');
+var os=require('os');
+var ifaces = os.networkInterfaces();
+var app = express();
+var fs = require("fs");
+var Promise=require('bluebird');
+var execAsync=Promise.promisify(require('child_process').exec);
+app.use(express.static(path.join(__dirname,'authwebapp')));
+
+var config = {
+    key: fs.readFileSync('./certs/server.key'),
+    cert: fs.readFileSync('./certs/server.crt'),
+    ca: fs.readFileSync('./certs/ca.crt'),
+    requestCert: true,
+    rejectUnauthorized: false
+};
+
+function natRecoverPkt(iface, ipAddr, port) {
+
+    var cmd = 'ip6tables -w -t nat -D PREROUTING -i ' + iface +
+      ' -p tcp --dport ' + port + ' -j DNAT  --to-destination ['
+      + ipAddr + ']:' + port;
+    var checkCmd = 'ip6tables -w -t nat -v -L PREROUTING';
+    var check = 'to:[' + ipAddr + ']:' + port;
+
+    console.log(checkCmd + ' to check ' + check);
+    execAsync(checkCmd).then(function (result) {
+        console.log("indexOf:" + result.indexOf(check));
+        if (result.indexOf(check) > 0) {
+            execAsync(cmd);
+            console.log(cmd);
+        }
+        else {
+            console.log("nat rule not exist.");
+        }
+    }, function (err) {console.error(err);});
+
+}
+
+function connDev(iface) {
+    var cmd = 'ip6tables -w -D FORWARD -i ' + iface + ' -j DROP';
+    var checkCmd = 'ip6tables -w -v -L FORWARD 1';
+    var check = 'DROP       all      ' + iface;
+
+    console.log(checkCmd + ' to check ' + check);
+    execAsync(checkCmd).then(function (result) {
+        console.log("indexOf:" + result.indexOf(check));
+        if (result.indexOf(check) > 0) {
+            execAsync(cmd);
+            console.log(cmd);
+        }
+        else {
+            console.log("Forward rule not exist.");
+        }
+    }, function (err) {console.error(err);});
+
+}
+
+function rmDnsRoute(ipAddr) {
+    //delete blindly, minor side effect
+    var cmd = 'route del ' + ipAddr;
+    execAsync(cmd);
+    console.log(cmd);
+}
+
+function pppoeRmRedirectPkt(ipAddr) {
+    natRecoverPkt('eth1', ipAddr, '80');
+    natRecoverPkt('eth1', ipAddr, '443');
+    connDev('eth1');
+    rmDnsRoute('8.8.8.8');
+}
+
+app.use(body_parser.json());
+app.use(body_parser.urlencoded({ extended: true })); 
+
+app.get('/', function (req, res) {
+	
+    console.log("===Please login.===" );
+    execAsync('cat adminState.txt').then(function (result) {
+        if (result.indexOf("enable") > 0)
+        {
+            res.sendFile(__dirname+'/authwebapp/login.html');
+        }
+        else
+        {
+            console.log("PPPoE disabled.");
+            res.send('PPPoE disabled.');
+        }
+    }, function (err) {
+        console.error(err);
+    });
+})
+
+app.post('/',function(req,res){
+    console.log("===post request===");
+    var username = req.body.username;
+    var password = req.body.password;
+    console.log("===user:"+username+",pwd:"+password+"===");
+	
+    var data = radiusOper.verifyFun(username,password);
+    data.then(function(result){        
+        console.log("===verifyFun result:"+result+"===");
+        if(result)
+        {
+            setTimeout(function(){
+                console.log("enter timeout");     
+                execAsync("ifconfig").then(function (result) {
+                    console.log("result.indexOf :"+result.indexOf("ppp0"));
+                    if(result.indexOf("ppp0") >= 0)
+                    {
+                        console.log("===PPPoE session has set up.===");
+                        pppoeRmRedirectPkt(eh1ip);
+                        res.setHeader("Access-Control-Allow-Origin", "*");
+                        res.jsonp({'result':'Auth successfully!!'});
+                    }
+                    else
+                    {
+                        execAsync("poff -a");
+                        console.log("===PPPoE session failed.===");
+                        res.setHeader("Access-Control-Allow-Origin", "*");
+                        res.jsonp({'result':'error!'});
+                    }
+                });
+            },5000);    
+        }
+        else
+        {
+            execAsync("poff -a");
+            console.log("===PPPoE session failed.===");
+            res.setHeader("Access-Control-Allow-Origin", "*");
+            res.jsonp({'result':'error!'});
+        }
+    });
+});
+ 
+var eh1ip='a';
+var i = false;
+ifaces['eth1'].forEach(function(details){
+    if (details.family=='IPv6' && i == false) 
+    {
+        i = true;
+        eh1ip = details.address;
+        console.log('eh1ip:'+eh1ip);
+    }
+});
+
+var httpPort = "80";
+var httpsPort = "443";
+
+http.createServer(app).listen(httpPort, eh1ip);
+https.createServer(config, app).listen(httpsPort, eh1ip);
+
+console.log("PPPoE Web Server listens on ports " + httpPort + " and " + httpsPort);
+
