diff --git a/src/hash-string-converter.cc b/src/hash-string-converter.cc
index 1c9a656..2961069 100644
--- a/src/hash-string-converter.cc
+++ b/src/hash-string-converter.cc
@@ -118,7 +118,7 @@
       return;
     }
 
-  unsigned char *m_buf = new unsigned char [EVP_MAX_MD_SIZE];
+  m_buf = new unsigned char [EVP_MAX_MD_SIZE];
   
   unsigned char *end = copy (string_to_binary (hashInTextEncoding.begin ()),
                             string_to_binary (hashInTextEncoding.end ()),
diff --git a/src/hash-string-converter.h b/src/hash-string-converter.h
index 1a84065..b696426 100644
--- a/src/hash-string-converter.h
+++ b/src/hash-string-converter.h
@@ -33,15 +33,19 @@
   Hash (const void *buf, size_t length)
     : m_length (length)
   {
-    m_buf = new unsigned char [length];
-    memcpy (m_buf, buf, length);
+    if (m_length != 0)
+      {
+        m_buf = new unsigned char [length];
+        memcpy (m_buf, buf, length);
+      }
   }
 
   Hash (const std::string &hashInTextEncoding);
 
   ~Hash ()
   {
-    delete [] m_buf;
+    if (m_length != 0)
+      delete [] m_buf;
   }
   
   bool
@@ -76,6 +80,9 @@
   unsigned char *m_buf;
   size_t m_length;
 
+  Hash (const Hash &) { }
+  Hash & operator = (const Hash &) { return *this; }
+  
   friend std::ostream &
   operator << (std::ostream &os, const Hash &digest);
 };
diff --git a/src/main.cc b/src/main.cc
index f8338c4..82b5c7d 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -21,10 +21,61 @@
  */
 
 #include "sqlite-helper.h"
+#include <iostream>
+
+using namespace std;
+using namespace boost;
+
+typedef boost::error_info<struct tag_errmsg, std::string> errmsg_info_str; 
+
 
 int
 main (int argc, char **argv)
 {
-  DbHelper db ("./");
+  try
+    {
+      DbHelper db ("./");
+
+      HashPtr hash = db.RememberStateInStateLog ();
+      // should be empty
+      cout << "Hash: [" << *hash << "]" << endl;
+
+      //
+      db.UpdateDeviceSeqno ("Alex", 1);
+      hash = db.RememberStateInStateLog ();
+      cout << "Hash: [" << *hash << "]" << endl;
+
+      db.UpdateDeviceSeqno ("Alex", 2);
+      hash = db.RememberStateInStateLog ();
+      cout << "Hash: [" << *hash << "]" << endl;
+
+      db.UpdateDeviceSeqno ("Alex", 2);
+      hash = db.RememberStateInStateLog ();
+      cout << "Hash: [" << *hash << "]" << endl;
+
+      db.UpdateDeviceSeqno ("Alex", 1);
+      hash = db.RememberStateInStateLog ();
+      cout << "Hash: [" << *hash << "]" << endl;
+
+      db.FindStateDifferences ("00", "ec0a9941fa726e1fb8f34ecdbd8e3faa75dc9dba22e6a2ea1d8482aae5fdfb52");
+      db.FindStateDifferences ("ec0a9941fa726e1fb8f34ecdbd8e3faa75dc9dba22e6a2ea1d8482aae5fdfb52", "00");
+      db.FindStateDifferences ("869c38c6dffe8911ced320aecc6d9244904d13d3e8cd21081311f2129b4557ce",
+                               "ec0a9941fa726e1fb8f34ecdbd8e3faa75dc9dba22e6a2ea1d8482aae5fdfb52");
+      db.FindStateDifferences ("ec0a9941fa726e1fb8f34ecdbd8e3faa75dc9dba22e6a2ea1d8482aae5fdfb52",
+                               "869c38c6dffe8911ced320aecc6d9244904d13d3e8cd21081311f2129b4557ce");
+
+      db.UpdateDeviceSeqno ("Bob", 1);
+      hash = db.RememberStateInStateLog ();
+      cout << "Hash: [" << *hash << "]" << endl;
+
+      db.FindStateDifferences ("00", "48f4d95b503b9a79c2d5939fa67722b13fc01db861fc501d09efd0a38dbafab8");
+      db.FindStateDifferences ("ec0a9941fa726e1fb8f34ecdbd8e3faa75dc9dba22e6a2ea1d8482aae5fdfb52",
+                               "48f4d95b503b9a79c2d5939fa67722b13fc01db861fc501d09efd0a38dbafab8");
+    }
+  catch (const boost::exception &e)
+    {
+      cout << "ERRORR: " << *get_error_info<errmsg_info_str> (e) << endl;
+    }
+
   return 0;
 }
