diff --git a/src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs b/src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs
index fde8ee8..ea18691 100644
--- a/src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs
+++ b/src/Core/Banshee.ThickClient/Banshee.Gui/TrackActions.cs
@@ -53,8 +53,8 @@ namespace Banshee.Gui
 
         private static readonly string [] require_selection_actions = new string [] {
             "TrackContextMenuAction", "TrackPropertiesAction", "AddToPlaylistAction",
-            "RemoveTracksAction", "RemoveTracksFromLibraryAction", "DeleteTracksFromDriveAction",
-            "RateTracksAction", "SelectNoneAction"
+            "RemoveTracksAction", "RemoveTracksFromLibraryAction", "OpenContainingFolderAction",
+            "DeleteTracksFromDriveAction", "RateTracksAction", "SelectNoneAction"
         };
 
         public event EventHandler SelectionChanged;
@@ -99,6 +99,10 @@ namespace Banshee.Gui
                     Catalog.GetString ("Remove From _Library"), "",
                     Catalog.GetString ("Remove selected track(s) from library"), OnRemoveTracksFromLibrary),
 
+                new ActionEntry ("OpenContainingFolderAction", null,
+                    Catalog.GetString ("_Open containing folder(s)"), null,
+                    Catalog.GetString ("Open the folder(s) that contain the selected item(s)"), OnOpenContainingFolder),
+
                 new ActionEntry ("DeleteTracksFromDriveAction", null,
                     Catalog.GetString ("_Delete From Drive"), null,
                     Catalog.GetString ("Permanently delete selected item(s) from medium"), OnDeleteTracksFromDrive),
@@ -228,7 +232,10 @@ namespace Banshee.Gui
                     );
 
                     UpdateAction ("RemoveTracksAction", is_track_source && track_source.CanRemoveTracks, has_selection, source);
-                    UpdateAction ("DeleteTracksFromDriveAction", is_track_source && track_source.CanDeleteTracks, has_selection, source);
+                    UpdateActions (is_track_source && track_source.CanDeleteTracks, has_selection, source,
+                                   "DeleteTracksFromDriveAction",
+                                   //if it can delete tracks, most likely it can open their folder
+                                   "OpenContainingFolderAction");
                     UpdateAction ("RemoveTracksFromLibraryAction", source.Parent is LibrarySource, has_selection, null);
 
                     UpdateAction ("TrackPropertiesAction", source.HasViewableTrackProperties, has_selection, source);
@@ -403,6 +410,51 @@ namespace Banshee.Gui
             }
         }
 
+        private void OnOpenContainingFolder (object o, EventArgs args)
+        {
+            var source = ActiveSource as ITrackModelSource;
+
+            //Assert.IsNotNull (source)
+            //Assert.IsNotNull (source.TrackModel)
+            //Assert.IsNotNull (source.TrackModel.SelectedItems)
+            //Assert.IsTrue (source.TrackModel.SelectedItems.Count > 0)
+            ThreadAssist.SpawnFromMain (delegate {
+                var already_opened = new List<string> ();
+                var non_existant = new List<string> ();
+                foreach (var track in source.TrackModel.SelectedItems) {
+
+                    var path = System.IO.Path.GetDirectoryName (track.Uri.AbsolutePath);
+
+                    if (!already_opened.Contains (path)) {
+                        already_opened.Add (path);
+                        if (Banshee.IO.Directory.Exists (path)) {
+                            System.Diagnostics.Process.Start (path);
+                        } else {
+                            non_existant.Add (path);
+                        }
+                    }
+                }
+                if (non_existant.Count == already_opened.Count) {
+                    var md = new HigMessageDialog (
+                        ServiceManager.Get<GtkElementsService> ("GtkElementsService").PrimaryWindow,
+                        DialogFlags.DestroyWithParent, MessageType.Warning,
+                        ButtonsType.None, Catalog.GetString ("One or more folders could not be found."), 
+                        Catalog.GetString ("Please check that their original location(s) are still accessible by the system.")
+                    );
+                    md.AddButton ("gtk-ok", ResponseType.Ok, true);
+
+                    ThreadAssist.ProxyToMain (delegate {
+                        try {
+                            md.Run ();
+                        } finally {
+                            md.Destroy ();
+                        }
+                    });
+
+                }
+            });
+        }
+
         private void OnDeleteTracksFromDrive (object o, EventArgs args)
         {
             ITrackModelSource source = ActiveSource as ITrackModelSource;
diff --git a/src/Core/Banshee.ThickClient/Resources/core-ui-actions-layout.xml b/src/Core/Banshee.ThickClient/Resources/core-ui-actions-layout.xml
index de1e3bf..9ea9a17 100644
--- a/src/Core/Banshee.ThickClient/Resources/core-ui-actions-layout.xml
+++ b/src/Core/Banshee.ThickClient/Resources/core-ui-actions-layout.xml
@@ -44,6 +44,7 @@
       <separator/>
       <menuitem name="RemoveTracks" action="RemoveTracksAction"/>
       <menuitem name="RemoveTracksFromLibrary" action="RemoveTracksFromLibraryAction"/>
+      <menuitem name="OpenContainingFolder" action="OpenContainingFolderAction"/>
       <menuitem name="DeleteTracksFromDrive" action="DeleteTracksFromDriveAction"/>
       <separator/>
       <menuitem name="RenameSource" action="RenameSourceAction"/>
@@ -152,6 +153,7 @@
     <separator/>
     <menuitem name="RemoveTracks" action="RemoveTracksAction"/>
     <menuitem name="RemoveTracksFromLibrary" action="RemoveTracksFromLibraryAction"/>
+    <menuitem name="OpenContainingFolder" action="OpenContainingFolderAction"/>
     <menuitem name="DeleteTracksFromDrive" action="DeleteTracksFromDriveAction"/>
     <separator/>
     <menu name="SearchMenu" action="SearchMenuAction">
