diff --git a/.DS_Store b/.DS_Store
index b34b353..327b47a 100644
--- a/.DS_Store
+++ b/.DS_Store
Binary files differ
diff --git a/js/CCNTime.js b/js/CCNTime.js
index 5aafca1..26e98df 100644
--- a/js/CCNTime.js
+++ b/js/CCNTime.js
@@ -4,15 +4,28 @@
  */
 
 var CCNTime = function CCNTime(
-                               //long 
-msec) {
+                               
+		msec) {
 
 
 
 
 	this.NANOS_MAX = 999877929;
 	
-	this.date = new Date(msec);
+	if(typeof msec =='object'){
+		this.setDateBinary(msec);
+		this.msec = msec;
+		this.msecHex = toHex(msec);
+	}
+	else if(typeof msec =='string'){
+		
+		this.msec = toNumbers(msec);
+		this.setDateBinary(this.msec);
+		this.msecHex = msec;
+	}
+	else{
+		if(LOG>1) console.log('UNRECOGNIZED TYPE FOR TIME');
+	}
 };
 
 
@@ -21,18 +34,7 @@
 	 * @param timestamp source timestamp to initialize from, some precision will be lost
 	 */
 
-	/**
-	 * Create a CCNTime
-	 * @param time source Date to initialize from, some precision will be lost
-	 * as CCNTime does not round to unitary milliseconds
-	 */
-CCNTime.prototype.setDate = function(
-	//Date 
-		date) {
 
-	this.date = date;
-};
-	
 	/**
 	 * Create a CCNTime from its binary encoding
 	 * @param binaryTime12 the binary representation of a CCNTime
@@ -50,24 +52,22 @@
 	value = 0;
 	for(i = 0; i < binaryTime12.length; i++) {
 		value = value << 8;
-		// Java will assume the byte is signed, so extend it and trim it.
 		b = (binaryTime12[i]) & 0xFF;
 		value |= b;
 	}
 	
-	this.date = new Date(value);
+	this.date = value;
+	//this.date = new Date(value);
 
 };
 
 //byte[]
 CCNTime.prototype.toBinaryTime = function() {
-	
-	
 
-	return unsignedLongToByteArray(this.date.getTime());
+	return this.msec; //unsignedLongToByteArray(this.date.getTime());
 
 }
-
+/*
 unsignedLongToByteArray= function( value) {
 	if( 0 == value )
 		return [0];
@@ -95,5 +95,5 @@
 			out[ offset - i ] = b;
 	}
 	return out;
-}
+}*/
 	
diff --git a/js/ContentName.js b/js/ContentName.js
index bec8482..8c12188 100644
--- a/js/ContentName.js
+++ b/js/ContentName.js
@@ -15,23 +15,43 @@
 	this.ROOT = null;
 	
 	if( typeof _Components == 'string') {
-		this.Components = _Components;
 		
-
+		if(LOG>3)console.log('Content Name String '+_Components);
+		this.Components = createNameArray(_Components);
 	}
 	else if(typeof _Components === 'object' && _Components instanceof Array ){
 		
+		if(LOG>4)console.log('Content Name Array '+_Components);
 		this.Components = _Components;
 
 	}
+	else if(_Components==null){
+		this.Components =[];
+	}
 	else{
-		
-		console.log("TODO: This should be an array");
-		this.Components==_Components;
+
+		if(LOG>1)console.log("NO CONTENT NAME GIVEN");
+
 	}
 };
 
