diff --git a/model/sync-logic.cc b/model/sync-logic.cc
index 13b66f5..3098b00 100644
--- a/model/sync-logic.cc
+++ b/model/sync-logic.cc
@@ -133,10 +133,12 @@
   size_t pos = hash.find ('/');
   if (pos != string::npos)
     {
-      hash         = name.substr (pos + 1);
-      interestType = name.substr (0, pos);
+      interestType = hash.substr (0, pos);
+      hash         = hash.substr (pos + 1);
     }
 
+  _LOG_TRACE (hash << ", " << interestType);
+
   DigestPtr digest = make_shared<Digest> ();
   istringstream is (hash);
   is >> *digest;
@@ -183,7 +185,15 @@
       string type;
       tie (digest, type) = convertNameToDigestAndType (name);
 
-      processSyncData (name, digest, dataBuffer);
+      if (type == "normal")
+        {
+          processSyncData (name, digest, dataBuffer);
+        }
+      else
+        {
+          m_scheduler.cancel (REEXPRESSING_RECOVERY_INTEREST);
+          processSyncData (name, digest, dataBuffer);
+        }
     }
   catch (Error::DigestCalculationError &e)
     {
@@ -191,7 +201,6 @@
       // log error. ignoring it for now, later we should log it
       return;
     }
-      
 }
 
 
@@ -242,9 +251,8 @@
     }
   else
     {
-      BOOST_ASSERT (false); // not implemented yet
-      
-      // _LOG_TRACE (">> D " << *digest << " (timed processing)");
+      _LOG_TRACE ("                                                      (timed processing)");
+      sendSyncRecoveryInterests (digest);
     }
 }
 
@@ -307,11 +315,12 @@
       // don't do anything
     }
 
-  if (diffLog != 0)
+  if (diffLog != 0 && diffLog->getLeaves ().size () > 0)
     {
-      BOOST_ASSERT (diffLog->getLeaves ().size () > 0);
+      // Do it only if everything went fine and state changed
 
-      satisfyPendingSyncInterests (diffLog); // if there are interests in PIT, there is a point to satisfy them using new state
+      // this is kind of wrong
+      // satisfyPendingSyncInterests (diffLog); // if there are interests in PIT, there is a point to satisfy them using new state
   
       // if state has changed, then it is safe to express a new interest
       m_scheduler.cancel (REEXPRESSING_INTEREST);
@@ -328,7 +337,11 @@
   
   DiffStateContainer::iterator stateInDiffLog = m_log.find (digest);
 
-  if (stateInDiffLog == m_log.end ()) return;
+  if (stateInDiffLog == m_log.end ())
+    {
+      _LOG_TRACE ("Could not find " << *digest << " in digest log");
+      return;
+    }
 
   sendSyncData (name, digest, m_state);
 }
@@ -336,16 +349,41 @@
 void
 SyncLogic::satisfyPendingSyncInterests (DiffStateConstPtr diffLog)
 {
-  uint32_t counter = 0;
-  while (m_syncInterestTable.size () > 0)
+  DiffStatePtr fullStateLog = make_shared<DiffState> ();
+  {
+    recursive_mutex::scoped_lock lock (m_stateMutex);
+    BOOST_FOREACH (LeafConstPtr leaf, m_state->getLeaves ()/*.get<timed> ()*/)
+      {
+        fullStateLog->update (leaf->getInfo (), leaf->getSeq ());
+        /// @todo Impose limit on how many state info should be send out
+      }
+  }
+  
+  try
     {
-      Interest interest = m_syncInterestTable.pop ();
-      
-      _LOG_TRACE (">> D " << interest.m_name);
-      sendSyncData (interest.m_name, interest.m_digest, diffLog);
-      counter ++;
+      uint32_t counter = 0;
+      while (m_syncInterestTable.size () > 0)
+        {
+          Interest interest = m_syncInterestTable.pop ();
+
+          if (!interest.m_unknown)
+            {
+              _LOG_TRACE (">> D " << interest.m_name);
+              sendSyncData (interest.m_name, interest.m_digest, diffLog);
+            }
+          else
+            {
+              _LOG_TRACE (">> D (unknown)" << interest.m_name);
+              sendSyncData (interest.m_name, interest.m_digest, fullStateLog);
+            }
+          counter ++;
+        }
+      _LOG_DEBUG ("Satisfied " << counter << " pending interests");
     }
-  _LOG_DEBUG ("Satisfied " << counter << " pending interests");
+  catch (Error::InterestTableIsEmpty &e)
+    {
+      // ok. not really an error
+    }
 }
 
 void
@@ -427,8 +465,27 @@
 }
 
 void
+SyncLogic::sendSyncRecoveryInterests (DigestConstPtr digest)
+{
+  ostringstream os;
+  os << m_syncPrefix << "/recovery/" << *digest;
+  _LOG_TRACE (">> I " << os.str ());
+
+  // no need for retransmission
+  // m_scheduler.cancel (REEXPRESSING_RECOVERY_INTEREST);
+  // m_scheduler.schedule (TIME_SECONDS_WITH_JITTER(1.0),//TIME_SECONDS_WITH_JITTER (m_syncInterestReexpress),
+  //                       bind (&SyncLogic::sendSyncRecoveryInterests, this, digest),
+  //                       REEXPRESSING_RECOVERY_INTEREST);
+
+  m_ccnxHandle->sendInterest (os.str (),
+                              bind (&SyncLogic::respondSyncData, this, _1, _2));
+}
+
+
+void
 SyncLogic::sendSyncData (const std::string &name, DigestConstPtr digest, StateConstPtr state)
 {
+  _LOG_TRACE (">> D " << name);
   // sending
   m_ccnxHandle->publishData (name,
                              lexical_cast<string> (*state),
