Index: Core/Util/Util.cs
===================================================================
--- Core/Util/Util.cs	(revision 27004)
+++ Core/Util/Util.cs	(working copy)
@@ -2459,7 +2459,7 @@
     private static Thread _fileSystemManagerThread = null;
     private static Thread _fileExistsCacheThread = null;
 
-    private static DateTime _lastTimeFolderWasAdded = DateTime.MinValue;
+    private static bool _watchedFolderHasChanged = false;
     
     private static ManualResetEvent _fileExistsCacheThreadEvt = new ManualResetEvent(false);
 
@@ -2564,7 +2564,7 @@
         {
           //Log.Debug("AddFoldersLookedUp {0}", dir);
           _foldersLookedUp.Add(dir);
-          _lastTimeFolderWasAdded = DateTime.Now;
+          _watchedFolderHasChanged = true;
         }
       }
     }
@@ -2599,13 +2599,17 @@
     {
       FileSystemWatcher watcher = sender as FileSystemWatcher;
 
-      if (watcher != null)
+      if (!e.FullPath.Contains("db3-journal"))
       {
-        Log.Debug("fileSystemWatcher_Created file {0}", e.FullPath);
-        FileLookUpItem fileLookUpItem = new FileLookUpItem();
-        fileLookUpItem.Exists = true;
-        fileLookUpItem.Filename = e.FullPath;
-        UpdateLookUpCacheItem(fileLookUpItem, e.FullPath);
+        if (watcher != null)
+        {
+          Log.Debug("fileSystemWatcher_Created file {0}", e.FullPath);
+          FileLookUpItem fileLookUpItem = new FileLookUpItem();
+          fileLookUpItem.Exists = true;
+          fileLookUpItem.Filename = e.FullPath;
+          UpdateLookUpCacheItem(fileLookUpItem, e.FullPath);
+          _watchedFolderHasChanged = true;
+        }
       }
     }
 
@@ -2613,10 +2617,14 @@
     {
       FileSystemWatcher watcher = sender as FileSystemWatcher;
 
-      if (watcher != null)
+      if (!e.FullPath.Contains("db3-journal"))
       {
-        Log.Debug("fileSystemWatcher_Deleted file {0}", e.FullPath);
-        DoInsertNonExistingFileIntoCache(e.FullPath);
+        if (watcher != null)
+        {
+          Log.Debug("fileSystemWatcher_Deleted file {0}", e.FullPath);
+          DoInsertNonExistingFileIntoCache(e.FullPath);
+          _watchedFolderHasChanged = true;
+        }
       }
     }
 
