diff --git a/src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs b/src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs
index 766f066..f56fa48 100644
--- a/src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs
+++ b/src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpSource.cs
@@ -389,10 +389,46 @@ namespace Banshee.Dap.Mtp
             } else if (track.HasAttribute (TrackMediaAttributes.Podcast)) {
                 return mtp_device.PodcastFolder;
             } else {
-                return mtp_device.MusicFolder;
+                return GetAlbumFolder (track);
             }
         }
 
+        private Folder GetAlbumFolder (TrackInfo track)
+        {
+            Folder root = mtp_device.MusicFolder;
+            Folder targetArtistFolder = null;
+            Folder albumFolder = null;
+            string albumArtist = track.AlbumArtist ?? "Unknown";
+            string albumName = track.AlbumTitle ?? "Unknown";
+
+            foreach (Folder artistFolder in root.GetChildren()) {
+                if (artistFolder.Name == albumArtist) {
+                    targetArtistFolder = artistFolder;
+                    break;
+                }
+            }
+
+            if (targetArtistFolder == null) {
+                targetArtistFolder = root.AddChild(albumArtist);
+                albumFolder = targetArtistFolder.AddChild(albumName);
+            }
+            else {
+                foreach (Folder artistAlbum in targetArtistFolder.GetChildren()){
+                    if (artistAlbum.Name == albumName) {
+                        albumFolder = artistAlbum;
+                        break;
+                    }
+                }
+                if (albumFolder == null) {
+                    albumFolder = targetArtistFolder.AddChild(albumName);
+                }
+           }
+
+
+            return albumFolder;
+        }
+
         private int OnUploadProgress (ulong sent, ulong total, IntPtr data)
         {
             AddTrackJob.DetailedProgress = (double) sent / (double) total;
diff --git a/src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpTrackInfo.cs b/src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpTrackInfo.cs
index 3128e61..df81683 100644
--- a/src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpTrackInfo.cs
+++ b/src/Dap/Banshee.Dap.Mtp/Banshee.Dap.Mtp/MtpTrackInfo.cs
@@ -73,9 +73,9 @@ namespace Banshee.Dap.Mtp
 
             MediaAttributes = TrackMediaAttributes.AudioStream;
             if (device != null) {
-                SetAttributeIf (file.InFolder (device.PodcastFolder) || Genre == "Podcast", TrackMediaAttributes.Podcast);
-                SetAttributeIf (file.InFolder (device.MusicFolder), TrackMediaAttributes.Music);
-                SetAttributeIf (file.InFolder (device.VideoFolder), TrackMediaAttributes.VideoStream);
+                SetAttributeIf (file.InFolderOrSubfolder (device.PodcastFolder, device) || Genre == "Podcast", TrackMediaAttributes.Podcast);
+                SetAttributeIf (file.InFolderOrSubfolder (device.MusicFolder, device), TrackMediaAttributes.Music);
+                SetAttributeIf (file.InFolderOrSubfolder (device.VideoFolder, device), TrackMediaAttributes.VideoStream);
             }
 
             // This can be implemented if there's enough people requesting it
diff --git a/src/Libraries/Mtp/Mtp/Folder.cs b/src/Libraries/Mtp/Mtp/Folder.cs
index 80eabbd..67a85c9 100644
--- a/src/Libraries/Mtp/Mtp/Folder.cs
+++ b/src/Libraries/Mtp/Mtp/Folder.cs
@@ -104,6 +104,28 @@ namespace Mtp
             LIBMTP_destroy_folder_t (root);
             return folders;
         }
+
+        private Folder CreateParentFolder()
+        {
+            return Find (device, parentId);
+        }
+
+        public bool HasAncestor (Folder ancestor)
+        {
+            bool hasAncestor = false;
+            if (parentId != 0) {
+                if (parentId == ancestor.FolderId) {
+                    hasAncestor = true;
+                } else {
+                    Folder parent = CreateParentFolder ();
+
+                    if (parent != null) {
+                        hasAncestor = parent.HasAncestor (ancestor);
+                    }
+                }
+            }
+            return hasAncestor;
+        }
         
         public void Remove()
         {
@@ -148,6 +170,20 @@ namespace Mtp
         {
             LIBMTP_destroy_folder_t (folder);
         }
+
+        internal static Folder Find (MtpDevice device, uint folderId)
+        {
+            Folder folder = new NullFolder (device);
+            if (device != null) {
+                IntPtr root = GetFolderList (device.Handle);
+                IntPtr ptr = Find (root, folderId);
+                if (ptr != IntPtr.Zero) {
+                    FolderStruct folderStruct = (FolderStruct)Marshal.PtrToStructure (ptr, typeof(FolderStruct));
+                    folder = new Folder (folderStruct, device);
+                }
+            }
+            return folder;
+        }
         
         internal static IntPtr Find (IntPtr folderList, uint folderId )
         {
@@ -176,6 +212,12 @@ namespace Mtp
         private static extern uint LIBMTP_Create_Folder (MtpDeviceHandle handle, string name, uint parentId, uint storageId);
     }
 
+    internal class NullFolder : Folder{
+        public NullFolder(MtpDevice device) : base(new FolderStruct(), device){
+            
+        }
+    }
+
     [StructLayout(LayoutKind.Sequential)]
     internal struct FolderStruct
     {
diff --git a/src/Libraries/Mtp/Mtp/Track.cs b/src/Libraries/Mtp/Mtp/Track.cs
index 22e15d3..fde513b 100644
--- a/src/Libraries/Mtp/Mtp/Track.cs
+++ b/src/Libraries/Mtp/Mtp/Track.cs
@@ -156,6 +156,11 @@ namespace Mtp
         {
             return folder != null && trackStruct.parent_id == folder.FolderId;
         }
+
+        public bool InFolderOrSubfolder (Folder folder, MtpDevice mtpDevice = null)
+        {
+            return folder != null && (trackStruct.parent_id == folder.FolderId || Folder.Find(mtpDevice ?? device, trackStruct.parent_id).HasAncestor(folder));
+        }
         
         public void Download (string path)
         {
