SelfEndorseCertificate is working
diff --git a/src/contact-storage.cpp b/src/contact-storage.cpp
index 8026644..21fcf51 100644
--- a/src/contact-storage.cpp
+++ b/src/contact-storage.cpp
@@ -13,6 +13,9 @@
 
 #include <string>
 #include <boost/filesystem.hpp>
+#include <ndn.cxx/fields/signature-sha256-with-rsa.h>
+#include <ndn.cxx/security/exception.h>
+#include <ndn.cxx/helpers/der/exception.h>
 #include "logging.h"
 
 using namespace std;
@@ -365,7 +368,6 @@
 void
 ContactStorage::updateProfileData(const Name& identity) const
 {
-   _LOG_DEBUG("Enter updateProfileData!");
   // Get current profile;
   Ptr<Profile> newProfile = getSelfProfile(identity);
   if(NULL == newProfile)
@@ -381,39 +383,41 @@
     {
       sqlite3_finalize (stmt);
 
-      Ptr<ProfileData> newProfileData = getSignedSelfProfileData(identity, *newProfile);
+      Ptr<EndorseCertificate> newEndorseCertificate = getSignedSelfEndorseCertificate(identity, *newProfile);
       _LOG_DEBUG("Signing DONE!");
-      if(NULL == newProfileData)
+      if(NULL == newEndorseCertificate)
         return;
-      Ptr<Blob> newProfileDataBlob = newProfileData->encodeToWire();
+      Ptr<Blob> newEndorseCertificateBlob = newEndorseCertificate->encodeToWire();
 
       _LOG_DEBUG("Before Inserting!");
 
       sqlite3_prepare_v2 (m_db, "INSERT INTO ProfileData (identity, profile_data) values (?, ?)", -1, &stmt, 0);
       sqlite3_bind_text(stmt, 1, identity.toUri().c_str(), identity.toUri().size(), SQLITE_TRANSIENT);
-      sqlite3_bind_text(stmt, 2, newProfileDataBlob->buf(), newProfileDataBlob->size(), SQLITE_TRANSIENT);
+      sqlite3_bind_text(stmt, 2, newEndorseCertificateBlob->buf(), newEndorseCertificateBlob->size(), SQLITE_TRANSIENT);
       sqlite3_step(stmt);
     }
   else
     {
       Ptr<Blob> profileDataBlob = Ptr<Blob>(new Blob(reinterpret_cast<const char *>(sqlite3_column_text(stmt, 0)), sqlite3_column_bytes (stmt, 0)));
       Ptr<Data> plainData = Data::decodeFromWire(profileDataBlob);
-      const Blob& oldProfileBlob = plainData->content();
+      EndorseCertificate oldEndorseCertificate(*plainData);    
+      // _LOG_DEBUG("Certificate converted!");
+      const Blob& oldProfileBlob = oldEndorseCertificate.getProfileData()->content();
       sqlite3_finalize (stmt);
 
       if(oldProfileBlob == *newProfileBlob)
         return;
 
-      Ptr<ProfileData> newProfileData = getSignedSelfProfileData(identity, *newProfile);
+      Ptr<EndorseCertificate> newEndorseCertificate = getSignedSelfEndorseCertificate(identity, *newProfile);
       _LOG_DEBUG("Signing DONE!");
-      if(NULL == newProfileData)
+      if(NULL == newEndorseCertificate)
         return;
-      Ptr<Blob> newProfileDataBlob = newProfileData->encodeToWire();
+      Ptr<Blob> newEndorseCertificateBlob = newEndorseCertificate->encodeToWire();
 
       _LOG_DEBUG("Before Updating!");
 
       sqlite3_prepare_v2 (m_db, "UPDATE ProfileData SET profile_data=? WHERE identity=?", -1, &stmt, 0);
-      sqlite3_bind_text(stmt, 1, newProfileDataBlob->buf(), newProfileDataBlob->size(), SQLITE_TRANSIENT);
+      sqlite3_bind_text(stmt, 1, newEndorseCertificateBlob->buf(), newEndorseCertificateBlob->size(), SQLITE_TRANSIENT);
       sqlite3_bind_text(stmt, 2, identity.toUri().c_str(), identity.toUri().size(), SQLITE_TRANSIENT);
       sqlite3_step(stmt);
     }
@@ -437,19 +441,33 @@
   return profile;
 }
 
