}         // proc OnEndReadConfiguration

        #endregion

        #region -- Handle Events ----------------------------------------------------------

        private void FileSystemWatcher_Changed(object sender, FileSystemEventArgs e)
        {
            WatcherChangeTypes type;
            var e2 = e as RenamedEventArgs;

            // write debug message
            if (IsDebug)
            {
                if (e2 != null)
                {
                    Log.Debug("FileSystemWatcher event: Type={0}, Name={1} > {2}, FullPath={3} > {4}", e.ChangeType, e2.OldName, e.Name, e2.OldFullPath, e.FullPath);
                }
                else
                {
                    Log.Debug("FileSystemWatcher event: Type={0}, Name={1}, FullPath={2}", e.ChangeType, e.Name, e.FullPath);
                }
            }

            // we priorisize the events, and ignore lower level events, if the occure
            if ((e.ChangeType & WatcherChangeTypes.Created) != 0)             // file is created
            {
                type = WatcherChangeTypes.Created;

                lock (notifyQueue)
                {
                    RemoveNotifyEvent(e.FullPath);
                    notifyQueue.Add(new FileNotifyEvent(e));
                }
            }
            else if ((e.ChangeType & WatcherChangeTypes.Deleted) != 0)             // files is deleted
            {
                type = WatcherChangeTypes.Deleted;
                lock (notifyQueue)
                    RemoveNotifyEvent(e.FullPath);
            }
            else if ((e.ChangeType & WatcherChangeTypes.Renamed) != 0)             // files is renamed
            {
                type = WatcherChangeTypes.Renamed;

                lock (notifyQueue)
                {
                    RemoveNotifyEvent(e2.OldFullPath);

                    // check if the new name requires the filter criteria
                    if (Regex.IsMatch(e.Name, Procs.FileFilterToRegex(fileSystemWatcher.Filter)))
                    {
                        notifyQueue.Add(new FileNotifyEvent(e));
                    }
                }
            }
            else if ((e.ChangeType & WatcherChangeTypes.Changed) != 0)             // attributes or lastwrite changed
            {
                type = WatcherChangeTypes.Changed;

                lock (notifyQueue)
                {
                    RemoveNotifyEvent(e.FullPath);
                    notifyQueue.Add(new FileNotifyEvent(e));
                }
            }
            else
            {
                return;
            }

            // call a lua extension
            var member = this["NotifyFileChangeCore"];

            if (Lua.RtInvokeable(member))
            {
                try
                {
                    ((dynamic)this).NotifyFileChange(type, e);
                }
                catch (Exception ex)
                {
                    Log.Except(String.Format("NotifyFileChangeCore failed for {0}.", e.Name), ex);
                }
            }
        }         // event FileSystemWatcher_Changed