diff --git a/src/sqlite-helper.cc b/src/sqlite-helper.cc
index 7f3d829..1a3ed1c 100644
--- a/src/sqlite-helper.cc
+++ b/src/sqlite-helper.cc
@@ -21,7 +21,8 @@
 
 #include "sqlite-helper.h"
 // #include "sync-log.h"
-#include "hash-string-converter.h"
+#include <boost/make_shared.hpp>
+#include <boost/ref.hpp>
 
 // Other options: VP_md2, EVP_md5, EVP_sha, EVP_sha1, EVP_sha256, EVP_dss, EVP_dss1, EVP_mdc2, EVP_ripemd160
 #define HASH_FUNCTION EVP_sha256
@@ -30,8 +31,11 @@
 typedef boost::error_info<struct tag_errmsg, std::string> errmsg_info_str; 
 // typedef boost::error_info<struct tag_errmsg, int> errmsg_info_int; 
 
+using namespace boost;
 
 const std::string INIT_DATABASE = "\
+PRAGMA foreign_keys = ON;                                       \
+                                                                \
 CREATE TABLE                                                    \
     SyncNodes(                                                  \
         device_id       INTEGER PRIMARY KEY AUTOINCREMENT,      \
@@ -42,14 +46,28 @@
         last_update     TIMESTAMP                               \
     );                                                          \
                                                                 \
-CREATE INDEX SyncNodes_device_name ON SyncNodes (device_name);  \
-                                                                \
-CREATE TABLE SyncLog(                                           \
-        state_id    INTEGER PRIMARY KEY AUTOINCREMENT,          \
-        state_hash  BLOB NOT NULL UNIQUE,                       \
-        last_update TIMESTAMP NOT NULL                          \
-    );                                                          \
-                                                                \
+CREATE TRIGGER SyncNodesUpdater_trigger                                \
+    BEFORE INSERT ON SyncNodes                                         \
+    FOR EACH ROW                                                       \
+    WHEN (SELECT device_id                                             \
+             FROM SyncNodes                                            \
+             WHERE device_name=NEW.device_name)                        \
+         IS NOT NULL                                                   \
+    BEGIN                                                              \
+        UPDATE SyncNodes                                               \
+            SET seq_no=max(seq_no,NEW.seq_no)                          \
+            WHERE device_name=NEW.device_name;                         \
+        SELECT RAISE(IGNORE);                                          \
+    END;                                                               \
+                                                                       \
+CREATE INDEX SyncNodes_device_name ON SyncNodes (device_name);         \
+                                                                       \
+CREATE TABLE SyncLog(                                                  \
+        state_id    INTEGER PRIMARY KEY AUTOINCREMENT,                 \
+        state_hash  BLOB NOT NULL UNIQUE,                              \
+        last_update TIMESTAMP NOT NULL                                 \
+    );                                                                 \
+                                                                       \
 CREATE TABLE                                                            \
     SyncStateNodes(                                                     \
         id          INTEGER PRIMARY KEY AUTOINCREMENT,                  \
@@ -86,13 +104,31 @@
     }
   
   res = sqlite3_create_function (m_db, "hash", 2, SQLITE_ANY, 0, 0,
-                                     DbHelper::hash_xStep, DbHelper::hash_xFinal);
+                                 DbHelper::hash_xStep, DbHelper::hash_xFinal);
   if (res != SQLITE_OK)
     {
       BOOST_THROW_EXCEPTION (Error::Db ()
                              << errmsg_info_str ("Cannot create function ``hash''"));
     }
 
