diff --git a/gui/fs-watcher.cc b/gui/fs-watcher.cc
index a97f8b4..94c6b3f 100644
--- a/gui/fs-watcher.cc
+++ b/gui/fs-watcher.cc
@@ -38,7 +38,7 @@
                       QObject* parent)
   : QObject(parent)
   , m_watcher (new QFileSystemWatcher())
-  , m_executor (1)
+  , m_scheduler (new Scheduler ())
   , m_dirPath (dirPath)
   , m_onChange (onChange)
   , m_onDelete (onDelete)
@@ -52,22 +52,27 @@
   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 ();
+  m_scheduler->start ();
+
+  Scheduler::scheduleOneTimeTask (m_scheduler, 0.1,
+                                  bind (&FsWatcher::ScanDirectory_Notify_Execute, this, m_dirPath),
+                                  m_dirPath.toStdString ()); // only one task will be scheduled per directory
 }
 
 FsWatcher::~FsWatcher()
 {
-  m_executor.shutdown ();
-  delete m_watcher;
+  m_scheduler->shutdown ();
 }
 
 void
 FsWatcher::DidDirectoryChanged (QString dirPath)
 {
-  // _LOG_DEBUG ("Triggered DirPath: " << dirPath.toStdString ());
+  _LOG_DEBUG ("Triggered DirPath: " << dirPath.toStdString ());
 
-  m_executor.execute (bind (&FsWatcher::ScanDirectory_Notify_Execute, this, dirPath));
+  // m_executor.execute (bind (&FsWatcher::ScanDirectory_Notify_Execute, this, dirPath));
+  Scheduler::scheduleOneTimeTask (m_scheduler, 0.5,
+                                  bind (&FsWatcher::ScanDirectory_Notify_Execute, this, dirPath),
+                                  dirPath.toStdString ()); // only one task will be scheduled per directory
 }
 
 void
@@ -85,32 +90,23 @@
   if (filesystem::exists (filesystem::path (absPathTriggeredFile)))
     {
       _LOG_DEBUG ("Triggered UPDATE of file:  " << triggeredFile.relative_path ().generic_string ());
-      m_onChange (triggeredFile.relative_path ());
+      // m_onChange (triggeredFile.relative_path ());
+
+      Scheduler::scheduleOneTimeTask (m_scheduler, 0.5,
+                                      bind (m_onChange, triggeredFile.relative_path ()),
+                                      triggeredFile.relative_path ().string());
     }
   else
     {
       _LOG_DEBUG ("Triggered DELETE of file: " << triggeredFile.relative_path ().generic_string ());
-      m_onDelete (triggeredFile.relative_path ());
+      // m_onDelete (triggeredFile.relative_path ());
+
+      Scheduler::scheduleOneTimeTask (m_scheduler, 0.5,
+                                      bind (m_onDelete, triggeredFile.relative_path ()),
+                                      triggeredFile.relative_path ().string());
     }
 }
 
-
-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)
 {
diff --git a/gui/fs-watcher.h b/gui/fs-watcher.h
index 6ba6671..109e8da 100644
--- a/gui/fs-watcher.h
+++ b/gui/fs-watcher.h
@@ -26,7 +26,7 @@
 #include <QFileSystemWatcher>
 #include <boost/filesystem.hpp>
 
-#include "executor.h"
+#include "scheduler.h"
 
 class FsWatcher : public QObject
 {
@@ -57,9 +57,6 @@
 
 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);
@@ -76,7 +73,7 @@
 
 private:
   QFileSystemWatcher* m_watcher; // filesystem watcher
-  Executor m_executor;
+  SchedulerPtr m_scheduler;
 
   QString m_dirPath; // monitored path
 
diff --git a/src/dispatcher.cc b/src/dispatcher.cc
index ea634b6..5b4388e 100644
--- a/src/dispatcher.cc
+++ b/src/dispatcher.cc
@@ -157,12 +157,19 @@
   HashPtr hash;
   tie (hash, seg_num) = m_objectManager.localFileToObjects (absolutePath, m_localUserName);
 
-  m_actionLog->AddLocalActionUpdate (relativeFilePath.generic_string(),
-                                     *hash,
-                                     last_write_time (absolutePath), status (absolutePath).permissions (), seg_num);
+  try
+    {
+      m_actionLog->AddLocalActionUpdate (relativeFilePath.generic_string(),
+                                         *hash,
+                                         last_write_time (absolutePath), status (absolutePath).permissions (), seg_num);
 
-  // notify SyncCore to propagate the change
-  m_core->localStateChanged();
+      // notify SyncCore to propagate the change
+      m_core->localStateChanged();
+    }
+  catch (filesystem::filesystem_error &error)
+    {
+      _LOG_ERROR ("File operations failed on [" << relativeFilePath << "] (ignoring)");
+    }
 }
 
 void
@@ -178,7 +185,7 @@
   if (filesystem::exists(absolutePath))
     {
       //BOOST_THROW_EXCEPTION (Error::Dispatcher() << error_info_str("Delete notification but file exists: " + absolutePath.string() ));
-      _LOG_DEBUG("DELETE command, but file still exists: " << absolutePath.string());
+      _LOG_ERROR("DELETE command, but file still exists: " << absolutePath.string());
       return;
     }
 
diff --git a/src/fetch-manager.cc b/src/fetch-manager.cc
index 4c0ba02..a883118 100644
--- a/src/fetch-manager.cc
+++ b/src/fetch-manager.cc
@@ -49,7 +49,7 @@
   m_scheduler->start ();
 
   m_scheduleFetchesTask = Scheduler::schedulePeriodicTask (m_scheduler,
-                                                           make_shared<SimpleIntervalGenerator> (1),
+                                                           make_shared<SimpleIntervalGenerator> (300), // no need to check to often. if needed, will be rescheduled
                                                            bind (&FetchManager::ScheduleFetches, this), SCHEDULE_FETCHES_TAG);
 }
 
@@ -107,6 +107,7 @@
   unique_lock<mutex> lock (m_parellelFetchMutex);
 
   boost::posix_time::ptime currentTime = date_time::second_clock<boost::posix_time::ptime>::universal_time ();
+  boost::posix_time::ptime nextSheduleCheck = currentTime + posix_time::seconds (300); // no reason to have anything, but just in case
 
   for (FetchList::iterator item = m_fetchList.begin ();
        m_currentParallelFetches < m_maxParallelFetches && item != m_fetchList.end ();
@@ -120,6 +121,9 @@
 
       if (currentTime < item->GetNextScheduledRetry ())
         {
+          if (item->GetNextScheduledRetry () < nextSheduleCheck)
+            nextSheduleCheck = item->GetNextScheduledRetry ();
+
           _LOG_DEBUG ("Item is delayed");
           continue;
         }
@@ -129,6 +133,8 @@
       m_currentParallelFetches ++;
       item->RestartPipeline ();
     }
+
+  m_scheduler->rescheduleTaskAt (m_scheduleFetchesTask, (nextSheduleCheck - currentTime).seconds ());
 }
 
 void
@@ -168,6 +174,8 @@
 
   fetcher.SetRetryPause (delay);
   fetcher.SetNextScheduledRetry (date_time::second_clock<boost::posix_time::ptime>::universal_time () + posix_time::seconds (delay));
+
+  m_scheduler->rescheduleTaskAt (m_scheduleFetchesTask, 0);
 }
 
 void
@@ -179,4 +187,5 @@
     m_fetchList.erase_and_dispose (FetchList::s_iterator_to (fetcher), fetcher_disposer ());
   }
 
+  m_scheduler->rescheduleTaskAt (m_scheduleFetchesTask, 0);
 }
