diff --git a/chatdialog.cpp b/chatdialog.cpp
index fdde9df..a3137a0 100644
--- a/chatdialog.cpp
+++ b/chatdialog.cpp
@@ -1,18 +1,26 @@
-#include <QtGui>
 #include "chatdialog.h"
+
 #include "settingdialog.h"
-#include <ctime>
-#include <iostream>
+
+#include <QtGui>
 #include <QTimer>
 #include <QMetaType>
 #include <QMessageBox>
+
+#ifndef Q_MOC_RUN
+#include <ctime>
+#include <iostream>
+
 #include <boost/random/random_device.hpp>
 #include <boost/random/uniform_int_distribution.hpp>
 #include <boost/lexical_cast.hpp>
+#include <boost/make_shared.hpp>
+
 #include <stdio.h>
+#endif
 
 #define BROADCAST_PREFIX_FOR_SYNC_DEMO "/ndn/broadcast/chronos"
-#define LOCAL_PREFIX_QUERY "/local/ndn/prefix" 
+#define LOCAL_PREFIX_QUERY "/local/ndn/prefix"
 #define DEFAULT_LOCAL_PREFIX "/private/local"
 #define CCN_EXEC  "/usr/local/bin/ccnpeek"
 
@@ -65,12 +73,12 @@
   connect(trayIcon, SIGNAL(messageClicked()), this, SLOT(showNormal()));
   connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));
   connect(m_scene, SIGNAL(rosterChanged(QStringList)), this, SLOT(updateRosterList(QStringList)));
-  
+
   initializeSync();
 
 }
 
-void 
+void
 ChatDialog::initializeSync()
 {
   // create sync socket
@@ -78,7 +86,7 @@
     std::string syncPrefix = BROADCAST_PREFIX_FOR_SYNC_DEMO;
     syncPrefix += "/";
     syncPrefix += m_user.getChatroom().toStdString();
-    try 
+    try
     {
       m_sock = new Sync::SyncAppSocket(syncPrefix,
                                        bind(&ChatDialog::processTreeUpdateWrapper, this, _1, _2),
@@ -93,7 +101,7 @@
         m_timer->start(FRESHNESS * 1000);
         disableTreeDisplay();
         QTimer::singleShot(2200, this, SLOT(enableTreeDisplay()));
-        Sync::CcnxWrapperPtr handle = Sync::CcnxWrapper::Create();
+        Sync::CcnxWrapperPtr handle = boost::make_shared<Sync::CcnxWrapper> ();
         handle->setInterestFilter(m_user.getPrefix().toStdString(), bind(&ChatDialog::respondHistoryRequest, this, _1));
       }
       else
@@ -101,7 +109,7 @@
         // this socket is going to be destroyed anyway
         // why bother doing the following steps
 
-        // the same steps would be performed for another socket 
+        // the same steps would be performed for another socket
         // in settingUpdated
       }
     }
@@ -115,7 +123,7 @@
 
 ChatDialog::~ChatDialog()
 {
-  if (m_sock != NULL) 
+  if (m_sock != NULL)
   {
     sendLeave();
     delete m_sock;
@@ -153,7 +161,7 @@
   std::map<std::string, bool> branches = logic.getBranchPrefixes();
   QMap<QString, DisplayUserPtr> roster = m_scene->getRosterFull();
 
-  m_zombieList.clear(); 
+  m_zombieList.clear();
 
   QMapIterator<QString, DisplayUserPtr> it(roster);
   std::map<std::string, bool>::iterator mapIt;
@@ -221,7 +229,7 @@
   }
 }
 
-void 
+void
 ChatDialog::setVisible(bool visible)
 {
   minimizeAction->setEnabled(visible);
@@ -230,7 +238,7 @@
   QDialog::setVisible(visible);
 }
 
-void 
+void
 ChatDialog::closeEvent(QCloseEvent *e)
 {
   if (trayIcon->isVisible() && !m_minimaniho)
@@ -247,13 +255,13 @@
   }
 }
 
