diff --git a/model/sync-diff-state-container.h b/model/sync-diff-state-container.h
index 0f70437..9349e76 100644
--- a/model/sync-diff-state-container.h
+++ b/model/sync-diff-state-container.h
@@ -40,14 +40,8 @@
 
 namespace Sync {
 
-struct DigestHash : public std::unary_function<Digest, std::size_t>
+struct DigestPtrHash : public std::unary_function<Digest, std::size_t>
 {
-  // std::size_t
-  // operator() (const Digest &digest) const
-  // {
-  //   return digest.getHash ();
-  // }
-
   std::size_t
   operator() (DigestConstPtr digest) const
   {
@@ -55,6 +49,16 @@
   }
 };
 
+struct DigestPtrEqual : public std::unary_function<Digest, std::size_t>
+{
+  bool
+  operator() (DigestConstPtr digest1, DigestConstPtr digest2) const
+  {
+    return *digest1 == *digest2;
+  }
+};
+
+
 /// @cond include_hidden 
 struct sequenced { };
 /// @endcond
@@ -70,7 +74,8 @@
     mi::hashed_unique<
       mi::tag<hashed>,
       mi::const_mem_fun<DiffState, DigestConstPtr, &DiffState::getDigest>,
-      DigestHash
+      DigestPtrHash,
+      DigestPtrEqual
       >
     ,        
     // sequenced index to access older/newer element (like in list)
diff --git a/model/sync-diff-state.cc b/model/sync-diff-state.cc
index 75e0be5..65323d3 100644
--- a/model/sync-diff-state.cc
+++ b/model/sync-diff-state.cc
@@ -61,22 +61,26 @@
 }
   
 // from State
-void
+bool
 DiffState::update (NameInfoConstPtr info, const SeqNo &seq)
 {
-  m_leaves.erase (*info);
+  m_leaves.erase (info);
 
   DiffLeafPtr leaf = make_shared<DiffLeaf> (info, cref (seq));
   m_leaves.insert (leaf);
+
+  return true;
 }
 
-void
+bool
 DiffState::remove (NameInfoConstPtr info)
 {
-  m_leaves.erase (*info);
+  m_leaves.erase (info);
 
   DiffLeafPtr leaf = make_shared<DiffLeaf> (info);
   m_leaves.insert (leaf);
+
+  return true;
 }
 
 } // ns3
diff --git a/model/sync-diff-state.h b/model/sync-diff-state.h
index 7a889c4..6a43aef 100644
--- a/model/sync-diff-state.h
+++ b/model/sync-diff-state.h
@@ -86,10 +86,10 @@
   operator += (const DiffState &state);
   
   // from State
-  virtual void
+  virtual bool
   update (NameInfoConstPtr info, const SeqNo &seq);
 
-  virtual void
+  virtual bool
   remove (NameInfoConstPtr info);
   
 private:
diff --git a/model/sync-full-leaf.cc b/model/sync-full-leaf.cc
index ee1d3dc..3636860 100644
--- a/model/sync-full-leaf.cc
+++ b/model/sync-full-leaf.cc
@@ -37,7 +37,7 @@
 FullLeaf::updateDigest ()
 {
   m_digest.reset ();
-  m_digest << getInfo ().getDigest () << *getSeq ().getDigest ();
+  m_digest << getInfo ()->getDigest () << *getSeq ().getDigest ();
   m_digest.finalize ();
 }
 
diff --git a/model/sync-full-state.cc b/model/sync-full-state.cc
index e8a2149..ed3a3ee 100644
--- a/model/sync-full-state.cc
+++ b/model/sync-full-state.cc
@@ -81,7 +81,7 @@
 }
 
 // from State
-void
+bool
 FullState::update (NameInfoConstPtr info, const SeqNo &seq)
 {
 #ifndef STANDALONE  
@@ -92,18 +92,23 @@
 
   m_digest.reset ();
 
-  LeafContainer::iterator item = m_leaves.find (*info);
+  LeafContainer::iterator item = m_leaves.find (info);
   if (item == m_leaves.end ())
     {
       m_leaves.insert (make_shared<FullLeaf> (info, cref (seq)));
     }
   else
     {
-      m_leaves.modify (item, ll::bind (&Leaf::setSeq, *ll::_1, seq));
+      if ((*item)->getSeq () == seq || seq < (*item)->getSeq ())
+        return false;
+      
+      m_leaves.modify (item,
+                       ll::bind (&Leaf::setSeq, *ll::_1, seq));
     }
+  return true;
 }
 
