diff --git a/build/build.environment.mk b/build/build.environment.mk
index 6bce1c1..25a4abb 100644
--- a/build/build.environment.mk
+++ b/build/build.environment.mk
@@ -124,6 +124,7 @@ REF_EXTENSION_COVERART = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_DAAP = $(LINK_BANSHEE_THICKCLIENT_DEPS) $(LINK_ICSHARP_ZIP_LIB) $(LINK_MONO_ZEROCONF)
 REF_EXTENSION_FILESYSTEMQUEUE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_INTERNETRADIO = $(LINK_BANSHEE_THICKCLIENT_DEPS)
+REF_EXTENSION_LIBRARYWATCHER = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_MINIMODE = $(LINK_BANSHEE_THICKCLIENT_DEPS)
 REF_EXTENSION_MULTIMEDIAKEYS = $(LINK_BANSHEE_SERVICES_DEPS)
 REF_EXTENSION_NOTIFICATIONAREA = $(LINK_BANSHEE_THICKCLIENT_DEPS)
diff --git a/configure.ac b/configure.ac
index 97cea24..a2e65b5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -272,6 +272,7 @@ src/Extensions/Banshee.Daap/Makefile
 src/Extensions/Banshee.FileSystemQueue/Makefile
 src/Extensions/Banshee.InternetRadio/Makefile
 src/Extensions/Banshee.Lastfm/Makefile
+src/Extensions/Banshee.LibraryWatcher/Makefile
 src/Extensions/Banshee.MediaWeb/Makefile
 src/Extensions/Banshee.MiniMode/Makefile
 src/Extensions/Banshee.MultimediaKeys/Makefile