+  res = sqlite3_create_function (m_db, "hash2str", 2, SQLITE_ANY, 0,
+                                 DbHelper::hash2str_Func,
+                                 0, 0);
+  if (res != SQLITE_OK)
+    {
+      BOOST_THROW_EXCEPTION (Error::Db ()
+                             << errmsg_info_str ("Cannot create function ``hash''"));
+    }
+
+  res = sqlite3_create_function (m_db, "str2hash", 2, SQLITE_ANY, 0,
+                                 DbHelper::str2hash_Func,
+                                 0, 0);
+  if (res != SQLITE_OK)
+    {
+      BOOST_THROW_EXCEPTION (Error::Db ()
+                             << errmsg_info_str ("Cannot create function ``hash''"));
+    }
+  
   // Alex: determine if tables initialized. if not, initialize... not sure what is the best way to go...
   // for now, just attempt to create everything
 
@@ -114,31 +150,69 @@
     }
 }
 
-void
-DbHelper::rememberStateInStateLog ()
+HashPtr
+DbHelper::RememberStateInStateLog ()
 {
-  char *errmsg = 0;
-  int res = sqlite3_exec (m_db, " \
-BEGIN TRANSACTION;                              \
-INSERT INTO SyncLog                             \
-    (state_hash, last_update)                   \
+  int res = sqlite3_exec (m_db, "BEGIN TRANSACTION;", 0,0,0);
+
+  res += sqlite3_exec (m_db, "\
+INSERT INTO SyncLog                                     \
+    (state_hash, last_update)                           \
     SELECT                                              \
        hash(device_name, seq_no), datetime('now')       \
     FROM SyncNodes                                      \
     ORDER BY device_name;                               \
-                                                        \
+", 0,0,0);
+
+  if (res != SQLITE_OK)
+    {
+      BOOST_THROW_EXCEPTION (Error::Db ()
+                             << errmsg_info_str ("1"));
+    }
+  
+  sqlite3_int64 rowId = sqlite3_last_insert_rowid (m_db);
+  
+  sqlite3_stmt *insertStmt;
+  res += sqlite3_prepare (m_db, "\
 INSERT INTO SyncStateNodes                              \
       (state_id, device_id, seq_no)                     \
-      SELECT last_insert_rowid(), device_id, seq_no     \
+      SELECT ?, device_id, seq_no                       \
             FROM SyncNodes;                             \
-COMMIT;                                                 \
-",
-                          NULL, NULL, &errmsg);
-  if (res != SQLITE_OK && errmsg != 0)
+", -1, &insertStmt, 0);
+
+  res += sqlite3_bind_int64 (insertStmt, 1, rowId);
+  sqlite3_step (insertStmt);
+
+  if (res != SQLITE_OK)
     {
-      std::cerr << "DEBUG: " << errmsg << std::endl;
-      sqlite3_free (errmsg);
+      BOOST_THROW_EXCEPTION (Error::Db ()
+                             << errmsg_info_str ("4"));
     }
+  sqlite3_finalize (insertStmt);
+  
+  sqlite3_stmt *getHashStmt;
+  res += sqlite3_prepare (m_db, "\
+SELECT state_hash FROM SyncLog WHERE state_id = ?\
+", -1, &getHashStmt, 0);
+  res += sqlite3_bind_int64 (getHashStmt, 1, rowId);
+
+  HashPtr retval;
+  int stepRes = sqlite3_step (getHashStmt);
+  if (stepRes == SQLITE_ROW)
+    {
+      retval = make_shared<Hash> (sqlite3_column_blob (getHashStmt, 0),
+                                  sqlite3_column_bytes (getHashStmt, 0));
+    }
+  sqlite3_finalize (getHashStmt);
+  res += sqlite3_exec (m_db, "COMMIT;", 0,0,0);
+
+  if (res != SQLITE_OK)
+    {
+      BOOST_THROW_EXCEPTION (Error::Db ()
+                             << errmsg_info_str ("Some error with rememberStateInStateLog"));
+    }
+
+  return retval;
 }
 
 
@@ -224,7 +298,8 @@
   const void *hash = sqlite3_value_blob (argv[0]);
 
   std::ostringstream os;
-  os << Hash (hash, hashBytes);
+  Hash tmpHash (hash, hashBytes);
+  os << tmpHash;
   sqlite3_result_text (context, os.str ().c_str (), -1, SQLITE_TRANSIENT);
 }
 