@@ -2649,7 +2657,7 @@
           if (path.Length > 0)
           {
             path = path.ToLower();
-            if (!HasFolderBeenScanned(path))
+            if (!HasFolderBeenScanned(path))                                                                          
             {
               lock (_fileExistsCacheLock)
               {
@@ -2736,45 +2744,48 @@
       {
         lock (_watchersLock)
         {
-          if (_lastTimeFolderWasAdded != DateTime.MinValue)
+          if (_watchedFolderHasChanged)
           {
-            DateTime now = DateTime.Now;
-            TimeSpan ts = now - _lastTimeFolderWasAdded;
+            _watchedFolderHasChanged = false;
+            Log.Debug("FileSystemWatchManagerThread : updating watchers");
 
-            //Log.Debug("_lastTimeFolderWasAdded: {0}", _lastTimeFolderWasAdded);
-            //Log.Debug("ts.TotalSeconds: {0}", ts.TotalSeconds);
-
-            if (ts.TotalSeconds > 5)
+            string[] keyCopy = _watchers.Keys.ToArray();
+            foreach (string key in keyCopy)
             {
-              Log.Debug("FileSystemWatchManagerThread : updating watchers");
-              HashSet<string> folders = GetUniqueTopLevelFolders();
-
-              foreach (string dir in folders)
+              FileSystemWatcher fsw = null;
+              if (_watchers.TryGetValue(key, out fsw))
               {
-                if (!string.IsNullOrEmpty(dir))
-                {                  
-                  UpdateWatchers(dir);
+                if (!Directory.Exists(fsw.Path))
+                {
+                  RemoveWatcher(fsw.Path);
                 }
               }
-              _lastTimeFolderWasAdded = DateTime.MinValue;
-              Log.Debug("FileLookUpCacheThread items : {0}", _fileLookUpCache.Count);                      
             }
 
-            /*string[] keyCopy = _watchers.Keys.ToArray();
-            foreach (string key in keyCopy)
+            HashSet<string> folders = GetUniqueTopLevelFolders();
+
+            foreach (string dir in folders)
             {
-              FileSystemWatcher fsw = null;
-              if (_watchers.TryGetValue(key, out fsw))
+              if (!string.IsNullOrEmpty(dir) && !_watchers.ContainsKey(dir))
               {
-                Log.Debug("FileSystemWatcher : {0}", fsw.Path);
+                AddWatcher(dir);
               }
-            }*/
+            }
+            Log.Debug("FileLookUpCacheThread items : {0}", _fileLookUpCache.Count);
           }
-        }        
+        }
         Thread.Sleep(FileLookUpCacheThreadScanningIntervalMSecs);
       }
     }
 
+    public static void publicAddWatcher(string dir)
+    {
+      if (!string.IsNullOrEmpty(dir) && !_watchers.ContainsKey(dir))
+      {
+        AddWatcher(dir);
+      }
+    }
+
     private static HashSet<string> GetUniqueTopLevelFolders()
     {
       HashSet<string> uniqueTopLevelFolders = new HashSet<string>();
@@ -2891,31 +2902,6 @@
       return isPathRoot;
     }
 
-    private static void UpdateWatchers(string dir4Watcher)
-    {           
-      int dir4WatcherLen = dir4Watcher.Length;
-
-      string[] keyCopy = _watchers.Keys.ToArray();
-      foreach (string key in keyCopy)
-      {
-        FileSystemWatcher fsw = null;
-        if (_watchers.TryGetValue(key, out fsw))
-        {
-          string path = fsw.Path;
-          int pathLen = path.Length;
-          if ((pathLen > dir4WatcherLen) && path.StartsWith(dir4Watcher))
-          {            
-            RemoveWatcher(path);
-          }
-        }
-      }
-
-      if (!_watchers.ContainsKey(dir4Watcher))
-      {
-        AddWatcher(dir4Watcher);
-      }
-    }
-
     private static void AddWatcher(string dir, int buffersize)
     {
       AddWatcher(dir);
@@ -2932,6 +2918,21 @@
 
     private static void AddWatcher(string dir)
     {
+      // determine if we are already watching a parent directory
+      string partialDir = dir;
+      string rootDir = Directory.GetDirectoryRoot(dir);
+
+      while (true)
+      {
+        if (_watchers.ContainsKey(partialDir))
+          return;
+
+        if (partialDir == rootDir)
+          break;
+
+        partialDir = Directory.GetParent(partialDir).FullName;
+      }
+
       try
       {        
         FileSystemWatcher fsw = new FileSystemWatcher(dir);
@@ -3000,6 +3001,8 @@
         }
       }
 
+      _watchedFolderHasChanged = true;
+
       lock (_foldersLookedUpLock)
       {
         Log.Debug("RemoveWatcher removing folders from cache={0}", dir);
@@ -3037,7 +3040,7 @@
       if (!String.IsNullOrEmpty(path))
       {
         string dir2Lower = path.ToLower();
-        
+
         if (!HasFolderBeenScanned(dir2Lower))
         {
           Log.Debug("InsertFilesIntoCacheAsynch: pre-scanning dir : {0}", path);
@@ -3047,10 +3050,6 @@
             DoInsertExistingFileIntoCache(file);
           }
         }
-        /*else
-        {
-          Log.Debug("InsertFilesIntoCacheAsynch: dir already pre-scanned : {0}", path);      
-        }*/
       }
     }
 
Index: Core/Util/VirtualDirectory.cs
===================================================================
--- Core/Util/VirtualDirectory.cs	(revision 27004)
+++ Core/Util/VirtualDirectory.cs	(working copy)
@@ -1406,6 +1406,11 @@
           item.Path = GetShareRemoteURL(share);
           item.IsRemote = true;
         }
+        else
+        {
+          Utils.publicAddWatcher(share.Path);
+        }
+
         Utils.SetDefaultIcons(item);
 
         if (share.Pincode < 0 && !Utils.IsNetwork(share.Path))
@@ -1553,7 +1558,6 @@
 
               aItemsList.Add(item);
               _cachedItems.Add(item);
-              
             }
             else
             {