+function createNameArray(name){
 
+		
+	//message = decodeURIComponent(message);
+	name = unescape(name);
+	
+	var array = name.split('/');
+
+	
+	if(name[0]=="/")
+		array=array.slice(1,array.length);
+		
+	if(name[name.length-1]=="/")
+		array=array.slice(0,array.length-1);
+	
+	return array;
+}
 
 
 ContentName.prototype.decode = function(/*XMLDecoder*/ decoder)  {
@@ -49,7 +69,8 @@
 
 ContentName.prototype.encode = function(/*XMLEncoder*/ encoder)  {
 		
-		//TODO Check if parameters are valid
+		if( this.Components ==null ) 
+			throw new Exception("CANNOT ENCODE EMPTY CONTENT NAME");
 
 		encoder.writeStartElement(this.getElementLabel());
 		var count = this.Components.length;
diff --git a/js/ContentObject.js b/js/ContentObject.js
index d05f7ba..e120a98 100644
--- a/js/ContentObject.js
+++ b/js/ContentObject.js
@@ -6,7 +6,7 @@
 	
 	
 	if (typeof _Name === 'string'){
-		var n = new Name(_Name);
+		this.Name = new ContentName(_Name);
 	}
 	else{
 		//TODO Check the class of _Name
@@ -16,26 +16,115 @@
 	this.Content=_Content;
 	this.Signature = _Signature;
 
+	
+	this.StartSIG = null;
+	this.EndSIG = null;
+	
+	this.StartSignedInfo = null;
+	this.EndContent = null;
+	
+	this.rawSignatureData = null;
 };
 
+ContentObject.prototype.sign = function(){
+	var n1 = this.encodeObject(this.Name);
+	var n2 = this.encodeObject(this.SignedInfo);
+	var n3 = this.encodeContent();
+	
+	var n = n1.concat(n2,n3);
+	if(LOG>2)console.log('Signature Data is (binary) '+n);
+	
+	if(LOG>2)console.log('Signature Data is (RawString) '+ toString(n) );
+	if(LOG>2)console.log(toString(n) );
+	
+	
+	var rsa = new RSAKey();
+			
+	rsa.readPrivateKeyFromPEMString(globalKeyManager.privateKey);
+			
+	var hSig = rsa.signString(toString(n), "sha256");
+
+	if(LOG>2)console.log('SIGNATURE SAVED IS');
+	
+	if(LOG>2)console.log(hSig);
+	
+	if(LOG>2)console.log(toNumbers(hSig.trim()));
+
+	this.Signature.Signature = toNumbers(hSig.trim());
+};
+
+ContentObject.prototype.encodeObject = function encodeObject(obj){
+	var enc = new BinaryXMLEncoder();
+ 
+	obj.encode(enc);
+	
+	var num = enc.getReducedOstream();
+
+	return num;
+
+	
+};
+
+ContentObject.prototype.encodeContent = function encodeContent(obj){
+	var enc = new BinaryXMLEncoder();
+	 
+	enc.writeElement(CCNProtocolDTags.Content, this.Content);
+
+	var num = enc.getReducedOstream();
+
+	return num;
+
+	
+};
+
+ContentObject.prototype.saveRawData = function(bytes){
+	
+	var sigBits = bytes.slice(this.StartSIG, this.EndSIG );
+	
+	//var sigIngoPlusContentBits = bytes.slice(this.StartSignedInfo, this.EndContent );
+	
+	//var concat = sigBits.concat(sigIngoPlusContentBits);
+	
+	//this.rawSignatureData = concat;
+
+	this.rawSignatureData = sigBits;
+};
 
 ContentObject.prototype.decode = function(/*XMLDecoder*/ decoder) {
 
 		decoder.readStartElement(this.getElementLabel());
 
-		this.Signature = new Signature();
-		this.Signature.decode(decoder);
+		
+		if( decoder.peekStartElement(CCNProtocolDTags.Signature) ){
+			this.Signature = new Signature();
+			this.Signature.decode(decoder);
+		}
+		
+		//this.EndSIG = decoder.offset;
+
+		this.StartSIG = decoder.offset;
 
 		this.Name = new ContentName();
 		this.Name.decode(decoder);
-
-		this.SignedInfo = new SignedInfo();
-		this.SignedInfo.decode(decoder);
-
+		
+		//this.StartSignedInfo = decoder.offset;
+	
+		
+		if( decoder.peekStartElement(CCNProtocolDTags.SignedInfo) ){
+			this.SignedInfo = new SignedInfo();
+			this.SignedInfo.decode(decoder);
+		}
+		
 		this.Content = decoder.readBinaryElement(CCNProtocolDTags.Content);
 
-		decoder.readEndElement();
+		
+		//this.EndContent = decoder.offset;
+		this.EndSIG = decoder.offset;
 
+		
+		decoder.readEndElement();
+		
+		this.saveRawData(decoder.istream);
 };
 
 ContentObject.prototype.encode = function(/*XMLEncoder*/ encoder)  {
@@ -45,14 +134,35 @@
 
 	encoder.writeStartElement(this.getElementLabel());
 
+	
+
+
 	if(null!=this.Signature) this.Signature.encode(encoder);
+	
+	
+	this.StartSIG = encoder.offset;
+	
+
 	if(null!=this.Name) this.Name.encode(encoder);
+	
+	//this.EndSIG = encoder.offset;
+	//this.StartSignedInfo = encoder.offset;
+	
+	
 	if(null!=this.SignedInfo) this.SignedInfo.encode(encoder);
 
 	encoder.writeElement(CCNProtocolDTags.Content, this.Content);
 
-	encoder.writeEndElement();
+	
+	this.EndSIG = encoder.offset;
+	
+	//this.EndContent = encoder.offset;
+	
 
+	encoder.writeEndElement();
+	
+	this.saveRawData(encoder.ostream);
+	
 };
 
 ContentObject.prototype.getElementLabel= function(){return CCNProtocolDTags.ContentObject;};
diff --git a/js/FaceInstance.js b/js/FaceInstance.js
index 48d9e5f..9f32ade 100644
--- a/js/FaceInstance.js
+++ b/js/FaceInstance.js
@@ -1,4 +1,7 @@
-
+/*
+ * @author: ucla-cs
+ * This class represents Face Instances
+ */
 
 
 var FaceInstance  = function FaceInstance(
@@ -151,7 +154,5 @@
 }
 
 
-
-
 FaceInstance.prototype.getElementLabel= function(){return CCNProtocolDTags.FaceInstance;};
 
diff --git a/js/ForwardingEntry.js b/js/ForwardingEntry.js
index 6702f39..60fe750 100644
--- a/js/ForwardingEntry.js
+++ b/js/ForwardingEntry.js
@@ -1,4 +1,7 @@
-
+/*
+ * @author: ucla-cs
+ * This class represents Forwarding Entries
+ */
 
 var ForwardingEntry = function ForwardingEntry(
                                                //ActionType 
diff --git a/js/KeyLocator.js b/js/KeyLocator.js
index 68adcba..d61ed12 100644
--- a/js/KeyLocator.js
+++ b/js/KeyLocator.js
@@ -18,6 +18,7 @@
     	this.KeyName = _Input;
     }
     else if(_Type==KeyLocatorType.KEY){
+    	console.log('SET KEY');
     	this.PublicKey = _Input;
     }
     else if(_Type==KeyLocatorType.CERTIFICATE){
@@ -37,16 +38,19 @@
 				
 				//TODO FIX THIS, This should create a Key Object instead of keeping bytes
 
-				this.Key =   encodedKey;//CryptoUtil.getPublicKey(encodedKey);
+				this.PublicKey =   encodedKey;//CryptoUtil.getPublicKey(encodedKey);
 				
-				this.PublicKey = encodedKey;
+				
+
+				if(LOG>4) console.log('PUBLIC KEY FOUND: '+ this.PublicKey);
+				//this.PublicKey = encodedKey;
 				
 				
 			} catch (e) {
 				throw new Exception("Cannot parse key: ", e);
 			} 
 
-			if (null == this.Key) {
+			if (null == this.PublicKey) {
 				throw new Exception("Cannot parse key: ");
 			}
 
@@ -61,13 +65,20 @@
 				//CertificateFactory factory = CertificateFactory.getInstance("X.509");
 				//this.Certificate = (X509Certificate) factory.generateCertificate(new ByteArrayInputStream(encodedCert));
 				
+
+				this.Certificate = encodedCert;
+				
+				if(LOG>4) console.log('CERTIFICATE FOUND: '+ this.Certificate);
+				
 			} catch ( e) {
 				throw new Exception("Cannot decode certificate: " +  e);
 			}
 			if (null == this.Certificate) {
 				throw new Exception("Cannot parse certificate! ");
 			}
-		} else {
+		} else  {
+			
+
 			this.KeyName = new KeyName();
 			this.KeyName.decode(decoder);
 		}
@@ -76,18 +87,19 @@
 	
 
 	KeyLocator.prototype.encode = function( encoder) {
-			
+		
+		if(LOG>2) console.log('type is is ' + this.Type);
 		//TODO Check if Name is missing
-		/*if (!validate()) {
+		if (!this.validate()) {
 			throw new ContentEncodingException("Cannot encode " + this.getClass().getName() + ": field values missing.");
-		}*/
+		}
 
 		
 		//TODO FIX THIS TOO
 		encoder.writeStartElement(this.getElementLabel());
 		
-		if (this._Type == KeyLocatorType.KEY) {
-			
+		if (this.Type == KeyLocatorType.KEY) {
+			if(LOG>5)console.log('About to encode a public key' +this.PublicKey);
 			encoder.writeElement(CCNProtocolDTags.Key, this.PublicKey);
 			
 		} else if (this.Type == KeyLocatorType.CERTIFICATE) {
@@ -99,7 +111,7 @@
 			}
 			
 		} else if (this.Type == KeyLocatorType.NAME) {
-			console.log('ACTUALLY HERE');
+			
 			this.KeyName.encode(encoder);
 		}
 		encoder.writeEndElement();
@@ -111,6 +123,6 @@
 };
 
 KeyLocator.prototype.validate = function() {
-	return (  (null != this.keyName) || (null != this.PublicKey) || (null != this.Certificate)   );
+	return (  (null != this.KeyName) || (null != this.PublicKey) || (null != this.Certificate)   );
 };
 	