@@ -244,3 +319,135 @@
   sqlite3_result_blob (context, hash.GetHash (), hash.GetHashBytes (), SQLITE_TRANSIENT);
 }
 
+
+sqlite3_int64
+DbHelper::LookupSyncLog (const std::string &stateHash)
+{
+  Hash tmpHash (stateHash);
+  return LookupSyncLog (stateHash);
+}
+
+sqlite3_int64
+DbHelper::LookupSyncLog (const Hash &stateHash)
+{
+  sqlite3_stmt *stmt;
+  int res = sqlite3_prepare (m_db, "SELECT state_id FROM SyncLog WHERE state_hash = ?",
+                             -1, &stmt, 0);
+  
+  if (res != SQLITE_OK)
+    {
+      BOOST_THROW_EXCEPTION (Error::Db ()
+                             << errmsg_info_str ("Cannot prepare statement"));
+    }
+
+  res = sqlite3_bind_blob (stmt, 1, stateHash.GetHash (), stateHash.GetHashBytes (), SQLITE_STATIC);
+  if (res != SQLITE_OK)
+    {
+      BOOST_THROW_EXCEPTION (Error::Db ()
+                             << errmsg_info_str ("Cannot bind"));
+    }
+
+  sqlite3_int64 row = 0; // something bad
+
+  if (sqlite3_step (stmt) == SQLITE_ROW)
+    {
+      row = sqlite3_column_int64 (stmt, 0);
+    }
+
+  sqlite3_finalize (stmt);
+
+  return row;
+}
+
+void
+DbHelper::UpdateDeviceSeqno (const std::string &name, uint64_t seqNo)
+{
+  sqlite3_stmt *stmt;
+  // update is performed using trigger
+  int res = sqlite3_prepare (m_db, "INSERT INTO SyncNodes (device_name, seq_no) VALUES (?,?);", 
+                             -1, &stmt, 0);
+
+  res += sqlite3_bind_text  (stmt, 1, name.c_str (), name.size (), SQLITE_STATIC);
+  res += sqlite3_bind_int64 (stmt, 2, seqNo);
+  sqlite3_step (stmt);
+  
+  if (res != SQLITE_OK)
+    {
+      BOOST_THROW_EXCEPTION (Error::Db ()
+                             << errmsg_info_str ("Some error with UpdateDeviceSeqno"));
+    }
+  sqlite3_finalize (stmt);
+}
+
+void
+DbHelper::FindStateDifferences (const std::string &oldHash, const std::string &newHash)
+{
+  Hash tmpOldHash (oldHash);
+  Hash tmpNewHash (newHash);
+
+  FindStateDifferences (tmpOldHash, tmpNewHash);
+}
+
+void
+DbHelper::FindStateDifferences (const Hash &oldHash, const Hash &newHash)
+{
+  sqlite3_stmt *stmt;
+
+  int res = sqlite3_prepare_v2 (m_db, "\
+SELECT sn.device_name, s_old.seq_no, s_new.seq_no                       \
+    FROM (SELECT *                                                      \
+            FROM SyncStateNodes                                         \
+            WHERE state_id=(SELECT state_id                             \
+                                FROM SyncLog                            \
+                                WHERE state_hash=:old_hash)) s_old      \
+    LEFT JOIN (SELECT *                                                 \
+                FROM SyncStateNodes                                     \
+                WHERE state_id=(SELECT state_id                         \
+                                    FROM SyncLog                        \
+                                    WHERE state_hash=:new_hash)) s_new  \
+                                                                        \
+        ON s_old.device_id = s_new.device_id                            \
+    JOIN SyncNodes sn ON sn.device_id = s_old.device_id                 \
+                                                                        \
+    WHERE s_new.seq_no IS NULL OR                                       \
+          s_old.seq_no != s_new.seq_no                                  \
+                                                                        \
+UNION ALL                                                               \
+                                                                        \
+SELECT sn.device_name, s_old.seq_no, s_new.seq_no                       \
+    FROM (SELECT *                                                      \
+            FROM SyncStateNodes                                         \
+            WHERE state_id=(SELECT state_id                             \
+                                FROM SyncLog                            \
+                                WHERE state_hash=:new_hash )) s_new     \
+    LEFT JOIN (SELECT *                                                 \
+                FROM SyncStateNodes                                     \
+                WHERE state_id=(SELECT state_id                         \
+                                    FROM SyncLog                        \
+                                    WHERE state_hash=:old_hash)) s_old  \
+                                                                        \
+        ON s_old.device_id = s_new.device_id                            \
+    JOIN SyncNodes sn ON sn.device_id = s_new.device_id                 \
+                                                                        \
+    WHERE s_old.seq_no IS NULL                                          \
+", -1, &stmt, 0);
+
+  if (res != SQLITE_OK)
+    {
+      BOOST_THROW_EXCEPTION (Error::Db ()
+                             << errmsg_info_str ("Some error with FindStateDifferences"));
+    }
+
+  res += sqlite3_bind_blob  (stmt, 1, oldHash.GetHash (), oldHash.GetHashBytes (), SQLITE_STATIC);
+  res += sqlite3_bind_blob  (stmt, 2, newHash.GetHash (), newHash.GetHashBytes (), SQLITE_STATIC);
+
+  while (sqlite3_step (stmt) == SQLITE_ROW)
+    {
+      std::cout << sqlite3_column_text (stmt, 0) <<
+        ": from "  << sqlite3_column_int64 (stmt, 1) <<
+        " to "     << sqlite3_column_int64 (stmt, 2) <<
+        std::endl;
+    }
+  sqlite3_finalize (stmt);
+  
+}
diff --git a/src/sqlite-helper.h b/src/sqlite-helper.h
index b710646..e119523 100644
--- a/src/sqlite-helper.h
+++ b/src/sqlite-helper.h
@@ -26,6 +26,7 @@
 #include <openssl/evp.h>
 #include <boost/exception/all.hpp>
 #include <string>
