Some files is forgotten to be commited...
diff --git a/.DS_Store b/.DS_Store
index e6cf14d..060a4a1 100644
--- a/.DS_Store
+++ b/.DS_Store
Binary files differ
diff --git a/js/.DS_Store b/js/.DS_Store
index 3aa25a9..80e2e80 100644
--- a/js/.DS_Store
+++ b/js/.DS_Store
Binary files differ
diff --git a/js/WebSocketTransport.js b/js/WebSocketTransport.js
index 49c09a4..83f53d9 100644
--- a/js/WebSocketTransport.js
+++ b/js/WebSocketTransport.js
@@ -161,7 +161,6 @@
 		bytes.set(hex);
 		
 		self.ws.send(bytes.buffer);
-		console.log('ws.onopen: ws.send() returned.');
 	}
 	
 	this.ws.onerror = function(ev) {
@@ -236,6 +235,13 @@
 		interest.scope = 1;
 		//var hex = encodeToHexInterest(int);
 		var binaryInterest = encodeToBinaryInterest(interest);
+		// If we directly use binaryInterest.buffer to feed ws.send(), 
+		// WebSocket will end up sending a packet with 10000 bytes of data.
+		// That is, WebSocket will flush the entire buffer in BinaryXMLEncoder
+		// regardless of the offset of the Uint8Array. So we have to create
+		// a new Uint8Array buffer with just the right size and copy the 
+		// content from binaryInterest to the new buffer.
+		//    ---Wentao
     	var bytearray = new Uint8Array(binaryInterest.length);
 		bytearray.set(binaryInterest);
 		console.log('Send Interest registration packet.');
@@ -244,7 +250,6 @@
 		CSTable.push(csEntry);
     	
     	this.ws.send(bytearray.buffer);
-		console.log('ws.send() returned.');
 		
 		return 0;
 	} else {
diff --git a/js/testing/.DS_Store b/js/testing/.DS_Store
index c13445d..3f0e7ef 100644
--- a/js/testing/.DS_Store
+++ b/js/testing/.DS_Store
Binary files differ
diff --git a/js/testing/test-put-async.html b/js/testing/test-put-async.html
index 315dec8..cece056 100644
--- a/js/testing/test-put-async.html
+++ b/js/testing/test-put-async.html
@@ -23,11 +23,6 @@
 			if (kind == Closure.UPCALL_FINAL) {

 				// Do nothing.

 			} else if (kind == Closure.UPCALL_INTEREST) {

-				// Extract the Name from the Interest. var name = upcallInfo.Interest.name;Íž

-				// Check that we want to respond to upcallInfo.interest. If yes, construct a ContentObject

-				// response, put it to the NDN and return Closure.RESULT_INTEREST_CONSUMED. Else fall 

-				// through to return Content.RESULT_OK.

-				// See linemaker.py for more details.

 				console.log('AsyncPutClosure.upcall() called.');

 				var content = document.getElementById('content').value;

 				var interest = upcallInfo.interest;

@@ -40,17 +35,21 @@
 				

 				var co = new ContentObject(new Name(nameStr), si, answer, new Signature()); 

 				co.sign();

-				var hex = encodeToHexContentObject(co);

+				var coBinary = encodeToBinaryContentObject(co);

+				// If we directly use coBinary.buffer to feed ws.send(), WebSocket 

+				// will end up sending a packet with 10000 bytes of data. That 

+				// is, WebSocket will flush the entire buffer in BinaryXMLEncoder

+				// regardless of the offset of the Uint8Array. So we have to

+				// create a new Uint8Array buffer with just the right size and

+				// copy the content from coBinary to the new buffer.

+				//    ---Wentao

+				var bytearray = new Uint8Array(coBinary.length);

+				bytearray.set(coBinary);

 				

-				var bytearray = new Uint8Array(hex.length / 2);

-	    		for (var i = 0; i < hex.length; i = i + 2) {

-	        		bytearray[i / 2] = '0x' + hex.substr(i, 2);

-	    		}

-	    		

-	    		upcallInfo.ndn.transport.ws.send(bytearray.buffer);

-	    		console.log('ws.send() finised.');

-	    		

-	    		return Closure.RESULT_INTEREST_CONSUMED;

+				upcallInfo.ndn.transport.ws.send(bytearray.buffer);

+				console.log('ws.send() finised.');

+				

+				return Closure.RESULT_INTEREST_CONSUMED;

 			}

 			return Closure.RESULT_OK;

 		};

diff --git a/wsproxy/README.md b/wsproxy/README.md
index eb0cdc0..0973017 100644
--- a/wsproxy/README.md
+++ b/wsproxy/README.md
@@ -1,10 +1,24 @@
 ws-ndn-js
 =========
 
