diff --git a/Banshee.sln b/Banshee.sln
index ff76e1d..d3f9bef 100644
--- a/Banshee.sln
+++ b/Banshee.sln
@@ -144,6 +144,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Banshee.SoundMenu", "src\Ex
 EndProject
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Banshee.UbuntuOneMusicStore", "src\Extensions\Banshee.UbuntuOneMusicStore\Banshee.UbuntuOneMusicStore.csproj", "{3B855EBC-8E55-48DF-816B-B241BE45EBD8}"
 EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Banshee.Video", "src\Extensions\Banshee.Video\Banshee.Video.csproj", "{DD7AF1FC-80DE-4382-8FC8-38BD6D66A2B8}"
+EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Libraries", "Libraries", "{4F47D6F1-4047-4A89-AE85-3AE5EF9F2961}"
 	ProjectSection(SolutionItems) = postProject
 	EndProjectSection
@@ -429,6 +431,16 @@ Global
 		{CE2AB4B9-F618-4CCA-8805-E1603741147E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{CE2AB4B9-F618-4CCA-8805-E1603741147E}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{CE2AB4B9-F618-4CCA-8805-E1603741147E}.Windows|Any CPU.ActiveCfg = Windows|Any CPU
+		{DD7AF1FC-80DE-4382-8FC8-38BD6D66A2B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{DD7AF1FC-80DE-4382-8FC8-38BD6D66A2B8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{DD7AF1FC-80DE-4382-8FC8-38BD6D66A2B8}.Debug|x86.ActiveCfg = Debug|Any CPU
+		{DD7AF1FC-80DE-4382-8FC8-38BD6D66A2B8}.Debug|x86.Build.0 = Debug|Any CPU
+		{DD7AF1FC-80DE-4382-8FC8-38BD6D66A2B8}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{DD7AF1FC-80DE-4382-8FC8-38BD6D66A2B8}.Release|Any CPU.Build.0 = Release|Any CPU
+		{DD7AF1FC-80DE-4382-8FC8-38BD6D66A2B8}.Release|x86.ActiveCfg = Release|Any CPU
+		{DD7AF1FC-80DE-4382-8FC8-38BD6D66A2B8}.Release|x86.Build.0 = Release|Any CPU
+		{DD7AF1FC-80DE-4382-8FC8-38BD6D66A2B8}.Windows|Any CPU.ActiveCfg = Debug|Any CPU
+		{DD7AF1FC-80DE-4382-8FC8-38BD6D66A2B8}.Windows|Any CPU.Build.0 = Debug|Any CPU
 		{DEADBEEF-CAFE-BABE-FACE-000C0FFEE000}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{DEADBEEF-CAFE-BABE-FACE-000C0FFEE000}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{DEADBEEF-CAFE-BABE-FACE-000C0FFEE000}.Debug|x86.ActiveCfg = Debug|Any CPU
@@ -541,6 +553,7 @@ Global
 		{AF8A9C6D-2188-413D-8EB8-C5E242BD68AC} = {4DD1DE63-F20B-4FC3-8FDA-F0BDF4183722}
 		{EE91126B-5500-4719-9FAA-36CBAC95DEE3} = {4DD1DE63-F20B-4FC3-8FDA-F0BDF4183722}
 		{3B855EBC-8E55-48DF-816B-B241BE45EBD8} = {4DD1DE63-F20B-4FC3-8FDA-F0BDF4183722}
+		{DD7AF1FC-80DE-4382-8FC8-38BD6D66A2B8} = {4DD1DE63-F20B-4FC3-8FDA-F0BDF4183722}
 		{95374549-9553-4C1E-9D89-667755F90E12} = {4F47D6F1-4047-4A89-AE85-3AE5EF9F2961}
 		{95374549-9553-4C1E-9D89-667755F90E13} = {4F47D6F1-4047-4A89-AE85-3AE5EF9F2961}
 		{C856EFD8-E812-4E61-8B76-E3583D94C233} = {4F47D6F1-4047-4A89-AE85-3AE5EF9F2961}
diff --git a/data/addin-xml-strings.cs b/data/addin-xml-strings.cs
index 4fde14f..64d2aaa 100644
--- a/data/addin-xml-strings.cs
+++ b/data/addin-xml-strings.cs
@@ -223,6 +223,11 @@ internal static class AddinXmlStringCatalog
         Catalog.GetString (@"This extension grants access to the Ubuntu One Music Store, powered by 7digital.");
         Catalog.GetString (@"Online Sources");
 
+        // ../src/Extensions/Banshee.Video/Banshee.Video.addin.xml
+        Catalog.GetString (@"Video library");
+        Catalog.GetString (@"Browse and manage your video library.");
+        Catalog.GetString (@"Core");
+
         // ../src/Extensions/Banshee.Wikipedia/Banshee.Wikipedia.addin.xml
         Catalog.GetString (@"Wikipedia");
         Catalog.GetString (@"View artist information from Wikipedia in the context pane.");
diff --git a/src/Clients/Beroe/Beroe/IndexerClient.cs b/src/Clients/Beroe/Beroe/IndexerClient.cs
index 538ff87..2e74e70 100644
--- a/src/Clients/Beroe/Beroe/IndexerClient.cs
+++ b/src/Clients/Beroe/Beroe/IndexerClient.cs
@@ -96,7 +96,6 @@ namespace Beroe
             ServiceManager.Get<CollectionIndexerService> ().ShutdownHandler = DBusConnection.QuitMainLoop;
 
             ServiceManager.SourceManager.AddSource (new Banshee.Library.MusicLibrarySource ());
-            ServiceManager.SourceManager.AddSource (new Banshee.Library.VideoLibrarySource ());
 
             DBusConnection.RunMainLoop ();
 
diff --git a/src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs b/src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs
index 90cddb6..f4cde53 100644
--- a/src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs
+++ b/src/Core/Banshee.Services/Banshee.Database/BansheeDbFormatMigrator.cs
@@ -43,6 +43,7 @@ using Banshee.Sources;
 using Banshee.Collection;
 using Banshee.Collection.Database;
 using Banshee.Streaming;
+using Banshee.Library;
 
 // MIGRATION NOTE: Return true if the step should allow the driver to continue
 //                 Return false if the step should terminate driver
@@ -1329,18 +1330,18 @@ namespace Banshee.Database
         {
             if (args.Service is JobScheduler) {
                 ServiceManager.ServiceStarted -= OnServiceStarted;
+
                 if (ServiceManager.SourceManager.MusicLibrary != null) {
                     RefreshMetadataDelayed ();
-                } else {
-                    ServiceManager.SourceManager.SourceAdded += OnSourceAdded;
                 }
+
+                ServiceManager.SourceManager.SourceAdded += OnSourceAdded;
             }
         }
 
         private void OnSourceAdded (SourceAddedArgs args)
         {
-            if (ServiceManager.SourceManager.MusicLibrary != null && ServiceManager.SourceManager.VideoLibrary != null) {
-                ServiceManager.SourceManager.SourceAdded -= OnSourceAdded;
+            if (args.Source is Library.LibrarySource) {
                 RefreshMetadataDelayed ();
             }
         }
diff --git a/src/Core/Banshee.Services/Banshee.Library/LibraryImportManager.cs b/src/Core/Banshee.Services/Banshee.Library/LibraryImportManager.cs
index 25ba9c6..5d67032 100644
--- a/src/Core/Banshee.Services/Banshee.Library/LibraryImportManager.cs
+++ b/src/Core/Banshee.Services/Banshee.Library/LibraryImportManager.cs
@@ -63,10 +63,11 @@ namespace Banshee.Library
         protected override int [] PrimarySourceIds {
             get {
                 if (base.PrimarySourceIds == null) {
-                    base.PrimarySourceIds = new int [] {
-                        ServiceManager.SourceManager.VideoLibrary.DbId,
-                        ServiceManager.SourceManager.MusicLibrary.DbId
-                    };
+                    List<int> ids = new List<int> ();
+                    foreach (var src in ServiceManager.SourceManager.FindSources<LibrarySource> ()) {
+                            ids.Add (src.DbId);
+                    }
+                    base.PrimarySourceIds = ids.ToArray ();
                 }
 
                 return base.PrimarySourceIds;
@@ -79,11 +80,8 @@ namespace Banshee.Library
 
         protected static PrimarySource DefaultTrackPrimarySourceChooser (DatabaseTrackInfo track)
         {
-            if ((track.MediaAttributes & TrackMediaAttributes.VideoStream) != 0) {
-                return ServiceManager.SourceManager.VideoLibrary;
-            } else {
-                return ServiceManager.SourceManager.MusicLibrary;
-            }
+            LibrarySource src = ServiceManager.SourceManager.GetBestSourceForTrack (track);
+            return src ?? ServiceManager.SourceManager.MusicLibrary;
         }
 
         string IService.ServiceName {
diff --git a/src/Core/Banshee.Services/Banshee.Library/LibrarySource.cs b/src/Core/Banshee.Services/Banshee.Library/LibrarySource.cs
index 0a85400..91b4faa 100644
--- a/src/Core/Banshee.Services/Banshee.Library/LibrarySource.cs
+++ b/src/Core/Banshee.Services/Banshee.Library/LibrarySource.cs
@@ -77,15 +77,15 @@ namespace Banshee.Library
         }
 
         private TrackMediaAttributes media_types;
-        protected TrackMediaAttributes MediaTypes {
+        public TrackMediaAttributes MediaTypes {
             get { return media_types; }
-            set { media_types = value; }
+            protected set { media_types = value; }
         }
 
         private TrackMediaAttributes not_media_types = TrackMediaAttributes.None;
-        protected TrackMediaAttributes NotMediaTypes {
+        public TrackMediaAttributes NotMediaTypes {
             get { return not_media_types; }
-            set { not_media_types = value; }
+            protected set { not_media_types = value; }
         }
 
         public override string PreferencesPageId {
diff --git a/src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs b/src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs
deleted file mode 100644
index 64e2f14..0000000
--- a/src/Core/Banshee.Services/Banshee.Library/VideoLibrarySource.cs
+++ /dev/null
@@ -1,105 +0,0 @@
-//
-// VideoLibrarySource.cs
-//
-// Author:
-//   Aaron Bockover <abockover@novell.com>
-//   Gabriel Burt <gburt@novell.com>
-//
-// Copyright (C) 2005-2008 Novell, Inc.
-//
-// 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.Collections.Generic;
-
-using Mono.Unix;
-
-using Banshee.SmartPlaylist;
-using Banshee.Collection;
-
-namespace Banshee.Library
-{
-    public class VideoLibrarySource : LibrarySource
-    {
-        // Catalog.GetString ("Video Library")
-        public VideoLibrarySource () : base (Catalog.GetString ("Videos"), "VideoLibrary", 50)
-        {
-            MediaTypes = TrackMediaAttributes.VideoStream;
-            NotMediaTypes = TrackMediaAttributes.Podcast;
-            Properties.SetStringList ("Icon.Name", "video-x-generic", "video", "source-library");
-            Properties.Set<string> ("SearchEntryDescription", Catalog.GetString ("Search your videos"));
-            Properties.SetString ("TrackView.ColumnControllerXml", String.Format (@"
-                <column-controller>
-                  <add-all-defaults />
-                  <remove-default column=""DiscColumn"" />
-                  <remove-default column=""AlbumColumn"" />
-                  <remove-default column=""ComposerColumn"" />
-                  <remove-default column=""AlbumArtistColumn"" />
-                  <remove-default column=""ConductorColumn"" />
-                  <remove-default column=""ComposerColumn"" />
-                  <remove-default column=""BpmColumn"" />
-                  <sort-column direction=""asc"">track_title</sort-column>
-                  <column modify-default=""ArtistColumn"">
-                    <title>{0}</title>
-                    <long-title>{0}</long-title>
-                  </column>
-                </column-controller>
-            ", Catalog.GetString ("Produced By")));
-        }
-
-        public override string GetPluralItemCountString (int count)
-        {
-            return Catalog.GetPluralString ("{0} video", "{0} videos", count);
-        }
-
-        public override bool ShowBrowser {
-            get { return false; }
-        }
-
-        protected override bool HasArtistAlbum {
-            get { return false; }
-        }
-
-        public override string DefaultBaseDirectory {
-            get { return Hyena.XdgBaseDirectorySpec.GetXdgDirectoryUnderHome ("XDG_VIDEOS_DIR", "Videos"); }
-        }
-
-        public override IEnumerable<SmartPlaylistDefinition> DefaultSmartPlaylists {
-            get { return default_smart_playlists; }
-        }
-
-        protected override string SectionName {
-            get { return Catalog.GetString ("Videos Folder"); }
-        }
-
-        private static SmartPlaylistDefinition [] default_smart_playlists = new SmartPlaylistDefinition [] {
-            new SmartPlaylistDefinition (
-                Catalog.GetString ("Favorites"),
-                Catalog.GetString ("Videos rated four and five stars"),
-                "rating>=4"),
-
-            new SmartPlaylistDefinition (
-                Catalog.GetString ("Unwatched"),
-                Catalog.GetString ("Videos that haven't been played yet"),
-                "plays=0"),
-        };
-    }
-}
diff --git a/src/Core/Banshee.Services/Banshee.Playlist/PlaylistFileUtil.cs b/src/Core/Banshee.Services/Banshee.Playlist/PlaylistFileUtil.cs
index 146201d..423ed7e 100644
--- a/src/Core/Banshee.Services/Banshee.Playlist/PlaylistFileUtil.cs
+++ b/src/Core/Banshee.Services/Banshee.Playlist/PlaylistFileUtil.cs
@@ -206,11 +206,7 @@ namespace Banshee.Playlist
                             SafeUri uri1 = new SafeUri (uris[0]);
                             var track = new TrackInfo ();
                             StreamTagger.TrackInfoMerge (track, uri1);
-
-                            if (track.HasAttribute (TrackMediaAttributes.VideoStream))
-                                source = ServiceManager.SourceManager.VideoLibrary;
-                            else
-                                source = ServiceManager.SourceManager.MusicLibrary;
+                            source = ServiceManager.SourceManager.GetBestSourceForTrack (track);
                         }
                     }
 
diff --git a/src/Core/Banshee.Services/Banshee.ServiceStack/Application.cs b/src/Core/Banshee.Services/Banshee.ServiceStack/Application.cs
index 5ec65c9..172f6c2 100644
--- a/src/Core/Banshee.Services/Banshee.ServiceStack/Application.cs
+++ b/src/Core/Banshee.Services/Banshee.ServiceStack/Application.cs
@@ -108,7 +108,6 @@ namespace Banshee.ServiceStack
             ServiceManager.Run ();
 
             ServiceManager.SourceManager.AddSource (new MusicLibrarySource (), true);
-            ServiceManager.SourceManager.AddSource (new VideoLibrarySource (), false);
             ServiceManager.SourceManager.LoadExtensionSources ();
 
             Banshee.Base.PlatformHacks.RestoreMonoJitSegv ();
diff --git a/src/Core/Banshee.Services/Banshee.Services.csproj b/src/Core/Banshee.Services/Banshee.Services.csproj
index 8e04884..b914496 100644
--- a/src/Core/Banshee.Services/Banshee.Services.csproj
+++ b/src/Core/Banshee.Services/Banshee.Services.csproj
@@ -215,7 +215,6 @@
     <Compile Include="Banshee.Sources\SourceMessage.cs" />
     <Compile Include="Banshee.Sources\MessageAction.cs" />
     <Compile Include="Banshee.Library\MusicLibrarySource.cs" />
-    <Compile Include="Banshee.Library\VideoLibrarySource.cs" />
     <Compile Include="Banshee.ServiceStack\Client.cs" />
     <Compile Include="Banshee.Collection.Database\DatabaseArtistInfo.cs" />
     <Compile Include="Banshee.Hardware\HardwareManager.cs" />
diff --git a/src/Core/Banshee.Services/Banshee.Sources/SourceManager.cs b/src/Core/Banshee.Services/Banshee.Sources/SourceManager.cs
index d50210c..07691a6 100644
--- a/src/Core/Banshee.Services/Banshee.Sources/SourceManager.cs
+++ b/src/Core/Banshee.Services/Banshee.Sources/SourceManager.cs
@@ -60,7 +60,6 @@ namespace Banshee.Sources
         private Source active_source;
         private Source default_source;
         private MusicLibrarySource music_library;
-        private VideoLibrarySource video_library;
 
         public event SourceEventHandler SourceUpdated;
         public event SourceAddedHandler SourceAdded;
@@ -102,7 +101,6 @@ namespace Banshee.Sources
                 active_source = null;
                 default_source = null;
                 music_library = null;
-                video_library = null;
 
                 // Do dispose extension sources
                 foreach (Source source in extension_sources.Values) {
@@ -167,8 +165,6 @@ namespace Banshee.Sources
 
             if (source is MusicLibrarySource) {
                 music_library = source as MusicLibrarySource;
-            } else if (source is VideoLibrarySource) {
-                video_library = source as VideoLibrarySource;
             }
 
             SourceAdded.SafeInvoke (new SourceAddedArgs () {
@@ -278,6 +274,21 @@ namespace Banshee.Sources
             });
         }
 
+        public LibrarySource GetBestSourceForTrack(Banshee.Collection.TrackInfo track)
+        {
+            foreach (Source source in sources) {
+                LibrarySource lib = source as LibrarySource;
+                if (lib == null) {
+                    continue;
+                }
+                if (track.HasAttribute (lib.MediaTypes) &&
+                    !track.HasAttribute (lib.NotMediaTypes)) {
+                    return lib;
+                }
+            }
+            return null;
+        }
+
         private void OnChildSourceAdded(SourceEventArgs args)
         {
             AddSource (args.Source);
@@ -314,10 +325,6 @@ namespace Banshee.Sources
             get { return music_library; }
         }
 
-        public VideoLibrarySource VideoLibrary {
-            get { return video_library; }
-        }
-
         public Source ActiveSource {
             get { return active_source; }
         }
diff --git a/src/Core/Banshee.Services/Makefile.am b/src/Core/Banshee.Services/Makefile.am
index 0de4ae2..bed4061 100644
--- a/src/Core/Banshee.Services/Makefile.am
+++ b/src/Core/Banshee.Services/Makefile.am
@@ -89,7 +89,6 @@ SOURCES =  \
 	Banshee.Library/MusicLibrarySource.cs \
 	Banshee.Library/Tests/FileNamePatternTests.cs \
 	Banshee.Library/ThreadPoolImportSource.cs \
-	Banshee.Library/VideoLibrarySource.cs \
 	Banshee.MediaEngine/IAudioCdRipper.cs \
 	Banshee.MediaEngine/IBpmDetector.cs \
 	Banshee.MediaEngine/IEqualizer.cs \
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/FileChooserDialog.cs b/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/FileChooserDialog.cs
index c904bf2..edbd535 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/FileChooserDialog.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui.Dialogs/FileChooserDialog.cs
@@ -27,6 +27,7 @@
 //
 
 using System;
+using System.Collections.Generic;
 using Gtk;
 
 using Banshee.Configuration;
@@ -51,13 +52,14 @@ namespace Banshee.Gui.Dialogs
             chooser.AddButton (Stock.Cancel, ResponseType.Cancel);
             // Translators: verb
             chooser.AddButton (Mono.Unix.Catalog.GetString("I_mport"), ResponseType.Ok);
+            List<string> lst = new List<string> ();
+            foreach (var library in ServiceManager.SourceManager.FindSources<Library.LibrarySource> ()) {
+                lst.Add (library.BaseDirectory);
+            }
+            lst.Add (GetPhotosFolder ());
 
-            // FIXME: this dialog should be library-specific, and so these shortcuts should be
-            // library-specific too
             Hyena.Gui.GtkUtilities.SetChooserShortcuts (chooser,
-                ServiceManager.SourceManager.MusicLibrary.BaseDirectory,
-                ServiceManager.SourceManager.VideoLibrary.BaseDirectory,
-                GetPhotosFolder ()
+                lst.ToArray ()
             );
 
             return chooser;
diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackSubtitleActions.cs b/src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackSubtitleActions.cs
index 749b8cc..f8790e0 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackSubtitleActions.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui/PlaybackSubtitleActions.cs
@@ -87,8 +87,14 @@ namespace Banshee.Gui
             chooser.AddButton (Stock.Cancel, ResponseType.Cancel);
             chooser.AddButton (Catalog.GetString ("L_oad"), ResponseType.Ok);
 
+            List<string> lst = new List<string> ();
+            foreach (var library in ServiceManager.SourceManager.FindSources<Library.LibrarySource> ()) {
+                if ((library.MediaTypes & TrackMediaAttributes.VideoStream) != 0)
+                    lst.Add (library.BaseDirectory);
+            }
+
             Hyena.Gui.GtkUtilities.SetChooserShortcuts (chooser,
-                ServiceManager.SourceManager.VideoLibrary.BaseDirectory
+                lst.ToArray ()
             );
 
             var filter = new FileFilter();
diff --git a/src/Dap/Banshee.Dap/Banshee.Dap/DapSync.cs b/src/Dap/Banshee.Dap/Banshee.Dap/DapSync.cs
index fc4e273..87051e8 100644
--- a/src/Dap/Banshee.Dap/Banshee.Dap/DapSync.cs
+++ b/src/Dap/Banshee.Dap/Banshee.Dap/DapSync.cs
@@ -48,6 +48,7 @@ using Banshee.Preferences;
 using Banshee.Gui;
 using Hyena.Widgets;
 using Gtk;
+using Banshee.Collection;
 
 namespace Banshee.Dap
 {
@@ -266,11 +267,7 @@ namespace Banshee.Dap
                     //return a.Order.CompareTo (b.Order);
                 //});
 
-            if (!dap.SupportsVideo && library == ServiceManager.SourceManager.VideoLibrary) {
-                return null;
-            }
-
-            if (!dap.SupportsPodcasts && library.UniqueId == "PodcastSource-PodcastLibrary") {
+            if (!dap.SupportsVideo && (library.MediaTypes & TrackMediaAttributes.VideoStream) != 0) {
                 return null;
             }
 
diff --git a/src/Dap/Banshee.Dap/Banshee.Dap/VideoGroupSource.cs b/src/Dap/Banshee.Dap/Banshee.Dap/VideoGroupSource.cs
index e6bd8d7..ae11419 100644
--- a/src/Dap/Banshee.Dap/Banshee.Dap/VideoGroupSource.cs
+++ b/src/Dap/Banshee.Dap/Banshee.Dap/VideoGroupSource.cs
@@ -38,8 +38,8 @@ namespace Banshee.Dap
         public VideoGroupSource (DapSource parent) : base (parent, Catalog.GetString ("Videos"))
         {
             Properties.Remove ("Icon.Name");
-            Properties.SetStringList ("Icon.Name", Banshee.ServiceStack.ServiceManager.SourceManager.VideoLibrary.Properties.GetStringList ("Icon.Name"));
-            ConditionSql = Banshee.ServiceStack.ServiceManager.SourceManager.VideoLibrary.AttributesCondition;
+            Properties.SetStringList ("Icon.Name", "video-x-generic", "video", "source-library");
+            ConditionSql = String.Format ("((CoreTracks.Attributes & {0}) == {0} AND (CoreTracks.Attributes & {1}) == 0)", (int)TrackMediaAttributes.VideoStream, (int)TrackMediaAttributes.Podcast);
             AutoHide = true;
         }
     }
diff --git a/src/Extensions/Banshee.LibraryWatcher/Banshee.LibraryWatcher/LibraryWatcherService.cs b/src/Extensions/Banshee.LibraryWatcher/Banshee.LibraryWatcher/LibraryWatcherService.cs
index 05a5d2d..26c6472 100644
--- a/src/Extensions/Banshee.LibraryWatcher/Banshee.LibraryWatcher/LibraryWatcherService.cs
+++ b/src/Extensions/Banshee.LibraryWatcher/Banshee.LibraryWatcher/LibraryWatcherService.cs
@@ -53,27 +53,12 @@ namespace Banshee.LibraryWatcher
 
         public void DelayedInitialize ()
         {
-            // FIXME: Support sources other than the music and the video library (e.g. podcasts, audiobooks, etc)
-            // The SourceWatcher uses LibraryImportManager which is specific to music/video.
-            // To support other sources we need a separate importer for each of them.
-            /*
             ServiceManager.SourceManager.SourceAdded += OnSourceAdded;
             ServiceManager.SourceManager.SourceRemoved += OnSourceRemoved;
 
             foreach (var library in ServiceManager.SourceManager.FindSources<LibrarySource> ()) {
                 AddLibrary (library);
             }
-            */
-            AddLibrary (ServiceManager.SourceManager.MusicLibrary);
-            AddLibrary (ServiceManager.SourceManager.VideoLibrary);
-
-            if (ServiceManager.SourceManager.MusicLibrary.Count == 0) {
-                new Banshee.Collection.RescanPipeline (ServiceManager.SourceManager.MusicLibrary);
-            }
-
-            if (ServiceManager.SourceManager.VideoLibrary.Count == 0) {
-                new Banshee.Collection.RescanPipeline (ServiceManager.SourceManager.VideoLibrary);
-            }
         }
 
         public void Dispose ()
@@ -86,7 +71,6 @@ namespace Banshee.LibraryWatcher
             }
         }
 
-        /*
         private void OnSourceAdded (SourceAddedArgs args)
         {
             var library = args.Source as LibrarySource;
@@ -102,7 +86,6 @@ namespace Banshee.LibraryWatcher
                 RemoveLibrary (library);
             }
         }
-        */
 
         private void AddLibrary (LibrarySource library)
         {
@@ -122,9 +105,11 @@ namespace Banshee.LibraryWatcher
                     }
                 }
             }
+            if (library.Count == 0) {
+                new Banshee.Collection.RescanPipeline (library);
+            }
         }
 
-        /*
         private void RemoveLibrary (LibrarySource library)
         {
             lock (watchers) {
@@ -134,6 +119,5 @@ namespace Banshee.LibraryWatcher
                 }
             }
         }
-        */
     }
 }
diff --git a/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs b/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs
index 13ed474..7a4b09b 100644
--- a/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs
+++ b/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/PlayQueueSource.cs
@@ -101,10 +101,10 @@ namespace Banshee.PlayQueue
             Properties.SetString ("GtkActionPath", "/PlayQueueContextMenu");
 
             // TODO listen to all primary sources, and handle transient primary sources
-            ServiceManager.SourceManager.MusicLibrary.TracksChanged += HandleTracksChanged;
-            ServiceManager.SourceManager.MusicLibrary.TracksDeleted += HandleTracksDeleted;
-            ServiceManager.SourceManager.VideoLibrary.TracksChanged += HandleTracksChanged;
-            ServiceManager.SourceManager.VideoLibrary.TracksDeleted += HandleTracksDeleted;
+            foreach (var library in ServiceManager.SourceManager.FindSources<LibrarySource> ()) {
+                library.TracksChanged += HandleTracksChanged;
+                library.TracksDeleted += HandleTracksDeleted;
+            }
 
             populate_from = ServiceManager.SourceManager.Sources.FirstOrDefault (
                 source => source.Name == populate_from_name) as DatabaseSource;
diff --git a/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/QueueableSourceComboBox.cs b/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/QueueableSourceComboBox.cs
index dccc590..7218659 100644
--- a/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/QueueableSourceComboBox.cs
+++ b/src/Extensions/Banshee.PlayQueue/Banshee.PlayQueue/QueueableSourceComboBox.cs
@@ -31,6 +31,7 @@ using Banshee.Library;
 using Banshee.ServiceStack;
 using Banshee.Sources;
 using Banshee.Sources.Gui;
+using Banshee.Collection;
 
 namespace Banshee.PlayQueue
 {
@@ -95,9 +96,11 @@ namespace Banshee.PlayQueue
 
         private bool IsQueueable (Source source)
         {
-            return source != null && (
-                source is MusicLibrarySource || source.Parent is MusicLibrarySource ||
-                source is VideoLibrarySource || source.Parent is VideoLibrarySource);
+            LibrarySource lib_source = source as LibrarySource;
+            return lib_source != null && (
+                (lib_source.MediaTypes & (TrackMediaAttributes.Music | TrackMediaAttributes.VideoStream)) != 0 ||
+                (lib_source.Parent != null && lib_source.Parent is LibrarySource &&
+                (((LibrarySource)lib_source.Parent).MediaTypes & (TrackMediaAttributes.Music | TrackMediaAttributes.VideoStream)) != 0));
         }
 
         private TreeIter FindSource (string name, TreeIter iter)
diff --git a/src/Extensions/Banshee.Video/Banshee.Video.addin.xml b/src/Extensions/Banshee.Video/Banshee.Video.addin.xml
new file mode 100644
index 0000000..9535411
--- /dev/null
+++ b/src/Extensions/Banshee.Video/Banshee.Video.addin.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Addin 
+    id="Banshee.Video"
+    version="1.0"
+    compatVersion="1.0"
+    copyright="Copyright © 2010 Olivier Dufour. Licensed under the MIT X11 license."
+    name="Video library"
+    category="Core"
+    description="Browse and manage your video library."
+    author="Olivier Dufour"
+    url="http://banshee.fm/"
+    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.Video.VideoService"/>
+  </Extension>
+
+</Addin>
+
diff --git a/src/Extensions/Banshee.Video/Banshee.Video.csproj b/src/Extensions/Banshee.Video/Banshee.Video.csproj
new file mode 100644
index 0000000..2969004
--- /dev/null
+++ b/src/Extensions/Banshee.Video/Banshee.Video.csproj
@@ -0,0 +1 @@
+<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="3.5" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProductVersion>9.0.21022</ProductVersion>
    <SchemaVersion>2.0</SchemaVersion>
    <ProjectGuid>{DD7AF1FC-80DE-4382-8FC8-38BD6D66A2B8}</ProjectGuid>
    <OutputType>Exe</OutputType>
    <RootNamespace>Banshee.Video</RootNamespace>
    <AssemblyName>Banshee.Video</AssemblyName>
    <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    <DebugSymbols>true</DebugSymbols>
    <DebugType>full</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Debug</OutputPath>
    <DefineConstants>DEBUG</DefineConstants>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <ConsolePause>false</ConsolePause>
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    <DebugType>none</DebugType>
    <Optimize>false</Optimize>
    <OutputPath>bin\Release</OutputPath>
    <ErrorReport>prompt</ErrorReport>
    <WarningLevel>4</WarningLevel>
    <ConsolePause>false</ConsolePause>
  </PropertyGroup>
  <ItemGroup>
    <Reference Include="gtk-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
    <Reference Include="atk-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
    <Reference Include="gdk-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
    <Reference Include="Mono.Cairo, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756" />
    <Reference Include="Mono.Addins, Version=0.5.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756" />
    <Reference Include="Mono.Posix" />
    <Reference Include="glib-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
  </ItemGroup>
  <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="..\..\Core\Banshee.ThickClient\Banshee.ThickClient.csproj">
      <Project>{AC839523-7BDF-4AB6-8115-E17921B96EC6}</Project>
      <Name>Banshee.ThickClient</Name>
    </ProjectReference>
    <ProjectReference Include="..\..\Hyena\Hyena\Hyena.csproj">
      <Project>{95374549-9553-4C1E-9D89-667755F90E12}</Project>
      <Name>Hyena</Name>
    </ProjectReference>
    <ProjectReference Include="..\..\Hyena\Hyena.Data.Sqlite\Hyena.Data.Sqlite.csproj">
      <Project>{95374549-9553-4C1E-9D89-667755F90E13}</Project>
      <Name>Hyena.Data.Sqlite</Name>
    </ProjectReference>
    <ProjectReference Include="..\..\Hyena\Hyena.Gui\Hyena.Gui.csproj">
      <Project>{C856EFD8-E812-4E61-8B76-E3583D94C233}</Project>
      <Name>Hyena.Gui</Name>
    </ProjectReference>
  </ItemGroup>
  <ItemGroup>
    <Folder Include="Banshee.Video\" />
  </ItemGroup>
  <ItemGroup>
    <EmbeddedResource Include="Banshee.Video.addin.xml">
      <LogicalName>Banshee.Video.addin.xml</LogicalName>
    </EmbeddedResource>
  </ItemGroup>
  <ItemGroup>
    <Compile Include="Banshee.Video\VideoService.cs" />
    <Compile Include="Banshee.Video\VideoLibrarySource.cs" />
  </ItemGroup>
  <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project>
\ No newline at end of file
diff --git a/src/Extensions/Banshee.Video/Banshee.Video/VideoLibrarySource.cs b/src/Extensions/Banshee.Video/Banshee.Video/VideoLibrarySource.cs
new file mode 100644
index 0000000..64e2f14
--- /dev/null
+++ b/src/Extensions/Banshee.Video/Banshee.Video/VideoLibrarySource.cs
@@ -0,0 +1,105 @@
+//
+// VideoLibrarySource.cs
+//
+// Author:
+//   Aaron Bockover <abockover@novell.com>
+//   Gabriel Burt <gburt@novell.com>
+//
+// Copyright (C) 2005-2008 Novell, Inc.
+//
+// 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.Collections.Generic;
+
+using Mono.Unix;
+
+using Banshee.SmartPlaylist;
+using Banshee.Collection;
+
+namespace Banshee.Library
+{
+    public class VideoLibrarySource : LibrarySource
+    {
+        // Catalog.GetString ("Video Library")
+        public VideoLibrarySource () : base (Catalog.GetString ("Videos"), "VideoLibrary", 50)
+        {
+            MediaTypes = TrackMediaAttributes.VideoStream;
+            NotMediaTypes = TrackMediaAttributes.Podcast;
+            Properties.SetStringList ("Icon.Name", "video-x-generic", "video", "source-library");
+            Properties.Set<string> ("SearchEntryDescription", Catalog.GetString ("Search your videos"));
+            Properties.SetString ("TrackView.ColumnControllerXml", String.Format (@"
+                <column-controller>
+                  <add-all-defaults />
+                  <remove-default column=""DiscColumn"" />
+                  <remove-default column=""AlbumColumn"" />
+                  <remove-default column=""ComposerColumn"" />
+                  <remove-default column=""AlbumArtistColumn"" />
+                  <remove-default column=""ConductorColumn"" />
+                  <remove-default column=""ComposerColumn"" />
+                  <remove-default column=""BpmColumn"" />
+                  <sort-column direction=""asc"">track_title</sort-column>
+                  <column modify-default=""ArtistColumn"">
+                    <title>{0}</title>
+                    <long-title>{0}</long-title>
+                  </column>
+                </column-controller>
+            ", Catalog.GetString ("Produced By")));
+        }
+
+        public override string GetPluralItemCountString (int count)
+        {
+            return Catalog.GetPluralString ("{0} video", "{0} videos", count);
+        }
+
+        public override bool ShowBrowser {
+            get { return false; }
+        }
+
+        protected override bool HasArtistAlbum {
+            get { return false; }
+        }
+
+        public override string DefaultBaseDirectory {
+            get { return Hyena.XdgBaseDirectorySpec.GetXdgDirectoryUnderHome ("XDG_VIDEOS_DIR", "Videos"); }
+        }
+
+        public override IEnumerable<SmartPlaylistDefinition> DefaultSmartPlaylists {
+            get { return default_smart_playlists; }
+        }
+
+        protected override string SectionName {
+            get { return Catalog.GetString ("Videos Folder"); }
+        }
+
+        private static SmartPlaylistDefinition [] default_smart_playlists = new SmartPlaylistDefinition [] {
+            new SmartPlaylistDefinition (
+                Catalog.GetString ("Favorites"),
+                Catalog.GetString ("Videos rated four and five stars"),
+                "rating>=4"),
+
+            new SmartPlaylistDefinition (
+                Catalog.GetString ("Unwatched"),
+                Catalog.GetString ("Videos that haven't been played yet"),
+                "plays=0"),
+        };
+    }
+}
diff --git a/src/Extensions/Banshee.Video/Banshee.Video/VideoService.cs b/src/Extensions/Banshee.Video/Banshee.Video/VideoService.cs
new file mode 100644
index 0000000..59fa6c0
--- /dev/null
+++ b/src/Extensions/Banshee.Video/Banshee.Video/VideoService.cs
@@ -0,0 +1,52 @@
+// 
+// VideoService.cs
+// 
+// Author:
+//   Olivier Dufour <olivier (dot) duff (at) gmail (dot) com>
+// 
+// Copyright 2011 
+// 
+// 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.ServiceStack;
+using Banshee.MediaEngine;
+
+namespace Banshee.Video
+{
+    public class VideoService : IExtensionService
+    {
+        public VideoService ()
+        {
+        }
+
+        private VideoLibrarySource source;
+
+        public void Initialize ()
+        {
+            source = new VideoLibrarySource ();
+            ServiceManager.SourceManager.AddSource (source);
+        }
+
+        public void Dispose ()
+        {
+            ServiceManager.SourceManager.RemoveSource (source);
+        }
+    }
+}
+
diff --git a/src/Hyena b/src/Hyena
index b0a0a9c..dd5de09 160000
--- a/src/Hyena
+++ b/src/Hyena
@@ -1 +1 @@
-Subproject commit b0a0a9c96f52f141f84e0e6bdd8100b26535b900
+Subproject commit dd5de0988e14e0da67441044dea339eb7ac3a615-dirty