+#include "hash-string-converter.h"
 
 // temporarily ignoring all potential database errors
 
@@ -35,21 +36,38 @@
   DbHelper (const std::string &path);
   ~DbHelper ();
 
+  // done
   void
-  updateDeviceSeqno ();
+  UpdateDeviceSeqno (const std::string &name, uint64_t seqNo);
 
-  std::string
-  LookupForwardingAlias (const std::string &deviceName);
+  // std::string
+  // LookupForwardingAlias (const std::string &deviceName);
 
-  void
-  updateForwardingAlias ();
+  // void
+  // UpdateForwardingAlias ();
 
+  // done
   /**
    * Create an entry in SyncLog and SyncStateNodes corresponding to the current state of SyncNodes
    */
-  void
-  rememberStateInStateLog ();
+  HashPtr
+  RememberStateInStateLog ();
 
+  // done
+  sqlite3_int64
+  LookupSyncLog (const std::string &stateHash);
+
+  // done
+  sqlite3_int64
+  LookupSyncLog (const Hash &stateHash);
+
+  // How difference is exposed will be determined later by the actual protocol
+  void
+  FindStateDifferences (const std::string &oldHash, const std::string &newHash);
+
+  void
+  FindStateDifferences (const Hash &oldHash, const Hash &newHash);
+  
 private:
   static void
   hash_xStep (sqlite3_context *context, int argc, sqlite3_value **argv);
