diff --git a/js/ccnxProtocol.xpi b/js/ccnxProtocol.xpi
index 1e59e8b..3561684 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 108b569..5308fdd 100644
--- a/js/ccnxProtocol/components/ccnxProtocolService.js
+++ b/js/ccnxProtocol/components/ccnxProtocolService.js
@@ -194,14 +194,9 @@
         var nextSegmentNumber = new Uint8Array(segmentNumberPlus1.length + 1);
         nextSegmentNumber.set(segmentNumberPlus1, 1);
         
-        // TODO: When Name uses Uint8Array, we don't need a byte array.
-        var nextSegmentNumberByteArray = [];
-        for (var i = 0; i < nextSegmentNumber.length; ++i)
-            nextSegmentNumberByteArray.push(nextSegmentNumber[i]);
-        
         var components = contentObject.name.components.slice
             (0, contentObject.name.components.length - 1);
-        components.push(nextSegmentNumberByteArray);
+        components.push(nextSegmentNumber);
         this.ndn.expressInterest(new Name(components), this);
     }
     else
diff --git a/js/ccnxProtocol/modules/ndn-js.jsm b/js/ccnxProtocol/modules/ndn-js.jsm
index e15a290..6e1c77a 100644
--- a/js/ccnxProtocol/modules/ndn-js.jsm
+++ b/js/ccnxProtocol/modules/ndn-js.jsm
@@ -90,7 +90,6 @@
 	ret += "\nContentObject: " + this.contentObject;
 	return ret;
 }
-
 /*
  * @author: Meki Cherkaoui, Jeff Thompson, Wentao Shang
  * See COPYING for copyright and distribution information.
@@ -161,7 +160,6 @@
 NDN.prototype.registerPrefix = function(name, closure, flag) {
     return this.transport.registerPrefix(this, name, closure, flag);
 }
-
 /* 
  * @author: Jeff Thompson
  * See COPYING for copyright and distribution information.
@@ -273,7 +271,6 @@
     pump.asyncRead(dataListener, null);
 }
 
-
 /*
  * @author: Meki Cheraoui
  * See COPYING for copyright and distribution information.
@@ -430,7 +427,6 @@
 //TESTING
 //console.log(exports.CCNProtocolDTagsStrings[17]);
 
-
 /*
  * @author: Meki Cheraoui
  * See COPYING for copyright and distribution information.
@@ -534,7 +530,6 @@
 	return out;
 }*/
 	
-
 /*
  * @author: Meki Cheraoui, Jeff Thompson
  * See COPYING for copyright and distribution information.
@@ -667,18 +662,21 @@
  * Return the converted value.
  */
 Name.prototype.add = function(component){
-    var result = null;
+    var result;
     if(typeof component == 'string')
         result = DataUtils.stringToUtf8Array(component);
-	else if(typeof component == 'object' && component instanceof Array)
-        result = new Uint8Array(component);
 	else if(typeof component == 'object' && component instanceof Uint8Array)
         result = new Uint8Array(component);
 	else if(typeof component == 'object' && component instanceof ArrayBuffer)
         // Make a copy.
         result = new Uint8Array(component.slice(0, component.byteLength));
+	else if(typeof component == 'object')
+        // Assume component is a byte array.  We can't check instanceof Array because
+        //   this doesn't work in JavaScript if the array comes from a different module.
+        result = new Uint8Array(component);
 	else 
-		if(LOG>4)console.log('NAME COMPONENT INVALID');
+		throw new Error("Cannot add Name element at index " + this.components.length + 
+            ": Invalid type");
     
 	return this.components.push(result);
 };
@@ -742,7 +740,6 @@
     }
     return result;
 };
