diff --git a/gui/chronosharegui.cpp b/gui/chronosharegui.cpp
index 9fca3b3..f310594 100644
--- a/gui/chronosharegui.cpp
+++ b/gui/chronosharegui.cpp
@@ -20,6 +20,12 @@
 
 #include "chronosharegui.h"
 #include "logging.h"
+#include "ccnx-wrapper.h"
+
+#include <boost/make_shared.hpp>
+
+using namespace boost;
+using namespace Ccnx;
 
 INIT_LOGGER ("Gui");
 
@@ -81,14 +87,19 @@
   //            const std::string &sharedFolder, const boost::filesystem::path &rootDir,
   //            Ccnx::CcnxWrapperPtr ccnx, SchedulerPtr scheduler, int poolSize = 2);
 
+  m_dispatcher = new Dispatcher (m_username.toStdString (), m_sharedFolderName.toStdString (),
+                                 m_dirPath.toStdString (), make_shared<CcnxWrapper> ());
 
   // Alex: this **must** be here, otherwise m_dirPath will be uninitialized
-  m_watcher = new FsWatcher (m_dirPath);
+  m_watcher = new FsWatcher (m_dirPath,
+                             bind (&Dispatcher::Did_LocalFile_AddOrModify, m_dispatcher, _1),
+                             bind (&Dispatcher::Did_LocalFile_Delete,      m_dispatcher, _1));
 }
 
 ChronoShareGui::~ChronoShareGui()
 {
   delete m_watcher; // stop filewatching ASAP
+  delete m_dispatcher; // stop dispatcher ASAP, but after watcher (to prevent triggering callbacks on deleted object)
 
   // cleanup
   delete m_trayIcon;
diff --git a/gui/chronosharegui.h b/gui/chronosharegui.h
index 098a48e..bf42515 100644
--- a/gui/chronosharegui.h
+++ b/gui/chronosharegui.h
@@ -35,6 +35,7 @@
 #include <QApplication>
 
 #include "fs-watcher.h"
+#include "dispatcher.h"
 
 class ChronoShareGui : public QDialog
 {
@@ -101,7 +102,8 @@
   QString m_username; // username
   QString m_sharedFolderName; // shared folder name
 
-  FsWatcher* m_watcher;
+  FsWatcher  *m_watcher;
+  Dispatcher *m_dispatcher;
 
   QLabel* labelUsername;
   QPushButton* button;
diff --git a/gui/fs-watcher.cc b/gui/fs-watcher.cc
new file mode 100644
index 0000000..2c6f8a2
--- /dev/null
+++ b/gui/fs-watcher.cc
@@ -0,0 +1,282 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2012-2013 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Jared Lindblom <lindblom@cs.ucla.edu>
+ *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ *         Zhenkai Zhu <zhenkai@cs.ucla.edu>
+ */
+
+#include "fs-watcher.h"
+#include "logging.h"
+
+#include <boost/bind.hpp>
+
+#include <QDirIterator>
+#include <QRegExp>
+
+using namespace std;
+using namespace boost;
+
+INIT_LOGGER ("FsWatcher");
+
+FsWatcher::FsWatcher (QString dirPath,
+                      LocalFile_Change_Callback onChange, LocalFile_Change_Callback onDelete,
+                      QObject* parent)
+  : QObject(parent)
+  , m_watcher (new QFileSystemWatcher())
+  , m_executor (1)
+  , m_dirPath (dirPath)
+  , m_onChange (onChange)
+  , m_onDelete (onDelete)
+{
+  _LOG_DEBUG ("Monitor dir: " << m_dirPath.toStdString ());
+  // add main directory to monitor
+  m_watcher->addPath (m_dirPath);
+
+  // register signals (callback functions)
+  connect (m_watcher, SIGNAL (directoryChanged (QString)), this, SLOT (DidDirectoryChanged (QString)));
+  connect (m_watcher, SIGNAL (fileChanged (QString)),      this, SLOT (DidFileChanged (QString)));
+
+  m_executor.execute (bind (&FsWatcher::ScanDirectory_Notify_Execute, this, m_dirPath));
+  m_executor.start ();
+}
+
+FsWatcher::~FsWatcher()
+{
+  m_executor.shutdown ();
+  delete m_watcher;
+}
+
+void
+FsWatcher::DidDirectoryChanged (QString dirPath)
+{
+  _LOG_DEBUG ("Triggered DirPath: " << dirPath.toStdString ());
+
+  m_executor.execute (bind (&FsWatcher::ScanDirectory_Notify_Execute, this, dirPath));
+}
+
+void
+FsWatcher::DidFileChanged (QString filePath)
+{
+  _LOG_DEBUG ("Triggered FilePath: " << filePath.toStdString ());
+}
+
+
+void FsWatcher::DidDirectoryChanged_Execute (QString dirPath)
+{
+//   // scan directory and populate file list
+//   QHash<QString, qint64> currentState = scanDirectory(dirPath);
+
+//   // reconcile directory and report changes
+//   std::vector<sEventInfo> dirChanges = reconcileDirectory(currentState, dirPath);
+// #ifdef _DEBUG
+//   // DEBUG: Print Changes
+//   printChanges(dirChanges);
+// #endif
+//   // emit the signal if not empty
+//   if(!dirChanges.empty())
+//     emit dirEventSignal(dirChanges);
+}
+
+void
+FsWatcher::ScanDirectory_Notify_Execute (QString dirPath)
+{
+  QRegExp exclude ("^(\\.|\\.\\.|\\.chronoshare)$");
+
+  QDirIterator dirIterator (dirPath,
+                            QDir::Dirs | QDir::Files | QDir::Hidden | QDir::NoSymLinks | QDir::NoDotAndDotDot,
+                            QDirIterator::Subdirectories); // directory iterator (recursive)
+
+  // iterate through directory recursively
+  while (dirIterator.hasNext ())
+    {
+      dirIterator.next ();
+
+      // Get FileInfo
+      QFileInfo fileInfo = dirIterator.fileInfo ();
+
+      QString name = fileInfo.fileName ();
+
+      if (!exclude.exactMatch (name))
+        {
+          // _LOG_DEBUG ("Not excluded file/dir: " << fileInfo.absoluteFilePath ().toStdString ());
+          QString absFilePath = fileInfo.absoluteFilePath ();
+
+          // _LOG_DEBUG ("Attempt to add path to watcher: " << absFilePath.toStdString ());
+          m_watcher->addPath (absFilePath);
+
+          if (fileInfo.isFile ())
+            {
+              DidFileChanged (absFilePath);
+            }
+          // // if this is a directory
+          // if(fileInfo.isDir())
+          //   {
+          //     QStringList dirList = m_watcher->directories();
+
+          //     // if the directory is not already being watched
+          //     if (absFilePath.startsWith(m_dirPath) && !dirList.contains(absFilePath))
+          //       {
+          //         _LOG_DEBUG ("Add new dir to watchlist: " << absFilePath.toStdString ());
+          //         // add this directory to the watch list
+          //         m_watcher->addPath(absFilePath);
+          //       }
+          //   }
+          // else
+          //   {
+          //     _LOG_DEBUG ("Found file: " << absFilePath.toStdString ());
+          //     // add this file to the file list
+          //     // currentState.insert(absFilePath, fileInfo.created().toMSecsSinceEpoch());
+          //   }
+        }
+      else
+        {
+          // _LOG_DEBUG ("Excluded file/dir: " << fileInfo.filePath ().toStdString ());
+        }
+    }
+}
+
+// std::vector<sEventInfo> FsWatcher::reconcileDirectory(QHash<QString, qint64> currentState, QString dirPath)
+// {
+//   // list of files changed
+//   std::vector<sEventInfo> dirChanges;
+
+//   // compare result (database/stored snapshot) to fileList (current snapshot)
+//   QMutableHashIterator<QString, qint64> i(m_storedState);
+
+//   while(i.hasNext())
+//     {
+//       i.next();
+
+//       QString absFilePath = i.key();
+//       qint64 storedCreated = i.value();
+
+//       // if this file is in a level higher than
+//       // this directory, ignore
+//       if(!absFilePath.startsWith(dirPath))
+//         {
+//           continue;
+//         }
+
+//       // check file existence
+//       if(currentState.contains(absFilePath))
+//         {
+//           qint64 currentCreated = currentState.value(absFilePath);
+
+//           if(storedCreated != currentCreated)
+//             {
+//               // update stored state
+//               i.setValue(currentCreated);
+
+//               // this file has been modified
+//               sEventInfo eventInfo;
+//               eventInfo.event = MODIFIED;
+//               eventInfo.absFilePath = absFilePath.toStdString();
+//               dirChanges.push_back(eventInfo);
+//             }
+
+//           // delete this file from fileList we have processed it
+//           currentState.remove(absFilePath);
+//         }
+//       else
+//         {
+//           // delete from stored state
+//           i.remove();
+
+//           // this file has been deleted
+//           sEventInfo eventInfo;
+//           eventInfo.event = DELETED;
+//           eventInfo.absFilePath = absFilePath.toStdString();
+//           dirChanges.push_back(eventInfo);
+//         }
+//     }
+
+//   // any files left in fileList have been added
+//   for(QHash<QString, qint64>::iterator i = currentState.begin(); i != currentState.end(); ++i)
+//     {
+//       QString absFilePath = i.key();
+//       qint64 currentCreated = i.value();
+
+//       m_storedState.insert(absFilePath, currentCreated);
+
+//       // this file has been added
+//       sEventInfo eventInfo;
+//       eventInfo.event = ADDED;
+//       eventInfo.absFilePath = absFilePath.toStdString();
+//       dirChanges.push_back(eventInfo);
+//     }
+
+//   return dirChanges;
+// }
+
+// QByteArray FsWatcher::calcChecksum(QString absFilePath)
+// {
+//   // initialize checksum
+//   QCryptographicHash crypto(QCryptographicHash::Md5);
+
+//   // open file
+//   QFile file(absFilePath);
+//   file.open(QFile::ReadOnly);
+
+//   // calculate checksum
+//   while(!file.atEnd())
+//     {
+//       crypto.addData(file.read(8192));
+//     }
+
+//   return crypto.result();
+// }
+
+// void FsWatcher::printChanges(std::vector<sEventInfo> dirChanges)
+// {
+//   if(!dirChanges.empty())
+//     {
+//       for(size_t i = 0; i < dirChanges.size(); i++)
+//         {
+//           QString tempString;
+
+//           eEvent event = dirChanges[i].event;
+//           QString absFilePath = QString::fromStdString(dirChanges[i].absFilePath);
+
+//           switch(event)
+//             {
+//             case ADDED:
+//               tempString.append("ADDED: ");
+//               break;
+//             case MODIFIED:
+//               tempString.append("MODIFIED: ");
+//               break;
+//             case DELETED:
+//               tempString.append("DELETED: ");
+//               break;
+//             }
+
+//           tempString.append(absFilePath);
+
+//           _LOG_DEBUG ("\t" << tempString.toStdString ());
+//         }
+//     }
+//   else
+//     {
+//           _LOG_DEBUG ("\t[EMPTY]");
+//     }
+// }
+
+#if WAF
+#include "fs-watcher.moc"
+#include "fs-watcher.cc.moc"
+#endif
diff --git a/gui/fs-watcher.h b/gui/fs-watcher.h
new file mode 100644
index 0000000..6ba6671
--- /dev/null
+++ b/gui/fs-watcher.h
@@ -0,0 +1,87 @@
+/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
+/*
+ * Copyright (c) 2012-2013 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Jared Lindblom <lindblom@cs.ucla.edu>
+ *         Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ *         Zhenkai Zhu <zhenkai@cs.ucla.edu>
+ */
+#ifndef FS_WATCHER_H
+#define FS_WATCHER_H
+
+#include <vector>
+#include <QFileSystemWatcher>
+#include <boost/filesystem.hpp>
+
+#include "executor.h"
+
+class FsWatcher : public QObject
+{
+  Q_OBJECT
+
+public:
+  typedef boost::function<void (const boost::filesystem::path &)> LocalFile_Change_Callback;
+
+  // constructor
+  FsWatcher (QString dirPath,
+             LocalFile_Change_Callback onChange, LocalFile_Change_Callback onDelete,
+             QObject* parent = 0);
+
+  // destructor
+  ~FsWatcher ();
+
+private slots:
+  // handle callback from watcher
+  void
+  DidDirectoryChanged (QString dirPath);
+
+  /**
+   * @brief This even will be triggered either by actual file change or via directory change event
+   * (i.e., can happen twice in a row, as well as trigger false alarm)
+   */
+  void
+  DidFileChanged (QString filePath);
+
+private:
+  // handle callback from the watcher
+  void
+  DidDirectoryChanged_Execute (QString dirPath);
+
+  // scan directory and notify callback about any file changes
+  void
+  ScanDirectory_Notify_Execute (QString dirPath);
+
+  // // reconcile directory, find changes
+  // std::vector<sEventInfo>
+  // reconcileDirectory (QHash<QString, qint64> fileList, QString dirPath);
+
+  // // calculate checksum
+  // QByteArray calcChecksum(QString absFilePath);
+
+  // // print Changes (DEBUG)
+  // void printChanges(std::vector<sEventInfo> dirChanges);
+
+private:
+  QFileSystemWatcher* m_watcher; // filesystem watcher
+  Executor m_executor;
+
+  QString m_dirPath; // monitored path
+
+  LocalFile_Change_Callback m_onChange;
+  LocalFile_Change_Callback m_onDelete;
+};
+
+#endif // FILESYSTEMWATCHER_H
