diff --git a/js/ContentObject.js b/js/ContentObject.js
index d95940c..7c66f3c 100644
--- a/js/ContentObject.js
+++ b/js/ContentObject.js
@@ -114,74 +114,34 @@
 	this.rawSignatureData = sigBits;
 };
 
+// Deprecated.  Use BinaryXMLWireFormat.decodeContentObject.
 ContentObject.prototype.from_ccnb = function(/*XMLDecoder*/ decoder) {
-	// TODO VALIDATE THAT ALL FIELDS EXCEPT SIGNATURE ARE PRESENT
-  decoder.readStartElement(this.getElementLabel());
-
-	if( decoder.peekStartElement(CCNProtocolDTags.Signature) ){
-		this.signature = new Signature();
-		this.signature.from_ccnb(decoder);
-	}
-  else
-    this.signature = null;
-		
-	this.startSIG = decoder.offset;
-
-	this.name = new Name();
-	this.name.from_ccnb(decoder);
-		
-	if( decoder.peekStartElement(CCNProtocolDTags.SignedInfo) ){
-		this.signedInfo = new SignedInfo();
-		this.signedInfo.from_ccnb(decoder);
-	}
-  else
-    this.signedInfo = null;
-
-  this.content = decoder.readBinaryElement(CCNProtocolDTags.Content, null, true);
-		
-	this.endSIG = decoder.offset;
-		
-	decoder.readEndElement();
-		
-	this.saveRawData(decoder.input);
+  BinaryXMLWireFormat.decodeContentObject(this, decoder);
 };
 
+// Deprecated.  Use BinaryXMLWireFormat.encodeContentObject.
 ContentObject.prototype.to_ccnb = function(/*XMLEncoder*/ encoder)  {
+  BinaryXMLWireFormat.encodeContentObject(this, encoder);
+};
 
-	//TODO verify name, SignedInfo and Signature is present
+/**
+ * Encode this ContentObject for a particular wire format.
+ * @param {WireFormat} wireFormat if null, use BinaryXMLWireFormat.
+ * @returns {Uint8Array}
+ */
+ContentObject.prototype.encode = function(wireFormat) {
+  wireFormat = (wireFormat || BinaryXMLWireFormat.instance);
+  return wireFormat.encodeContentObject(this);
+};
 
-
-	encoder.writeStartElement(this.getElementLabel());
-
-	
-
-
-	if(null!=this.signature) this.signature.to_ccnb(encoder);
-	
-	
-	this.startSIG = encoder.offset;
-	
-
-	if(null!=this.name) this.name.to_ccnb(encoder);
-	
-	//this.endSIG = encoder.offset;
-	//this.startSignedInfo = encoder.offset;
-	
-	
-	if(null!=this.signedInfo) this.signedInfo.to_ccnb(encoder);
-
-	encoder.writeElement(CCNProtocolDTags.Content, this.content);
-
-	
-	this.endSIG = encoder.offset;
-	
-	//this.endContent = encoder.offset;
-	
-
-	encoder.writeEndElement();
-	
-	this.saveRawData(encoder.ostream);
-	
+/**
+ * Decode the input using a particular wire format and update this ContentObject.
+ * @param {Uint8Array} input
+ * @param {WireFormat} wireFormat if null, use BinaryXMLWireFormat.
+ */
+ContentObject.prototype.decode = function(input, wireFormat) {
+  wireFormat = (wireFormat || BinaryXMLWireFormat.instance);
+  wireFormat.decodeContentObject(this, input);
 };
 
 ContentObject.prototype.getElementLabel= function(){return CCNProtocolDTags.ContentObject;};
diff --git a/js/Interest.js b/js/Interest.js
index e8d2891..692b90c 100644
--- a/js/Interest.js
+++ b/js/Interest.js
@@ -34,104 +34,34 @@
 
 Interest.DEFAULT_ANSWER_ORIGIN_KIND = Interest.ANSWER_CONTENT_STORE | Interest.ANSWER_GENERATED;
 