-
 /*
  * @author: Meki Cheraoui
  * See COPYING for copyright and distribution information.
@@ -1204,7 +1201,6 @@
 			return false;
 		return true;
 };
-
 /*
  * Date Format 1.2.3
  * (c) 2007-2009 Steven Levithan <stevenlevithan.com>
@@ -1330,7 +1326,6 @@
 Date.prototype.format = function (mask, utc) {
 	return dateFormat(this, mask, utc);
 };
-
  /*
  * @author: Meki Cheraoui
  * See COPYING for copyright and distribution information.
@@ -1351,20 +1346,20 @@
 	this.scope = _scope;
 	this.interestLifetime = _interestLifetime;  // number of seconds
 	this.nonce = _nonce;	
-
-	this.RECURSIVE_POSTFIX = "*";
-
-	this.CHILD_SELECTOR_LEFT = 0;
-	this.CHILD_SELECTOR_RIGHT = 1;
-	this.ANSWER_CONTENT_STORE = 1;
-	this.ANSWER_GENERATED = 2;
-	this.ANSWER_STALE = 4;		// Stale answer OK
-	this.MARK_STALE = 16;		// Must have scope 0.  Michael calls this a "hack"
-
-	this.DEFAULT_ANSWER_ORIGIN_KIND = this.ANSWER_CONTENT_STORE | this.ANSWER_GENERATED;
-
 };
 
+Interest.RECURSIVE_POSTFIX = "*";
+
+Interest.CHILD_SELECTOR_LEFT = 0;
+Interest.CHILD_SELECTOR_RIGHT = 1;
+Interest.ANSWER_CONTENT_STORE = 1;
+Interest.ANSWER_GENERATED = 2;
+Interest.ANSWER_STALE = 4;		// Stale answer OK
+Interest.MARK_STALE = 16;		// Must have scope 0.  Michael calls this a "hack"
+
+Interest.DEFAULT_ANSWER_ORIGIN_KIND = Interest.ANSWER_CONTENT_STORE | Interest.ANSWER_GENERATED;
+
+
 Interest.prototype.from_ccnb = function(/*XMLDecoder*/ decoder) {
 
 		decoder.readStartElement(CCNProtocolDTags.Interest);
@@ -1555,7 +1550,6 @@
 };
 
 ExcludeComponent.prototype.getElementLabel = function() { return CCNProtocolDTags.Component; };