\ No newline at end of file
diff --git a/js/KeyName.js b/js/KeyName.js
index 036a550..2c79bfc 100644
--- a/js/KeyName.js
+++ b/js/KeyName.js
@@ -20,6 +20,8 @@
 	this.ContentName = new ContentName();
 	this.ContentName.decode(decoder);
 	
+	if(LOG>4) console.log('KEY NAME FOUND: ');
+	
 	if ( peek(decoder) ) {
 		this.PublisherID = new PublisherID();
 		this.PublisherID.decode(decoder);
diff --git a/js/PublisherPublicKeyDigest.js b/js/PublisherPublicKeyDigest.js
index 92dec39..adbc25c 100644
--- a/js/PublisherPublicKeyDigest.js
+++ b/js/PublisherPublicKeyDigest.js
@@ -4,24 +4,39 @@
  */
 var PublisherPublicKeyDigest = function PublisherPublicKeyDigest(_pkd){ 
 	
- 	 if( typeof _pkd == "ByteArray") this.PublisherPublicKeyDigest = _pkd; // Byte Array
- 	 else if( typeof _pkd == "PublicKey") ;//TODO...
+	
+ 	 this.PUBLISHER_ID_LEN = 256/8;
+ 	 
+	 this.PublisherPublicKeyDigest = _pkd;
+ 	 //if( typeof _pkd == "object") this.PublisherPublicKeyDigest = _pkd; // Byte Array
+ 	 //else if( typeof _pkd == "PublicKey") ;//TODO...
     
+ 	 
+
 };
 
+
+
+
 PublisherPublicKeyDigest.prototype.decode = function( decoder) {		
 
 		this.PublisherPublicKeyDigest = decoder.readBinaryElement(this.getElementLabel());
+		
+		if(LOG>4)console.log('Publisher public key digest is ' + this.PublisherPublicKeyDigest);
+
 		if (null == this.PublisherPublicKeyDigest) {
 			throw new Exception("Cannot parse publisher key digest.");
 		}
 		
 		//TODO check if the length of the PublisherPublicKeyDigest is correct ( Security reason)
 
-		/*if (this.PublisherPublicKeyDigest.length != PublisherID.PUBLISHER_ID_LEN) {
-			console.log('SHOULD NOT GO HERE !!!!!!!!!!!!!!!!!!');
-			this.PublisherPublicKeyDigest = new PublisherPublicKeyDigest(this.PublisherPublicKeyDigest).PublisherKeyDigest;
-		}*/
+		if (this.PublisherPublicKeyDigest.length != PublisherID.PUBLISHER_ID_LEN) {
+			
+			console.log('LENGTH OF PUBLISHER ID IS WRONG!');
+			
+			//this.PublisherPublicKeyDigest = new PublisherPublicKeyDigest(this.PublisherPublicKeyDigest).PublisherKeyDigest;
+		
+		}
 	};
 
 PublisherPublicKeyDigest.prototype.encode= function( encoder) {
@@ -29,8 +44,8 @@
 		/*if (!this.validate()) {
 			throw new Exception("Cannot encode : field values missing.");
 		}*/
-	
-		if (this.PublisherKeyDigest!=null)this.encoder.writeElement(this.getElementLabel(), this.PublisherKeyDigest);
+		if(LOG>3) console.log('PUBLISHER KEY DIGEST IS'+this.PublisherPublicKeyDigest);
+		encoder.writeElement(this.getElementLabel(), this.PublisherPublicKeyDigest);
 };
 	
 PublisherPublicKeyDigest.prototype.getElementLabel = function() { return CCNProtocolDTags.PublisherPublicKeyDigest; };
diff --git a/js/Signature.js b/js/Signature.js
index 763d9fe..f8f4d69 100644
--- a/js/Signature.js
+++ b/js/Signature.js
@@ -11,16 +11,49 @@
 	this.DigestAlgorithm = _DigestAlgorithm//String _digestAlgorithm;
 };
 
