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');
+
+