-Ptr<ProfileData>
-ContactStorage::getSignedSelfProfileData(const Name& identity,
-                         const Profile& profile) const
+Ptr<EndorseCertificate>
+ContactStorage::getSignedSelfEndorseCertificate(const Name& identity,
+                                                const Profile& profile) const
 {
   Name certificateName = m_identityManager->getDefaultCertificateNameByIdentity(identity);
   if(0 == certificateName.size())
     return NULL;
 
   Ptr<ProfileData> profileData = Ptr<ProfileData>(new ProfileData(identity, profile));
-  _LOG_DEBUG("Get ProfileData, size: " << profileData->content().size());
-  _LOG_DEBUG("Get SigningCert, name: " << certificateName.toUri());
   m_identityManager->signByCertificate(*profileData, certificateName);
 
-  return profileData;
+  Ptr<security::IdentityCertificate> dskCert = m_identityManager->getCertificate(certificateName);
+  Ptr<const signature::Sha256WithRsa> dskCertSig = boost::dynamic_pointer_cast<const signature::Sha256WithRsa>(dskCert->getSignature());
+  Ptr<security::IdentityCertificate> kskCert = m_identityManager->getCertificate(dskCertSig->getKeyLocator().getKeyName());
+
+  vector<string> endorseList;
+  Profile::const_iterator it = profile.begin();
+  for(; it != profile.end(); it++)
+    endorseList.push_back(it->first);
+  
+  Ptr<EndorseCertificate> selfEndorseCertificate = Ptr<EndorseCertificate>(new EndorseCertificate(*kskCert,
+                                                                                                  kskCert->getNotBefore(),
+                                                                                                  kskCert->getNotAfter(),
+                                                                                                  profileData,
+                                                                                                  endorseList));
+  m_identityManager->signByCertificate(*selfEndorseCertificate, kskCert->getName());
+
+  return selfEndorseCertificate;
 }
 
diff --git a/src/contact-storage.h b/src/contact-storage.h
index 5b87146..7fc3171 100644
--- a/src/contact-storage.h
+++ b/src/contact-storage.h
@@ -14,7 +14,7 @@
 #include <sqlite3.h>
 #include "trusted-contact.h"
 #include "contact-item.h"
-#include "profile-data.h"
+#include "endorse-certificate.h"
 #include <ndn.cxx/security/identity/identity-manager.h>
 #include <ndn.cxx/fields/signature-sha256-with-rsa.h>
 
@@ -68,9 +68,9 @@
   ndn::Ptr<Profile>
   getSelfProfile(const ndn::Name& identity) const;
 
-  ndn::Ptr<ProfileData>
-  getSignedSelfProfileData(const ndn::Name& identity,
-                           const Profile& profile) const;
+  ndn::Ptr<EndorseCertificate>
+  getSignedSelfEndorseCertificate(const ndn::Name& identity,
+                                  const Profile& profile) const;
   
 private:
   ndn::Ptr<ndn::security::IdentityManager> m_identityManager;
diff --git a/src/endorse-certificate.cpp b/src/endorse-certificate.cpp
index c6d338a..8dd43e0 100644
--- a/src/endorse-certificate.cpp
+++ b/src/endorse-certificate.cpp
@@ -13,12 +13,14 @@
 #include <ndn.cxx/helpers/der/der.h>
 #include <ndn.cxx/helpers/der/visitor/simple-visitor.h>
 #include <ndn.cxx/security/certificate/certificate-subdescrpt.h>
-
+#include "logging.h"
 
 using namespace std;
 using namespace ndn;
 using namespace ndn::security;
 
+INIT_LOGGER("EndorseCertificate");
+
 ProfileExtension::ProfileExtension(const ProfileData & profileData)
   : CertificateExtension("1.3.6.1.5.32.2.1", true, *profileData.encodeToWire())
 {}