+var generateSignature = function(contentName,content,signedinfo){
+	
+	var enc = new BinaryXMLEncoder();
+	contentName.encode(enc);
+	var hex1 = toHex(enc.getReducedOstream());
+
+	var enc = new BinaryXMLEncoder();
+	content.encode(enc);
+	var hex2 = toHex(enc.getReducedOstream());
+
+	var enc = new BinaryXMLEncoder();
+	signedinfo.encode(enc);
+	var hex3 = toHex(enc.getReducedOstream());
+
+	var hex = hex1+hex2+hex3;
+
+	//globalKeyManager.sig
+
+};
 
 Signature.prototype.decode =function( decoder) {
 		decoder.readStartElement(this.getElementLabel());
+		
+		if(LOG>4)console.log('STARTED DECODING SIGNATURE ');
+		
 		if (decoder.peekStartElement(CCNProtocolDTags.DigestAlgorithm)) {
+			
+			if(LOG>4)console.log('DIGIEST ALGORITHM FOUND');
 			this.DigestAlgorithm = decoder.readUTF8Element(CCNProtocolDTags.DigestAlgorithm); 
 		}
 		if (decoder.peekStartElement(CCNProtocolDTags.Witness)) {
+			if(LOG>4)console.log('WITNESS FOUND FOUND');
 			this.Witness = decoder.readBinaryElement(CCNProtocolDTags.Witness); 
 		}
-		this.Signature = decoder.readBinaryElement(CCNProtocolDTags.SignatureBits);	
+		
+		//FORCE TO READ A SIGNATURE
+
+		//if (decoder.peekStartElement(CCNProtocolDTags.SignatureBits)) {
+			//if(LOG>4)console.log('SIGNATURE FOUND ');
+			this.Signature = decoder.readBinaryElement(CCNProtocolDTags.SignatureBits);	
+
+		//}
+		
 		decoder.readEndElement();
 	
 };