-void 
+void
 ChatDialog::changeEvent(QEvent *e)
 {
-  switch(e->type()) 
+  switch(e->type())
   {
   case QEvent::ActivationChange:
-    if (isActiveWindow()) 
+    if (isActiveWindow())
     {
       trayIcon->setIcon(QIcon(":/images/icon_small.png"));
     }
@@ -268,7 +276,7 @@
 {
   boost::recursive_mutex::scoped_lock lock(m_msgMutex);
 
-  if (msg.type() == SyncDemo::ChatMessage::CHAT) 
+  if (msg.type() == SyncDemo::ChatMessage::CHAT)
   {
 
     if (!msg.has_data())
@@ -311,7 +319,7 @@
 
     time_t timestamp = msg.timestamp();
     printTimeInCell(table, timestamp);
-    
+
     QTextCursor nextCursor(textEdit->textCursor());
     nextCursor.movePosition(QTextCursor::End);
     table = nextCursor.insertTable(1, 1, tableFormat);
@@ -358,7 +366,7 @@
   bar->setValue(bar->maximum());
 }
 
-void 
+void
 ChatDialog::printTimeInCell(QTextTable *table, time_t timestamp)
 {
   QTextCharFormat timeFormat;
@@ -423,12 +431,12 @@
 
   int n = v.size();
   int totalMissingPackets = 0;
-  for (int i = 0; i < n; i++) 
+  for (int i = 0; i < n; i++)
   {
     totalMissingPackets += v[i].high.getSeq() - v[i].low.getSeq() + 1;
   }
-  
-  for (int i = 0; i < n; i++) 
+
+  for (int i = 0; i < n; i++)
   {
     if (totalMissingPackets < 4)
     {
@@ -468,7 +476,7 @@
   char *tempBuf = new char[len];
   memcpy(tempBuf, buf, len);
   emit dataReceived(name.c_str(), tempBuf, len, false, false);
-  
+
   if (!m_historyInitialized)
   {
     fetchHistory(name);
@@ -484,13 +492,13 @@
   emit dataReceived(name.c_str(), tempBuf, len, true, true);
 }
 
-void 
+void
 ChatDialog::fetchHistory(std::string name)
 {
   std::string nameWithoutSeq = name.substr(0, name.find_last_of('/'));
   std::string prefix = nameWithoutSeq.substr(0, nameWithoutSeq.find_last_of('/'));
   prefix += "/history";
-  Sync::CcnxWrapperPtr handle = Sync::CcnxWrapper::Create(); 
+  Sync::CcnxWrapperPtr handle = boost::make_shared<Sync::CcnxWrapper> ();
   QString randomString = getRandomString();
   for (int i = 0; i < MAX_HISTORY_ENTRY; i++)
   {
@@ -502,11 +510,11 @@
 void
 ChatDialog::respondHistoryRequest(std::string interest)
 {
-  std::string seqStr = interest.substr(interest.find_last_of('/') + 1); 
+  std::string seqStr = interest.substr(interest.find_last_of('/') + 1);
   int seq = boost::lexical_cast<int>(seqStr);
   if (seq >= 0 && seq < m_history.size())
   {
-    Sync::CcnxWrapperPtr handle = Sync::CcnxWrapper::Create();
+    Sync::CcnxWrapperPtr handle = boost::make_shared<Sync::CcnxWrapper> ();
     SyncDemo::ChatMessage msg = m_history.at(seq);
     size_t size = msg.ByteSize();
     char *buf = new char[size];
@@ -521,7 +529,7 @@
 {
   SyncDemo::ChatMessage msg;
   bool corrupted = false;
-  if (!msg.ParseFromArray(buf, len)) 
+  if (!msg.ParseFromArray(buf, len))
   {
     std::cerr << "Errrrr.. Can not parse msg with name: " << name.toStdString() << ". what is happening?" << std::endl;
     // nasty stuff: as a remedy, we'll form some standard msg for inparsable msgs
@@ -542,7 +550,7 @@
   {
     appendMessage(msg, isHistory);
   }
-  
+
   if (!isHistory)
   {
     // update the tree view
@@ -598,7 +606,7 @@
   msg.set_type(SyncDemo::ChatMessage::CHAT);
 }
 
-void 
+void
 ChatDialog::formControlMessage(SyncDemo::ChatMessage &msg, SyncDemo::ChatMessage::ChatMessageType type)
 {
   msg.set_from(m_user.getNick().toStdString());
@@ -626,8 +634,8 @@
 bool
 ChatDialog::getLocalPrefix()
 {
-//   /* 
-//    * this method tries to use ccncat 
+//   /*
+//    * this method tries to use ccncat
 //    * however, it does not work in Mac OS X app bundle
 //    * it works well in command line though
 //    */
@@ -658,10 +666,10 @@
 //   }
 //   return localPrefix;
   std::cerr << "trying to get local prefix" << std::endl;
-  
+
   if (m_sock != NULL)
   {
-    QString originPrefix = QString::fromStdString (m_sock->getLocalPrefix()).trimmed ();
+    QString originPrefix = QString::fromStdString (m_sock->GetLocalPrefix()).trimmed ();
     std::cerr << "got: " << originPrefix.toStdString () << std::endl;
 
     if (originPrefix != "" && m_user.getOriginPrefix () != originPrefix)
@@ -693,9 +701,9 @@
   // Sync::CcnxWrapperPtr wrapper = Sync::CcnxWrapper::Create ();
   // QString originPrefix = QString::fromStdString (wrapper->getLocalPrefix());
   // Sync::CcnxWrapper::Destroy ();
-  
+
   QString originPrefix = DEFAULT_LOCAL_PREFIX;
-  
+
   m_minimaniho = s.value("minimaniho", false).toBool();
   if (nick == "" || chatroom == "" || originPrefix == "") {
     m_user.setOriginPrefix(DEFAULT_LOCAL_PREFIX);
@@ -716,7 +724,7 @@
  // return false;
 }
 
-void 
+void
 ChatDialog::writeSettings()
 {
   QSettings s(ORGANIZATION, APPLICATION);
@@ -732,7 +740,7 @@
   QString settingDisp = QString("Chatroom: %1").arg(m_user.getChatroom());
   infoLabel->setStyleSheet("QLabel {color: #630; font-size: 16px; font: bold \"Verdana\";}");
   infoLabel->setText(settingDisp);
-  QString prefixDisp; 
+  QString prefixDisp;
   if (m_user.getPrefix().startsWith(DEFAULT_LOCAL_PREFIX))
   {
     prefixDisp = QString("<Warning: no connection to hub or hub does not support prefix autoconfig.>\n <Prefix = %1>").arg(m_user.getPrefix());
@@ -746,13 +754,13 @@
   prefixLabel->setText(prefixDisp);
 }
 
-void 
+void
 ChatDialog::returnPressed()
 {
   QString text = lineEdit->text();
   if (text.isEmpty())
     return;
- 
+
   lineEdit->clear();
 
   if (text.startsWith("boruoboluomi"))
@@ -771,7 +779,7 @@
 
   SyncDemo::ChatMessage msg;
   formChatMessage(text, msg);
-  
+
   appendMessage(msg);
 
   sendMsg(msg);
@@ -779,14 +787,14 @@
   fitView();
 }
 
-void 
+void
 ChatDialog::sendMsg(SyncDemo::ChatMessage &msg)
 {
   // send msg
   size_t size = msg.ByteSize();
   char *buf = new char[size];
   msg.SerializeToArray(buf, size);
-  if (!msg.IsInitialized()) 
+  if (!msg.IsInitialized())
   {
     std::cerr << "Errrrr.. msg was not probally initialized "<<__FILE__ <<":"<<__LINE__<<". what is happening?" << std::endl;
     abort();
@@ -808,7 +816,7 @@
   }
 }
 
-void 
+void
 ChatDialog::sendJoin()
 {
   m_joined = true;
@@ -821,7 +829,7 @@
   QTimer::singleShot(m_randomizedInterval, this, SLOT(sendHello()));
 }
 
-void 
+void
 ChatDialog::sendHello()
 {
   time_t now = time(NULL);
@@ -850,7 +858,7 @@
     Sync::SyncLogic &logic = m_sock->getLogic ();
     logic.printState ();
   }
-  
+
   SettingDialog dialog(this, m_user.getNick(), m_user.getChatroom(), m_user.getOriginPrefix());
   connect(&dialog, SIGNAL(updated(QString, QString, QString)), this, SLOT(settingUpdated(QString, QString, QString)));
   dialog.exec();
@@ -965,7 +973,7 @@
       usleep(100000);
       m_sock = new Sync::SyncAppSocket(syncPrefix, bind(&ChatDialog::processTreeUpdateWrapper, this, _1, _2), bind(&ChatDialog::processRemoveWrapper, this, _1));
       usleep(100000);
-      Sync::CcnxWrapperPtr handle = Sync::CcnxWrapper::Create();
+      Sync::CcnxWrapperPtr handle = boost::make_shared<Sync::CcnxWrapper> ();
       handle->setInterestFilter(m_user.getPrefix().toStdString(), bind(&ChatDialog::respondHistoryRequest, this, _1));
       QTimer::singleShot(600, this, SLOT(sendJoin()));
       m_timer->start(FRESHNESS * 1000);
@@ -978,7 +986,7 @@
       std::exit(1);
     }
 
-    
+
   }
   else if (needFresh && m_sock == NULL)
   {
@@ -1019,7 +1027,7 @@
 ChatDialog::showMessage(QString from, QString data)
 {
   //  std::cout <<"Showing Message: " << from.toStdString() << ": " << data.toStdString() << std::endl;
-  if (!isActiveWindow()) 
+  if (!isActiveWindow())
   {
     trayIcon->showMessage(QString("Chatroom %1 has a new message").arg(m_user.getChatroom()), QString("<%1>: %2").arg(from).arg(data), QSystemTrayIcon::Information, 20000);
     trayIcon->setIcon(QIcon(":/images/note.png"));
@@ -1037,13 +1045,13 @@
 {
   minimizeAction = new QAction(tr("Mi&nimize"), this);
   connect(minimizeAction, SIGNAL(triggered()), this, SLOT(hide()));
-  
+
   maximizeAction = new QAction(tr("Ma&ximize"), this);
   connect(maximizeAction, SIGNAL(triggered()), this, SLOT(showMaximized()));
-  
+
   restoreAction = new QAction(tr("&Restore"), this);
   connect(restoreAction, SIGNAL(triggered()), this, SLOT(showNormal()));
-  
+
   quitAction = new QAction(tr("Quit"), this);
   connect(quitAction, SIGNAL(triggered()), qApp, SLOT(quit()));
 }
@@ -1068,13 +1076,13 @@
   trayIcon->setVisible(true);
 }
 
-void 
+void
 ChatDialog::resizeEvent(QResizeEvent *e)
 {
   fitView();
 }
 
-void 
+void
 ChatDialog::showEvent(QShowEvent *e)
 {
   fitView();
diff --git a/chatdialog.h b/chatdialog.h
index 8adcc88..71f36d8 100644
--- a/chatdialog.h
+++ b/chatdialog.h
@@ -1,7 +1,10 @@
 #ifndef CHATDIALOG_H
 #define CHATDIALOG_H
+
+#ifndef Q_MOC_RUN
 #include <boost/function.hpp>
 #include <boost/thread/recursive_mutex.hpp>
+
 #include <vector>
 #include "digesttreescene.h"
 #include "ui_chatdialog.h"
@@ -9,6 +12,8 @@
 #include <sync-app-socket.h>
 #include <sync-logic.h>
 #include <sync-seq-no.h>
+#endif
+
 #include <QSystemTrayIcon>
 #include <QQueue>
 
diff --git a/digesttreescene.cpp b/digesttreescene.cpp
index 2265fd0..5e474bf 100644
--- a/digesttreescene.cpp
+++ b/digesttreescene.cpp
@@ -1,10 +1,14 @@
+#include "digesttreescene.h"
+
 #include <QtGui>
+
+#ifndef Q_MOC_RUN
 #include <vector>
 #include <iostream>
 #include <assert.h>
 #include <boost/lexical_cast.hpp>
 #include <memory>
-#include "digesttreescene.h"
+#endif
 
 static const double Pi = 3.14159265358979323846264338327950288419717;
 
diff --git a/digesttreescene.h b/digesttreescene.h
index a2cc69a..fd04828 100644
--- a/digesttreescene.h
+++ b/digesttreescene.h
@@ -1,15 +1,19 @@
 #ifndef DIGESTTREESCENE_H
 #define DIGESTTREESCENE_H
 
+#include "treelayout.h"
+
 #include <QtGui/QGraphicsScene>
+#include <QColor>
+#include <QMap>
+
+#ifndef Q_MOC_RUN
 #include <sync-seq-no.h>
 #include <sync-logic.h>
 #include <ctime>
-#include <QMap>
 #include <vector>
 #include <tr1/memory>
-#include <QColor>
-#include "treelayout.h"
+#endif
 
 const int FRESHNESS = 60;
 
