diff --git a/js/tools/build/ndn-js-uncomp.js b/js/tools/build/ndn-js-uncomp.js
index e1d626d..e16d843 100644
--- a/js/tools/build/ndn-js-uncomp.js
+++ b/js/tools/build/ndn-js-uncomp.js
@@ -1144,7 +1144,7 @@
 		}
 
 		if (decoder.peekStartElement(CCNProtocolDTags.Type)) {
-			binType = decoder.readBinaryElement(CCNProtocolDTags.Type);//byte [] 
+			var binType = decoder.readBinaryElement(CCNProtocolDTags.Type);//byte [] 
 		
 			
 			//TODO Implement type of Key Reading
@@ -1714,7 +1714,7 @@
 
 	if (decoder.peekStartElement(CCNProtocolDTags.Key)) {
 		try {
-			encodedKey = decoder.readBinaryElement(CCNProtocolDTags.Key);
+			var encodedKey = decoder.readBinaryElement(CCNProtocolDTags.Key);
 			// This is a DER-encoded SubjectPublicKeyInfo.
 			
 			//TODO FIX THIS, This should create a Key Object instead of keeping bytes
@@ -1737,7 +1737,7 @@
 
 	} else if ( decoder.peekStartElement(CCNProtocolDTags.Certificate)) {
 		try {
-			encodedCert = decoder.readBinaryElement(CCNProtocolDTags.Certificate);
+			var encodedCert = decoder.readBinaryElement(CCNProtocolDTags.Certificate);
 			
 			/*
 			 * Certificates not yet working
@@ -1934,7 +1934,7 @@
 PublisherID.peek = function(/* XMLDecoder */ decoder) {
 
 		//Long
-		nextTag = decoder.peekStartElementAsLong();
+		var nextTag = decoder.peekStartElementAsLong();
 		
 		if (null == nextTag) {
 			// on end element
@@ -2780,52 +2780,6 @@
 	this.offset = 0;
 };
 
-BinaryXMLDecoder.prototype.readAttributes = function(
-	//TreeMap<String,String> 
-	attributes){
-	
-	if (null == attributes) {
-		return;
-	}
-
-	try {
-
-		//this.TypeAndVal 
-		var nextTV = this.peekTypeAndVal();
-
-		while ((null != nextTV) && ((XML_ATTR == nextTV.type()) ||
-				(XML_DATTR == nextTV.type()))) {
-
-			//this.TypeAndVal 
-			var thisTV = this.decodeTypeAndVal();
-
-			var attributeName = null;
-			if (XML_ATTR == thisTV.type()) {
-				
-				attributeName = this.decodeUString(thisTV.val()+1);
-
-			} else if (XML_DATTR == thisTV.type()) {
-				// DKS TODO are attributes same or different dictionary?
-				attributeName = tagToString(thisTV.val());
-				if (null == attributeName) {
-					throw new ContentDecodingException(new Error("Unknown DATTR value" + thisTV.val()));
-				}
-			}
-			
-			var attributeValue = this.decodeUString();
-
-			attributes.put(attributeName, attributeValue);
-
-			nextTV = this.peekTypeAndVal();
-		}
-
-	} catch ( e) {
-
-		throw new ContentDecodingException(new Error("readStartElement", e));
-	}
-};
-
-
 BinaryXMLDecoder.prototype.initializeDecoding = function() {
 		//if (!this.istream.markSupported()) {
 			//throw new IllegalArgumentException(this.getClass().getName() + ": input stream must support marking!");
@@ -2852,7 +2806,7 @@
 			//startTag = tagToString(startTag);
 		
 			//TypeAndVal 
-			tv = this.decodeTypeAndVal();
+			var tv = this.decodeTypeAndVal();
 			
 			if (null == tv) {
 				throw new ContentDecodingException(new Error("Expected start element: " + startTag + " got something not a tag."));
@@ -2906,7 +2860,7 @@
 	
 
 BinaryXMLDecoder.prototype.readAttributes = function(
-	//TreeMap<String,String> 
+	// array of [attributeName, attributeValue] 
 	attributes) {
 	
 	if (null == attributes) {
@@ -2930,11 +2884,11 @@
 			if (XML_ATTR == thisTV.type()) {
 				// Tag value represents length-1 as attribute names cannot be empty.
 				var valval ;
-				if(typeof tv.val() == 'string'){
-					valval = (parseInt(tv.val())) + 1;
+				if(typeof thisTV.val() == 'string'){
+					valval = (parseInt(thisTV.val())) + 1;
 				}
 				else
-					valval = (tv.val())+ 1;
+					valval = (thisTV.val())+ 1;
 				
 				attributeName = this.decodeUString(valval);
 
@@ -3270,68 +3224,10 @@
 	return bytes;
 };
 
-var count =0;
-
 //String
 BinaryXMLDecoder.prototype.decodeUString = function(
 		//int 
 		byteLength) {
-	
-	/*
-	console.log('COUNT IS '+count);
-	console.log('INPUT BYTELENGTH IS '+byteLength);
-	count++;
-	if(null == byteLength||  undefined == byteLength){
-		console.log("!!!!");
-		tv = this.decodeTypeAndVal();
-		var valval ;
-		if(typeof tv.val() == 'string'){
-			valval = (parseInt(tv.val()));
-		}
-		else
-			valval = (tv.val());
-		
-		if(LOG>4) console.log('valval  is ' + valval);
-		byteLength= this.decodeUString(valval);
-		
-		//if(LOG>4) console.log('byte Length found in type val is '+ byteLength.charCodeAt(0));
-		byteLength = parseInt(byteLength);
-		
-		
-		//byteLength = byteLength.charCodeAt(0);
-		//if(LOG>4) console.log('byte Length found in type val is '+ byteLength);
-	}
-	if(LOG>4)console.log('byteLength is '+byteLength);
-	if(LOG>4)console.log('type of byteLength is '+typeof byteLength);
-	
-	stringBytes = this.decodeBlob(byteLength);
-	
-	//console.log('String bytes are '+ stringBytes);
-	//console.log('stringBytes);
-	
-	if(LOG>4)console.log('byteLength is '+byteLength);
-	if(LOG>4)console.log('this.offset is '+this.offset);
-
-	tempBuffer = this.istream.slice(this.offset, this.offset+byteLength);
-	if(LOG>4)console.log('TEMPBUFFER IS' + tempBuffer);
-	if(LOG>4)console.log( tempBuffer);
-
-	if(LOG>4)console.log('ADDING to offset value' + byteLength);
-	this.offset+= byteLength;
-	//if(LOG>3)console.log('read the String' + tempBuffer.toString('ascii'));
-	//return tempBuffer.toString('ascii');//
-	
-	
-	//if(LOG>3)console.log( 'STRING READ IS '+ DataUtils.getUTF8StringFromBytes(stringBytes) ) ;
-	//if(LOG>3)console.log( 'STRING READ IS '+ DataUtils.getUTF8StringFromBytes(tempBuffer) ) ;
-	//if(LOG>3)console.log(DataUtils.getUTF8StringFromBytes(tempBuffer) ) ;
-	//return DataUtils.getUTF8StringFromBytes(tempBuffer);
-	
-	if(LOG>3)console.log( 'STRING READ IS '+ DataUtils.toString(stringBytes) ) ;
-	if(LOG>3)console.log( 'TYPE OF STRING READ IS '+ typeof DataUtils.toString(stringBytes) ) ;
-
-	return  DataUtils.toString(stringBytes);*/
-
 	if(null == byteLength ){
 		var tempStreamPosition = this.offset;
 			
@@ -3364,9 +3260,6 @@
 	}
 };
 
-
-
-
 //OBject containg a pair of type and value
 var TypeAndVal = function TypeAndVal(_type,_val) {
 	this.t = _type;
@@ -4092,7 +3985,7 @@
 	var numbers = DataUtils.toNumbers(result);
 			
 	
-	decoder = new BinaryXMLDecoder(numbers);
+	var decoder = new BinaryXMLDecoder(numbers);
 	
 	if(LOG>3)console.log('DECODING HEX FACE INSTANCE  \n'+numbers);
 
@@ -4109,7 +4002,7 @@
 function decodeHexInterest(result){
 	var numbers = DataUtils.toNumbers(result);	
 	
-	decoder = new BinaryXMLDecoder(numbers);
+	var decoder = new BinaryXMLDecoder(numbers);
 	
 	if(LOG>3)console.log('DECODING HEX INTERST  \n'+numbers);
 
@@ -4126,11 +4019,11 @@
 function decodeHexContentObject(result){
 	var numbers = DataUtils.toNumbers(result);
 	
-	decoder = new BinaryXMLDecoder(numbers);
+	var decoder = new BinaryXMLDecoder(numbers);
 	
 	if(LOG>3)console.log('DECODED HEX CONTENT OBJECT \n'+numbers);
 	
-	co = new ContentObject();
+	var co = new ContentObject();
 
 	co.from_ccnb(decoder);
 
@@ -4143,11 +4036,11 @@
 function decodeHexForwardingEntry(result){
 	var numbers = DataUtils.toNumbers(result);
 
-	decoder = new BinaryXMLDecoder(numbers);
+	var decoder = new BinaryXMLDecoder(numbers);
 	
 	if(LOG>3)console.log('DECODED HEX FORWARDING ENTRY \n'+numbers);
 	
-	forwardingEntry = new ForwardingEntry();
+	var forwardingEntry = new ForwardingEntry();
 
 	forwardingEntry.from_ccnb(decoder);
 
@@ -4554,7 +4447,7 @@
 			if (step == 4) {
 				// Start to decode digest hex string
 				len = witness[i+1];  // XXX: digest hex should always be 32 bytes
-				str = DataUtils.toHex(witness.subarray(i + 2, i + 2 + len));
+				var str = DataUtils.toHex(witness.subarray(i + 2, i + 2 + len));
 				this.path.digestList.push(str);  // digest hex string
 				//console.log(str);
 			}
@@ -5068,7 +4961,7 @@
   var slop;
   for(i = 0; i < s.length; ++i) {
     if(s.charAt(i) == b64pad) break;
-    v = b64map.indexOf(s.charAt(i));
+    var v = b64map.indexOf(s.charAt(i));
     if(v < 0) continue;
     if(k == 0) {
       ret += int2char(v >> 2);
@@ -5775,9 +5668,9 @@
 	  	msgHashValue = ff(byteArray);
 	  } else {
 	  	// Compute merkle hash
-		  h = hex_sha256_from_bytes(byteArray);
-		  index = witness.path.index;
-		  for (i = witness.path.digestList.length - 1; i >= 0; i--) {
+		  var h = hex_sha256_from_bytes(byteArray);
+		  var index = witness.path.index;
+		  for (var i = witness.path.digestList.length - 1; i >= 0; i--) {
 		  	var str = "";
 		  	if (index % 2 == 0) {
 		  		str = h + witness.path.digestList[i];
@@ -7625,12 +7518,13 @@
 /**
  * settings is an associative array with the following defaults:
  * {
- *   getTransport: function() { return new WebSocketTransport(); }
+ *   getTransport: function() { return new WebSocketTransport(); },
  *   getHostAndPort: transport.defaultGetHostAndPort,
  *   host: null, // If null, use getHostAndPort when connecting.
  *   port: 9696,
- *   onopen: function() { if (LOG > 3) console.log("NDN connection established."); }
- *   onclose: function() { if (LOG > 3) console.log("NDN connection closed."); }
+ *   onopen: function() { if (LOG > 3) console.log("NDN connection established."); },
+ *   onclose: function() { if (LOG > 3) console.log("NDN connection closed."); },
+ *   verify: true // If false, don't verify and call upcall with Closure.UPCALL_CONTENT_UNVERIFIED.
  * }
  * 
  * getHostAndPort is a function, on each call it returns a new { host: host, port: port } or