diff --git a/js/SignedInfo.js b/js/SignedInfo.js
index 3d03f17..0b81201 100644
--- a/js/SignedInfo.js
+++ b/js/SignedInfo.js
@@ -13,7 +13,7 @@
 var SignedInfo = function SignedInfo(_publisher,_timestamp,_type,_locator,_freshnessSeconds,_finalBlockID){
 
 	//TODO, Check types
-    
+
     this.Publisher = _publisher; //PublisherPublicKeyDigest
     this.Timestamp=_timestamp; // CCN Time
     this.Type=_type; // ContentType
@@ -23,18 +23,45 @@
 
 };
 
+SignedInfo.prototype.setFields = function(){
+	//BASE64 -> RAW STRING
+	
+	var stringCertificate = DataUtils.base64toString(globalKeyManager.certificate);
+	
+	if(LOG>3)console.log('string Certificate is '+stringCertificate);
+
+	//HEX -> BYTE ARRAY
+	var publisherkey = toNumbers(hex_sha256(stringCertificate));
+	
+	if(LOG>3)console.log('publisher key is ');
+	if(LOG>3)console.log(publisherkey);
+	
+	this.Publisher = new PublisherPublicKeyDigest(publisherkey);
+
+	
+	this.Timestamp = new CCNTime('FD0499602d2000');
+	
+	this.Type = ContentType.DATA;
+	
+	console.log('toNumbersFromString(stringCertificate) '+toNumbersFromString(stringCertificate));
+	this.Locator = new KeyLocator(  toNumbersFromString(stringCertificate)  ,KeyLocatorType.KEY );
+
+};
 
 SignedInfo.prototype.decode = function( decoder){
 
 		decoder.readStartElement( this.getElementLabel() );
 		
 		if (decoder.peekStartElement(CCNProtocolDTags.PublisherPublicKeyDigest)) {
+			if(LOG>3) console.log('DECODING PUBLISHER KEY');
 			this.Publisher = new PublisherPublicKeyDigest();
 			this.Publisher.decode(decoder);
 		}
 
 		if (decoder.peekStartElement(CCNProtocolDTags.Timestamp)) {
 			this.Timestamp = decoder.readDateTime(CCNProtocolDTags.Timestamp);
+			if(LOG>4)console.log('TIMESTAMP FOUND IS  '+this.Timestamp);
+
 		}
 
 		if (decoder.peekStartElement(CCNProtocolDTags.Type)) {
@@ -43,22 +70,25 @@
 		
 			//TODO Implement Type of Key Reading
 			
-			//this.Type = valueToType(binType);
+			if(LOG>4)console.log('TYPE IS'+bintype);
+
+			this.Type = this.valueToType(binType);
 			
 			
 			//TODO Implement Type of Key Reading
 			
-			/*
+			
 			if (null == this.Type) {
 				throw new Exception("Cannot parse signedInfo type: bytes.");
 			}
 			
 		} else {
-			this.Type = ContentType.DATA; // default*/
+			this.Type = ContentType.DATA; // default
 		}
 		
 		if (decoder.peekStartElement(CCNProtocolDTags.FreshnessSeconds)) {
 			this.FreshnessSeconds = decoder.readIntegerElement(CCNProtocolDTags.FreshnessSeconds);
+			if(LOG>4) console.log('FRESHNESS IN SECONDS IS '+ this.FreshnessSeconds);
 		}
 		
 		if (decoder.peekStartElement(CCNProtocolDTags.FinalBlockID)) {
@@ -80,6 +110,8 @@
 		encoder.writeStartElement(this.getElementLabel());
 		
 		if (null!=this.Publisher) {
+			if(LOG>3) console.log('ENCODING PUBLISHER KEY' + this.Publisher.PublisherPublicKeyDigest);
+
 			this.Publisher.encode(encoder);
 		}
 
@@ -107,6 +139,15 @@
 		encoder.writeEndElement();   		
 };
 	
+SignedInfo.prototype.valueToType = function(){
+	//for (Entry<byte [], ContentType> entry : ContentValueTypes.entrySet()) {
+		//if (Arrays.equals(value, entry.getKey()))
+			//return entry.getValue();
+		//}
+	return null;
+	
+};
+
 SignedInfo.prototype.getElementLabel = function() { 
 	return CCNProtocolDTags.SignedInfo;
 };
diff --git a/js/java_socket_bridge.js b/js/java_socket_bridge.js
index 5ed0c9d..5ecb343 100644
--- a/js/java_socket_bridge.js
+++ b/js/java_socket_bridge.js
@@ -3,7 +3,10 @@
  * This class represents Interest Objects
  */
 
-var LOG = 5; 
+//var ccndAddr = unescape(%E0%A0%1E%099h%F9t%0C%E7%F46%1B%AB%F5%BB%05%A4%E5Z%AC%A5%E5%8Fs%ED%DE%B8%E0%13%AA%8F);
+var ccndAddrHex = '%E0%A0%1E%099h%F9t%0C%E7%F46%1B%AB%F5%BB%05%A4%E5Z%AC%A5%E5%8Fs%ED%DE%B8%E0%13%AA%8F';
+
+var LOG = 5;
 
 // Global variables
 var java_socket_bridge_ready_flag = false;
@@ -22,6 +25,9 @@
 	java_socket_bridge_ready_flag = true;
 }
 
