diff --git a/src/addcontactpanel.cpp b/src/addcontactpanel.cpp
index c5c80e4..8e90f66 100644
--- a/src/addcontactpanel.cpp
+++ b/src/addcontactpanel.cpp
@@ -130,6 +130,7 @@
   }catch(exception& e){
     m_warningDialog->setMsg(e.what());
     m_warningDialog->show();
+    _LOG_ERROR("Exception: " << e.what());
     return;
   }
   emit newContactAdded();
@@ -139,7 +140,14 @@
 void 
 AddContactPanel::selfEndorseCertificateFetched(const EndorseCertificate& endorseCertificate)
 {
-  m_currentEndorseCertificate = Ptr<EndorseCertificate>(new EndorseCertificate(endorseCertificate));
+  try{
+    m_currentEndorseCertificate = Ptr<EndorseCertificate>(new EndorseCertificate(endorseCertificate));
+  }catch(exception& e){
+    m_warningDialog->setMsg(e.what());
+    m_warningDialog->show();
+    _LOG_ERROR("Exception: " << e.what());
+    return;
+  }
   m_currentEndorseCertificateReady = true;
 
   if(m_currentCollectEndorseReady == true)
@@ -156,7 +164,14 @@
 void
 AddContactPanel::onContactKeyFetched(const EndorseCertificate& endorseCertificate)
 {
-  m_currentEndorseCertificate = Ptr<EndorseCertificate>(new EndorseCertificate(endorseCertificate));
+  try{
+    m_currentEndorseCertificate = Ptr<EndorseCertificate>(new EndorseCertificate(endorseCertificate));
+  }catch(exception& e){
+    m_warningDialog->setMsg(e.what());
+    m_warningDialog->show();
+    _LOG_ERROR("Exception: " << e.what());
+    return;
+  }
 
   m_currentCollectEndorseReady = NULL;
 
@@ -193,7 +208,7 @@
 void
 AddContactPanel::displayContactInfo()
 {
-  _LOG_TRACE("displayContactInfo");
+  // _LOG_TRACE("displayContactInfo");
   const Profile& profile = m_currentEndorseCertificate->getProfileData()->getProfile();
   const Blob& profileBlob = m_currentEndorseCertificate->getProfileData()->content();
 
@@ -201,7 +216,6 @@
 
   if(m_currentCollectEndorse != NULL)
     {
-      _LOG_DEBUG("CollectEndorse fetched");
       boost::iostreams::stream
         <boost::iostreams::array_source> is (m_currentCollectEndorse->content().buf(), m_currentCollectEndorse->content().size());
   
@@ -212,10 +226,16 @@
       for(int i = 0; i < children.size(); i++)
         {
           Ptr<Blob> dataBlob = boost::any_cast<Ptr<Blob> >(children[i]->accept(simpleVisitor));
-          Ptr<Data> data = Data::decodeFromWire(dataBlob);
-          Ptr<EndorseCertificate> endorseCert = Ptr<EndorseCertificate>(new EndorseCertificate(*data));
-          _LOG_DEBUG("endorseCert name: " << endorseCert->getName().toUri());
           
+          Ptr<Data> data = NULL;
+          Ptr<EndorseCertificate> endorseCert = NULL;
+          try{
+            data = Data::decodeFromWire(dataBlob);
+            endorseCert = Ptr<EndorseCertificate>(new EndorseCertificate(*data));
+          }catch(exception& e){
+            continue;
+          }
+
           Name signerKeyName = endorseCert->getSigner();
           Name signerName = signerKeyName.getPrefix(signerKeyName.size()-1);
           
@@ -239,12 +259,6 @@
             endorseCount[*it] += 1;
         }
     }
-
-  // map<string, int>::iterator tmp_it = endorseCount.begin();
-  // for(; tmp_it != endorseCount.end(); tmp_it++)
-  //   {
-  //     _LOG_DEBUG("Entry: " << tmp_it->first << " " << tmp_it->second);
-  //   }
   
   ui->infoView->setColumnCount(3);
   Profile::const_iterator it = profile.begin();
diff --git a/src/chat-policy-rule.cpp b/src/chat-policy-rule.cpp
index 201cf70..76d0cf1 100644
--- a/src/chat-policy-rule.cpp
+++ b/src/chat-policy-rule.cpp
@@ -36,7 +36,15 @@
 bool 
 ChatPolicyRule::matchSignerName(const Data & data)
 { 
-  Ptr<const signature::Sha256WithRsa> sigPtr = DynamicCast<const signature::Sha256WithRsa> (data.getSignature());
+  Ptr<const Signature> sig = data.getSignature();
+
+  if(NULL == sig)
+    return false;
+
+  Ptr<const signature::Sha256WithRsa> sigPtr = DynamicCast<const signature::Sha256WithRsa> (sig);
+  if(KeyLocator::KEYNAME != sigPtr->getKeyLocator().getType())
+    return false;
+
   Name signerName = sigPtr->getKeyLocator ().getKeyName ();
   return m_signerRegex->match(signerName); 
 }
diff --git a/src/chatdialog.cpp b/src/chatdialog.cpp
index 1e30f87..fd3179c 100644
--- a/src/chatdialog.cpp
+++ b/src/chatdialog.cpp
@@ -46,7 +46,7 @@
   , m_chatroomPrefix(chatroomPrefix)
   , m_localPrefix(localPrefix)
   , m_defaultIdentity(defaultIdentity)
-  , m_invitationPolicyManager(ndn::Ptr<InvitationPolicyManager>(new InvitationPolicyManager(m_chatroomPrefix.get(-1).toUri())))
+  , m_invitationPolicyManager(ndn::Ptr<InvitationPolicyManager>(new InvitationPolicyManager(m_chatroomPrefix.get(-1).toUri(), m_defaultIdentity)))
   , m_nick(nick)
   , m_sock(NULL)
   , m_lastMsgTime(0)
@@ -328,7 +328,6 @@
   QTimer::singleShot(2200, this, SLOT(enableTreeDisplay()));
   // Sync::CcnxWrapperPtr handle = boost::make_shared<Sync::CcnxWrapper> ();
   // handle->setInterestFilter(m_user.getPrefix().toStdString(), bind(&ChatDialog::respondHistoryRequest, this, _1));
-  // _LOG_DEBUG("initializeSync is done!");
 }
 
 void
diff --git a/src/chronochat.cpp b/src/chronochat.cpp
deleted file mode 100644
index bd9389c..0000000
--- a/src/chronochat.cpp
+++ /dev/null
@@ -1,29 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- *                     Yingdi Yu
- *
- * BSD license, See the LICENSE file for more information
- *
- * Author: Yingdi Yu <yingdi@cs.ucla.edu>
- */
-
-#include "chronochat.h"
-#include "ui_chronochat.h"
-
-ChronoChat::ChronoChat(QWidget *parent) :
-    QDialog(parent),
-    ui(new Ui::ChronoChat)
-{
-    ui->setupUi(this);
-}
-
-ChronoChat::~ChronoChat()
-{
-    delete ui;
-}
-
-#if WAF
-#include "chronochat.moc"
-#include "chronochat.cpp.moc"
-#endif
diff --git a/src/chronochat.h b/src/chronochat.h
deleted file mode 100644
index f4eb0fe..0000000
--- a/src/chronochat.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil -*- */
-/*
- * Copyright (c) 2013, Regents of the University of California
- *                     Yingdi Yu
- *
- * BSD license, See the LICENSE file for more information
- *
- * Author: Yingdi Yu <yingdi@cs.ucla.edu>
- */
-
-#ifndef CHRONOCHAT_H
-#define CHRONOCHAT_H
-
-#include <QDialog>
-
-namespace Ui {
-class ChronoChat;
-}
-
-class ChronoChat : public QDialog
-{
-    Q_OBJECT
-
-public:
-    explicit ChronoChat(QWidget *parent = 0);
-    ~ChronoChat();
-
-private:
-    Ui::ChronoChat *ui;
-};
-
-#endif // CHRONOCHAT_H
diff --git a/src/chronochat.ui b/src/chronochat.ui
deleted file mode 100644
index dcc8755..0000000
--- a/src/chronochat.ui
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>ChronoChat</class>
- <widget class="QDialog" name="ChronoChat">
-  <property name="geometry">
-   <rect>
-    <x>0</x>
-    <y>0</y>
-    <width>600</width>
-    <height>450</height>
-   </rect>
-  </property>
-  <property name="windowTitle">
-   <string>ChronoChat</string>
-  </property>
-  <widget class="QWidget" name="">
-   <property name="geometry">
-    <rect>
-     <x>10</x>
-     <y>10</y>
-     <width>581</width>
-     <height>431</height>
-    </rect>
-   </property>
-   <layout class="QHBoxLayout" name="horizontalLayout" stretch="18,40">
-    <item>
-     <widget class="QListView" name="Participants"/>
-    </item>
-    <item>
-     <layout class="QVBoxLayout" name="ChatLayout" stretch="38,5">
-      <property name="sizeConstraint">
-       <enum>QLayout::SetDefaultConstraint</enum>
-      </property>
-      <property name="leftMargin">
-       <number>0</number>
-      </property>
-      <item>
-       <widget class="QTextEdit" name="Transcript">
-        <property name="readOnly">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item>
-       <widget class="QTextEdit" name="Message"/>
-      </item>
-     </layout>
-    </item>
-   </layout>
-  </widget>
- </widget>
- <resources/>
- <connections/>
-</ui>
diff --git a/src/chronos-invitation.cpp b/src/chronos-invitation.cpp
index 5a392a1..f918342 100644
--- a/src/chronos-invitation.cpp
+++ b/src/chronos-invitation.cpp
@@ -42,8 +42,6 @@
     throw LnException("Wrong ChronosInvitation Name, No chatroom tag");
   m_inviteeNameSpace = interestName.getSubName(inviteeBegin, i - inviteeBegin);
 
-  _LOG_DEBUG(m_inviteeNameSpace.toUri());
-
   string inviterPrefixStr("inviter-prefix");
   int chatroomBegin = (++i);
   for(; i < size;  i++)
@@ -54,8 +52,6 @@
     throw LnException("Wrong ChronosInvitation Name, No inviter-prefix tag");
   m_chatroom = interestName.getSubName(chatroomBegin, i - chatroomBegin);
 
-  _LOG_DEBUG(m_chatroom.toUri());
-
   string inviterStr("inviter");
   int inviterPrefixBegin = (++i);
   for(; i < size; i++)
@@ -66,12 +62,8 @@
     throw LnException("Wrong ChronosInvitation Name, No inviter tag");
   m_inviterPrefix = interestName.getSubName(inviterPrefixBegin, i - inviterPrefixBegin);
 
-  _LOG_DEBUG(m_inviterPrefix.toUri());
-
   int inviterCertBegin = (++i);
   m_inviterCertificateName = interestName.getSubName(inviterCertBegin, size - 1 - inviterCertBegin);
-
-  _LOG_DEBUG(m_inviterCertificateName.toUri());
   
   string signature = interestName.get(-1).toBlob();
   m_signatureBits.insert(m_signatureBits.end(), signature.begin(), signature.end());
diff --git a/src/contact-item.cpp b/src/contact-item.cpp
index 839988c..9ce1b66 100644
--- a/src/contact-item.cpp
+++ b/src/contact-item.cpp
@@ -28,41 +28,14 @@
   , m_isIntroducer(isIntroducer)
 {
   Name endorsedkeyName = selfEndorseCertificate.getPublicKeyName();
-  // Ptr<const signature::Sha256WithRsa> endorseSig = boost::dynamic_pointer_cast<const signature::Sha256WithRsa>(selfEndorseCertificate.getSignature());
-  // const Name& signingKeyName = endorseSig->getKeyLocator().getKeyName();
-  
-  // int i = 0;
-  // int j = -1;
-  // string keyString("KEY");
-  // string idString("ID-CERT");
-  // for(; i < signingKeyName.size(); i++)
-  //   {
-  //     if(keyString == signingKeyName.get(i).toUri())
-  //       j = i;
-  //     if(idString == signingKeyName.get(i).toUri())
-  //       break;
-  //   }
-
-  // if(i >= signingKeyName.size() || j < 0)
-  //   throw LnException("Wrong name!");
-
-  // Name subName = signingKeyName.getSubName(0, j);
-  // subName.append(signingKeyName.getSubName(j+1, i-j-1));
-
-
-
-  // // _LOG_DEBUG("endorsedkeyName " << endorsedkeyName.toUri());
-  // // _LOG_DEBUG("subKeyName " << subName.toUri());
-
-  // if(endorsedkeyName != subName)
-  //   throw LnException("not a self-claimed");
 
   m_namespace = endorsedkeyName.getSubName(0, endorsedkeyName.size() - 1);
-  m_alias = alias.empty() ? m_namespace.toUri() : alias;
+
 
   Ptr<ProfileData> profileData = selfEndorseCertificate.getProfileData();
   Ptr<const Blob> nameBlob = profileData->getProfile().getProfileEntry("name");
   m_name = string(nameBlob->buf(), nameBlob->size());
+  m_alias = alias.empty() ? m_name : alias;
   Ptr<const Blob> institutionBlob = profileData->getProfile().getProfileEntry("institution");
   m_institution = string(institutionBlob->buf(), institutionBlob->size());
 }
diff --git a/src/contact-manager.cpp b/src/contact-manager.cpp
index 2b834c6..651ab82 100644
--- a/src/contact-manager.cpp
+++ b/src/contact-manager.cpp
@@ -232,11 +232,17 @@
   Name certificateName = identityManager->getDefaultCertificateName ();
   identityManager->signByCertificate(*profileData, certificateName);
 
-  EndorseCertificate endorseCertificate(identityCertificate, profileData);
+  Ptr<EndorseCertificate> endorseCertificate = NULL;
+  try{
+    endorseCertificate = Ptr<EndorseCertificate>(new EndorseCertificate(identityCertificate, profileData));
+  }catch(exception& e){
+    _LOG_ERROR("Exception: " << e.what());
+    return;
+  }
 
-  identityManager->signByCertificate(endorseCertificate, certificateName);
+  identityManager->signByCertificate(*endorseCertificate, certificateName);
 
-  emit contactKeyFetched (endorseCertificate); 
+  emit contactKeyFetched (*endorseCertificate); 
 }
 
 void
@@ -250,7 +256,6 @@
 void
 ContactManager::updateProfileData(const Name& identity)
 {
-  // _LOG_DEBUG("updateProfileData: " << identity.toUri());
   // Get current profile;
   Ptr<Profile> newProfile = m_contactStorage->getSelfProfile(identity);
   if(NULL == newProfile)
@@ -261,19 +266,26 @@
   Ptr<Blob> profileDataBlob = m_contactStorage->getSelfEndorseCertificate(identity);
   if(NULL != profileDataBlob)
     {
-      Ptr<Data> plainData = Data::decodeFromWire(profileDataBlob);
-      EndorseCertificate oldEndorseCertificate(*plainData);    
-      // _LOG_DEBUG("Certificate converted!");
-      const Blob& oldProfileBlob = oldEndorseCertificate.getProfileData()->content();
+      
+      Ptr<EndorseCertificate> oldEndorseCertificate = NULL;
+      try{
+        Ptr<Data> plainData = Data::decodeFromWire(profileDataBlob);
+        oldEndorseCertificate = Ptr<EndorseCertificate>(new EndorseCertificate(*plainData));
+      }catch(exception& e){
+        _LOG_ERROR("Exception: " << e.what());
+        return;
+      }
+
+      const Blob& oldProfileBlob = oldEndorseCertificate->getProfileData()->content();
 
       if(oldProfileBlob == *newProfileBlob)
         return;
 
       Ptr<EndorseCertificate> newEndorseCertificate = getSignedSelfEndorseCertificate(identity, *newProfile);
-      // _LOG_DEBUG("Signing DONE!");
+
       if(NULL == newEndorseCertificate)
         return;
-      // _LOG_DEBUG("About to update");
+
       m_contactStorage->updateSelfEndorseCertificate(newEndorseCertificate, identity);
 
       publishSelfEndorseCertificateInDNS(newEndorseCertificate);
@@ -281,10 +293,10 @@
   else
     {
       Ptr<EndorseCertificate> newEndorseCertificate = getSignedSelfEndorseCertificate(identity, *newProfile);
-      // _LOG_DEBUG("Signing DONE!");
+
       if(NULL == newEndorseCertificate)
         return;
-      // _LOG_DEBUG("About to Insert");
+
       m_contactStorage->addSelfEndorseCertificate(newEndorseCertificate, identity);
 
       publishSelfEndorseCertificateInDNS(newEndorseCertificate);
@@ -298,9 +310,15 @@
   Ptr<EndorseCertificate> newEndorseCertificate = generateEndorseCertificate(identity, signerIdentity);
   if(NULL != oldEndorseCertificateBlob)
     {
-      Ptr<Data> plainData = Data::decodeFromWire(oldEndorseCertificateBlob);
-      EndorseCertificate oldEndorseCertificate(*plainData);
-      const Blob& oldEndorseContent = oldEndorseCertificate.content();
+      Ptr<EndorseCertificate> oldEndorseCertificate = NULL;
+      try{
+        Ptr<Data> plainData = Data::decodeFromWire(oldEndorseCertificateBlob);
+        oldEndorseCertificate = Ptr<EndorseCertificate>(new EndorseCertificate(*plainData));
+      }catch(exception& e){
+        _LOG_ERROR("Exception: " << e.what());
+        return;
+      }
+      const Blob& oldEndorseContent = oldEndorseCertificate->content();
       const Blob& newEndorseContent = newEndorseCertificate->content();
       if(oldEndorseContent == newEndorseContent)
         return;
@@ -327,7 +345,13 @@
 
   vector<string> endorseList = m_contactStorage->getEndorseList(identity);
 
-  Ptr<EndorseCertificate> cert = Ptr<EndorseCertificate>(new EndorseCertificate(contact->getSelfEndorseCertificate(), signerKeyName, endorseList)); 
+  Ptr<EndorseCertificate> cert = NULL;
+  try{
+    cert = Ptr<EndorseCertificate>(new EndorseCertificate(contact->getSelfEndorseCertificate(), signerKeyName, endorseList)); 
+  }catch(exception& e){
+    _LOG_ERROR("Exception: " << e.what());
+    return NULL;
+  } 
   identityManager->signByCertificate(*cert, signerCertName);
 
   return cert;
@@ -384,9 +408,16 @@
   for(; it != profile.end(); it++)
     endorseList.push_back(it->first);
   
-  Ptr<EndorseCertificate> selfEndorseCertificate = Ptr<EndorseCertificate>(new EndorseCertificate(*kskCert,
-                                                                                                  profileData,
-                                                                                                  endorseList));
+  Ptr<EndorseCertificate> selfEndorseCertificate = NULL;
+  try{
+    selfEndorseCertificate = Ptr<EndorseCertificate>(new EndorseCertificate(*kskCert,
+                                                                            profileData,
+                                                                            endorseList));
+  }catch(exception& e){
+    _LOG_ERROR("Exception: " << e.what());
+    return NULL;
+  } 
+
   identityManager->signByCertificate(*selfEndorseCertificate, kskCert->getName());
 
   return selfEndorseCertificate;
@@ -398,9 +429,15 @@
 {
   Ptr<Blob> dataContentBlob = Ptr<Blob>(new Blob(data->content().buf(), data->content().size()));
 
-  Ptr<Data> plainData = Data::decodeFromWire(dataContentBlob);
-
-  Ptr<EndorseCertificate> selfEndorseCertificate = Ptr<EndorseCertificate>(new EndorseCertificate(*plainData));
+  Ptr<Data> plainData = NULL;
+  Ptr<EndorseCertificate> selfEndorseCertificate = NULL;
+  try{
+    plainData = Data::decodeFromWire(dataContentBlob);
+    selfEndorseCertificate = Ptr<EndorseCertificate>(new EndorseCertificate(*plainData));
+  }catch(exception& e){
+    _LOG_ERROR("Exception: " << e.what());
+    return;
+  }
 
   const security::Publickey& ksk = selfEndorseCertificate->getPublicKeyInfo();
 
diff --git a/src/contactpanel.cpp b/src/contactpanel.cpp
index de35f51..57d8c80 100644
--- a/src/contactpanel.cpp
+++ b/src/contactpanel.cpp
@@ -55,14 +55,9 @@
   
   createAction();
 
-  openDB();    
-
   m_contactManager = contactManager;
-  m_profileEditor = new ProfileEditor(m_contactManager);
-  m_addContactPanel = new AddContactPanel(contactManager);
-  m_setAliasDialog = new SetAliasDialog(contactManager);
- 
-  ui->setupUi(this);
+
+  openDB();    
 
   refreshContactList();
 
@@ -72,6 +67,14 @@
   m_nickName = m_defaultIdentity.get(-1).toUri();
   m_settingDialog->setIdentity(m_defaultIdentity.toUri(), m_nickName);
 
+  m_profileEditor = new ProfileEditor(m_contactManager);
+  m_profileEditor->setCurrentIdentity(m_defaultIdentity);
+
+  m_addContactPanel = new AddContactPanel(contactManager);
+  m_setAliasDialog = new SetAliasDialog(contactManager);
+ 
+  ui->setupUi(this);
+
   m_handler = Ptr<Wrapper>(new Wrapper(m_keychain));  
 
   setLocalPrefix();
@@ -184,7 +187,9 @@
 
   vector<Ptr<ContactItem> >::const_iterator it = m_contactList.begin();
   for(; it != m_contactList.end(); it++)
-    m_panelPolicyManager->addTrustAnchor((*it)->getSelfEndorseCertificate());
+    {
+      m_panelPolicyManager->addTrustAnchor((*it)->getSelfEndorseCertificate());
+    }
 
   m_keychain = Ptr<security::Keychain>(new security::Keychain(Ptr<security::IdentityManager>::Create(), 
                                                               m_panelPolicyManager, 
@@ -243,15 +248,21 @@
 ContactPanel::onInvitation(Ptr<Interest> interest)
 {
   _LOG_DEBUG("Receive invitation!" << interest->getName().toUri());
-
-  Ptr<ChronosInvitation> invitation = Ptr<ChronosInvitation>(new ChronosInvitation(interest->getName()));
-
+  
+  Ptr<ChronosInvitation> invitation = NULL;
+  try{
+    invitation = Ptr<ChronosInvitation>(new ChronosInvitation(interest->getName()));
+  }catch(exception& e){
+    _LOG_ERROR("Exception: " << e.what());
+    return;
+  }
+  
   Name chatroomName("/ndn/broadcast/chronos");
   chatroomName.append(invitation->getChatroom());
   map<Name, ChatDialog*>::iterator it = m_chatDialogs.find(chatroomName);
   if(it != m_chatDialogs.end())
     {
-      _LOG_DEBUG("Exisiting chatroom!");
+      _LOG_ERROR("Exisiting chatroom!");
       return;
     }
 
@@ -485,6 +496,7 @@
 ContactPanel::updateDefaultIdentity(const QString& identity, const QString& nickName)
 { 
   m_defaultIdentity = Name(identity.toStdString());
+  m_profileEditor->setCurrentIdentity(m_defaultIdentity);
   m_nickName = nickName.toStdString();
   m_handler->clearInterestFilter(m_inviteListenPrefix);
   setInvitationListener();
diff --git a/src/dns-storage.cpp b/src/dns-storage.cpp
index 70d04fe..52a23b2 100644
--- a/src/dns-storage.cpp
+++ b/src/dns-storage.cpp
@@ -80,7 +80,6 @@
 
   if(sqlite3_step (stmt) != SQLITE_ROW)
     {
-      _LOG_DEBUG("INSERT");
       sqlite3_finalize(stmt);
       sqlite3_prepare_v2 (m_db, "INSERT INTO DnsData (dns_identity, dns_name, dns_type, dns_value, data_name) VALUES (?, ?, ?, ?, ?)", -1, &stmt, 0);
       sqlite3_bind_text(stmt, 1, identity.c_str(), identity.size(), SQLITE_TRANSIENT);
@@ -93,7 +92,6 @@
     }
   else
     {
-      _LOG_DEBUG("UPDATE");
       sqlite3_finalize(stmt);
       sqlite3_prepare_v2 (m_db, "UPDATE DnsData SET dns_value=?, data_name=? WHERE dns_identity=? and dns_name=?, dns_type=?", -1, &stmt, 0);
       sqlite3_bind_text(stmt, 1, data.buf(), data.size(), SQLITE_TRANSIENT);
@@ -148,10 +146,13 @@
   
   if(sqlite3_step (stmt) == SQLITE_ROW)
     {
-      Blob dnsDataBlob(reinterpret_cast<const char *>(sqlite3_column_text(stmt, 0)), sqlite3_column_bytes (stmt, 0));
-      boost::iostreams::stream
-        <boost::iostreams::array_source> is (dnsDataBlob.buf(), dnsDataBlob.size());
-      return Data::decodeFromWire(is);
+      Ptr<Blob> dnsDataBlob = Ptr<Blob>(new Blob(reinterpret_cast<const char *>(sqlite3_column_text(stmt, 0)), sqlite3_column_bytes (stmt, 0)));
+      // boost::iostreams::stream
+      //   <boost::iostreams::array_source> is (dnsDataBlob.buf(), dnsDataBlob.size());
+      sqlite3_finalize(stmt);
+      return Data::decodeFromWire(dnsDataBlob);
     }
+  sqlite3_finalize(stmt);
+
   return NULL;
 }
diff --git a/src/endorse-certificate.cpp b/src/endorse-certificate.cpp
index 20e2aff..80ff165 100644
--- a/src/endorse-certificate.cpp
+++ b/src/endorse-certificate.cpp
@@ -39,10 +39,8 @@
 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)));
+  Ptr<Blob> dataBlob = Ptr<Blob>(new Blob(m_extnValue.buf (), m_extnValue.size ()));
+  return Ptr<ProfileData>(new ProfileData(*Data::decodeFromWire(dataBlob)));
 }
 
 EndorseExtension::EndorseExtension(const vector<string>& endorsedList)
@@ -97,35 +95,6 @@
   return blobStream.buf ();
 }
 
-// EndorseCertificate::EndorseCertificate(const IdentityCertificate& kskCertificate)
-//   : Certificate()
-//   , m_keyName(kskCertificate.getPublicKeyName())
-//   , m_signer(kskCertificate.getPublicKeyName())
-// {
-//   Profile profile(m_keyName.getPrefix(m_keyName.size()-1), 
-//                   m_keyName.get(-2).toUri(),
-//                   m_keyName.get(m_keyName.size()-2).toUri());
-  
-//   Ptr<ProfileData> profileData = Ptr<ProfileData>(new ProfileData(m_keyName.getPrefix(m_keyName.size()-1),
-//                                                                   profile));
-
-//   m_profileData = profileData;
-
-//   Name dataName = m_keyName;
-//   dataName.append("PROFILE-CERT").append(m_signer).appendVersion();
-//   setName(dataName);
-
-//   setNotBefore(kskCertificate.getNotBefore());
-//   setNotAfter(kskCertificate.getNotAfter());
-//   addSubjectDescription(CertificateSubDescrypt("2.5.4.41", m_keyName.toUri()));
-//   setPublicKeyInfo(kskCertificate.getPublicKeyInfo());  
-//   addExtension(ProfileExtension(*m_profileData));
-//   addExtension(EndorseExtension(m_endorseList));
-  
-//   encode();
-// }
-
-
 EndorseCertificate::EndorseCertificate(const IdentityCertificate& kskCertificate,
                                        Ptr<ProfileData> profileData,
                                        const vector<string>& endorseList)
@@ -183,11 +152,8 @@
 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++)
     {
@@ -197,35 +163,25 @@
 	  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/endorse-certificate.h b/src/endorse-certificate.h
index 1b9b897..99d9d65 100644
--- a/src/endorse-certificate.h
+++ b/src/endorse-certificate.h
@@ -57,8 +57,6 @@
 public:
   EndorseCertificate() {}
 
-  // EndorseCertificate(const ndn::security::IdentityCertificate& kskCertificate);
-
   EndorseCertificate(const ndn::security::IdentityCertificate& kskCertificate,
                      ndn::Ptr<ProfileData> profileData,
                      const std::vector<std::string>& endorseList = std::vector<std::string>());
diff --git a/src/endorse-combobox-delegate.cpp b/src/endorse-combobox-delegate.cpp
index e909e3d..a70a772 100644
--- a/src/endorse-combobox-delegate.cpp
+++ b/src/endorse-combobox-delegate.cpp
@@ -44,7 +44,6 @@
 {
   QComboBox *comboBox = static_cast<QComboBox*>(editor);
   int value = index.model()->data(index, Qt::EditRole).toUInt();
-  _LOG_DEBUG("value: " << value);
   comboBox->setCurrentIndex(value);
 }
  
@@ -52,7 +51,6 @@
 EndorseComboBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
 {
   QComboBox *comboBox = static_cast<QComboBox*>(editor);
-  _LOG_DEBUG("currentIndex: " << comboBox->currentIndex());
   model->setData(index, comboBox->currentIndex(), Qt::EditRole);
 }
  
diff --git a/src/invitation-policy-manager.cpp b/src/invitation-policy-manager.cpp
index ca4ae5b..58c9fcc 100644
--- a/src/invitation-policy-manager.cpp
+++ b/src/invitation-policy-manager.cpp
@@ -21,9 +21,11 @@
 INIT_LOGGER("InvitationPolicyManager");
 
 InvitationPolicyManager::InvitationPolicyManager(const string& chatroomName,
-                                             int stepLimit,
-					     Ptr<CertificateCache> certificateCache)
+                                                 const Name& signingIdentity,
+                                                 int stepLimit,
+                                                 Ptr<CertificateCache> certificateCache)
   : m_chatroomName(chatroomName)
+  , m_signingIdentity(signingIdentity)
   , m_stepLimit(stepLimit)
   , m_certificateCache(certificateCache)
 {
@@ -62,7 +64,7 @@
 {
   if(m_stepLimit == stepCount)
     {
-      _LOG_DEBUG("reach the maximum steps of verification");
+      _LOG_ERROR("Reach the maximum steps of verification!");
       unverifiedCallback(data);
       return NULL;
     }
@@ -71,6 +73,7 @@
 
   if(KeyLocator::KEYNAME != sha256sig->getKeyLocator().getType())
     {
+      _LOG_ERROR("KeyLocator is not name!");
       unverifiedCallback(data);
       return NULL;
     }
@@ -102,8 +105,6 @@
 	return NULL;
       }
 
-      _LOG_DEBUG("KeyLocator has not been cached and validated!");
-
       DataCallback recursiveVerifiedCallback = boost::bind(&InvitationPolicyManager::onDskCertificateVerified, 
                                                            this, 
                                                            _1, 
@@ -131,17 +132,13 @@
 
   if(m_kskRegex->match(data->getName()))
     {
-      _LOG_DEBUG("is ksk");
       Name keyName = m_kskRegex->expand();
-      _LOG_DEBUG("ksk name: " << keyName.toUri());
       map<Name, Publickey>::iterator it = m_trustAnchors.find(keyName);
       if(m_trustAnchors.end() != it)
         {
-          _LOG_DEBUG("found key!");
           Ptr<IdentityCertificate> identityCertificate = Ptr<IdentityCertificate>(new IdentityCertificate(*data));
           if(it->second.getKeyBlob() == identityCertificate->getPublicKeyInfo().getKeyBlob())
             {
-              _LOG_DEBUG("same key!");
               verifiedCallback(data);
             }
           else
@@ -177,15 +174,13 @@
 InvitationPolicyManager::checkSigningPolicy(const Name& dataName, 
 					  const Name& certificateName)
 {
-  //TODO:
   return true;
 }
     
 Name 
 InvitationPolicyManager::inferSigningIdentity(const Name& dataName)
 {
-  //TODO:
-  return Name();
+  return m_signingIdentity;
 }
 
 void
@@ -215,9 +210,9 @@
 
 void 
 InvitationPolicyManager::onDskCertificateVerified(Ptr<Data> certData, 
-					     Ptr<Data> originalData,
-					     const DataCallback& verifiedCallback, 
-					     const UnverifiedCallback& unverifiedCallback)
+                                                  Ptr<Data> originalData,
+                                                  const DataCallback& verifiedCallback, 
+                                                  const UnverifiedCallback& unverifiedCallback)
 {
   Ptr<IdentityCertificate> certificate = Ptr<IdentityCertificate>(new IdentityCertificate(*certData));
 
diff --git a/src/invitation-policy-manager.h b/src/invitation-policy-manager.h
index cc37d7b..f2cfc1c 100644
--- a/src/invitation-policy-manager.h
+++ b/src/invitation-policy-manager.h
@@ -24,8 +24,9 @@
 {
 public:
   InvitationPolicyManager(const std::string& chatroomName,
-                        int stepLimit = 10,
-                        ndn::Ptr<ndn::security::CertificateCache> certificateCache = NULL);
+                          const ndn::Name& signingIdentity,
+                          int stepLimit = 10,
+                          ndn::Ptr<ndn::security::CertificateCache> certificateCache = NULL);
   
   virtual
   ~InvitationPolicyManager();
@@ -73,6 +74,7 @@
 
 private:
   std::string m_chatroomName;
+  ndn::Name m_signingIdentity;
 
   int m_stepLimit;
 
diff --git a/src/invitationdialog.cpp b/src/invitationdialog.cpp
index 9194bcc..1522314 100644
--- a/src/invitationdialog.cpp
+++ b/src/invitationdialog.cpp
@@ -40,10 +40,10 @@
   m_inviterAlias = alias;
   string msg = alias;
   msg.append(" invites you to join the chat room: ");
-  ui->msgLabel->setText(QString::fromUtf8(msg.c_str()));
+  ui->msgLabel->setText(QString::fromStdString(msg));
 
   m_invitation = invitation;
-  ui->chatroomLine->setText(QString::fromUtf8(invitation->getChatroom().get(0).toUri().c_str()));
+  ui->chatroomLine->setText(QString::fromStdString(invitation->getChatroom().get(0).toUri()));
 
   m_identityCertificate = identityCertificate;
 }
diff --git a/src/invitelistdialog.cpp b/src/invitelistdialog.cpp
index 797a312..c3d12af 100644
--- a/src/invitelistdialog.cpp
+++ b/src/invitelistdialog.cpp
@@ -43,7 +43,7 @@
 { 
   string msg("invite to chatroom:\n");
   msg += label;
-  ui->inviteLabel->setText(QString::fromUtf8(msg.c_str())); 
+  ui->inviteLabel->setText(QString::fromStdString(msg)); 
   refreshContactList();
 }
 
@@ -54,7 +54,7 @@
   QStringList contactNameList;
   for(int i = 0; i < m_contactList.size(); i++)
     {
-      contactNameList << QString::fromUtf8(m_contactList[i]->getAlias().c_str());
+      contactNameList << QString::fromStdString(m_contactList[i]->getAlias());
     }
 
   m_contactListModel->setStringList(contactNameList);
@@ -65,7 +65,7 @@
 {
   QModelIndexList selected = ui->contactListView->selectionModel()->selectedIndexes();
   QString text = m_contactListModel->data(selected.first(), Qt::DisplayRole).toString();
-  string alias = text.toUtf8().constData();
+  string alias = text.toStdString();
 
   int i = 0;
   for(; i < m_contactList.size(); i++)
@@ -74,7 +74,7 @@
         break;
     }
 
-  QString invitedContactNamespace = QString::fromUtf8(m_contactList[i]->getNameSpace().toUri().c_str());
+  QString invitedContactNamespace = QString::fromStdString(m_contactList[i]->getNameSpace().toUri());
 
   bool isIntroducer = true;
 
diff --git a/src/main.cpp b/src/main.cpp
index 44a67ee..0ed7fc2 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -11,7 +11,6 @@
 #include <QApplication>
 #include <QSystemTrayIcon>
 
-#include "chronochat.h"
 #include "contactpanel.h"
 #include "contact-storage.h"
 #include "dns-storage.h"
@@ -54,13 +53,15 @@
   // app.setWindowIcon(QIcon(":/demo.icns"));
 
   Ptr<ContactStorage> contactStorage = NULL;
+  Ptr<DnsStorage> dnsStorage = NULL;
   try{
     contactStorage = Ptr<ContactStorage>::Create();
+    dnsStorage = Ptr<DnsStorage>::Create();
   }catch(std::exception& e){
     std::cerr << e.what() << std::endl;
     exit(1);
   }
-  Ptr<DnsStorage> dnsStorage = Ptr<DnsStorage>::Create();
+
   Ptr<ContactManager> contactManager = Ptr<ContactManager>(new ContactManager(contactStorage, dnsStorage));
   
   ContactPanel contactPanel(contactManager);
diff --git a/src/panel-policy-manager.cpp b/src/panel-policy-manager.cpp
index 1bbd849..679a3c9 100644
--- a/src/panel-policy-manager.cpp
+++ b/src/panel-policy-manager.cpp
@@ -82,10 +82,9 @@
 						 const DataCallback& verifiedCallback,
 						 const UnverifiedCallback& unverifiedCallback)
 {
-  _LOG_DEBUG("checkVerificationPolicy");
   if(m_stepLimit == stepCount)
     {
-      _LOG_DEBUG("reach the maximum steps of verification");
+      _LOG_ERROR("Reach the maximum steps of verification!");
       unverifiedCallback(data);
       return NULL;
     }
@@ -94,6 +93,7 @@
 
   if(KeyLocator::KEYNAME != sha256sig->getKeyLocator().getType())
     {
+      _LOG_ERROR("Keylocator is not name!");
       unverifiedCallback(data);
       return NULL;
     }
@@ -102,9 +102,7 @@
 
   if(m_kskRegex->match(data->getName()))
     {
-      _LOG_DEBUG("is ksk");
       Name keyName = m_kskRegex->expand();
-      _LOG_DEBUG("ksk name: " << keyName.toUri());
       map<Name, Publickey>::iterator it = m_trustAnchors.find(keyName);
       if(m_trustAnchors.end() != it)
         {
@@ -112,7 +110,6 @@
           Ptr<IdentityCertificate> identityCertificate = Ptr<IdentityCertificate>(new IdentityCertificate(*data));
           if(it->second.getKeyBlob() == identityCertificate->getPublicKeyInfo().getKeyBlob())
             {
-              _LOG_DEBUG("same key!");
               verifiedCallback(data);
             }
           else
@@ -140,13 +137,10 @@
       return NULL;	
     }
 
-  _LOG_DEBUG("KEY Locator: " << keyLocatorName.toUri());
   if(m_endorseeRule->satisfy(*data))
     {
       m_keyNameRegex->match(keyLocatorName);
       Name keyName = m_keyNameRegex->expand();
-      _LOG_DEBUG("data name: " << data->getName());
-      _LOG_DEBUG("keyName: " << keyName.toUri());
       if(m_trustAnchors.end() != m_trustAnchors.find(keyName))
         if(verifySignature(*data, m_trustAnchors[keyName]))
           verifiedCallback(data);
@@ -164,26 +158,6 @@
   return NULL;
 }
 
-// void 
-// PanelPolicyManager::onCertificateVerified(Ptr<Data> certData, 
-// 					       Ptr<Data> originalData,
-// 					       const DataCallback& verifiedCallback, 
-// 					       const UnverifiedCallback& unverifiedCallback)
-// {
-//   IdentityCertificate certificate(*certData);
-
-//   if(verifySignature(*originalData, certificate.getPublicKeyInfo()))
-//     verifiedCallback(originalData);
-//   else
-//     unverifiedCallback(originalData);
-// }
-
-// void
-// PanelPolicyManager::onCertificateUnverified(Ptr<Data> certData, 
-// 						 Ptr<Data> originalData,
-// 						 const UnverifiedCallback& unverifiedCallback)
-// { unverifiedCallback(originalData); }
-
 bool 
 PanelPolicyManager::checkSigningPolicy(const Name & dataName, const Name & certificateName)
 {
@@ -202,6 +176,6 @@
 void
 PanelPolicyManager::addTrustAnchor(const EndorseCertificate& selfEndorseCertificate)
 { 
-  _LOG_DEBUG(selfEndorseCertificate.getPublicKeyName().toUri());
+  // _LOG_DEBUG("Add Anchor: " << selfEndorseCertificate.getPublicKeyName().toUri());
   m_trustAnchors.insert(pair <Name, Publickey > (selfEndorseCertificate.getPublicKeyName(), selfEndorseCertificate.getPublicKeyInfo())); 
 }
diff --git a/src/profile-data.cpp b/src/profile-data.cpp
index ef067f9..e839f0f 100644
--- a/src/profile-data.cpp
+++ b/src/profile-data.cpp
@@ -57,7 +57,6 @@
 ProfileData::ProfileData(const Data& data)
   : Data()
 {
-  // _LOG_DEBUG("ProfileData constructor");
   const Name& dataName = data.getName();
   name::Component appFlag(string("PROFILE"));  
 
@@ -91,7 +90,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/profileeditor.cpp b/src/profileeditor.cpp
index d3d2608..7014794 100644
--- a/src/profileeditor.cpp
+++ b/src/profileeditor.cpp
@@ -32,8 +32,8 @@
 {
   ui->setupUi(this);
   
-  Name defaultIdentity = contactManager->getDefaultIdentity();
-  ui->identityInput->setText(defaultIdentity.toUri().c_str());
+  m_currentIdentity = contactManager->getDefaultIdentity();
+  ui->identityInput->setText(m_currentIdentity.toUri().c_str());
 
   connect(ui->addRowButton, SIGNAL(clicked()),
           this, SLOT(onAddClicked()));
@@ -94,7 +94,6 @@
   m_currentIdentity = Name(inputIdentity.toUtf8().constData());
   string filter("profile_identity = '");
   filter.append(m_currentIdentity.toUri()).append("'");
-  _LOG_DEBUG("filter: " << filter);
 
   m_tableModel->setEditStrategy(QSqlTableModel::OnManualSubmit);
   m_tableModel->setTable("SelfProfile");
@@ -104,8 +103,6 @@
   m_tableModel->setHeaderData(1, Qt::Horizontal, QObject::tr("Type"));
   m_tableModel->setHeaderData(2, Qt::Horizontal, QObject::tr("Value"));
 
-  _LOG_DEBUG("row count: " << m_tableModel->rowCount());
-
   ui->profileTable->setModel(m_tableModel);
   ui->profileTable->setColumnHidden(0, true);
   ui->profileTable->show();
diff --git a/src/profileeditor.h b/src/profileeditor.h
index 196a263..92ceaeb 100644
--- a/src/profileeditor.h
+++ b/src/profileeditor.h
@@ -31,6 +31,10 @@
                          QWidget *parent = 0);
   
   ~ProfileEditor();
+
+  inline void
+  setCurrentIdentity(const ndn::Name& name)
+  { m_currentIdentity = name; }
   
 private slots:
   void
@@ -50,7 +54,6 @@
   Ui::ProfileEditor *ui;
   QSqlTableModel* m_tableModel;
   ndn::Ptr<ContactManager> m_contactManager;
-  ndn::Name m_defaultIdentity;
   ndn::Name m_currentIdentity;
 };
 
diff --git a/src/setaliasdialog.cpp b/src/setaliasdialog.cpp
index 38e70d9..c615127 100644
--- a/src/setaliasdialog.cpp
+++ b/src/setaliasdialog.cpp
@@ -38,7 +38,7 @@
 SetAliasDialog::onOkClicked()
 {
   QString text = ui->aliasInput->text();
-  string alias = text.toUtf8().constData();
+  string alias = text.toStdString();
   
   m_contactManager->getContactStorage()->updateAlias(Name(m_target), alias);
 
@@ -57,7 +57,7 @@
   m_target = name; 
   string msg("Set alias for ");
   msg.append(name).append(":");
-  ui->introLabel->setText(QString::fromUtf8(msg.c_str()));
+  ui->introLabel->setText(QString::fromStdString(msg));
   ui->aliasInput->clear();
 }
 
diff --git a/src/startchatdialog.cpp b/src/startchatdialog.cpp
index 02d88f0..64795c0 100644
--- a/src/startchatdialog.cpp
+++ b/src/startchatdialog.cpp
@@ -33,14 +33,14 @@
 StartChatDialog::setInvitee(const string& invitee, const string& chatroom)
 { 
   m_invitee = invitee;
-  ui->chatroomInput->setText(QString::fromUtf8(chatroom.c_str()));
+  ui->chatroomInput->setText(QString::fromStdString(chatroom));
 }
 
 void 
 StartChatDialog::onOkClicked()
 {
   QString chatroom = ui->chatroomInput->text();
-  QString invitee = QString::fromUtf8(m_invitee.c_str());
+  QString invitee = QString::fromStdString(m_invitee);
   // bool isIntroducer = ui->introCheckBox->isChecked();
   bool isIntroducer = true;
   emit chatroomConfirmed(chatroom, invitee, isIntroducer);
diff --git a/src/warningdialog.cpp b/src/warningdialog.cpp
index 6c7eb8a..6dcae60 100644
--- a/src/warningdialog.cpp
+++ b/src/warningdialog.cpp
@@ -30,7 +30,7 @@
 
 void
 WarningDialog::setMsg(const string& msg)
-{ ui->message->setText(QApplication::translate("WarningDialog",msg.c_str(), 0, QApplication::UnicodeUTF8)); }
+{ ui->message->setText(QString::fromStdString(msg)); }
 
 void
 WarningDialog::onOkClicked()
