diff --git a/js/ccnxProtocol/components/ccnxProtocolService.js b/js/ccnxProtocol/components/ccnxProtocolService.js
index 12da336..91b590c 100644
--- a/js/ccnxProtocol/components/ccnxProtocolService.js
+++ b/js/ccnxProtocol/components/ccnxProtocolService.js
@@ -46,9 +46,12 @@
                     nameString = nameString.substr(colonIndex + 1, nameString.length - colonIndex - 1);
                 
 				var name = new Name(nameString);
+                // TODO: Strip off an ending implicit digest before checking the last component?
+                var uriEndsWithSequence = endsWithSequence(name);
+                
 			    // 131.179.141.18 is lioncub.metwi.ucla.edu .
 				var ndn = new NDN('131.179.141.18');
-				
+                				
 				var ContentClosure = function ContentClosure() {
                     // Inherit from Closure.
                     Closure.call(this);
@@ -70,9 +73,21 @@
 					contentListener.onReceivedContent(content, 
                         contentTypeEtc.contentType, contentTypeEtc.contentCharset);
                     
-                    // Assume that onReceivedContent sends all the content immediately and that
-                    //   the gURLBar is updated if the content is for the main window.
+                    // Assume that onReceivedContent sends all the content immediately and updatse
+                    //   the gURLBar if the content is for the main window.
                     var urlBar = mostRecentWindow.gURLBar;
+                    if (urlBar && urlBar.value == aURI.spec) {
+                        // Assume the URI is for the window.  Update the URL bar.
+                        // Show the name without the ending sequence (unless the original URI had it).
+                        if (!uriEndsWithSequence && endsWithSequence(contentObject.name)) {
+                            var nameWithoutSequence = new Name
+                                (contentObject.name.components.slice
+                                 (0, contentObject.name.components.length - 1));
+                            urlBar.value = "ccnx:" + nameWithoutSequence.to_uri();
+                        }
+                        else
+                            urlBar.value = "ccnx:" + contentObject.name.to_uri();
+                    }
                     
                     return Closure.RESULT_OK;
 				};
@@ -114,18 +129,27 @@
         
         var str = DataUtils.toString(component).toLowerCase();
         if (str.indexOf(".gif") >= 0) 
-            return { contentType:  "image/gif", charset:  "ISO-8859-1" }
+            return { contentType: "image/gif", charset: "ISO-8859-1" }
     	else if (str.indexOf(".jpg") >= 0 ||
     			 str.indexOf(".jpeg") >= 0) 
-            return { contentType:  "image/jpeg", charset:  "ISO-8859-1" }
+            return { contentType: "image/jpeg", charset: "ISO-8859-1" }
     	else if (str.indexOf(".png") >= 0) 
-            return { contentType:  "image/png", charset:  "ISO-8859-1" }
+            return { contentType: "image/png", charset: "ISO-8859-1" }
         else if (str.indexOf(".bmp") >= 0) 
-            return { contentType:  "image/bmp", charset:  "ISO-8859-1" }
+            return { contentType: "image/bmp", charset: "ISO-8859-1" }
     	else if (str.indexOf(".css") >= 0) 
-            return { contentType:  "text/css", charset: "utf-8" }
+            return { contentType: "text/css", charset: "utf-8" }
     }
     
     // default
     return { contentType: "text/html", charset: "utf-8" };
 }
+
+/*
+ * Return true if the last component in the name is a sequence..
+ */
+function endsWithSequence(name) {
+    return name.components != null && name.components.length >= 1 &&
+        name.components[name.components.length - 1].length >= 1 &&
+        name.components[name.components.length - 1][0] == 0;
+}
\ No newline at end of file
diff --git a/js/ccnxProtocol/modules/ndn-js.jsm b/js/ccnxProtocol/modules/ndn-js.jsm
index f720696..8134e79 100644
--- a/js/ccnxProtocol/modules/ndn-js.jsm
+++ b/js/ccnxProtocol/modules/ndn-js.jsm
@@ -657,7 +657,7 @@
 /*
  * @author: ucla-cs
  * See COPYING for copyright and distribution information.
- * This class represents a Name
+ * This class represents a Name as an array of components where each is a byte array.
  */
  
 
@@ -712,20 +712,34 @@
 	return blobArrays;
 };
 
-Name.createNameArray=function(name){
-
-
-	name = unescape(name);
-	
+Name.createNameArray=function(name) {
 	var array = name.split('/');
-
+    var colonIndex = array[0].indexOf(':');
+    if (colonIndex >= 0) {
+        name = name.substr(colonIndex + 1, name.length - colonIndex - 1);
+        array = name.split('/');
+    }
 	
 	if(name[0]=="/")
-		array=array.slice(1,array.length);
-		
+		array=array.slice(1,array.length);		
 	if(name[name.length-1]=="/")
 		array=array.slice(0,array.length-1);
-	
+    
+    // Unescape the components.
+    for (var i = 0; i < array.length; ++i) {
+        var component = unescape(array[i]);
+        
+        if (component.match(/[^.]/) == null) {
+            // Special case for component of only periods.  Remove 3 periods.
+            if (component.length <= 3)
+                array[i] = "";
+            else
+                array[i] = component.substr(3, component.length - 3);
+        }
+        else
+            array[i] = component;
+    }
+
 	return array;
 }
 
@@ -764,6 +778,49 @@
 	return this.components.push(param);
 };
 