+
+
+
 //Sets the route to ccnx router
 function createRoute(url, port){
 	ndnport = port;
@@ -30,11 +36,9 @@
 	console.log(new BinaryXMLDecoder());
 
 	//SEND INTERST TO CCNX NODE
-	startRegisterPrefix();
+
 	
 	//Now Start the receiving thread
-	var result = get_java_socket_bridge().connectAndStartAndPublish();
-	
 	
 }
 
@@ -55,17 +59,8 @@
 		}
 		
 		//message = decodeURIComponent(message);
-		message = unescape(message);
 		
-		var array = message.split('/');
-
-		
-		if(message[0]=="/")
-			array=array.slice(1,array.length);
-			
-		if(message[message.length-1]=="/")
-			array=array.slice(0,array.length-1);
-		
+		var array = createNameArray(message);
 		
 		//console.log('ARRAY IS '+ array);
 		
@@ -80,8 +75,6 @@
 		
 		
 		//console.log('Connecting and start '+ ndnurl +':'+ndnport+'-'+message);
-		
-		
 
 
 		var result = get_java_socket_bridge().connectAndStart(ndnurl,ndnport,hex);
@@ -106,8 +99,8 @@
         
 			co.decode(decoder);
 
-			//console.log(co);
-			
+			if(LOG>2) console.log(co);
+
 			return co;
 			
 
