Index: src/Backends/Banshee.Unix/Banshee.IO.Unix/Directory.cs
===================================================================
--- src/Backends/Banshee.Unix/Banshee.IO.Unix/Directory.cs	(revision 4812)
+++ src/Backends/Banshee.Unix/Banshee.IO.Unix/Directory.cs	(working copy)
@@ -90,7 +90,14 @@
         {
             UnixDirectoryInfo unix_dir = new UnixDirectoryInfo (directory);
             foreach (UnixFileSystemInfo entry in unix_dir.GetFileSystemEntries ()) {
-                if (!entry.IsDirectory && entry.IsRegularFile && !entry.IsSocket && entry.Exists) {
+                if (entry.IsSymbolicLink)
+				{
+					UnixFileSystemInfo contents = TraverseSymlink(entry);
+					if (!contents.IsDirectory && contents.IsRegularFile && contents.Exists && !contents.IsSocket) {
+						yield return entry.FullName;
+					}
+				}
+				if (!entry.IsDirectory && entry.IsRegularFile && !entry.IsSocket && entry.Exists) {
                     yield return entry.FullName;
                 }
             }
@@ -100,11 +107,38 @@
         {
             UnixDirectoryInfo unix_dir = new UnixDirectoryInfo (directory);
             foreach (UnixFileSystemInfo entry in unix_dir.GetFileSystemEntries ()) {
-                if (entry.IsDirectory && entry.Exists && !entry.IsSocket) {
+				if (entry.IsSymbolicLink)
+				{
+					UnixFileSystemInfo contents = TraverseSymlink(entry);
+					if (contents.IsDirectory && contents.Exists && !contents.IsSocket) {
+						yield return entry.FullName;
+					}
+				}
+				else if (entry.IsDirectory && entry.Exists && !entry.IsSocket) {
                     yield return entry.FullName;
                 }
             }
         }
+		
+		
+		/*
+		 * Traverses through muliple levels of symbolic links until an
+		 * actual file or directory is found.
+		 */
+		private UnixFileSystemInfo TraverseSymlink(UnixFileSystemInfo link)
+		{
+			// info for the current file
+			UnixSymbolicLinkInfo entry = new UnixSymbolicLinkInfo(link.FullName);
+			
+			// if we've found a real file or directory, return it
+			if (entry.GetContents().IsDirectory || entry.GetContents().IsRegularFile)
+			{
+				return entry.GetContents();
+			}
+			// traverse into the next level of link
+			return TraverseSymlink(entry.GetContents());
+		}
+		
         
         public void Move (SafeUri from, SafeUri to)
         {
