diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..e43b0f9
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+.DS_Store
diff --git a/wsproxy/.gitignore b/wsproxy/.gitignore
new file mode 100644
index 0000000..ce380c6
--- /dev/null
+++ b/wsproxy/.gitignore
@@ -0,0 +1,2 @@
+node_modules/*
+.DS_Store
diff --git a/wsproxy/wsproxy-tcp.js b/wsproxy/wsproxy-tcp.js
new file mode 100644
index 0000000..2e4c4b6
--- /dev/null
+++ b/wsproxy/wsproxy-tcp.js
@@ -0,0 +1,109 @@
+/* 
+ * @author: Wentao Shang
+ * See COPYING for copyright and distribution information.
+ * Implement WebSocket proxy between ccnd and javascript stack.
+ */
+
+var WebSocketServer = require('ws').Server;
+var net = require('net');
+
+var opt = require('node-getopt').create([
+  ['c' , 'ccnd=ARG', 'host name or ip of ccnd router'],
+  ['m' , 'maxclient=ARG', 'maximum number of concurrent client'],
+  ['L' , 'LOG=ARG', 'level of log message display'],
+  ['h' , 'help', 'display this help']
+])              // create Getopt instance
+.bindHelp()     // bind option 'help' to default action
+.parseSystem(); // parse command line
+
+//console.log(opt);
+
+var ccndhost = opt.options.ccnd || 'localhost';
+//console.log(ccndhost);
+
+var wss = new WebSocketServer({port:9696});   //TODO: Do we need to make WS server port number configurable?
+
+var MaxNumOfClients = opt.options.maxclient || 40;
+//console.log(MaxNumOfClients);
+
+var LOG = opt.options.LOG || 1;
+//console.log(LOG);
+
+if (LOG > 0) console.log('WebSocketServer started...');
+
+wss.on('connection', function(ws) {
+	if (LOG > 0) console.log('WebSocket client connection received.');
+	if (LOG > 0) console.log('Number of clients now is ' + wss.clients.length);
+	
+	if (wss.clients.length > MaxNumOfClients) {
+		if (LOG > 0) console.log('Max num of clients exceeded. Close WS connection now.');
+		ws.terminate();
+		return;
+	}
+	
+	var sock_ready = false;
+	var send_queue = [];
+	var sock = net.connect({port: 9695, host: ccndhost});
+	
+	ws.on('message', function(message) {
+		if (typeof message == 'string') {
+			if (LOG > 1) console.log("Message from clinet: " + message);
+		}
+		else if (typeof message == 'object') {
+			var bytesView = new Uint8Array(message);
+
+			if (LOG > 1) {
+				var logMsg = 'Byte array from client: ';
+				for (var i = 0; i < bytesView.length; i++)
+					logMsg += String.fromCharCode(bytesView[i]);
+				console.log(logMsg);
+			}
+			
+			if (sock_ready) {
+				sock.write(bytesView.buffer);
+			} else {
+				send_queue.push(message);
+			}
+		}
+	});
+	
+	ws.on('close', function() {
+		if (LOG > 0) console.log('WebSocket connection closed.');
+		sock.end();
+	});
+	
+	sock.on('connect', function() {
+		while (send_queue.length > 0) {
+			var message = send_queue.shift();
+			sock.write(message);
+		}
+		sock_ready = true;
+		if (LOG > 0) console.log('ccnd socket connection ready.');
+	});
+	
+	sock.on('data', function(data) {
+		if (typeof data == 'object') {
+			var bytesView = new Uint8Array(data);
+			
+			if (LOG > 1) {
+				console.log('Byte array from server: ');
+				var logMsg = "";
+				for (var i = 0; i < bytesView.length; i++)
+					logMsg += String.fromCharCode(bytesView[i]);
+				console.log(logMsg);
+			}
+			
+			ws.send(bytesView.buffer, {binary: true, mask: false});
+		}
+	});
+	
+	sock.on('end', function() {
+		if (LOG > 0) console.log('TCP connection terminated by ccnd. Shut down WS connection to client.');
+		ws.terminate();
+	});
+	
+	sock.on('error', function() {
+		if (LOG > 0) console.log('Error on TCP connection to ccnd. Shut down WS connection to client.');
+		ws.terminate();
+	});
+});