-void
+bool
 FullState::remove (NameInfoConstPtr info)
 {
 #ifndef STANDALONE  
@@ -114,7 +119,14 @@
 
   m_digest.reset ();
 
-  m_leaves.erase (*info);
+  LeafContainer::iterator item = m_leaves.find (info);
+  if (item != m_leaves.end ())
+    {
+      m_leaves.erase (info);
+      return true;
+    }
+  else
+    return false;
 }
 
 } // Sync
diff --git a/model/sync-full-state.h b/model/sync-full-state.h
index 9769878..2aac7b9 100644
--- a/model/sync-full-state.h
+++ b/model/sync-full-state.h
@@ -67,10 +67,10 @@
   getDigest ();
   
   // from State
-  virtual void
+  virtual bool
   update (NameInfoConstPtr info, const SeqNo &seq);
 
-  virtual void
+  virtual bool
   remove (NameInfoConstPtr info);
   
 private:
diff --git a/model/sync-leaf.h b/model/sync-leaf.h
index 00ae151..5970709 100644
--- a/model/sync-leaf.h
+++ b/model/sync-leaf.h
@@ -46,8 +46,8 @@
   /**
    * @brief Get name of the leaf
    */
-  const NameInfo &
-  getInfo () const { return *m_info; }
+  NameInfoConstPtr
+  getInfo () const { return m_info; }
 
   /**
    * @brief Get sequence number of the leaf
diff --git a/model/sync-logic.cc b/model/sync-logic.cc
index a3fe621..6b11c9a 100644
--- a/model/sync-logic.cc
+++ b/model/sync-logic.cc
@@ -39,10 +39,10 @@
 
 
 SyncLogic::SyncLogic (const string &syncPrefix,
-                      LogicCallback fetch,
+                      LogicCallback fetchCallback,
                       CcnxWrapperPtr ccnxHandle)
   : m_syncPrefix (syncPrefix)
-  , m_fetch (fetch)
+  , m_fetchCallback (fetchCallback)
   , m_ccnxHandle (ccnxHandle)
   , m_delayedCheckThreadRunning (true)
 {
@@ -173,9 +173,8 @@
 SyncLogic::processSyncData (const string &name, const string &dataBuffer)
 {
   string last = name.substr(name.find_last_of("/") + 1);
-  stringstream ss(dataBuffer);
+  istringstream ss (dataBuffer);
 
-  const LeafContainer &fullLc = m_state.getLeaves();
   DiffStatePtr diffLog = make_shared<DiffState>();
 
   if (last == "state")
@@ -184,39 +183,38 @@
     ss >> full;
     BOOST_FOREACH (LeafConstPtr leaf, full.getLeaves().get<ordered>())
     {
-      shared_ptr<const FullLeaf> fullLeaf = dynamic_pointer_cast<const FullLeaf>(leaf);
-      const NameInfo &info = fullLeaf->getInfo();
-      LeafContainer::iterator it = fullLc.find(info);
-      NameInfoConstPtr pInfo = StdNameInfo::FindOrCreate(info.toString());
-      SeqNo seq = fullLeaf->getSeq();
+      NameInfoConstPtr info = leaf->getInfo ();
+      LeafContainer::iterator it = m_state.getLeaves().find (info);
 
-      if (it == fullLc.end())
-      {
-	string prefix = info.toString();
-	prefix += "/";
-	prefix += seq.getSession();
-	m_fetch(prefix, 1, seq.getSeq());
-	m_state.update(pInfo, seq);
-	diffLog->update(pInfo, seq);
-      }
-      else
-      {
-	SeqNo currSeq = (*it)->getSeq();
-	if (currSeq < seq)
-	{
-	  string prefix = info.toString();
-	  prefix += "/";
-	  prefix += seq.getSession();
+      SeqNo seq = leaf->getSeq ();
 
-	  if (currSeq.getSession() == seq.getSession())
-	    m_fetch(prefix, currSeq.getSeq() + 1, seq.getSeq());
-	  else
-	    m_fetch(prefix, 1, seq.getSeq());
+      // if (it == m_state.getLeaves().end())
+      // {
+      //   string prefix = info.toString();
+      //   prefix += "/";
+      //   prefix += seq.getSession();
+      //   m_fetchCallback (prefix, 1, seq.getSeq());
+      //   m_state.update(pInfo, seq);
+      //   diffLog->update(pInfo, seq);
+      // }
+      // else
+      // {
+      //   SeqNo currSeq = (*it)->getSeq();
+      //   if (currSeq < seq)
+      //   {
+      //     string prefix = info.toString();
+      //     prefix += "/";
+      //     prefix += seq.getSession();
 
-	  m_state.update(pInfo, seq);
-	  diffLog->update(pInfo, seq);
-	}
-      }
+      //     if (currSeq.getSession() == seq.getSession())
+      //       m_fetchCallback(prefix, currSeq.getSeq() + 1, seq.getSeq());
+      //     else
+      //       m_fetchCallback(prefix, 1, seq.getSeq());
+
+      //     m_state.update(pInfo, seq);
+      //     diffLog->update(pInfo, seq);
+      //   }
+      // }
     }
   }
   else
@@ -225,63 +223,74 @@
     ss >> diff;
     BOOST_FOREACH (LeafConstPtr leaf, diff.getLeaves().get<ordered>())
     {
-      shared_ptr<const DiffLeaf> diffLeaf = dynamic_pointer_cast<const DiffLeaf>(leaf);
-      const NameInfo &info = diffLeaf->getInfo();
-      LeafContainer::iterator it = fullLc.find(info);
+      shared_ptr<const DiffLeaf> diffLeaf = dynamic_pointer_cast<const DiffLeaf> (leaf);
+      if (diffLeaf == 0)
+        {
+          return;
+          /// \todo Log the error
+        }
+      NameInfoConstPtr info = diffLeaf->getInfo();
+      LeafContainer::iterator it = m_state.getLeaves().find (info);
       SeqNo seq = diffLeaf->getSeq();
 
-      switch (diffLeaf->getOperation())
-      {
-	case UPDATE:
-	  if (it == fullLc.end())
-	  {
-	    string prefix = info.toString();
-	    prefix += "/";
-	    prefix += seq.getSession();
-	    m_fetch(prefix, 1, seq.getSeq());
+      // switch (diffLeaf->getOperation())
+      // {
+      //   case UPDATE:
+      //     if (it == m_state.getLeaves().end())
+      //     {
+      //       string prefix = info.toString();
+      //       prefix += "/";
+      //       prefix += seq.getSession();
+      //       m_fetchCallback(prefix, 1, seq.getSeq());
 
-	    NameInfoConstPtr pInfo = StdNameInfo::FindOrCreate(info.toString());
-	    m_state.update(pInfo, seq);
-	    diffLog->update(pInfo, seq);
-	  }
-	  else
-	  {
-	    SeqNo currSeq = (*it)->getSeq();
-	    if (currSeq < seq)
-	    {
-	      string prefix = info.toString();
-	      prefix += "/";
-	      prefix += seq.getSession();
+      //       NameInfoConstPtr pInfo = StdNameInfo::FindOrCreate(info.toString());
+      //       m_state.update(pInfo, seq);
+      //       diffLog->update(pInfo, seq);
+      //     }
+      //     else
+      //     {
+      //       SeqNo currSeq = (*it)->getSeq();
+      //       if (currSeq < seq)
+      //       {
+      //         string prefix = info.toString();
+      //         prefix += "/";
+      //         prefix += seq.getSession();
 
-	      if (currSeq.getSession() == seq.getSession())
-	        m_fetch(prefix, currSeq.getSeq() + 1, seq.getSeq());
-	      else
-	        m_fetch(prefix, 1, seq.getSeq());
+      //         if (currSeq.getSession() == seq.getSession())
+      //           m_fetchCallback(prefix, currSeq.getSeq() + 1, seq.getSeq());
+      //         else
+      //           m_fetchCallback(prefix, 1, seq.getSeq());
 
-	      NameInfoConstPtr pInfo = StdNameInfo::FindOrCreate(info.toString());
-	      m_state.update(pInfo, seq);
-	      diffLog->update(pInfo, seq);
-	    }
-	  }
-	  break;
+      //         NameInfoConstPtr pInfo = StdNameInfo::FindOrCreate(info.toString());
+      //         m_state.update(pInfo, seq);
+      //         diffLog->update(pInfo, seq);
+      //       }
+      //     }
+      //     break;
 
-	case REMOVE:
-	  if (it != fullLc.end())
-	  {
-	    NameInfoConstPtr pInfo = StdNameInfo::FindOrCreate(info.toString());
-  	    m_state.remove(pInfo);
-	    diffLog->remove(pInfo);
-	  }
-	  break;
+      //   case REMOVE:
+      //     if (it != m_state.getLeaves().end())
+      //     {
+      //       NameInfoConstPtr pInfo = StdNameInfo::FindOrCreate(info.toString());
+      //       m_state.remove(pInfo);
+      //       diffLog->remove(pInfo);
+      //     }
+      //     break;
 
-	default:
-	  break;
-      }
+      //   default:
+      //     break;
+      // }
     }
   }
 
   diffLog->setDigest(m_state.getDigest());
-  m_log.insert(diffLog);
+  m_log.insert (diffLog);
+
+  // notify upper layer
+  BOOST_FOREACH (LeafConstPtr leaf, diffLog->getLeaves ())
+    {
+    }
+  
   sendSyncInterest();
 }
 
@@ -301,7 +310,7 @@
   ss << *diff;
   for (vector<string>::iterator ii = pis.begin(); ii != pis.end(); ++ii)
   {
-    m_ccnxHandle->publishData(*ii, ss.str(), m_syncResponseFreshness);
+    m_ccnxHandle->publishData (*ii, ss.str(), m_syncResponseFreshness);
   }
 }
 
diff --git a/model/sync-logic.h b/model/sync-logic.h
index b624ecb..42a2ae0 100644
--- a/model/sync-logic.h
+++ b/model/sync-logic.h
@@ -101,7 +101,7 @@
   SyncInterestTable m_syncInterestTable;
 
   std::string m_syncPrefix;
-  LogicCallback m_fetch;
+  LogicCallback m_fetchCallback;
   CcnxWrapperPtr m_ccnxHandle;
 
   boost::thread m_delayedCheckThread;
diff --git a/model/sync-state-leaf-container.h b/model/sync-state-leaf-container.h
index 9ae98b0..7111ff6 100644
--- a/model/sync-state-leaf-container.h
+++ b/model/sync-state-leaf-container.h
@@ -42,9 +42,27 @@
 struct NameInfoHash : public std::unary_function<NameInfo, std::size_t>
 {
   std::size_t
-  operator() (const NameInfo &prefix) const
+  operator() (NameInfoConstPtr prefix) const
   {
-    return prefix.getHashId ();
+    return prefix->getHashId ();
+  }
+};
+
+struct NameInfoEqual : public std::unary_function<NameInfo, std::size_t>
+{
+  bool
+  operator() (NameInfoConstPtr prefix1, NameInfoConstPtr prefix2) const
+  {
+    return *prefix1 == *prefix2;
+  }
+};
+
+struct NameInfoCompare : public std::unary_function<NameInfo, std::size_t>
+{
+  bool
+  operator() (NameInfoConstPtr prefix1, NameInfoConstPtr prefix2) const
+  {
+    return *prefix1 < *prefix2;
   }
 };
 
@@ -63,13 +81,16 @@
     // For fast access to elements using NameInfo
     mi::hashed_unique<
       mi::tag<hashed>,
-      mi::const_mem_fun<Leaf, const NameInfo&, &Leaf::getInfo>,
-      NameInfoHash
+      mi::const_mem_fun<Leaf, NameInfoConstPtr, &Leaf::getInfo>,
+      NameInfoHash,
+      NameInfoEqual
       >,
-        mi::ordered_unique<
-          mi::tag<ordered>,
-          mi::const_mem_fun<Leaf, const NameInfo&, &Leaf::getInfo>
-          >
+        
+    mi::ordered_unique<
+      mi::tag<ordered>,
+      mi::const_mem_fun<Leaf, NameInfoConstPtr, &Leaf::getInfo>,
+      NameInfoCompare
+      >
     >
   >
 {
diff --git a/model/sync-state.cc b/model/sync-state.cc
index 4befe62..c021d0e 100644
--- a/model/sync-state.cc
+++ b/model/sync-state.cc
@@ -64,7 +64,7 @@
         {
           os << "<item>"; DEBUG_ENDL;
         }
-      os << "<name>" << leaf->getInfo () << "</name>"; DEBUG_ENDL;
+      os << "<name>" << *leaf->getInfo () << "</name>"; DEBUG_ENDL;
       if (diffLeaf == 0 || (diffLeaf != 0 && diffLeaf->getOperation () == UPDATE))
         {
           os << "<seq>" << leaf->getSeq () << "</seq>"; DEBUG_ENDL;
diff --git a/model/sync-state.h b/model/sync-state.h
index bfe2517..2806fdb 100644
--- a/model/sync-state.h
+++ b/model/sync-state.h
@@ -48,14 +48,14 @@
    * @param info name of the leaf
    * @param seq  sequence number of the leaf
    */
-  virtual void
+  virtual bool
   update (NameInfoConstPtr info, const SeqNo &seq) = 0;
 
   /**
    * @brief Remove leaf from the state tree
    * @param info name of the leaf
    */
-  virtual void
+  virtual bool
   remove (NameInfoConstPtr info) = 0;
 
   /**
diff --git a/test/test_state.cc b/test/test_state.cc
index 7732798..00ff467 100644
--- a/test/test_state.cc
+++ b/test/test_state.cc
@@ -156,6 +156,7 @@
   ostringstream os;
   os << state;
   string s = os.str ();
+  // cout << s << endl; 
   erase_all (s, "\n");
   BOOST_CHECK_EQUAL (s, xml1);
   }