@@ -116,6 +109,7 @@
 
 	}
 
+
 	else{
 
 		alert('ERROR URL OR PORT NOT SET');
@@ -126,8 +120,33 @@
 
 }
 
+var registerStarted = false;
+function registerPrefix(name, content){
+	
+	registeredPrefixes[name] = content ;
+	
+	if(registerStarted == false){
+		var result = get_java_socket_bridge().connectAndStartAndPublish();
+		
+		startRegisterPrefix();
+		
+		registerStarted = true;
+	}
+	sendForwardingEntry(10);
+}
+
+
+function unRegisterPrefix(name){
+	
+	delete registeredPrefixes[name];
+
+}
+
+
+
 
 function on_socket_received_interest(IP, port, interestBinary){
+	console.log('WOOOO RECEIVED STUFF' );
 	var interest = decodeHexInterest(interestBinary);
 	
 	console.log('WOOO received interest' + interest.Name.Components);
@@ -152,20 +171,6 @@
 	}
 }
 
-function registerPrefix(name, content){
-	
-	registeredPrefixes[name] = content ;
-
-}
-
-
-function unRegisterPrefix(name){
-	
-	delete registeredPrefixes[name];
-
-}
-
-
 
 
 
@@ -194,26 +199,32 @@
 		var faceInstanceBinary = encoder1.getReducedOstream();
 
 		
-
-		var co = new ContentObject(null,null,faceInstanceBinary,null); 
+		var si = new SignedInfo();
+		si.setFields();
+		
+		var co = new ContentObject(new ContentName(),si,faceInstanceBinary,new Signature()); 
+		co.sign();
 		
 		var encoder2 = new BinaryXMLEncoder();
-		
+
 		co.encode(encoder2);
 
 		var coBinary = encoder2.getReducedOstream();
+		
+		//if(LOG>3)console.log('ADDESS OF CCND IS'+unescape('%E0%A0%1E%099h%F9t%0C%E7%F46%1B%AB%F5%BB%05%A4%E5Z%AC%A5%E5%8Fs%ED%DE%B8%E0%13%AA%8F'));
+		
+		//var interestName = new ContentName(['ccnx',co.SignedInfo.Publisher.PublisherPublicKeyDigest,'newface',coBinary]);
+		var interestName = new ContentName(['ccnx',unescape('%E0%A0%1E%099h%F9t%0C%E7%F46%1B%AB%F5%BB%05%A4%E5Z%AC%A5%E5%8Fs%ED%DE%B8%E0%13%AA%8F'),'newface',coBinary]);
+		//var interestName = new ContentName(['ccnx','%E0%A0%1E%099h%F9t%0C%E7%F46%1B%AB%F5%BB%05%A4%E5Z%AC%A5%E5%8Fs%ED%DE%B8%E0%13%AA%8F','newface',coBinary]);
 
-
-
-		var interestName = new ContentName(['ccnx','1234','newface',faceInstanceBinary]);
 		//var interestName = new ContentName(['ccnx','1234','newface',coBinary]);
-
+		//var interestName = new ContentName(['ccnx',co.SignedInfo.Publisher.PublisherPublicKeyDigest,'newface',coBinary]);
 		int = new Interest(interestName,face);
 		
 		var hex = encodeToHexInterest(int);
 		/////////////////
-
-
+		
+		
 		
 		if(LOG>4)console.log('Interst name of Conntection Message is '+ interestName);
 		
@@ -222,11 +233,9 @@
 		//console.log('Connecting and start '+ ndnurl +':'+ndnport+'-'+message);
 		
 		var result = get_java_socket_bridge().connectAndStart(ndnurl,ndnport,hex);
-		
-		console.log('BINARY RESPONSE IS ' +result);
+
 		
 		//TODO MOVE THIS
