diff --git a/src/Backends/Banshee.Unix/Banshee.IO.Unix/Directory.cs b/src/Backends/Banshee.Unix/Banshee.IO.Unix/Directory.cs
index 65359ce..d046649 100644
--- a/src/Backends/Banshee.Unix/Banshee.IO.Unix/Directory.cs
+++ b/src/Backends/Banshee.Unix/Banshee.IO.Unix/Directory.cs
@@ -90,8 +90,9 @@ namespace Banshee.IO.Unix
         {
             UnixDirectoryInfo unix_dir = new UnixDirectoryInfo (directory);
             foreach (UnixFileSystemInfo entry in unix_dir.GetFileSystemEntries ()) {
-                if (!entry.IsDirectory && entry.IsRegularFile && !entry.IsSocket && entry.Exists) {
-                    yield return entry.FullName;
+                UnixFileSystemInfo info = TraverseSymlink (entry);
+                if (info != null && !info.IsDirectory && info.IsRegularFile && !info.IsSocket && info.Exists) {
+                    yield return info.FullName;
                 }
             }
         }
@@ -100,12 +101,28 @@ namespace Banshee.IO.Unix
         {
             UnixDirectoryInfo unix_dir = new UnixDirectoryInfo (directory);
             foreach (UnixFileSystemInfo entry in unix_dir.GetFileSystemEntries ()) {
-                if (entry.IsDirectory && entry.Exists && !entry.IsSocket) {
-                    yield return entry.FullName;
+                UnixFileSystemInfo info = TraverseSymlink (entry);
+                if (info != null && info.IsDirectory && info.Exists && !info.IsSocket) {
+                    yield return info.FullName;
                 }
             }
         }
-        
+
+        private UnixFileSystemInfo TraverseSymlink(UnixFileSystemInfo info)
+        {
+            Dictionary<string, UnixFileSystemInfo> visited = new Dictionary<string, UnixFileSystemInfo> ();
+
+            while (info.IsSymbolicLink) {
+                if (visited.ContainsKey (info.FullName)) {
+                    return null;
+                }
+                visited.Add (info.FullName, info);
+                info = new UnixSymbolicLinkInfo (info.FullName).GetContents ();
+            }
+
+            return info;
+        }
+
         public void Move (SafeUri from, SafeUri to)
         {
             Mono.Unix.Native.Stdlib.rename (from.LocalPath, to.LocalPath);