-WebSocket proxy server between NDN javascript stack and ccnd
+WebSocket proxy server between NDN javascript stack and ccnd.
 
-This proxy runs on top of 'node.js'. 'ws' package is required. It listens for WebSocket connection request on port number 9696. Once it receives a incoming connection, it issues a TCP connection to the specified 'ccnd' router (port number 9695). It then translates packet frames from WebSocket to pure TCP byte streams and vice versa.
+This proxy runs on top of 'node.js'. 'ws' and 'node-getopt' packages are required. It listens for WebSocket connection request on port number 9696. Once it receives a incoming connection, it issues a TCP connection to the specified 'ccnd' router (port number 9695). It then translates packet frames from WebSocket to pure TCP byte streams and vice versa.
 
-To run the proxy, simply use the command 'node ws-ndn.js'.
+Installation guide:
+
+1) node.js: go to http://nodejs.org/ to download and install node.js;
+2) ws package: use command 'npm install ws' or go to https://github.com/einaros/ws for more information;
+3) node-getopt package: use command 'npm install node-getopt' or go to https://npmjs.org/package/node-getopt for more information.
+
+
+To run the proxy, simply use the command 'node wsproxy-tcp.js' or 'node wsproxy-udp.js'.
+To specify remote ccnd router's hostname or ip address, use option '-c x.x.x.x'. Default is 'localhost'.
+To specify maximum number of concurrent clients, use option '-m N'. Default is 40.
+To specify the level of log info display, use option '-L x'. x=0 means no output; x=1 will log connection startup and close; x=2 will log contents of all messages that flow across the proxy. Default is 1.
+
+Example: to setup UDP connection to ccnd router 192.168.1.51 with max client number 50 and log level 2, use the command:
+
+node wsproxy-udp.js -c 192.168.1.51 -m 50 -L 2
 
 Acknowledgement: this code is extended from Junxiao's WebSocket proxy implementation (https://gist.github.com/3835425).
\ No newline at end of file
diff --git a/wsproxy/ws-ndn.js b/wsproxy/ws-ndn.js
deleted file mode 100644
index 2b67e0d..0000000
--- a/wsproxy/ws-ndn.js
+++ /dev/null
@@ -1,80 +0,0 @@
-var WebSocketServer = require('ws').Server;
-var net = require('net');
-
-var wss = new WebSocketServer({port:9696, host:'0.0.0.0'});
-
-var MaxNumOfClients = 2;
-
-wss.on('connection', function(ws) {
-	console.log('WebSocket client connection received.');
-	console.log('Number of clients now is ' + wss.clients.length);
-	
-	if (wss.clients.length > MaxNumOfClients) {
-		console.log('Max num of clients exceeded. Close WS connection now.');
-		ws.terminate();
-		return;
-	}
-	
-	var sock_ready = false;
-	var send_queue = [];
-	var sock = net.createConnection(9695);
-	
-	ws.on('message', function(message) {
-		if (typeof message == 'string')
-			console.log("Message from clinet: " + message);
-		else if (typeof message == 'object') {
-			var bytesView = new Uint8Array(message);
-
-			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);
-				console.log('sock.write() returned.');
-			} else {
-				send_queue.push(message);
-			}
-		}
-	});
-	
-	ws.on('close', function() {
-		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;
-		console.log('ccnd socket connection ready.');
-	});
-	
-	sock.on('data', function(data) {
-		if (typeof data == 'object') {
-			var bytesView = new Uint8Array(data);
-			
-			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});
-			console.log('ws.send() returned.');
-		}
-	});
-	
-	sock.on('end', function() {
-		console.log('TCP connection terminated by ccnd. Shut down WS connection to client.');
-		ws.terminate();
-	});
-	
-	sock.on('error', function() {
-		console.log('Error on TCP connection to ccnd. Shut down WS connection to client.');
-		ws.terminate();
-	});
-});
diff --git a/wsproxy/wsproxy-udp.js b/wsproxy/wsproxy-udp.js
index bec9421..9b79ac2 100644
--- a/wsproxy/wsproxy-udp.js
+++ b/wsproxy/wsproxy-udp.js
@@ -1,18 +1,37 @@
+/* 
+ * @author: Wentao Shang
+ * See COPYING for copyright and distribution information.
+ * Implement WebSocket proxy between ccnd and javascript stack.
+ */
+
 var WebSocketServer = require('ws').Server;
 var dgram = require('dgram');
 
-var ccndhost = 'localhost';
+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
 