+// Return the escaped name string according to "CCNx URI Scheme".  Does not include "ccnx:".
+Name.prototype.to_uri = function() {	
+	var result = "";
+	
+	for(var i = 0; i < this.components.length; ++i)
+		result += "/"+ Name.toEscapedString(this.components[i]);
+	
+	return result;	
+};
+
+/**
+ * Return component as an escaped string according to "CCNx URI Scheme".
+ * We can't use encodeURIComponent because that doesn't encode all the characters we want to.
+ */
+Name.toEscapedString = function(component) {
+    var result = "";
+    var gotNonDot = false;
+    for (var i = 0; i < component.length; ++i) {
+        if (component[i] != 0x2e) {
+            gotNonDot = true;
+            break;
+        }
+    }
+    if (!gotNonDot) {
+        // Special case for component of zero or more periods.  Add 3 periods.
+        result = "...";
+        for (var i = 0; i < component.length; ++i)
+            result += ".";
+    }
+    else {
+        for (var i = 0; i < component.length; ++i) {
+            var value = component[i];
+            // Check for 0-9, A-Z, a-z, (+), (-), (.), (_)
+            if (value >= 0x30 && value <= 0x39 || value >= 0x41 && value <= 0x5a ||
+                value >= 0x61 && value <= 0x7a || value == 0x2b || value == 0x2d || 
+                value == 0x2e || value == 0x5f)
+                result += String.fromCharCode(value);
+            else
+                result += "%" + (value < 16 ? "0" : "") + value.toString(16).toUpperCase();
+        }
+    }
+    return result;
+};
 
 /*
  * @author: ucla-cs
@@ -1893,11 +1950,10 @@
 		//TODO check if the length of the PublisherPublicKeyDigest is correct ( Security reason)
 
 		if (this.publisherPublicKeyDigest.length != this.PUBLISHER_ID_LEN) {
+			if (LOG > 0)
+                console.log('LENGTH OF PUBLISHER ID IS WRONG! Expected ' + this.PUBLISHER_ID_LEN + ", got " + this.publisherPublicKeyDigest.length);
 			
-			console.log('LENGTH OF PUBLISHER ID IS WRONG! Expected ' + this.PUBLISHER_ID_LEN + ", got " + this.publisherPublicKeyDigest.length);
-			
-			//this.publisherPublicKeyDigest = new PublisherPublicKeyDigest(this.PublisherPublicKeyDigest).PublisherKeyDigest;
-		
+			//this.publisherPublicKeyDigest = new PublisherPublicKeyDigest(this.PublisherPublicKeyDigest).PublisherKeyDigest;		
 		}
 	};
 
@@ -2118,7 +2174,7 @@
 ForwardingEntry.prototype.from_ccnb =function(
 	//XMLDecoder 
 	decoder) 
-	//throws Error when name == "ContentDecodingException"
+	//throws ContentDecodingException
 	{
 			decoder.readStartElement(this.getElementLabel());
 			if (decoder.peekStartElement(CCNProtocolDTags.Action)) {
@@ -3820,7 +3876,9 @@
 DataUtils.decodeUtf8 = function (utftext) {
 		var string = "";
 		var i = 0;
-		var c = c1 = c2 = 0;
+		var c = 0;
+        var c1 = 0;
+        var c2 = 0;
  
 		while ( i < utftext.length ) {
  
@@ -3837,7 +3895,7 @@
 			}
 			else {
 				c2 = utftext.charCodeAt(i+1);
-				c3 = utftext.charCodeAt(i+2);
+				var c3 = utftext.charCodeAt(i+2);
 				string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
 				i += 3;
 			}
@@ -3905,7 +3963,37 @@
     }
 
     return true;
-}
+};
+
+/*
+ * Convert the big endian byte array to an unsigned int.
+ * Don't check for overflow.
+ */
+DataUtils.bigEndianToUnsignedInt = function(bytes) {
+    var result = 0;
+    for (var i = 0; i < bytes.length; ++i) {
+        result <<= 8;
+        result += bytes[i];
+    }
+    return result;
+};
+
+/*
+ * Convert the int value to a new big endian byte array and return.
+ * If value is 0 or negative, return []. 
+ */
+DataUtils.nonNegativeIntToBigEndian = function(value) {
+    var result = [];
+    if (value <= 0)
+        return result;
+    
+    while (value != 0) {
+        result.unshift(value & 0xff);
+        value >>= 8;
+    }
+    return result;
+};
+
 /*
  * This file contains utilities to help encode and decode NDN objects.
  * author: ucla-cs