diff --git a/src/Extensions/Banshee.LibraryWatcher/Banshee.LibraryWatcher.addin.xml b/src/Extensions/Banshee.LibraryWatcher/Banshee.LibraryWatcher.addin.xml
new file mode 100644
index 0000000..02bff10
--- /dev/null
+++ b/src/Extensions/Banshee.LibraryWatcher/Banshee.LibraryWatcher.addin.xml
@@ -0,0 +1,22 @@
+<Addin
+    id="Banshee.LibraryWatcher"
+    version="1.0"
+    compatVersion="1.0"
+    copyright="© 2009 Christian Martellini, Alexander Hixon. Licensed under the MIT X11 license."
+    name="Library Watcher"
+    category="Hardware"
+    description="Automatically update music and video libraries"
+    author="Christian Martellini, Alexander Hixon"
+    url="http://banshee-project.org/"
+    defaultEnabled="true">
+
+  <Dependencies>
+    <Addin id="Banshee.Services" version="1.0"/>
+    <Addin id="Banshee.ThickClient" version="1.0"/>
+  </Dependencies>
+
+  <Extension path="/Banshee/ServiceManager/Service">
+    <Service class="Banshee.LibraryWatcher.LibraryWatcherService"/>
+  </Extension>
+
+</Addin>
diff --git a/src/Extensions/Banshee.LibraryWatcher/Banshee.LibraryWatcher.csproj b/src/Extensions/Banshee.LibraryWatcher/Banshee.LibraryWatcher.csproj
new file mode 100644
index 0000000..4a2895f
--- /dev/null
+++ b/src/Extensions/Banshee.LibraryWatcher/Banshee.LibraryWatcher.csproj
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <PropertyGroup>
+    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
+    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
+    <ProductVersion>8.0.50727</ProductVersion>
+    <ProjectGuid>{F38B53BA-8F85-4DC6-9B94-029C1CF96F24}</ProjectGuid>
+    <OutputType>Library</OutputType>
+    <UseParentDirectoryAsNamespace>true</UseParentDirectoryAsNamespace>
+    <AssemblyName>Banshee.LibraryWatcher</AssemblyName>
+    <SchemaVersion>2.0</SchemaVersion>
+  </PropertyGroup>
+  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
+    <DebugSymbols>true</DebugSymbols>
+    <DebugType>full</DebugType>
+    <Optimize>true</Optimize>
+    <OutputPath>..\..\..\bin</OutputPath>
+    <ErrorReport>prompt</ErrorReport>
+    <WarningLevel>4</WarningLevel>
+    <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
+    <CustomCommands>
+      <CustomCommands>
+        <Command type="Build" command="make" workingdir="${SolutionDir}" />
+        <Command type="Execute" command="make run" workingdir="${SolutionDir}" />
+      </CustomCommands>
+    </CustomCommands>
+    <AssemblyKeyFile>.</AssemblyKeyFile>
+  </PropertyGroup>
+  <ItemGroup>
+    <ProjectReference Include="..\..\Core\Banshee.Core\Banshee.Core.csproj">
+      <Project>{2ADB831A-A050-47D0-B6B9-9C19D60233BB}</Project>
+      <Name>Banshee.Core</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\Core\Banshee.Services\Banshee.Services.csproj">
+      <Project>{B28354F0-BA87-44E8-989F-B864A3C7C09F}</Project>
+      <Name>Banshee.Services</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\Libraries\Hyena\Hyena.csproj">
+      <Project>{95374549-9553-4C1E-9D89-667755F90E12}</Project>
+      <Name>Hyena</Name>
+    </ProjectReference>
+    <ProjectReference Include="..\..\Core\Banshee.ThickClient\Banshee.ThickClient.csproj">
+      <Project>{AC839523-7BDF-4AB6-8115-E17921B96EC6}</Project>
+      <Name>Banshee.ThickClient</Name>
+    </ProjectReference>
+  </ItemGroup>
+  <ItemGroup>
+    <Reference Include="System" />
+    <Reference Include="Mono.Addins, Version=0.4.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756" />
+    <Reference Include="gtk-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
+  </ItemGroup>
+  <ItemGroup>
+    <EmbeddedResource Include="Banshee.LibraryWacher.addin.xml" />
+    <EmbeddedResource Include="Resources\ActiveSourceUI.xml">
+      <LogicalName>ActiveSourceUI.xml</LogicalName>
+    </EmbeddedResource>
+    <EmbeddedResource Include="Resources\GlobalUI.xml">
+      <LogicalName>GlobalUI.xml</LogicalName>
+    </EmbeddedResource>
+  </ItemGroup>
+  <ItemGroup>
+    <Compile Include="Banshee.LibraryWatcher\LibraryWatcherService.cs" />
+    <Compile Include="Banshee.LibraryWatcher\SourceWatcher.cs" />
+  </ItemGroup>
+  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+  <ProjectExtensions>
+    <MonoDevelop>
+      <Properties>
+        <MonoDevelop.Autotools.MakefileInfo IntegrationEnabled="true" RelativeMakefileName="./Makefile.am">
+          <BuildFilesVar Sync="true" Name="SOURCES" />
+          <DeployFilesVar />
+          <ResourcesVar Sync="true" Name="RESOURCES" />
+          <OthersVar />
+          <GacRefVar />
+          <AsmRefVar />
+          <ProjectRefVar />
+        </MonoDevelop.Autotools.MakefileInfo>
+      </Properties>
+    </MonoDevelop>
+  </ProjectExtensions>
+</Project>
diff --git a/src/Extensions/Banshee.LibraryWatcher/Banshee.LibraryWatcher/LibraryWatcherService.cs b/src/Extensions/Banshee.LibraryWatcher/Banshee.LibraryWatcher/LibraryWatcherService.cs
new file mode 100644
index 0000000..07f79d1
--- /dev/null
+++ b/src/Extensions/Banshee.LibraryWatcher/Banshee.LibraryWatcher/LibraryWatcherService.cs
@@ -0,0 +1,68 @@
+//  
+// LibraryWatcherService.cs
+//
+// Authors:
+//   Alexander Hixon <hixon.alexander@mediati.org>
+//   Christian Martellini <christian.martellini@gmail.com>
+//
+// Copyright (C) 2009 Christian Martellini
+// Copyright (C) 2008 Alexander Hixon
+// 
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+// 
+
+using System;
+
+using Banshee.Base ;
+using Banshee.Sources;
+using Banshee.ServiceStack;
+using Banshee.Library;
+
+namespace Banshee.LibraryWatcher
+{	
+    public class LibraryWatcherService : IExtensionService, IDisposable, IDelayedInitializeService
+    {
+        private SourceWatcher watcher;
+        
+        string IService.ServiceName {
+            get { return "LibraryWatcherService"; }
+        }
+        
+        void IExtensionService.Initialize ()
+        {
+        }
+        
+        public void DelayedInitialize ()
+        {
+            watcher = new SourceWatcher ();
+            watcher.MusicLibrary = ServiceManager.SourceManager.MusicLibrary;
+            watcher.VideoLibrary = ServiceManager.SourceManager.VideoLibrary;
+            watcher.StartWatch ();
+        }
+        
+        public void Dispose ()
+        {
+            if (watcher != null) {
+                watcher.StopWatch ();
+                watcher = null;
+            }
+        }
+    }
+}
diff --git a/src/Extensions/Banshee.LibraryWatcher/Banshee.LibraryWatcher/SourceWatcher.cs b/src/Extensions/Banshee.LibraryWatcher/Banshee.LibraryWatcher/SourceWatcher.cs
new file mode 100644
index 0000000..87749f5
--- /dev/null
+++ b/src/Extensions/Banshee.LibraryWatcher/Banshee.LibraryWatcher/SourceWatcher.cs
@@ -0,0 +1,247 @@
+//
+// SourceWatcher.cs
+//
+// Author:
+//   Christian Martellini <christian.martellini@gmail.com>
+//
+// Copyright (C) 2009 Christian Martellini
+// 
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.IO;
+using System.Data;
+using System.Threading;
+using System.Collections.Generic;
+
+using Banshee.Base;
+using Banshee.Library;
+using Banshee.Sources;
+using Banshee.ServiceStack;
+using Banshee.Collection.Database;
+
+using Hyena;
+using Hyena.Data.Sqlite;
+
+namespace Banshee.LibraryWatcher
+{	
+    public class SourceWatcher
+    {
+        private LibraryImportManager import_manager;
+        
+        private bool force_update;
+        private string dir_to_watch;
+        
+        /*sources to refresh when something change*/
+        public MusicLibrarySource music_library;
+        public VideoLibrarySource video_library;
+        
+        private FileSystemWatcher watcher = new FileSystemWatcher ();
+        		
+        private List<string> tracks_to_remove = new List<string> ();
+        private List<string> tracks_to_add = new List<string> ();
+        
+        private Thread watch_thread;
+        
+        private bool stop_thread = false;
+        
+        public SourceWatcher ()
+        {
+            import_manager = ServiceManager.Get<LibraryImportManager> ();
+            import_manager.KeepUserJobHidden = true;
+        }
+        
+        public MusicLibrarySource MusicLibrary {
+            get { return music_library; }
+            set {
+                dir_to_watch = value.BaseDirectory;
+                music_library = value;
+            }
+        }
+        
+        public VideoLibrarySource VideoLibrary {
+            get { return video_library; }
+            set { video_library = value; }
+        }
+        
+#region Public Methods
+
+        public void StartWatch ()
+        {	
+            watcher.Path = dir_to_watch; 
+            watcher.Created += OnFileSystemEvent;
+            watcher.Deleted += OnFileSystemEvent;
+            watcher.Renamed += OnRenamed;
+            
+            watcher.IncludeSubdirectories = true;
+            watcher.EnableRaisingEvents = true;
+            
+            stop_thread = false;
+            watch_thread = new Thread (new ThreadStart (Watcher));
+            watch_thread.Start ();
+            
+            Log.DebugFormat ("Watching dir {0}", dir_to_watch);
+        }
+        
+        public void StopWatch ()
+        {
+            watcher.Created -= OnFileSystemEvent;
+            watcher.Deleted -= OnFileSystemEvent;
+            watcher.Renamed -= OnRenamed;
+            watcher.EnableRaisingEvents = false;
+            stop_thread = true;
+        }
+
+#endregion
+        
+#region Private Methods
+
+        private void OnRenamed (object source, RenamedEventArgs e)
+        {
+            force_update = true;
+        }
+        
+        private void OnFileSystemEvent (object source, FileSystemEventArgs e)
+        {
+            if (e.ChangeType == WatcherChangeTypes.Created) {
+                lock (tracks_to_add) {
+                    tracks_to_add.Add (e.FullPath);
+                }
+            } else if (e.ChangeType == WatcherChangeTypes.Deleted) {
+                lock (tracks_to_remove) {
+                    tracks_to_remove.Add (e.FullPath);
+                }
+            }
+        }
+        
+        private void Watcher ()
+        {
+            /*update the library at startup*/
+            force_update = true;
+            
+            /*the main thread*/
+            while (!stop_thread) {
+                bool need_reload = false;
+                if (force_update) {
+                    SearchForDeletedSongs ();
+                    SearchForNewSongs ();
+                    force_update = false;
+                }
+                	
+                if (tracks_to_remove.Count > 0) {
+                    lock (tracks_to_remove) {
+                        RemoveFromLibrary (tracks_to_remove);
+                    }
+                    need_reload = true;
+                }
+                
+                if (tracks_to_add.Count > 0) {
+                    lock (tracks_to_add) {
+                        AddToLibrary (tracks_to_add);
+                    }
+                    need_reload = true;
+                }
+                
+                if (need_reload) {
+                    this.MusicLibrary.Reload ();
+                    this.VideoLibrary.Reload ();
+                    this.MusicLibrary.NotifyTracksChanged ();
+                    this.VideoLibrary.NotifyTracksChanged ();
+                }
+                Thread.Sleep (400);
+            }
+        }
+        
+        private void AddToLibrary (List<string> tracks)
+        {
+            foreach (String track in tracks) {
+                import_manager.ImportTrack (track);
+            }
+            tracks.Clear ();
+        }
+        
+        private void RemoveFromLibrary (List<string> tracks) {
+            foreach (String track in tracks) {
+                RemoveTrack (track);
+            }
+            tracks.Clear ();
+        }
+        
+        private void RemoveTrack (string track)
+        {
+            int track_id = DatabaseTrackInfo.GetTrackIdForUri (new SafeUri (track).AbsoluteUri);
+            HyenaSqliteCommand delete_command;
+            if (track_id > 0) {
+                delete_command = new HyenaSqliteCommand (string.Format ("BEGIN;DELETE FROM CoreTracks WHERE TrackID = '{0}';COMMIT ",track_id));
+            } else {
+                /*if track_id is 0 you removed a directory*/
+                delete_command = new HyenaSqliteCommand (string.Format ("BEGIN;DELETE FROM CoreTracks WHERE TrackID IN (SELECT TrackID FROM CoreTracks where lower(Uri) LIKE '{0}%');COMMIT",new SafeUri(track).AbsoluteUri + "/"));
+            }
+            ServiceManager.DbConnection.Execute (@delete_command);
+        }
+        
+        private void SearchForDeletedSongs ()
+        {	
+            SafeUri uri;
+            HyenaSqliteCommand select_command = new HyenaSqliteCommand ("SELECT Uri from CoreTracks");
+            IDataReader reader = ServiceManager.DbConnection.Query (select_command);
+            while (reader.Read ()) {				
+                string uri_str = (string)reader["Uri"];
+                if (uri_str.StartsWith ("file:///") || uri_str.Contains (dir_to_watch)) {
+                    uri = new SafeUri (uri_str);
+            } else {
+                    uri = new SafeUri (dir_to_watch + "/" + uri_str); 
+                }
+                if (!Banshee.IO.File.Exists (uri)) {
+                    tracks_to_remove.Add (uri.AbsolutePath);
+                }
+            }
+        }
+        
+        private void SearchForNewSongs ()
+        {
+            string[] filenames = System.IO.Directory.GetFiles (dir_to_watch,"*", SearchOption.AllDirectories);
+            foreach (string filename in filenames) {
+                if (IsValidPath (filename)) {
+                    tracks_to_add.Add (filename);	
+                }
+            }
+        }
+        
+        private bool IsValidPath (string track_path)
+        {
+            if (System.IO.Directory.Exists (track_path)) {
+                return false;
+            }
+            if (!DatabaseImportManager.IsWhiteListedFile (track_path)) {
+                return false;
+            }
+            int[] source_ids =  new int [] { this.MusicLibrary.DbId, this.VideoLibrary.DbId };
+            if (DatabaseTrackInfo.ContainsUri (new SafeUri(track_path),source_ids)) {
+                return false;
+            }
+            return true;
+        }
+
+#endregion
+
+    }
+}
diff --git a/src/Extensions/Banshee.LibraryWatcher/Makefile.am b/src/Extensions/Banshee.LibraryWatcher/Makefile.am
new file mode 100644
index 0000000..a8a0084
--- /dev/null
+++ b/src/Extensions/Banshee.LibraryWatcher/Makefile.am
@@ -0,0 +1,15 @@
+ASSEMBLY = Banshee.LibraryWatcher
+TARGET = library
+LINK = $(REF_EXTENSION_LIBRARYWATCHER)
+INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR)
+
+SOURCES =  \
+	Banshee.LibraryWatcher/LibraryWatcherService.cs \
+	Banshee.LibraryWatcher/SourceWatcher.cs
+	
+
+RESOURCES =  \
+	Banshee.LibraryWatcher.addin.xml
+
+include $(top_srcdir)/build/build.mk
+
diff --git a/src/Extensions/Makefile.am b/src/Extensions/Makefile.am
index 2bde3de..20622da 100644
--- a/src/Extensions/Makefile.am
+++ b/src/Extensions/Makefile.am
@@ -8,6 +8,7 @@ SUBDIRS = \
 	Banshee.FileSystemQueue \
 	Banshee.InternetRadio \
 	Banshee.Lastfm \
+	Banshee.LibraryWatcher \
 	Banshee.MediaWeb \
 	Banshee.MiniMode \
 	Banshee.MultimediaKeys \
@@ -22,4 +23,5 @@ SUBDIRS = \
 	Banshee.RemoteAudio \
 	Banshee.Wikipedia
 
+
 MAINTAINERCLEANFILES = Makefile.in