-
+// Deprecated.  Use BinaryXMLWireFormat.decodeInterest.
 Interest.prototype.from_ccnb = function(/*XMLDecoder*/ decoder) {
-
-		decoder.readStartElement(CCNProtocolDTags.Interest);
-
-		this.name = new Name();
-		this.name.from_ccnb(decoder);
-
-		if (decoder.peekStartElement(CCNProtocolDTags.MinSuffixComponents))
-			this.minSuffixComponents = decoder.readIntegerElement(CCNProtocolDTags.MinSuffixComponents);
-    else
-      this.minSuffixComponents = null;
-
-		if (decoder.peekStartElement(CCNProtocolDTags.MaxSuffixComponents)) 
-			this.maxSuffixComponents = decoder.readIntegerElement(CCNProtocolDTags.MaxSuffixComponents);
-    else
-      this.maxSuffixComponents = null;
-			
-		if (decoder.peekStartElement(CCNProtocolDTags.PublisherPublicKeyDigest)) {
-			this.publisherPublicKeyDigest = new PublisherPublicKeyDigest();
-			this.publisherPublicKeyDigest.from_ccnb(decoder);
-		}
-    else
-      this.publisherPublicKeyDigest = null;
-
-		if (decoder.peekStartElement(CCNProtocolDTags.Exclude)) {
-			this.exclude = new Exclude();
-			this.exclude.from_ccnb(decoder);
-		}
-    else
-      this.exclude = null;
-		
-		if (decoder.peekStartElement(CCNProtocolDTags.ChildSelector))
-			this.childSelector = decoder.readIntegerElement(CCNProtocolDTags.ChildSelector);
-    else
-      this.childSelector = null;
-		
-		if (decoder.peekStartElement(CCNProtocolDTags.AnswerOriginKind))
-			this.answerOriginKind = decoder.readIntegerElement(CCNProtocolDTags.AnswerOriginKind);
-    else
-      this.answerOriginKind = null;
-		
-		if (decoder.peekStartElement(CCNProtocolDTags.Scope))
-			this.scope = decoder.readIntegerElement(CCNProtocolDTags.Scope);
-    else
-      this.scope = null;
-
-		if (decoder.peekStartElement(CCNProtocolDTags.InterestLifetime))
-			this.interestLifetime = 1000.0 * DataUtils.bigEndianToUnsignedInt
-                (decoder.readBinaryElement(CCNProtocolDTags.InterestLifetime)) / 4096;
-    else
-      this.interestLifetime = null;              
-		
-		if (decoder.peekStartElement(CCNProtocolDTags.Nonce))
-			this.nonce = decoder.readBinaryElement(CCNProtocolDTags.Nonce);
-    else
-      this.nonce = null;
-		
-		decoder.readEndElement();
+  BinaryXMLWireFormat.decodeInterest(this, decoder);
 };
 
+// Deprecated. Use BinaryXMLWireFormat.encodeInterest.
 Interest.prototype.to_ccnb = function(/*XMLEncoder*/ encoder){
-		//Could check if name is present
-		
-		encoder.writeStartElement(CCNProtocolDTags.Interest);
-		
-		this.name.to_ccnb(encoder);
-	
-		if (null != this.minSuffixComponents) 
-			encoder.writeElement(CCNProtocolDTags.MinSuffixComponents, this.minSuffixComponents);	
+  BinaryXMLWireFormat.encodeInterest(this, encoder);
+};
 
-		if (null != this.maxSuffixComponents) 
-			encoder.writeElement(CCNProtocolDTags.MaxSuffixComponents, this.maxSuffixComponents);
+/**
+ * Encode this Interest for a particular wire format.
+ * @param {WireFormat} wireFormat if null, use BinaryXMLWireFormat.
+ * @returns {Uint8Array}
+ */
+Interest.prototype.encode = function(wireFormat) {
+  wireFormat = (wireFormat || BinaryXMLWireFormat.instance);
+  return wireFormat.encodeInterest(this);
+};
 
