diff --git a/src-old/ContentObject.js b/src-old/ContentObject.js
new file mode 100644
index 0000000..0802479
--- /dev/null
+++ b/src-old/ContentObject.js
@@ -0,0 +1,12 @@
+// JavaScript Document
+
+var ContentObject = function ContentObject(_Signature,_Name,_SignedInfo,_Content){
+	
+	this.Signature = _Signature;
+	this.Name = _Name;
+	this.SignedInfo = _SignedInfo;
+	this.Content=_Content;
+	
+};
+
+exports.ContentObject = ContentObject;
diff --git a/src-old/ContentObjectDecoder.js b/src-old/ContentObjectDecoder.js
new file mode 100644
index 0000000..83e5aee
--- /dev/null
+++ b/src-old/ContentObjectDecoder.js
@@ -0,0 +1,214 @@
+// JavaScript Document
+/*
+	@author: Meki Cherkaoui
+*/
+var DTAGS = require('./TAG').d;
+var TT = require('./TAG').tt;
+
+
+var ContentObjectEncoder = function ContentObjectEncoder(){
+	
+	
+};
+
+
+/*
+	TT bits specify the type of nodes
+	
+*/
+var CCN_TT_BITS=3;
+var CCN_TT_MASK=((1 << CCN_TT_BITS) - 1);
+var CCN_MAX_TINY=((1 << (7-CCN_TT_BITS)) - 1);
+var CCN_TT_HBIT=((1 << 7));
+
+Encoder.prototype.encodeContentObject = function(_ContentObject){
+	
+	//var slit = function splitNumber(number){
+	//};
+	var i = 0;
+	
+	var addToBuffer = function addToBuffer(buffer,number,tt){
+		
+		
+		var sizeOfBuffer = 1+8*((sizeof(number)+6)/7);
+		
+		
+		
+		splitNumbers = new Buffer(sizeOfBuffer);
+		
+		number >>= 7-CCN_TT_BITS;
+		
+		splitNumbers.write((CCN_TT_HBIT & ~require('./TAG').d.CCN_CLOSE) |
+  			((number & CCN_MAX_TINY) << CCN_TT_BITS) |
+  			(CCN_TT_MASK & tt));
+		
+		var index = 1;
+		while(number>0){
+			splitNumbers.write( number & ~CCN_TT_HBIT |require('./TAG').d.CCN_CLOSE);
+			index++;
+			number>>=7;
+		}
+		
+		for( i=0, j=sizeofBuffer-1;i <sizeOfBuffer;i++,j--) {
+		
+			buffer[index+i] = splitNumbers[j];
+		}
+		
+	};
+	//NOTE NUMBETR= SIZE
+	var addToBufferData = function addToBuffer(buffer,data,tt){
+		
+		var number = sizeof(data);
+		var sizeOfBuffer = 1+8*((sizeof(number)+6)/7);
+		
+		splitNumbers = new Buffer(sizeOfBuffer);
+		
+		number >>= 7-CCN_TT_BITS;
+		
+		splitNumbers.write((CCN_TT_HBIT & ~require('./TAG').d.CCN_CLOSE) |
+  			((number & CCN_MAX_TINY) << CCN_TT_BITS) |
+  			(CCN_TT_MASK & tt));
+		
+		
+		while(number>0){
+			splitNumbers.write( number & ~CCN_TT_HBIT |require('./TAG').d.CCN_CLOSE);
+			index++;
+			number>>=7;
+		}
+		
+		for( i=0, j=sizeofBuffer-1;i <sizeOfBuffer;i++,j--) {
+		
+			buffer[index+i] = splitNumbers[j];
+		}
+		
+		for(i=0;i<10;i++){
+			buffer[index+i] = data[i];
+		}
+		
+	};
+	
+	//NOTE NUMBETR= SIZE
+	var addName = function addToBuffer(buffer,name){
+		
+		for(i=0;i<name.size;i++){
+			tt = require('./TAG').tt.CCN_BLOB ;
+			addToBufferData(buffer,_ContentObject.moSignature.SignatureBits,tt);
+			addCloseTag(buffer);
+		}
+		
+	};
+	
+	
+	var addCloseTag = function addCloseTag(buffer){
+		var tag = DTAGS.CCN_CLOSE;
+		buffer.write(tag);
+	}; 
+	
+	var buffer = new Buffer(1000);
+	 
+	var tag = DTAGS.CCN_DTAG_ContentObject;
+	var tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	
+	tag = DTAGS.CCN_Signature;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	
+	tag = DTAGS.CCN_SignatureBits;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	tt = TT.CCN_BLOB ;
+	addToBufferData(buffer,_ContentObject.moSignature.SignatureBits,tt);
+	
+	addCloseTag(buffer);
+	
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_Name;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+
+
+	addName(buffer,_ContentObject.moName,tt);
+
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_DTAG_SignedInfo;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+
+	tag = DTAGS.CCN_DTAG_PublisherPublicKeyDigest;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	addToBufferData(buffer,_ContentObject.moSignedInfo.msPublisherPublicKeyDigest ,tt);
+	
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_DTAG_Timestamp;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	addToBufferData(buffer,_ContentObject.moSignedInfo.msTimestamp ,tt);
+	
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_DTAG_KeyLocator;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	tag = DTAGS.CCN_DTAG_key;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	addToBufferData(buffer,_ContentObject.moSignedInfo.msKeyLocator ,tt);
+	
+	addCloseTag(buffer);
+	
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_DTAG_Content;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	addToBufferData(buffer,_ContentObject.msContent,tt);
+	
+	addCloseTag(buffer);
+	
+	addCloseTag(buffer);
+
+}
+
+
+Encoder.prototype.encodeContentObjectToFile = function(_filename){
+	
+	
+	var content = "hello world";
+	
+	var name = new require('./Name').Name(['hello']);
+	
+	var sigInfo = new require('./SignatureInfo').SignatureInfo(new Buffer('h7exThsbBBViA/knAnWd2lMdaAgW/lcI6EIAK6ln4Ut8/owZ0tobVQ4YJ3lHkl3qwzldAqLT8RayMU8cxpqrT6sa/nHFatbiObj2GrAAKbsJRSiV/ESzeVXPUHdbNJ75iDc5wjqvC4aJL8tGJt8vAOjJ7fy4MWD+mgFBYqn+1bw='));
+	
+	var sig = new require('./Signature').Signature(new Buffer("IEh0BFqfrJjrt9+txLvRqxWm5AZTScbIOoRghE6rMYU=",'base64'), new Buffer('BPMrnKOi','base64'), new Buffer('MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9lWVVnBeVwEml703J0byLmBtmCX6iU/XQ9Q8aHfkIrE5pp5fa3SwFkJRKboSeH7tzccU9/dvngCZW4dX0SbhTDZx9qNar69kOBhJNkn8vbFch8dDknn9qEWfK+WDZb/Wvqi0lZzN3cqlEyObOuFmyWiMdnsqHNXT/mCJchT847wIDAQAB','base64'));
+
+	sig.generateSignature(name,sigInfo,content);
+	
+	var co = new require('./ContentObject').ContentObject(sig,name,sigInfo,content);
+	
+	var buffer = this.encodeContentObject(co);
+	
+	fs.writeFile(_filename);
+	
+	
+}
+
+
+var co = new ContentObjectEncoder();
+
+
+var file = ContentObjectEncoder.decodeFile('/Users/eastman/Desktop/CCN/ccnx-0.5.0rc1/hello');
+
+
diff --git a/src-old/ContentObjectEncoder.js b/src-old/ContentObjectEncoder.js
new file mode 100644
index 0000000..ae10a5f
--- /dev/null
+++ b/src-old/ContentObjectEncoder.js
@@ -0,0 +1,260 @@
+// JavaScript Document
+/*
+	@author: Meki Cherkaoui
+*/
+var DTAGS = require('./TAG').d;
+var TT = require('./TAG').tt;
+
+
+var ContentObjectEncoder = function ContentObjectEncoder(){
+	
+	
+};
+
+
+/*
+	TT bits specify the type of nodes
+	
+*/
+var CCN_TT_BITS=3;
+var CCN_TT_MASK=((1 << CCN_TT_BITS) - 1);
+var CCN_MAX_TINY=((1 << (7-CCN_TT_BITS)) - 1);
+var CCN_TT_HBIT=((1 << 7));
+
+Encoder.prototype.encodeContentObject = function(_ContentObject){
+	
+	//var slit = function splitNumber(number){
+	//};
+
+	/*
+	 * returns an integer
+	 */
+	var encodeTypeAndVal = function(itype, lvalue, bstream) {
+	        /*
+	        We exploit the fact that encoding is done from the right, so this actually means
+	        there is a deterministic encoding from a long to a Type/Value pair:
+	        
+	        |    0    |    1    |    2    |    3    |    4    |    5    |    6    |    7    |
+	        |ABCD.EFGH|IJKL.MNOP|QRST.UVWX|YZ01.2345|6789.abcd|efgh.ijkl|mnop.qrst|uvwx.yz@#
+	        
+	               60>       53>       46>       39>       32>       25>       18>       11>        4>
+	        |_000.ABCD|_EFG.HIJK|_LMN.OPQR|_STU.VWXY|_Z01.2345|_678.9abc|_defg.hij|_klm.nopq|_rst.uvwx|_yz@#___
+	        
+	        What we want to do is compute the result in MSB order and write it directly
+	        to the channel without any intermediate form.
+	        */
+	   
+	       var bits;
+	       var count = 0;
+	       
+	       // once we start writing bits, we keep writing bits even if they are "0"
+	       var writing = false;
+	       
+	       // a few heuristic to catch the small-bit length patterns
+	       if( value < 0 || value > 15 ) {
+	           int start = 60;
+	           if( 0 <= value ) {
+	        	   if( value < bits_11 )
+	        		   start = 4;
+	        	   else if( value < bits_18 )
+	                   start = 11;
+	               else if( value < bits_32 )
+	                   start = 25;
+	           }
+	           
+	           for( var i = start; i >= 4; i -= 7) {
+	               bits = (int) (value >>> i) & BinaryXMLCodec.XML_REG_VAL_MASK;
+	               if( bits != 0 || writing ) {
+	                   ostream.write(bits);
+	                   count++;
+	                   writing = true;
+	               }
+	           }
+	       }
+	};
+	
+	var addToBuffer = function addToBuffer(buffer,number,tt){
+		
+		
+		var sizeOfBuffer = 1+8*((sizeof(number)+6)/7);
+		
+		
+		
+		splitNumbers = new Buffer(sizeOfBuffer);
+		
+		number >>= 7-CCN_TT_BITS;
+		
+		splitNumbers.write((CCN_TT_HBIT & ~require('./TAG').d.CCN_CLOSE) |
+  			((number & CCN_MAX_TINY) << CCN_TT_BITS) |
+  			(CCN_TT_MASK & tt));
+		
+		var index = 1;
+		while(number>0){
+			splitNumbers.write( number & ~CCN_TT_HBIT |require('./TAG').d.CCN_CLOSE);
+			index++;
+			number>>=7;
+		}
+		
+		for( i=0, j=sizeofBuffer-1;i <sizeOfBuffer;i++,j--) {
+		
+			buffer[index+i] = splitNumbers[j];
+		}
+		
+	};
+	//NOTE NUMBETR= SIZE
+	var addToBufferData = function addToBuffer(buffer,data,tt){
+		
+		var number = sizeof(data);
+		var sizeOfBuffer = 1+8*((sizeof(number)+6)/7);
+		
+		splitNumbers = new Buffer(sizeOfBuffer);
+		
+		number >>= 7-CCN_TT_BITS;
+		
+		splitNumbers.write((CCN_TT_HBIT & ~require('./TAG').d.CCN_CLOSE) |
+  			((number & CCN_MAX_TINY) << CCN_TT_BITS) |
+  			(CCN_TT_MASK & tt));
+		
+		
+		while(number>0){
+			splitNumbers.write( number & ~CCN_TT_HBIT |require('./TAG').d.CCN_CLOSE);
+			index++;
+			number>>=7;
+		}
+		
+		for( i=0, j=sizeofBuffer-1;i <sizeOfBuffer;i++,j--) {
+		
+			buffer[index+i] = splitNumbers[j];
+		}
+		
+		for(i=0;i<10;i++){
+			buffer[index+i] = data[i];
+		}
+		
+	};
+	
+	//NOTE NUMBETR= SIZE
+	var addName = function addToBuffer(buffer,name){
+		
+		for(i=0;i<name.size;i++){
+			tt = require('./TAG').tt.CCN_BLOB ;
+			addToBufferData(buffer,_ContentObject.moSignature.SignatureBits,tt);
+			addCloseTag(buffer);
+		}
+		
+	};
+	
+	
+	var addCloseTag = function addCloseTag(buffer){
+		var tag = DTAGS.CCN_CLOSE;
+		buffer.write(tag);
+	}; 
+	
+	var buffer = new Buffer(1000);
+	 
+	var tag = DTAGS.CCN_DTAG_ContentObject;
+	var tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	
+	tag = DTAGS.CCN_Signature;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	
+	tag = DTAGS.CCN_SignatureBits;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	tt = TT.CCN_BLOB ;
+	addToBufferData(buffer,_ContentObject.moSignature.SignatureBits,tt);
+	
+	addCloseTag(buffer);
+	
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_Name;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+
+
+	addName(buffer,_ContentObject.moName,tt);
+
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_DTAG_SignedInfo;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+
+	tag = DTAGS.CCN_DTAG_PublisherPublicKeyDigest;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	addToBufferData(buffer,_ContentObject.moSignedInfo.msPublisherPublicKeyDigest ,tt);
+	
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_DTAG_Timestamp;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	addToBufferData(buffer,_ContentObject.moSignedInfo.msTimestamp ,tt);
+	
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_DTAG_KeyLocator;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	tag = DTAGS.CCN_DTAG_key;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	addToBufferData(buffer,_ContentObject.moSignedInfo.msKeyLocator ,tt);
+	
+	addCloseTag(buffer);
+	
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_DTAG_Content;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	addToBufferData(buffer,_ContentObject.msContent,tt);
+	
+	addCloseTag(buffer);
+	
+	addCloseTag(buffer);
+
+}
+
+
+Encoder.prototype.encodeContentObjectToFile = function(_filename){
+	
+	
+	var content = "hello world";
+	
+	var name = new require('./Name').Name(['hello']);
+	
+	var sigInfo = new require('./SignatureInfo').SignatureInfo(new Buffer('h7exThsbBBViA/knAnWd2lMdaAgW/lcI6EIAK6ln4Ut8/owZ0tobVQ4YJ3lHkl3qwzldAqLT8RayMU8cxpqrT6sa/nHFatbiObj2GrAAKbsJRSiV/ESzeVXPUHdbNJ75iDc5wjqvC4aJL8tGJt8vAOjJ7fy4MWD+mgFBYqn+1bw='));
+	
+	var sig = new require('./Signature').Signature(new Buffer("IEh0BFqfrJjrt9+txLvRqxWm5AZTScbIOoRghE6rMYU=",'base64'), new Buffer('BPMrnKOi','base64'), new Buffer('MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9lWVVnBeVwEml703J0byLmBtmCX6iU/XQ9Q8aHfkIrE5pp5fa3SwFkJRKboSeH7tzccU9/dvngCZW4dX0SbhTDZx9qNar69kOBhJNkn8vbFch8dDknn9qEWfK+WDZb/Wvqi0lZzN3cqlEyObOuFmyWiMdnsqHNXT/mCJchT847wIDAQAB','base64'));
+
+	sig.generateSignature(name,sigInfo,content);
+	
+	var co = new require('./ContentObject').ContentObject(sig,name,sigInfo,content);
+	
+	var buffer = this.encodeContentObject(co);
+	
+	fs.writeFile(_filename);
+	
+	
+}
+
+
+var co = new ContentObjectEncoder();
+
+
+var file = ContentObjectEncoder.decodeFile('/Users/eastman/Desktop/CCN/ccnx-0.5.0rc1/hello');
+
+
diff --git a/src-old/Decoder.js b/src-old/Decoder.js
new file mode 100644
index 0000000..7a59e5e
--- /dev/null
+++ b/src-old/Decoder.js
@@ -0,0 +1,42 @@
+// JavaScript Document
+
+
+var Decoder = function Decoder(){
+	
+	
+	//PRIVATE FUNCTIONS
+	
+
+}
+
+
+//PUBLIC FUNCTIONS
+
+Decoder.prototype.decodeFile = function(filename){
+	var fs = require('fs');
+
+	var file = fs.readFile(filename, function(err,data){
+  		if(err) {
+   		 console.error("Could not open file: %s", err);
+   		 process.exit(1);
+  		}
+		
+		//console.log(data);
+		//console.log(data.toString('binary'));
+		for( i=0;i<data.length ;i++) {
+			var v = data[i];
+			console.log(v.toString(2)+'\n');
+		}
+
+		console.log( require('./TAG.js').d.CCN_DTAG_Any);
+		var a =new Buffer('aGVsbG8gd29ybGQK','base64');
+		console.log(a.toString('base64'));
+
+	});
+}
+
+
+
+var decoder = new Decoder();
+var file = decoder.decodeFile('/Users/eastman/Desktop/CCN/ccnx-0.5.0rc1/hello');
+
diff --git a/src-old/Encoder.js b/src-old/Encoder.js
new file mode 100644
index 0000000..4ced16c
--- /dev/null
+++ b/src-old/Encoder.js
@@ -0,0 +1,208 @@
+// JavaScript Document
+/*
+	Meki Cherkaoui
+*/
+var DTAGS = require('./TAG').d;
+var TT = require('./TAG').tt;
+
+
+var Encoder = function Encoder(){
+	
+	
+};
+/*
+	TT bits specify the type of nodes
+
+*/
+var CCN_TT_BITS=3;
+var CCN_TT_MASK=((1 << CCN_TT_BITS) - 1);
+var CCN_MAX_TINY=((1 << (7-CCN_TT_BITS)) - 1);
+var CCN_TT_HBIT=((1 << 7));
+
+Encoder.prototype.encodeContentObject = function(_ContentObject){
+	
+	//var slit = function splitNumber(number){
+	//};
+	var i = 0;
+	
+	var addToBuffer = function addToBuffer(buffer,number,tt){
+		
+		var sizeOfBuffer = 1+8*((sizeof(number)+6)/7);
+		
+		splitNumbers = new Buffer(sizeOfBuffer);
+		
+		number >>= 7-CCN_TT_BITS;
+		
+		splitNumbers.write((CCN_TT_HBIT & ~require('./TAG').d.CCN_CLOSE) |
+  			((number & CCN_MAX_TINY) << CCN_TT_BITS) |
+  			(CCN_TT_MASK & tt));
+		
+		var index = 1;
+		while(number>0){
+			splitNumbers.write( number & ~CCN_TT_HBIT |require('./TAG').d.CCN_CLOSE);
+			index++;
+			number>>=7;
+		}
+		
+		for( i=0, j=sizeofBuffer-1;i <sizeOfBuffer;i++,j--) {
+		
+			buffer[index+i] = splitNumbers[j];
+		}
+		
+	};
+	//NOTE NUMBETR= SIZE
+	var addToBufferData = function addToBuffer(buffer,data,tt){
+		
+		var number = sizeof(data);
+		var sizeOfBuffer = 1+8*((sizeof(number)+6)/7);
+		
+		splitNumbers = new Buffer(sizeOfBuffer);
+		
+		number >>= 7-CCN_TT_BITS;
+		
+		splitNumbers.write((CCN_TT_HBIT & ~require('./TAG').d.CCN_CLOSE) |
+  			((number & CCN_MAX_TINY) << CCN_TT_BITS) |
+  			(CCN_TT_MASK & tt));
+		
+		
+		while(number>0){
+			splitNumbers.write( number & ~CCN_TT_HBIT |require('./TAG').d.CCN_CLOSE);
+			index++;
+			number>>=7;
+		}
+		
+		for( i=0, j=sizeofBuffer-1;i <sizeOfBuffer;i++,j--) {
+		
+			buffer[index+i] = splitNumbers[j];
+		}
+		
+		for(i=0;i<10;i++){
+			buffer[index+i] = data[i];
+		}
+		
+	};
+	
+	//NOTE NUMBETR= SIZE
+	var addName = function addToBuffer(buffer,name){
+		
+		for(i=0;i<name.size;i++){
+			tt = require('./TAG').tt.CCN_BLOB ;
+			addToBufferData(buffer,_ContentObject.moSignature.SignatureBits,tt);
+			addCloseTag(buffer);
+		}
+		
+	};
+	
+	
+	var addCloseTag = function addCloseTag(buffer){
+		var tag = DTAGS.CCN_CLOSE;
+		buffer.write(tag);
+	}; 
+	
+	var buffer = new Buffer(1000);
+	 
+	var tag = DTAGS.CCN_DTAG_ContentObject;
+	var tt = require('./TAG').tt.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	
+	tag = DTAGS.CCN_Signature;
+	tt = require('./TAG').tt.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	
+	tag = DTAGS.CCN_SignatureBits;
+	tt = require('./TAG').tt.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	tt = require('./TAG').tt.CCN_BLOB ;
+	addToBufferData(buffer,_ContentObject.moSignature.SignatureBits,tt);
+	
+	addCloseTag(buffer);
+	
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_Name;
+	tt = require('./TAG').tt.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+
+
+	addName(buffer,_ContentObject.moName,tt);
+
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_DTAG_SignedInfo;
+	tt = require('./TAG').tt.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+
+	tag = DTAGS.CCN_DTAG_PublisherPublicKeyDigest;
+	tt = require('./TAG').tt.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	addToBufferData(buffer,_ContentObject.moSignedInfo.msPublisherPublicKeyDigest ,tt);
+	
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_DTAG_Timestamp;
+	tt = require('./TAG').tt.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	addToBufferData(buffer,_ContentObject.moSignedInfo.msTimestamp ,tt);
+	
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_DTAG_KeyLocator;
+	tt = require('./TAG').tt.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	tag = DTAGS.CCN_DTAG_key;
+	tt = require('./TAG').tt.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	addToBufferData(buffer,_ContentObject.moSignedInfo.msKeyLocator ,tt);
+	
+	addCloseTag(buffer);
+	
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_DTAG_Content;
+	tt = require('./TAG').tt.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	addToBufferData(buffer,_ContentObject.msContent,tt);
+	
+	addCloseTag(buffer);
+	
+	addCloseTag(buffer);
+
+}
+
+
+Encoder.prototype.encodeContentObjectToFile = function(_filename){
+	
+	
+	var content = "hello world";
+	
+	var name = new require('./Name').Name(['hello']);
+	
+	var sigInfo = new require('./SignatureInfo').SignatureInfo(new Buffer('h7exThsbBBViA/knAnWd2lMdaAgW/lcI6EIAK6ln4Ut8/owZ0tobVQ4YJ3lHkl3qwzldAqLT8RayMU8cxpqrT6sa/nHFatbiObj2GrAAKbsJRSiV/ESzeVXPUHdbNJ75iDc5wjqvC4aJL8tGJt8vAOjJ7fy4MWD+mgFBYqn+1bw='));
+	
+	var sig = new require('./Signature').Signature(new Buffer("IEh0BFqfrJjrt9+txLvRqxWm5AZTScbIOoRghE6rMYU=",'base64'), new Buffer('BPMrnKOi','base64'), new Buffer('MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9lWVVnBeVwEml703J0byLmBtmCX6iU/XQ9Q8aHfkIrE5pp5fa3SwFkJRKboSeH7tzccU9/dvngCZW4dX0SbhTDZx9qNar69kOBhJNkn8vbFch8dDknn9qEWfK+WDZb/Wvqi0lZzN3cqlEyObOuFmyWiMdnsqHNXT/mCJchT847wIDAQAB','base64'));
+
+	sig.generateSignature(name,sigInfo,content);
+	
+	var co = new require('./ContentObject').ContentObject(sig,name,sigInfo,content);
+	
+	var buffer = this.encodeContentObject(co);
+	
+	fs.writeFile(_filename);
+	
+	
+}
+
+
+var Encoder = new Encoder();
+
+var file = Encoder.decodeFile('/Users/eastman/Desktop/CCN/ccnx-0.5.0rc1/hello');
+
+
diff --git a/src-old/InterestMessage.js b/src-old/InterestMessage.js
new file mode 100644
index 0000000..90177b4
--- /dev/null
+++ b/src-old/InterestMessage.js
@@ -0,0 +1,17 @@
+// JavaScript Document
+
+var InterestMessage = function InterestMessage(_Name,_MinSuffixComponents,_MaxSuffixComponents,_PublisherPublicKeyDigest, _Exclude, _ChildSelector,_AnswerOriginKind,_Scope,_InterestLifetime,_Nonce){
+	
+	this.Name = _Name;
+	this.MinSuffixComponents = _MinSuffixComponents;
+	this.MaxSuffixComponents = _MaxSuffixComponents;
+	this.PublisherPublicKeyDigest=_PublisherPublicKeyDigest;
+	this.Exclude=_Exclude;
+	this.ChildSelector=_ChildSelector;
+	this.Scope=_Scope;
+	this.InterestLifetime=_InterestLifetime;
+	this.Nonce = _Nonce;
+	
+};
+
+exports.InterestMessage = InterestMessage;
diff --git a/src-old/InterestMessageDecoder.js b/src-old/InterestMessageDecoder.js
new file mode 100644
index 0000000..565c1a9
--- /dev/null
+++ b/src-old/InterestMessageDecoder.js
@@ -0,0 +1,207 @@
+// JavaScript Document
+/*
+	@author: Meki Cherkaoui
+*/
+var DTAGS = require('./TAG').d;
+var TT = require('./TAG').tt;
+
+
+var Encoder = function Encoder(){
+	
+	
+};
+/*
+	TT bits specify the type of nodes
+
+*/
+var CCN_TT_BITS=3;
+var CCN_TT_MASK=((1 << CCN_TT_BITS) - 1);
+var CCN_MAX_TINY=((1 << (7-CCN_TT_BITS)) - 1);
+var CCN_TT_HBIT=((1 << 7));
+
+Encoder.prototype.encodeContentObject = function(_ContentObject){
+	
+	//var slit = function splitNumber(number){
+	//};
+	var i = 0;
+	
+	var addToBuffer = function addToBuffer(buffer,number,tt){
+		
+		var sizeOfBuffer = 1+8*((sizeof(number)+6)/7);
+		
+		splitNumbers = new Buffer(sizeOfBuffer);
+		
+		number >>= 7-CCN_TT_BITS;
+		
+		splitNumbers.write((CCN_TT_HBIT & ~require('./TAG').d.CCN_CLOSE) |
+  			((number & CCN_MAX_TINY) << CCN_TT_BITS) |
+  			(CCN_TT_MASK & tt));
+		
+		var index = 1;
+		while(number>0){
+			splitNumbers.write( number & ~CCN_TT_HBIT |require('./TAG').d.CCN_CLOSE);
+			index++;
+			number>>=7;
+		}
+		
+		for( i=0, j=sizeofBuffer-1;i <sizeOfBuffer;i++,j--) {
+		
+			buffer[index+i] = splitNumbers[j];
+		}
+		
+	};
+	//NOTE NUMBETR= SIZE
+	var addToBufferData = function addToBuffer(buffer,data,tt){
+		
+		var number = sizeof(data);
+		var sizeOfBuffer = 1+8*((sizeof(number)+6)/7);
+		
+		splitNumbers = new Buffer(sizeOfBuffer);
+		
+		number >>= 7-CCN_TT_BITS;
+		
+		splitNumbers.write((CCN_TT_HBIT & ~require('./TAG').d.CCN_CLOSE) |
+  			((number & CCN_MAX_TINY) << CCN_TT_BITS) |
+  			(CCN_TT_MASK & tt));
+		
+		
+		while(number>0){
+			splitNumbers.write( number & ~CCN_TT_HBIT |require('./TAG').d.CCN_CLOSE);
+			index++;
+			number>>=7;
+		}
+		
+		for( i=0, j=sizeofBuffer-1;i <sizeOfBuffer;i++,j--) {
+		
+			buffer[index+i] = splitNumbers[j];
+		}
+		
+		for(i=0;i<10;i++){
+			buffer[index+i] = data[i];
+		}
+		
+	};
+	
+	//NOTE NUMBETR= SIZE
+	var addName = function addToBuffer(buffer,name){
+		
+		for(i=0;i<name.size;i++){
+			tt = require('./TAG').tt.CCN_BLOB ;
+			addToBufferData(buffer,_ContentObject.moSignature.SignatureBits,tt);
+			addCloseTag(buffer);
+		}
+		
+	};
+	
+	
+	var addCloseTag = function addCloseTag(buffer){
+		var tag = DTAGS.CCN_CLOSE;
+		buffer.write(tag);
+	}; 
+	
+	var buffer = new Buffer(1000);
+	 
+	var tag = DTAGS.CCN_DTAG_ContentObject;
+	var tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	
+	tag = DTAGS.CCN_Signature;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	
+	tag = DTAGS.CCN_SignatureBits;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	tt = TT.CCN_BLOB ;
+	addToBufferData(buffer,_ContentObject.moSignature.SignatureBits,tt);
+	
+	addCloseTag(buffer);
+	
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_Name;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+
+
+	addName(buffer,_ContentObject.moName,tt);
+
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_DTAG_SignedInfo;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+
+	tag = DTAGS.CCN_DTAG_PublisherPublicKeyDigest;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	addToBufferData(buffer,_ContentObject.moSignedInfo.msPublisherPublicKeyDigest ,tt);
+	
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_DTAG_Timestamp;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	addToBufferData(buffer,_ContentObject.moSignedInfo.msTimestamp ,tt);
+	
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_DTAG_KeyLocator;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	tag = DTAGS.CCN_DTAG_key;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	addToBufferData(buffer,_ContentObject.moSignedInfo.msKeyLocator ,tt);
+	
+	addCloseTag(buffer);
+	
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_DTAG_Content;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	addToBufferData(buffer,_ContentObject.msContent,tt);
+	
+	addCloseTag(buffer);
+	
+	addCloseTag(buffer);
+
+}
+
+
+Encoder.prototype.encodeContentObjectToFile = function(_filename){
+	
+	
+	var content = "hello world";
+	
+	var name = new require('./Name').Name(['hello']);
+	
+	var sigInfo = new require('./SignatureInfo').SignatureInfo(new Buffer('h7exThsbBBViA/knAnWd2lMdaAgW/lcI6EIAK6ln4Ut8/owZ0tobVQ4YJ3lHkl3qwzldAqLT8RayMU8cxpqrT6sa/nHFatbiObj2GrAAKbsJRSiV/ESzeVXPUHdbNJ75iDc5wjqvC4aJL8tGJt8vAOjJ7fy4MWD+mgFBYqn+1bw='));
+	
+	var sig = new require('./Signature').Signature(new Buffer("IEh0BFqfrJjrt9+txLvRqxWm5AZTScbIOoRghE6rMYU=",'base64'), new Buffer('BPMrnKOi','base64'), new Buffer('MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9lWVVnBeVwEml703J0byLmBtmCX6iU/XQ9Q8aHfkIrE5pp5fa3SwFkJRKboSeH7tzccU9/dvngCZW4dX0SbhTDZx9qNar69kOBhJNkn8vbFch8dDknn9qEWfK+WDZb/Wvqi0lZzN3cqlEyObOuFmyWiMdnsqHNXT/mCJchT847wIDAQAB','base64'));
+
+	sig.generateSignature(name,sigInfo,content);
+	
+	var co = new require('./ContentObject').ContentObject(sig,name,sigInfo,content);
+	
+	var buffer = this.encodeContentObject(co);
+	
+	fs.writeFile(_filename);
+	
+}
+
+
+var Encoder = new Encoder();
+
+var file = Encoder.decodeFile('/Users/eastman/Desktop/CCN/ccnx-0.5.0rc1/hello');
+
+
diff --git a/src-old/InterestMessageEncoder.js b/src-old/InterestMessageEncoder.js
new file mode 100644
index 0000000..ba90934
--- /dev/null
+++ b/src-old/InterestMessageEncoder.js
@@ -0,0 +1,234 @@
+// JavaScript Document
+/*
+	InterestMessageEncoder is used to convert XML Interest Message into Binary Interest Message.
+	@author: Meki Cherkaoui
+	
+*/
+var DTAGS = require('./TAG').d;
+var TT = require('./TAG').tt;
+
+
+/*
+	Constructor for the IME
+*/
+var InterestMessageEncoder = function InterestMessageEncoder(){
+	
+	
+};
+
+/*
+	TT bits specify the type of nodes
+
+*/
+var CCN_TT_BITS=3;
+var CCN_TT_MASK=((1 << CCN_TT_BITS) - 1);
+var CCN_MAX_TINY=((1 << (7-CCN_TT_BITS)) - 1);
+var CCN_TT_HBIT=((1 << 7));
+
+
+/*
+	Encode function takes in a content object and returs a buffer containing the whole binary encoding.
+	
+*/
+Encoder.prototype.encodeContentObject = function(_ContentObject){
+	
+	
+	var i = 0;
+	
+	
+	
+	/*
+		This function will add a Tag to the buffer
+		The number is the dtag number and tt is the tag type
+		http://www.ccnx.org/documentation/protocol/ccnx-protocol-2/ccnx-binary-encoding-ccnb/
+	
+	*/
+	var addTagToBuffer = function(buffer,number,tt){
+		
+		var sizeOfBuffer = 1+8*((sizeof(number)+6)/7);
+		
+		splitNumbers = new Buffer(sizeOfBuffer);
+		
+		number >>= 7-CCN_TT_BITS;
+		
+		splitNumbers.write((CCN_TT_HBIT & DTAGS.CCN_CLOSE) |
+  			((number & CCN_MAX_TINY) << CCN_TT_BITS) |
+  			(CCN_TT_MASK & tt));
+		
+		var index = 1;
+		while(number>0){
+			splitNumbers.write( number & ~CCN_TT_HBIT | DTAGS.CCN_CLOSE);
+			index++;
+			number>>=7;
+		}
+		
+		for( i=0, j=sizeofBuffer-1;i <sizeOfBuffer;i++,j--) {
+		
+			buffer.write(splitNumbers[j]);
+		}
+		
+	};
+	
+	//NOTE NUMBETR= SIZE
+	var addToBuffer = function(buffer,data,tt){
+		
+		var number = sizeof(data);
+		var sizeOfBuffer = 1+8*((sizeof(number)+6)/7);
+		
+		splitNumbers = new Buffer(sizeOfBuffer);
+		
+		number >>= 7-CCN_TT_BITS;
+		
+		splitNumbers.write((CCN_TT_HBIT & ~DTAGS.CCN_CLOSE) |
+  			((number & CCN_MAX_TINY) << CCN_TT_BITS) |
+  			(CCN_TT_MASK & tt));
+		
+		
+		while(number>0){
+			splitNumbers.write( number & ~CCN_TT_HBIT | DTAGS.CCN_CLOSE);
+			index++;
+			number>>=7;
+		}
+		
+		for( i=0, j=sizeofBuffer-1;i <sizeOfBuffer;i++,j--) {
+		
+			buffer[index+i] = splitNumbers[j];
+		}
+		
+		for(i=0;i<data.length;i++){
+			buffer[index+i] = data[i];
+		}
+		
+	};
+	
+	
+	/*
+		Add tag to buffer:
+			
+		
+	*/
+	var addName = function(buffer,name){
+		
+		for(i=0;i<name.size;i++){
+			tt = require('./TAG').tt.CCN_BLOB ;
+			addToBufferData(buffer,_ContentObject.moSignature.SignatureBits,tt);
+			addCloseTag(buffer);
+		}
+		
+	};
+	
+	
+	var addCloseTag = function(buffer){
+		var tag = DTAGS.CCN_CLOSE;
+		buffer.write(tag);
+	}; 
+	
+	var buffer = new Buffer(1000);
+	 
+	var tag = DTAGS.CCN_DTAG_ContentObject;
+	var tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	
+	tag = DTAGS.CCN_Signature;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	
+	tag = DTAGS.CCN_SignatureBits;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	tt = TT.CCN_BLOB ;
+	addToBufferData(buffer,_ContentObject.moSignature.SignatureBits,tt);
+	
+	addCloseTag(buffer);
+	
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_Name;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+
+
+	addName(buffer,_ContentObject.moName,tt);
+
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_DTAG_SignedInfo;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+
+	tag = DTAGS.CCN_DTAG_PublisherPublicKeyDigest;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	addToBufferData(buffer,_ContentObject.moSignedInfo.msPublisherPublicKeyDigest ,tt);
+	
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_DTAG_Timestamp;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	addToBufferData(buffer,_ContentObject.moSignedInfo.msTimestamp ,tt);
+	
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_DTAG_KeyLocator;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	tag = DTAGS.CCN_DTAG_key;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	addToBufferData(buffer,_ContentObject.moSignedInfo.msKeyLocator ,tt);
+	
+	addCloseTag(buffer);
+	
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_DTAG_Content;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	addToBufferData(buffer,_ContentObject.msContent,tt);
+	
+	addCloseTag(buffer);
+	
+	addCloseTag(buffer);
+
+
+	return buffer;
+}
+
+
+Encoder.prototype.encodeToFile = function(_filename){
+	
+	
+	var content = "hello world";
+	
+	var name = new require('./Name').Name(['hello']);
+	
+	var sigInfo = new require('./SignatureInfo').SignatureInfo(new Buffer('h7exThsbBBViA/knAnWd2lMdaAgW/lcI6EIAK6ln4Ut8/owZ0tobVQ4YJ3lHkl3qwzldAqLT8RayMU8cxpqrT6sa/nHFatbiObj2GrAAKbsJRSiV/ESzeVXPUHdbNJ75iDc5wjqvC4aJL8tGJt8vAOjJ7fy4MWD+mgFBYqn+1bw='));
+	
+	var sig = new require('./Signature').Signature(new Buffer("IEh0BFqfrJjrt9+txLvRqxWm5AZTScbIOoRghE6rMYU=",'base64'), new Buffer('BPMrnKOi','base64'), new Buffer('MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9lWVVnBeVwEml703J0byLmBtmCX6iU/XQ9Q8aHfkIrE5pp5fa3SwFkJRKboSeH7tzccU9/dvngCZW4dX0SbhTDZx9qNar69kOBhJNkn8vbFch8dDknn9qEWfK+WDZb/Wvqi0lZzN3cqlEyObOuFmyWiMdnsqHNXT/mCJchT847wIDAQAB','base64'));
+
+	sig.generateSignature(name,sigInfo,content);
+	
+	var co = new require('./ContentObject').ContentObject(sig,name,sigInfo,content);
+	
+	var buffer = this.encodeContentObject(co);
+	
+	fs.writeFile(_filename);
+	
+	
+}
+
+
+var InterestMessageEncoder = new InterestMessageEncoder();
+
+var file = InterestMessageEncoder.encodeToFile('/Users/eastman/Desktop/CCN/ccnx-0.5.0rc1/hello');
+
+
diff --git a/src-old/InterestMessageEncodingTest.js b/src-old/InterestMessageEncodingTest.js
new file mode 100644
index 0000000..a5c843d
--- /dev/null
+++ b/src-old/InterestMessageEncodingTest.js
@@ -0,0 +1,235 @@
+// JavaScript Document
+/*
+	InterestMessageEncoder is used to convert XML Interest Message into Binary Interest Message.
+	@author: Meki Cherkaoui
+	
+*/
+var DTAGS = require('./TAG').d;
+var TT = require('./TAG').tt;
+
+
+
+/*
+	Constructor for the IME
+*/
+var InterestMessageEncoder = function InterestMessageEncoder(){
+	
+	
+};
+
+/*
+	TT bits specify the type of nodes
+
+*/
+var CCN_TT_BITS=3;
+var CCN_TT_MASK=((1 << CCN_TT_BITS) - 1);
+var CCN_MAX_TINY=((1 << (7-CCN_TT_BITS)) - 1);
+var CCN_TT_HBIT=((1 << 7));
+
+
+/*
+	Encode function takes in a content object and returs a buffer containing the whole binary encoding.
+	
+*/
+InterestMessageEncoder.prototype.encodeContentObject = function(_InterestMessage){
+	
+	
+	var i = 0;
+	
+	
+	
+	/*
+		This function will add a Tag to the buffer
+		The number is the dtag number and tt is the tag type
+		http://www.ccnx.org/documentation/protocol/ccnx-protocol-2/ccnx-binary-encoding-ccnb/
+	
+	*/
+	var addTagToBuffer = function(buffer,number,tt){
+		
+		var sizeOfBuffer = 1+8*((sizeof(number)+6)/7);
+		
+		splitNumbers = new Buffer(sizeOfBuffer);
+		
+		number >>= 7-CCN_TT_BITS;
+		
+		splitNumbers.write((CCN_TT_HBIT & DTAGS.CCN_CLOSE) |
+  			((number & CCN_MAX_TINY) << CCN_TT_BITS) |
+  			(CCN_TT_MASK & tt));
+		
+		var index = 1;
+		while(number>0){
+			splitNumbers.write( number & ~CCN_TT_HBIT | DTAGS.CCN_CLOSE);
+			index++;
+			number>>=7;
+		}
+		
+		for( i=0, j=sizeofBuffer-1;i <sizeOfBuffer;i++,j--) {
+		
+			buffer.write(splitNumbers[j]);
+		}
+		
+	};
+	
+	//NOTE NUMBETR= SIZE
+	var addToBuffer = function(buffer,data,tt){
+		
+		var number = sizeof(data);
+		var sizeOfBuffer = 1+8*((sizeof(number)+6)/7);
+		
+		splitNumbers = new Buffer(sizeOfBuffer);
+		
+		number >>= 7-CCN_TT_BITS;
+		
+		splitNumbers.write((CCN_TT_HBIT & ~DTAGS.CCN_CLOSE) |
+  			((number & CCN_MAX_TINY) << CCN_TT_BITS) |
+  			(CCN_TT_MASK & tt));
+		
+		
+		while(number>0){
+			splitNumbers.write( number & ~CCN_TT_HBIT | DTAGS.CCN_CLOSE);
+			index++;
+			number>>=7;
+		}
+		
+		for( i=0, j=sizeofBuffer-1;i <sizeOfBuffer;i++,j--) {
+		
+			buffer[index+i] = splitNumbers[j];
+		}
+		
+		for(i=0;i<data.length;i++){
+			buffer[index+i] = data[i];
+		}
+		
+	};
+	
+	
+	/*
+		Add tag to buffer:
+			
+		
+	*/
+	var addName = function(buffer,name){
+		
+		for(i=0;i<name.size;i++){
+			tt = require('./TAG').tt.CCN_BLOB ;
+			addToBufferData(buffer,_ContentObject.moSignature.SignatureBits,tt);
+			addCloseTag(buffer);
+		}
+		
+	};
+	
+	
+	var addCloseTag = function(buffer){
+		var tag = DTAGS.CCN_CLOSE;
+		buffer.write(tag);
+	}; 
+	
+	var buffer = new Buffer(1000);
+	 
+	var tag = DTAGS.CCN_DTAG_ContentObject;
+	var tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	
+	tag = DTAGS.CCN_Signature;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	
+	tag = DTAGS.CCN_SignatureBits;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	tt = TT.CCN_BLOB ;
+	addToBufferData(buffer,_ContentObject.moSignature.SignatureBits,tt);
+	
+	addCloseTag(buffer);
+	
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_Name;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+
+
+	addName(buffer,_ContentObject.moName,tt);
+
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_DTAG_SignedInfo;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+
+	tag = DTAGS.CCN_DTAG_PublisherPublicKeyDigest;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	addToBufferData(buffer,_ContentObject.moSignedInfo.msPublisherPublicKeyDigest ,tt);
+	
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_DTAG_Timestamp;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	addToBufferData(buffer,_ContentObject.moSignedInfo.msTimestamp ,tt);
+	
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_DTAG_KeyLocator;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	tag = DTAGS.CCN_DTAG_key;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	addToBufferData(buffer,_ContentObject.moSignedInfo.msKeyLocator ,tt);
+	
+	addCloseTag(buffer);
+	
+	addCloseTag(buffer);
+	
+	tag = DTAGS.CCN_DTAG_Content;
+	tt = TT.CCN_DTAG ;
+	addToBuffer(buffer,tag,tt);
+	
+	addToBufferData(buffer,_ContentObject.msContent,tt);
+	
+	addCloseTag(buffer);
+	
+	addCloseTag(buffer);
+
+
+	return buffer;
+}
+
+
+Encoder.prototype.encodeToFile = function(_filename){
+	
+	
+	var content = "hello world";
+	
+	var name = new require('./Name').Name(['hello']);
+	
+	var sigInfo = new require('./SignatureInfo').SignatureInfo(new Buffer('h7exThsbBBViA/knAnWd2lMdaAgW/lcI6EIAK6ln4Ut8/owZ0tobVQ4YJ3lHkl3qwzldAqLT8RayMU8cxpqrT6sa/nHFatbiObj2GrAAKbsJRSiV/ESzeVXPUHdbNJ75iDc5wjqvC4aJL8tGJt8vAOjJ7fy4MWD+mgFBYqn+1bw='));
+	
+	var sig = new require('./Signature').Signature(new Buffer("IEh0BFqfrJjrt9+txLvRqxWm5AZTScbIOoRghE6rMYU=",'base64'), new Buffer('BPMrnKOi','base64'), new Buffer('MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC9lWVVnBeVwEml703J0byLmBtmCX6iU/XQ9Q8aHfkIrE5pp5fa3SwFkJRKboSeH7tzccU9/dvngCZW4dX0SbhTDZx9qNar69kOBhJNkn8vbFch8dDknn9qEWfK+WDZb/Wvqi0lZzN3cqlEyObOuFmyWiMdnsqHNXT/mCJchT847wIDAQAB','base64'));
+
+	sig.generateSignature(name,sigInfo,content);
+	
+	var co = new require('./ContentObject').ContentObject(sig,name,sigInfo,content);
+	
+	var buffer = this.encodeContentObject(co);
+	
+	fs.writeFile(_filename);
+	
+	
+}
+
+
+var InterestMessageEncoder = new InterestMessageEncoder();
+
+var file = InterestMessageEncoder.encodeToFile('/Users/eastman/Desktop/CCN/ccnx-0.5.0rc1/hello');
+
+
diff --git a/src-old/Name.js b/src-old/Name.js
new file mode 100644
index 0000000..6882f0e
--- /dev/null
+++ b/src-old/Name.js
@@ -0,0 +1,6 @@
+// JavaScript Document
+var Name = function Name(_Component){
+	this.Component = _Component;
+};
+
+exports.Name = Name;
\ No newline at end of file
diff --git a/src-old/Signature.js b/src-old/Signature.js
new file mode 100644
index 0000000..2d1d878
--- /dev/null
+++ b/src-old/Signature.js
@@ -0,0 +1,8 @@
+// JavaScript Document
+var Signature = function(_DigestAlgorithm, _Witness, _SignatureBits){
+	this.DigestAlgorithm = _DigestAlgorithm;
+	this.Witness = _Witness;
+	this.SignatureBits = _SignatureBits;
+}
+
+exports.Signature = Signature;
\ No newline at end of file
diff --git a/src-old/SignedInfo.js b/src-old/SignedInfo.js
new file mode 100644
index 0000000..dcc083f
--- /dev/null
+++ b/src-old/SignedInfo.js
@@ -0,0 +1,12 @@
+// JavaScript Document
+var SignedInfo = function SignedInfo(_PublisherPublicKeyDigest,_Timestamp,_Type,  _KeyLocator,_FreshnessSeconds,_FinalBlockID){
+	
+	this.PublisherPublicKeyDigest = _PublisherPublicKeyDigest;
+	this.Timestamp = _Timestamp;
+	this.FreshnessSeconds = _FinalBlockID;
+	this.FinalBlockID = _FinalBlockID;
+	this.KeyLocator= _KeyLocator;
+}
+
+exports.SignedInfo = SignedInfo;
+
diff --git a/src-old/TAG.js b/src-old/TAG.js
new file mode 100644
index 0000000..d95c610
--- /dev/null
+++ b/src-old/TAG.js
@@ -0,0 +1,113 @@
+// JavaScript Document
+
+
+//d are the dictionnary tags
+exports.tt= {
+  CCN_EXT : 0x00,
+  CCN_TAG : 0x01,
+  CCN_DTAG : 0x02,
+  CCN_ATTR : 0x03,
+  CCN_DATTR : 0x04,
+  CCN_BLOB : 0x05,
+  CCN_UDATA : 0x06
+};
+
+//d are the dictionnary tags
+exports.dtags= {
+  CCN_CLOSE :0,
+  CCN_DTAG_Any : 13,
+  CCN_DTAG_Name : 14,
+  CCN_DTAG_Component : 15,
+  CCN_DTAG_Certificate : 16,
+  CCN_DTAG_Collection : 17,
+  CCN_DTAG_CompleteName : 18,
+  CCN_DTAG_Content : 19,
+  CCN_DTAG_SignedInfo : 20,
+  CCN_DTAG_ContentDigest : 21,
+  CCN_DTAG_ContentHash : 22,
+  CCN_DTAG_Count : 24,
+  CCN_DTAG_Header : 25,
+  CCN_DTAG_Interest : 26,	/* 20090915 */
+  CCN_DTAG_Key : 27,
+  CCN_DTAG_KeyLocator : 28,
+  CCN_DTAG_KeyName : 29,
+  CCN_DTAG_Length : 30,
+  CCN_DTAG_Link : 31,
+  CCN_DTAG_LinkAuthenticator : 32,
+  CCN_DTAG_NameComponentCount : 33,	/* DeprecatedInInterest */
+  CCN_DTAG_RootDigest : 36,
+  CCN_DTAG_Signature : 37,
+  CCN_DTAG_Start : 38,
+  CCN_DTAG_Timestamp : 39,
+  CCN_DTAG_Type : 40,
+  CCN_DTAG_Nonce : 41,
+  CCN_DTAG_Scope : 42,
+  CCN_DTAG_Exclude : 43,
+  CCN_DTAG_Bloom : 44,
+  CCN_DTAG_BloomSeed : 45,
+  CCN_DTAG_AnswerOriginKind : 47,
+  CCN_DTAG_InterestLifetime : 48,
+  CCN_DTAG_Witness : 53,
+  CCN_DTAG_SignatureBits : 54,
+  CCN_DTAG_DigestAlgorithm : 55,
+  CCN_DTAG_BlockSize : 56,
+  CCN_DTAG_FreshnessSeconds : 58,
+  CCN_DTAG_FinalBlockID : 59,
+  CCN_DTAG_PublisherPublicKeyDigest : 60,
+  CCN_DTAG_PublisherCertificateDigest : 61,
+  CCN_DTAG_PublisherIssuerKeyDigest : 62,
+  CCN_DTAG_PublisherIssuerCertificateDigest : 63,
+  CCN_DTAG_ContentObject : 64,	/* 20090915 */
+  CCN_DTAG_WrappedKey : 65,
+  CCN_DTAG_WrappingKeyIdentifier : 66,
+  CCN_DTAG_WrapAlgorithm : 67,
+  CCN_DTAG_KeyAlgorithm : 68,
+  CCN_DTAG_Label : 69,
+  CCN_DTAG_EncryptedKey : 70,
+  CCN_DTAG_EncryptedNonceKey : 71,
+  CCN_DTAG_WrappingKeyName : 72,
+  CCN_DTAG_Action : 73,
+  CCN_DTAG_FaceID : 74,
+  CCN_DTAG_IPProto : 75,
+  CCN_DTAG_Host : 76,
+  CCN_DTAG_Port : 77,
+  CCN_DTAG_MulticastInterface : 78,
+  CCN_DTAG_ForwardingFlags : 79,
+  CCN_DTAG_FaceInstance : 80,
+  CCN_DTAG_ForwardingEntry : 81,
+  CCN_DTAG_MulticastTTL : 82,
+  CCN_DTAG_MinSuffixComponents : 83,
+  CCN_DTAG_MaxSuffixComponents : 84,
+  CCN_DTAG_ChildSelector : 85,
+  CCN_DTAG_RepositoryInfo : 86,
+  CCN_DTAG_Version : 87,
+  CCN_DTAG_RepositoryVersion : 88,
+  CCN_DTAG_GlobalPrefix : 89,
+  CCN_DTAG_LocalName : 90,
+  CCN_DTAG_Policy : 91,
+  CCN_DTAG_Namespace : 92,
+  CCN_DTAG_GlobalPrefixName : 93,
+  CCN_DTAG_PolicyVersion : 94,
+  CCN_DTAG_KeyValueSet : 95,
+  CCN_DTAG_KeyValuePair : 96,
+  CCN_DTAG_IntegerValue : 97,
+  CCN_DTAG_DecimalValue : 98,
+  CCN_DTAG_StringValue : 99,
+  CCN_DTAG_BinaryValue : 100,
+  CCN_DTAG_NameValue : 101,
+  CCN_DTAG_Entry : 102,
+  CCN_DTAG_ACL : 103,
+  CCN_DTAG_ParameterizedName : 104,
+  CCN_DTAG_Prefix : 105,
+  CCN_DTAG_Suffix : 106,
+  CCN_DTAG_Root : 107,
+  CCN_DTAG_ProfileName : 108,
+  CCN_DTAG_Parameters : 109,
+  CCN_DTAG_InfoString : 110,
+  CCN_DTAG_StatusResponse : 112,
+  CCN_DTAG_StatusCode : 113,
+  CCN_DTAG_StatusText : 114,
+  CCN_DTAG_Nack : 200,
+  CCN_DTAG_SequenceNumber : 256,
+  CCN_DTAG_CCNProtocolDataUnit : 17702112
+};
\ No newline at end of file
diff --git a/src-old/TextXMLEncoder.js b/src-old/TextXMLEncoder.js
new file mode 100644
index 0000000..402022d
--- /dev/null
+++ b/src-old/TextXMLEncoder.js
@@ -0,0 +1,18 @@
+/*
+	
+ */
+
+
+/**
+ * An implementation of XMLEncoder for the Text codec. 
+ * 
+ * @see TextXMLCodec
+ * @see XMLEncoder
+ */
+var TextXMLEncoder = function TextXMLEncoder(){
+	
+	
+	
+};
+
+