-		sendForwardingEntry(10);
 		
 		//result[0] and result[1] should be 0 and 4 if there is a content object found
 		if(result==null || result==undefined || result =="" || result[0] != '0'||result[1]!='4'){
@@ -271,7 +280,7 @@
 		
 
 		///////////////////////
-		var face = new ForwardingEntry('prefixreg',new ContentName('helloworld'),null, faceID, 1,null);
+		var face = new ForwardingEntry('prefixreg',new ContentName(['helloworld']),null, faceID, 1,null);
 		
 		var encoder1 = new BinaryXMLEncoder();
 		 
@@ -281,18 +290,26 @@
 
 		
 
-		var co = new ContentObject(null,null,faceInstanceBinary,null); 
+		var si = new SignedInfo();
+		si.setFields();
+		
+		var co = new ContentObject(new ContentName(),si,faceInstanceBinary,new Signature()); 
+		co.sign();
 		
 		var encoder2 = new BinaryXMLEncoder();
-		
+
 		co.encode(encoder2);
 
 		var coBinary = encoder2.getReducedOstream();
 
 
 
-		var interestName = new ContentName(['ccnx','1234','prefixreg',faceInstanceBinary]);
+		var interestName = new ContentName(['ccnx',unescape('%E0%A0%1E%099h%F9t%0C%E7%F46%1B%AB%F5%BB%05%A4%E5Z%AC%A5%E5%8Fs%ED%DE%B8%E0%13%AA%8F'),'prefixreg',coBinary]);
+		//var interestName = new ContentName(['ccnx',co.SignedInfo.Publisher.PublisherPublicKeyDigest,'newface',coBinary]);
+		//var interestName = new ContentName(['ccnx','%E0%A0%1E%099h%F9t%0C%E7%F46%1B%AB%F5%BB%05%A4%E5Z%AC%A5%E5%8Fs%ED%DE%B8%E0%13%AA%8F','newface',coBinary]);
+
 		//var interestName = new ContentName(['ccnx','1234','newface',coBinary]);
+		//var interestName = new ContentName(['ccnx',co.SignedInfo.Publisher.PublisherPublicKeyDigest,'prefixreg',coBinary]);
 
 		int = new Interest(interestName,face);
 		
@@ -309,7 +326,7 @@
 		
 		var result = get_java_socket_bridge().connectAndStart(ndnurl,ndnport,hex);
 		
-		console.log('BINARY RESPONSE IS ' +result);
+		if(LOG>3)console.log('BINARY RESPONSE IS ' +result);
 		
 		
 		//result[0] and result[1] should be 0 and 4 if there is a content object found
@@ -340,25 +357,6 @@
 
 
 
-function createNameArray(name){
-	if(name==null || name =="" || name=="/"){
-			return -2;
-		}
-		
-	//message = decodeURIComponent(message);
-	name = unescape(name);
-	
-	var array = name.split('/');
-
-	
-	if(name[0]=="/")
-		array=array.slice(1,array.length);
-		
-	if(name[name.length-1]=="/")
-		array=array.slice(0,array.length-1);
-	
-	return array;
-}
 
 function encodeToHexInterest(int){
 	
@@ -391,9 +389,8 @@
 			
 	
 	decoder = new BinaryXMLDecoder(numbers);
-	console.log('DECODED HEX INTERST  \n'+numbers);
-	
-	
+	if(LOG>3)console.log('DECODED HEX INTERST  \n'+numbers);
+
 	i = new Interest();
 
 	i.decode(decoder);
@@ -406,7 +403,7 @@
 	var numbers = toNumbers(result);
 
 	decoder = new BinaryXMLDecoder(numbers);
-	console.log('DECODED HEX CONTENT OBJECT \n'+numbers);
+	if(LOG>3)console.log('DECODED HEX CONTENT OBJECT \n'+numbers);
 	
 	co = new ContentObject();
 
@@ -417,30 +414,7 @@
 }
 
 
-//http://ejohn.org/blog/numbers-hex-and-colors/
-function toHex(arguments){
-  //console.log(arguments);
-  var ret = "";
-  for ( var i = 0; i < arguments.length; i++ )
-    ret += (arguments[i] < 16 ? "0" : "") + arguments[i].toString(16);
-  return ret.toUpperCase();
-}
 
-function toString(arguments){
-  //console.log(arguments);
-  var ret = "";
-  for ( var i = 0; i < arguments.length; i++ )
-    ret += String.fromCharCode(arguments[i]);
-  return ret;
-}
-
-function toNumbers( str ){
-  var ret = [];
-   str.replace(/(..)/g, function(str){
-    ret.push( parseInt( str, 16 ) );
-  });
-  return ret;
-}
 
 // Get something from the socket
 function on_socket_get(message){}