-		if (null != this.publisherPublicKeyDigest)
-			this.publisherPublicKeyDigest.to_ccnb(encoder);
-		
-		if (null != this.exclude)
-			this.exclude.to_ccnb(encoder);
-		
-		if (null != this.childSelector) 
-			encoder.writeElement(CCNProtocolDTags.ChildSelector, this.childSelector);
-
-		if (this.DEFAULT_ANSWER_ORIGIN_KIND != this.answerOriginKind && this.answerOriginKind!=null) 
-			encoder.writeElement(CCNProtocolDTags.AnswerOriginKind, this.answerOriginKind);
-		
-		if (null != this.scope) 
-			encoder.writeElement(CCNProtocolDTags.Scope, this.scope);
-		
-		if (null != this.interestLifetime) 
-			encoder.writeElement(CCNProtocolDTags.InterestLifetime, 
-                DataUtils.nonNegativeIntToBigEndian((this.interestLifetime / 1000.0) * 4096));
-		
-		if (null != this.nonce)
-			encoder.writeElement(CCNProtocolDTags.Nonce, this.nonce);
-		
-		encoder.writeEndElement();
-
+/**
+ * Decode the input using a particular wire format and update this Interest.
+ * @param {Uint8Array} input
+ * @param {WireFormat} wireFormat if null, use BinaryXMLWireFormat.
+ */
+Interest.prototype.decode = function(input, wireFormat) {
+  wireFormat = (wireFormat || BinaryXMLWireFormat.instance);
+  wireFormat.decodeInterest(this, input);
 };
 
 /*
diff --git a/js/encoding/BinaryXMLWireFormat.js b/js/encoding/BinaryXMLWireFormat.js
new file mode 100644
index 0000000..5cc2a5f
--- /dev/null
+++ b/js/encoding/BinaryXMLWireFormat.js
@@ -0,0 +1,229 @@
+/**
+ * @author: Jeff Thompson
+ * See COPYING for copyright and distribution information.
+ * This class represents Interest Objects
+ */
+
+/**
+ * A BinaryXMLWireFormat implements the WireFormat interface for encoding and decoding in binary XML.
+ */
+var BinaryXMLWireFormat = function BinaryXMLWireFormat() {
+};
+
+/**
+ * Encode the interest and return a Uint8Array.
+ * @param {Interest} interest
+ * @returns {UInt8Array}
+ */
+BinaryXMLWireFormat.prototype.encodeInterest = function(interest) {
+	var encoder = new BinaryXMLEncoder();
+	interest.to_ccnb(encoder);
+	
+	return encoder.getReducedOstream();  
+};
+
+/**
+ * Decode the input and put the result in interest.
+ * @param {Interest} interest
+ * @param {Uint8Array} input
+ */
+BinaryXMLWireFormat.prototype.decodeInterest = function(interest, input) {
+	var decoder = new BinaryXMLDecoder(input);
+  BinaryXMLWireFormat.decodeInterest(interest, decoder);
+};
+
+/**
+ * Encode the contentObject and return a Uint8Array. 
+ * @param {ContentObject} contentObject
+ * @returns {Uint8Array}
+ */
+BinaryXMLWireFormat.prototype.encodeContentObject = function(contentObject) {
+	var encoder = new BinaryXMLEncoder();
+	BinaryXMLWireFormat(contentObject, encoder);
+
+	return encoder.getReducedOstream();  
+};
+
+/**
+ * Decode the input and put the result in contentObject.
+ * @param {ContentObject} contentObject
+ * @param {Uint8Array} input
+ */
+BinaryXMLWireFormat.prototype.decodeContentObject = function(contentObject, input) {
+	var decoder = new BinaryXMLDecoder(input);
+	contentObject.from_ccnb(decoder);  
+};
+
+// Default object.
+BinaryXMLWireFormat.instance = new BinaryXMLWireFormat();
+
+/**
+ * Encode the interest by calling the operations on the encoder.
+ * @param {Interest} interest
+ * @param {BinaryXMLEncoder} encoder
+ */
+BinaryXMLWireFormat.encodeInterest = function(interest, encoder) {
+	encoder.writeStartElement(CCNProtocolDTags.Interest);
+		
+	interest.name.to_ccnb(encoder);
+	
+	if (null != interest.minSuffixComponents) 
+		encoder.writeElement(CCNProtocolDTags.MinSuffixComponents, interest.minSuffixComponents);	
+
+	if (null != interest.maxSuffixComponents) 
+		encoder.writeElement(CCNProtocolDTags.MaxSuffixComponents, interest.maxSuffixComponents);
+
+	if (null != interest.publisherPublicKeyDigest)
+		interest.publisherPublicKeyDigest.to_ccnb(encoder);
+		
+	if (null != interest.exclude)
+		interest.exclude.to_ccnb(encoder);
+		
+	if (null != interest.childSelector) 
+		encoder.writeElement(CCNProtocolDTags.ChildSelector, interest.childSelector);
+
+	if (interest.DEFAULT_ANSWER_ORIGIN_KIND != interest.answerOriginKind && interest.answerOriginKind!=null) 
+		encoder.writeElement(CCNProtocolDTags.AnswerOriginKind, interest.answerOriginKind);
+		
+	if (null != interest.scope) 
+		encoder.writeElement(CCNProtocolDTags.Scope, interest.scope);
+		
+	if (null != interest.interestLifetime) 
+		encoder.writeElement(CCNProtocolDTags.InterestLifetime, 
+                DataUtils.nonNegativeIntToBigEndian((interest.interestLifetime / 1000.0) * 4096));
+		
+	if (null != interest.nonce)
+		encoder.writeElement(CCNProtocolDTags.Nonce, interest.nonce);
+		
+	encoder.writeEndElement();
+};
+
+/**
+ * Use the decoder to place the result in interest.
+ * @param {Interest} interest
+ * @param {BinaryXMLDecoder} decoder
+ */
+BinaryXMLWireFormat.decodeInterest = function(interest, decoder) {
+	decoder.readStartElement(CCNProtocolDTags.Interest);
+
+	interest.name = new Name();
+	interest.name.from_ccnb(decoder);
+
+	if (decoder.peekStartElement(CCNProtocolDTags.MinSuffixComponents))
+		interest.minSuffixComponents = decoder.readIntegerElement(CCNProtocolDTags.MinSuffixComponents);
+  else
+    interest.minSuffixComponents = null;
+
+	if (decoder.peekStartElement(CCNProtocolDTags.MaxSuffixComponents)) 
+		interest.maxSuffixComponents = decoder.readIntegerElement(CCNProtocolDTags.MaxSuffixComponents);
+  else
+    interest.maxSuffixComponents = null;
+			
+	if (decoder.peekStartElement(CCNProtocolDTags.PublisherPublicKeyDigest)) {
+		interest.publisherPublicKeyDigest = new PublisherPublicKeyDigest();
+		interest.publisherPublicKeyDigest.from_ccnb(decoder);
+	}
+  else
+    interest.publisherPublicKeyDigest = null;
+
+	if (decoder.peekStartElement(CCNProtocolDTags.Exclude)) {
+		interest.exclude = new Exclude();
+		interest.exclude.from_ccnb(decoder);
+	}
+  else
+    interest.exclude = null;
+		
+	if (decoder.peekStartElement(CCNProtocolDTags.ChildSelector))
+		interest.childSelector = decoder.readIntegerElement(CCNProtocolDTags.ChildSelector);
+  else
+    interest.childSelector = null;
+		
+	if (decoder.peekStartElement(CCNProtocolDTags.AnswerOriginKind))
+		interest.answerOriginKind = decoder.readIntegerElement(CCNProtocolDTags.AnswerOriginKind);
+  else
+    interest.answerOriginKind = null;
+		
+	if (decoder.peekStartElement(CCNProtocolDTags.Scope))
+		interest.scope = decoder.readIntegerElement(CCNProtocolDTags.Scope);
+  else
+    interest.scope = null;
+
+	if (decoder.peekStartElement(CCNProtocolDTags.InterestLifetime))
+		interest.interestLifetime = 1000.0 * DataUtils.bigEndianToUnsignedInt
+               (decoder.readBinaryElement(CCNProtocolDTags.InterestLifetime)) / 4096;
+  else
+    interest.interestLifetime = null;              
+		
+	if (decoder.peekStartElement(CCNProtocolDTags.Nonce))
+		interest.nonce = decoder.readBinaryElement(CCNProtocolDTags.Nonce);
+  else
+    interest.nonce = null;
+		
+	decoder.readEndElement();
+};
+
+/**
+ * Encode the contentObject by calling the operations on the encoder.
+ * @param {ContentObject} contentObject
+ * @param {BinaryXMLEncoder} encoder
+ */
+BinaryXMLWireFormat.encodeContentObject = function(contentObject, encoder)  {
+	//TODO verify name, SignedInfo and Signature is present
+	encoder.writeStartElement(contentObject.getElementLabel());
+
+	if (null != contentObject.signature) 
+    contentObject.signature.to_ccnb(encoder);
+		
+	contentObject.startSIG = encoder.offset;
+
+	if (null != contentObject.name) 
+    contentObject.name.to_ccnb(encoder);
+	
+	if (null != contentObject.signedInfo) 
+    contentObject.signedInfo.to_ccnb(encoder);
+
+	encoder.writeElement(CCNProtocolDTags.Content, contentObject.content);
+	
+	contentObject.endSIG = encoder.offset;
+	
+	encoder.writeEndElement();
+	
+	contentObject.saveRawData(encoder.ostream);	
+};
+
+/**
+ * Use the decoder to place the result in contentObject.
+ * @param {ContentObject} contentObject
+ * @param {BinaryXMLDecoder} decoder
+ */
+BinaryXMLWireFormat.decodeContentObject = function(contentObject, decoder) {
+	// TODO VALIDATE THAT ALL FIELDS EXCEPT SIGNATURE ARE PRESENT
+  decoder.readStartElement(contentObject.getElementLabel());
+
+	if( decoder.peekStartElement(CCNProtocolDTags.Signature) ){
+		contentObject.signature = new Signature();
+		contentObject.signature.from_ccnb(decoder);
+	}
+  else
+    contentObject.signature = null;
+		
+	contentObject.startSIG = decoder.offset;
+
+	contentObject.name = new Name();
+	contentObject.name.from_ccnb(decoder);
+		
+	if( decoder.peekStartElement(CCNProtocolDTags.SignedInfo) ){
+		contentObject.signedInfo = new SignedInfo();
+		contentObject.signedInfo.from_ccnb(decoder);
+	}
+  else
+    contentObject.signedInfo = null;
+
+  contentObject.content = decoder.readBinaryElement(CCNProtocolDTags.Content, null, true);
+		
+	contentObject.endSIG = decoder.offset;
+		
+	decoder.readEndElement();
+		
+	contentObject.saveRawData(decoder.input);
+};
