diff --git a/js/ccnxProtocol.xpi b/js/ccnxProtocol.xpi
index 15b71e5..4a92f4a 100644
--- a/js/ccnxProtocol.xpi
+++ b/js/ccnxProtocol.xpi
Binary files differ
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