@@ -37,6 +39,7 @@
 Ptr<ProfileData>
 ProfileExtension::getProfileData()
 {
+  // _LOG_DEBUG("size: " << m_extnValue.size ());
   boost::iostreams::stream
     <boost::iostreams::array_source> is (m_extnValue.buf (), m_extnValue.size ());
   return Ptr<ProfileData>(new ProfileData(*Data::decodeFromWire(is)));
@@ -115,7 +118,7 @@
   setNotBefore(notBefore);
   setNotAfter(notAfter);
   addSubjectDescription(CertificateSubDescrypt("2.5.4.41", m_keyName.toUri()));
-  setPublicKeyInfo(kskCertificate.getPublicKeyInfo());
+  setPublicKeyInfo(kskCertificate.getPublicKeyInfo());  
   addExtension(ProfileExtension(*m_profileData));
   addExtension(EndorseExtension(m_endorseList));
   
@@ -161,9 +164,11 @@
 EndorseCertificate::EndorseCertificate(const Data& data)
   : Certificate(data)
 {
+  // _LOG_DEBUG("0");
   const Name& dataName = data.getName();
+  // _LOG_DEBUG("1");
   name::Component certFlag(string("PROFILE-CERT"));  
-
+  // _LOG_DEBUG("2");
   int profileIndex = -1;
   for(int i = 0; i < dataName.size(); i++)
     {
@@ -173,26 +178,35 @@
 	  break;
 	}
     }
-
+  // _LOG_DEBUG("3");
   if(profileIndex < 0)
     throw LnException("No PROFILE-CERT component in data name!");
 
   m_keyName = dataName.getSubName(0, profileIndex);
   m_signer = dataName.getSubName(profileIndex + 1, dataName.size() - profileIndex - 2);
 
+  // _LOG_DEBUG("keyName: " << m_keyName.toUri());
+  // _LOG_DEBUG("signer: " << m_signer.toUri());
+
   OID profileExtensionOID("1.3.6.1.5.32.2.1");
   OID endorseExtensionOID("1.3.6.1.5.32.2.2");
 
+  // _LOG_DEBUG("OID ready");
   ExtensionList::iterator it = m_extnList.begin();
   for(; it != m_extnList.end(); it++)
     {
+      // _LOG_DEBUG("entry");
       if(profileExtensionOID == it->getOID())
 	{
+          // _LOG_DEBUG("ProfileExtn");
           ProfileExtension profileExtension(*it);
+          // _LOG_DEBUG("ProfileExtn created");
 	  m_profileData = profileExtension.getProfileData();
+          // _LOG_DEBUG("get profileDate");
 	}
       if(endorseExtensionOID == it->getOID())
         {
+          // _LOG_DEBUG("EndorseExtn");
           EndorseExtension endorseExtension(*it);
           m_endorseList = endorseExtension.getEndorsedList();
         }
diff --git a/src/profile-data.cpp b/src/profile-data.cpp
index b779adc..f057a6d 100644
--- a/src/profile-data.cpp
+++ b/src/profile-data.cpp
@@ -11,10 +11,14 @@
 #include "profile-data.h"
 #include "exception.h"
 #include <ndn.cxx/fields/signature-sha256-with-rsa.h>
+#include "logging.h"
+
 
 using namespace ndn;
 using namespace std;
 
+INIT_LOGGER("ProfileData");
+
 ProfileData::ProfileData(const Name& identity,
 			 const Profile& profile)
   : Data()
@@ -57,6 +61,7 @@
 ProfileData::ProfileData(const Data& data)
   : Data()
 {
+  // _LOG_DEBUG("ProfileData constructor");
   const Name& dataName = data.getName();
   name::Component appFlag(string("PROFILE"));  
 
@@ -90,6 +95,7 @@
   setSignature(newSig);
   setContent(data.getContent());
   setSignedBlob(newSignedBlob);
-
+  // _LOG_DEBUG("Decode Profile");
   m_profile = *Profile::fromDerBlob(data.content());
+  // _LOG_DEBUG("Profile Decoded");
 }
diff --git a/src/profile.cpp b/src/profile.cpp
index 7f2ba6e..e5c5325 100644
--- a/src/profile.cpp
+++ b/src/profile.cpp
@@ -10,11 +10,14 @@
 
 #include "profile.h"
 #include <ndn.cxx/helpers/der/der.h>
+#include <ndn.cxx/helpers/der/visitor/print-visitor.h>
 #include <ndn.cxx/helpers/der/visitor/simple-visitor.h>
+#include "logging.h"
 
 using namespace std;
 using namespace ndn;
 
+INIT_LOGGER("Profile");
 Profile::Profile(const Name& identityName)
   : m_identityName(identityName)
 {
@@ -91,7 +94,6 @@
     <boost::iostreams::array_source> is (derBlob.buf(), derBlob.size());
 
   Ptr<der::DerSequence> root = DynamicCast<der::DerSequence>(der::DerNode::parse(reinterpret_cast<InputIterator &>(is)));
-  
   const der::DerNodePtrList & children = root->getChildren();
   der::SimpleVisitor simpleVisitor;
   string identityName = boost::any_cast<string>(children[0]->accept(simpleVisitor));
@@ -100,7 +102,7 @@
   for(int i = 1; i < children.size(); i++)
     {
       Ptr<der::DerSequence> entry = DynamicCast<der::DerSequence>(children[i]);
-      const der::DerNodePtrList & tuple = root->getChildren();
+      const der::DerNodePtrList & tuple = entry->getChildren();
       string type = boost::any_cast<string>(tuple[0]->accept(simpleVisitor));
       Ptr<Blob> value = boost::any_cast<Ptr<Blob> >(tuple[1]->accept(simpleVisitor));
       profile->setProfileEntry(type, *value);
diff --git a/wscript b/wscript
index 34a2c49..8834f50 100644
--- a/wscript
+++ b/wscript
@@ -33,7 +33,16 @@
         source = bld.path.ant_glob(['src/*.cpp', 'src/*.ui', 'logging.cc']),
         includes = ".",
         use = "QTCORE QTGUI QTSQL SQLITE3 NDNCXX TINYXML BOOST BOOST_FILESYSTEM LOG4CXX",
-        )   
+        )
+
+    cert_publish = bld (
+        target = "CertPublish",
+        features = "cxx cxxprogram",
+        defines = "WAF",
+        source = bld.path.ant_glob(['tmp/cert-publish.cpp']),
+        includes = ".",
+        use = "SQLITE3 NDNCXX BOOST BOOST_FILESYSTEM LOG4CXX",
+        )
 
 
 @Configure.conf