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