-var wss = new WebSocketServer({port:9696, host:ccndhost});
+var ccndhost = opt.options.ccnd || 'localhost';
 
-var MaxNumOfClients = 2;
+var wss = new WebSocketServer({port:9696});
+
+var MaxNumOfClients = opt.options.maxclient || 40;
+
+var LOG = opt.options.LOG || 1;
+
+if (LOG > 0) console.log('WebSocketServer started...');
 
 wss.on('connection', function(ws) {
-	console.log('wss.onconnection: WebSocket client connection received.');
-	console.log('wss.onconnection: Number of clients now is ' + wss.clients.length);
+	if (LOG > 0) console.log('wss.onconnection: WebSocket client connection received.');
+	if (LOG > 0) console.log('wss.onconnection: Number of clients now is ' + wss.clients.length);
 	
 	if (wss.clients.length > MaxNumOfClients) {
-		console.log('wss.onconnection: Max num of clients exceeded. Close WS connection now.');
+		if (LOG > 0) console.log('wss.onconnection: Max num of clients exceeded. Close WS connection now.');
 		ws.terminate();
 		return;
 	}
@@ -43,30 +62,32 @@
 		var hb = new Buffer(1);
 		hb[0] = 0x21;
 		udp.send(hb, 0, 1, 9695, ccndhost, null);
-		//console.log('UDP heartbeat fired at ccnd.');
+		if (LOG > 1) console.log('UDP heartbeat fired at ccnd.');
 	}, 
 	8000 // 8000 ms delay
 	);
 	
 	ws.on('message', function(message) {
-		if (typeof message == 'string')
-			console.log("ws.onmessage: Message from clinet: " + message);
+		if (typeof message == 'string') {
+			if (LOG > 2) console.log("ws.onmessage: Message from clinet: " + message);
+		}
 		else if (typeof message == 'object') {
 			// From JS array to Buffer
 			var buffer = new Buffer(message);
 
-			var logMsg = 'ws.onmessage: Byte array from client: ';
-			for (var i = 0; i < buffer.length; i++)
-				logMsg += String.fromCharCode(buffer[i]);
-			console.log(logMsg);
+			if (LOG > 2) {
+				var logMsg = 'ws.onmessage: Byte array from client: ';
+				for (var i = 0; i < buffer.length; i++)
+					logMsg += String.fromCharCode(buffer[i]);
+				console.log(logMsg);
+			}
 			
 			udp.send(buffer, 0, buffer.length, 9695, ccndhost, null);
-			console.log('ws.onmessage: udp.send() returned.');
 		}
 	});
 	
 	ws.on('close', function() {
-		console.log('ws.onclose: WebSocket connection closed. Close UDP connection to ccnd and stop "heartbeat" timer.');
+		if (LOG > 0) console.log('ws.onclose: WebSocket connection closed. Close UDP connection to ccnd and stop "heartbeat" timer.');
 		clearInterval(timerID);
 		udp.close();
 		udp = null;
@@ -77,15 +98,16 @@
 			// From Buffer to ArrayBuffer
 			var bytesView = new Uint8Array(msg);
 			
-			console.log('udp.onmessage: Byte array from server: ');
-			console.log('udp.onmessage: bytesView.length ' + bytesView.length);
-			var logMsg = "";
-			for (var i = 0; i < bytesView.length; i++)
-				logMsg += String.fromCharCode(bytesView[i]);
-			console.log(logMsg);
+			if (LOG > 2) {
+				console.log('udp.onmessage: Byte array from server: ');
+				console.log('udp.onmessage: bytesView.length ' + bytesView.length);
+				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});
-			console.log('udp.onmessage: ws.send() returned.');
 		}
 	});
 	
@@ -97,13 +119,13 @@
 	// will check the 'readyState' before closing, therefore avoids 'close' event loop.
 	//     --Wentao
 	udp.on('close', function() {
-		console.log('udp.onclose: UDP connection to ccnd terminated. Shut down WS connection to client and stop "heartbeat" timer.');
+		if (LOG > 0) console.log('udp.onclose: UDP connection to ccnd terminated. Shut down WS connection to client and stop "heartbeat" timer.');
 		clearInterval(timerID);
 		ws.terminate();
 	});
 	
 	udp.on('error', function() {
-		console.log('udp.onerror: Error on UDP connection to ccnd. Shut down WS connection to client and stop "heartbeat" timer.');
+		if (LOG > 0) console.log('udp.onerror: Error on UDP connection to ccnd. Shut down WS connection to client and stop "heartbeat" timer.');
 		clearInterval(timerID);
 		ws.terminate();
 	});