-
 /*
  * @author: Meki Cheraoui
  * See COPYING for copyright and distribution information.
@@ -1751,7 +1745,6 @@
 		// null signedInfo ok
 		return (null != this.contentName);
 };
-
 /*
  * @author: Meki Cheraoui
  * See COPYING for copyright and distribution information.
@@ -1848,7 +1841,6 @@
 
 
 
-
 /*
  * @author: Meki Cheraoui
  * See COPYING for copyright and distribution information.
@@ -1900,7 +1892,6 @@
 PublisherPublicKeyDigest.prototype.validate =function() {
 		return (null != this.publisherPublicKeyDigest);
 };
-
 /*
  * @author: Meki Cheraoui
  * See COPYING for copyright and distribution information.
@@ -2062,7 +2053,6 @@
 
 FaceInstance.prototype.getElementLabel= function(){return CCNProtocolDTags.FaceInstance;};
 
-
 /*
  * @author: Meki Cheraoui
  * See COPYING for copyright and distribution information.
@@ -2164,7 +2154,6 @@
 		};
 
 ForwardingEntry.prototype.getElementLabel = function() { return CCNProtocolDTags.ForwardingEntry; }
-
 /*
  * This class is used to encode ccnb binary elements (blob, type/value pairs).
  * 
@@ -2563,7 +2552,6 @@
 	return this.ostream.subarray(0, this.offset);
 };
 
-
 /*
  * This class is used to decode ccnb binary elements (blob, type/value pairs).
  * 
@@ -3293,7 +3281,6 @@
 ContentDecodingException.prototype = new Error();
 ContentDecodingException.prototype.name = "ContentDecodingException";
 
-
 /*
  * This class uses BinaryXMLDecoder to follow the structure of a ccnb binary element to 
  * determine its end.
@@ -3415,7 +3402,6 @@
         }
     }
 };
-
 /*
  * This class contains utilities to help parse the data
  * author: Meki Cheraoui, Jeff Thompson
@@ -3841,7 +3827,6 @@
     }
     return result.subarray(size - i, size);
 };
-
 /*
  * This class defines MOME types based on the filename extension.
  * author: Jeff Thompson
@@ -4390,7 +4375,6 @@
   "zip": "application/zip",
   "zmt": "chemical/x-mopac-input"
 };
-
 /*
  * This file contains utilities to help encode and decode NDN objects.
  * author: Meki Cheraoui
@@ -4736,7 +4720,6 @@
 
     return output;
 }
-
 /*
  * @author: Meki Cheraoui
  * See COPYING for copyright and distribution information.
@@ -4842,7 +4825,6 @@
 //var KeyPair = { "public" : "PUBLIC KEY" , "private" : "PRIVATE KEY" };
 
 
-
 /*
  * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined
  * in FIPS 180-1
@@ -5173,7 +5155,6 @@
 {
   return (num << cnt) | (num >>> (32 - cnt));
 }
-
 /*
  * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined
  * in FIPS 180-2
@@ -5553,7 +5534,6 @@
   var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
   return (msw << 16) | (lsw & 0xFFFF);
 }
-
 /*
  * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined
  * in FIPS 180-2
@@ -6050,7 +6030,6 @@
    dst.l = (w0 & 0xffff) | (w1 << 16);
    dst.h = (w2 & 0xffff) | (w3 << 16);
 }
-
 /*
  * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
  * Digest Algorithm, as defined in RFC 1321.
@@ -6430,7 +6409,6 @@
 {
   return (num << cnt) | (num >>> (32 - cnt));
 }
-
 /*
  * A JavaScript implementation of the RIPEMD-160 Algorithm
  * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
@@ -6790,7 +6768,6 @@
 {
   return (num << cnt) | (num >>> (32 - cnt));
 }
-
 var b64map="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 var b64pad="=";
 
@@ -6862,7 +6839,6 @@
   }
   return a;
 }
-
 // Depends on jsbn.js and rng.js
 
 // Version 1.1: support utf-8 encoding in pkcs1pad2
@@ -6993,7 +6969,6 @@
 RSAKey.prototype.setPublic = RSASetPublic;
 RSAKey.prototype.encrypt = RSAEncrypt;
 //RSAKey.prototype.encrypt_b64 = RSAEncryptB64;
-
 // Depends on rsa.js and jsbn2.js
 
 // Version 1.1: support utf-8 decoding in pkcs1unpad2
@@ -7135,7 +7110,6 @@
 RSAKey.prototype.generate = RSAGenerate;
 RSAKey.prototype.decrypt = RSADecrypt;
 //RSAKey.prototype.b64_decrypt = RSAB64Decrypt;
-
 /*! rsapem-1.1.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license
  */
 //
@@ -7217,7 +7191,6 @@
 }
 
 RSAKey.prototype.readPrivateKeyFromPEMString = _rsapem_readPrivateKeyFromPEMString;
-
 /*! rsasign-1.2.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license
  */
 //
@@ -7570,7 +7543,6 @@
  * @class
  * @description Tom Wu's RSA Key class and extension
  */
-
 /*! asn1hex-1.1.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license
  */
 //
@@ -7850,7 +7822,6 @@
 ASN1HEX.getDecendantIndexByNthList = _asnhex_getDecendantIndexByNthList;
 ASN1HEX.getDecendantHexVByNthList = _asnhex_getDecendantHexVByNthList;
 ASN1HEX.getDecendantHexTLVByNthList = _asnhex_getDecendantHexTLVByNthList;
-
 /*! x509-1.1.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license
  */
 // 
@@ -8122,7 +8093,6 @@
 X509.prototype.getNotBefore = _x509_getNotBefore;
 X509.prototype.getNotAfter = _x509_getNotAfter;
 
-
 // Copyright (c) 2005  Tom Wu
 // All Rights Reserved.
 // See "LICENSE" for details.
@@ -8682,7 +8652,6 @@
 // "constants"
 BigInteger.ZERO = nbv(0);
 BigInteger.ONE = nbv(1);
-
 // Copyright (c) 2005-2009  Tom Wu
 // All Rights Reserved.
 // See "LICENSE" for details.
@@ -9331,4 +9300,3 @@
 // int hashCode()
 // long longValue()
 // static BigInteger valueOf(long val)
-
