diff --git a/gnomemusic/grilo.py b/gnomemusic/grilo.py
index 0d1bc31..3238764 100644
--- a/gnomemusic/grilo.py
+++ b/gnomemusic/grilo.py
@@ -47,7 +47,9 @@ class Grilo(GObject.GObject):
 
     METADATA_KEYS = [
         Grl.METADATA_KEY_ID, Grl.METADATA_KEY_TITLE,
-        Grl.METADATA_KEY_ARTIST, Grl.METADATA_KEY_ALBUM,
+        Grl.METADATA_KEY_ARTIST,
+        Grl.METADATA_KEY_ALBUM,
+        Grl.METADATA_KEY_ALBUM_DISC,
         Grl.METADATA_KEY_DURATION,
         Grl.METADATA_KEY_CREATION_DATE,
         Grl.METADATA_KEY_URL,
diff --git a/gnomemusic/query.py b/gnomemusic/query.py
index b882fb7..8df9fa4 100644
--- a/gnomemusic/query.py
+++ b/gnomemusic/query.py
@@ -260,6 +260,7 @@ class Query():
         nmm:artistName(nmm:performer(?song)) AS ?artist
         nie:title(nmm:musicAlbum(?song)) AS ?album
         nfo:duration(?song) AS ?duration
+        nmm:setNumber(nmm:musicAlbumDisc(?song)) AS ?album_disc
         IF(bound(?tag), 'truth!', '') AS ?lyrics
     WHERE {
         ?song a nmm:MusicPiece ;
diff --git a/gnomemusic/widgets.py b/gnomemusic/widgets.py
index 03673c9..3e5e750 100644
--- a/gnomemusic/widgets.py
+++ b/gnomemusic/widgets.py
@@ -68,10 +68,13 @@ class StarHandler():
         self.parent = parent
 
     @log
-    def _add_star_renderers(self, list_widget, cols, hidden=False):
+    def _add_star_renderers(self, list_widget, cols, hidden=False, render_function=None):
         star_renderer = CellRendererClickablePixbuf(self.parent.view, hidden=hidden)
         star_renderer.connect("clicked", self._on_star_toggled)
-        list_widget.add_renderer(star_renderer, lambda *args: None, None)
+        if not render_function:
+            list_widget.add_renderer(star_renderer, lambda *args: None, None)
+        else:
+            list_widget.add_renderer(star_renderer, render_function, None)
         cols[0].clear_attributes(star_renderer)
         cols[0].add_attribute(star_renderer, 'show_star', self.star_index)
 
@@ -100,6 +103,23 @@ class StarHandler():
 
 class AlbumWidget(Gtk.EventBox):
 
+    class AWStarHandler(StarHandler):
+
+        def __repr__(self):
+            return '<AWStarHandler>'
+
+        @log
+        def _on_star_toggled(self, widget, path):
+            if (len(self.parent.discs.keys()) == 1):
+                try:
+                    _iter = self.parent.playlist_model.get_iter(path)
+                except TypeError:
+                    return
+                _iter = self.parent.playlist_model.convert_iter_to_child_iter(_iter)
+                path = self.parent.model.get_string_from_iter(_iter)
+
+            super()._on_star_toggled(widget, path)
+
     tracks = []
     duration = 0
     loadingIcon = ALBUM_ART_CACHE.get_default_icon(256, 256, True)
@@ -117,11 +137,13 @@ class AlbumWidget(Gtk.EventBox):
 
         self.ui = Gtk.Builder()
         self.ui.add_from_resource('/org/gnome/Music/AlbumWidget.ui')
-        self._create_model()
+
         self.view = Gd.MainView(
             shadow_type=Gtk.ShadowType.NONE
         )
         self.view.set_view_type(Gd.MainViewType.LIST)
+        self._create_model()
+        self.discs = {}
         self.album = None
         self.header_bar = None
         self.view.connect('item-activated', self._on_item_activated)
@@ -136,7 +158,7 @@ class AlbumWidget(Gtk.EventBox):
         self.view.remove(child_view)
         view_box.add(child_view)
         self.add(self.ui.get_object('AlbumWidget'))
-        self.star_handler = StarHandler(self, 9)
+        self.star_handler = self.AWStarHandler(self, 9)
         self._add_list_renderers()
         self.get_style_context().add_class('view')
         self.get_style_context().add_class('content-view')
@@ -153,16 +175,24 @@ class AlbumWidget(Gtk.EventBox):
             self.star_handler.star_renderer_click = False
             return
 
-        _iter = self.model.get_iter(path)
+        if (len(self.discs.keys()) > 1):
+            _tmp_path = path
+        else:
+            _tmp_path = self.playlist_model.convert_path_to_child_path(path)
 
-        if self.model.get_value(_iter, 10) != DiscoveryStatus.FAILED:
+        _iter = self.model.get_iter(_tmp_path)
+        if not self.model.get_value(_iter, 13):
+            pass
+        elif self.model.get_value(_iter, 10) != DiscoveryStatus.FAILED:
             if (self.iterToClean and self.player.playlistId == self.album):
                 item = self.model.get_value(self.iterToClean, 5)
                 title = AlbumArtCache.get_media_title(item)
                 self.model.set_value(self.iterToClean, 0, title)
                 # Hide now playing icon
                 self.model.set_value(self.iterToClean, 6, False)
-            self.player.set_playlist('Album', self.album, self.model, _iter, 5, 11)
+
+            _result, _playlist_iter = self.playlist_model.convert_child_iter_to_iter(_iter)
+            self.player.set_playlist('Album', self.album, self.playlist_model, _playlist_iter, 5, 11)
             self.player.set_playing(True)
 
     @log
@@ -192,7 +222,7 @@ class AlbumWidget(Gtk.EventBox):
             ellipsize=Pango.EllipsizeMode.END,
             xalign=0.0
         )
-        list_widget.add_renderer(type_renderer, lambda *args: None, None)
+        list_widget.add_renderer(type_renderer, self._on_list_widget_song_renderer, None)
         cols[0].clear_attributes(type_renderer)
         cols[0].add_attribute(type_renderer, 'markup', 0)
 
@@ -202,18 +232,53 @@ class AlbumWidget(Gtk.EventBox):
             xalign=1.0
         )
         durationRenderer.add_class('dim-label')
-        list_widget.add_renderer(durationRenderer, lambda *args: None, None)
+        list_widget.add_renderer(durationRenderer, self._on_list_widget_song_renderer, None)
         cols[0].clear_attributes(durationRenderer)
         cols[0].add_attribute(durationRenderer, 'markup', 1)
 
-        self.star_handler._add_star_renderers(list_widget, cols)
+        title_renderer = Gd.StyledTextRenderer(
+            xpad=16,
+            xalign=0.0,
+#            yalign=0.5,
+            height=32,
+            ellipsize=Pango.EllipsizeMode.END,
+            weight=Pango.Weight.BOLD
+        )
+        list_widget.add_renderer(title_renderer,
+                                 self._on_list_widget_title_render, None)
+        cols[0].clear_attributes(title_renderer)
+        cols[0].add_attribute(title_renderer, 'markup', 2)
+
+        self.star_handler._add_star_renderers(list_widget, cols,
+                                              render_function=self._on_list_widget_song_renderer)
+
+        cells = cols[0].get_cells()
+        cols[0].reorder(cells[0], -1)
+        cols[0].set_cell_data_func(cells[0], self._on_list_widget_selection_render, None)
+
+    def _on_list_widget_selection_render(self, col, cell, model, _iter, data):
+        cell.set_visible(self.view.get_selection_mode() and model.get_value(_iter, 13))
+
+    def _on_list_widget_title_render(self, col, cell, model, _iter, data):
+        if model.get_value(_iter, 13):
+            cell.set_visible(False)
+        else:
+            cell.set_visible(True)
+
+    def _on_list_widget_song_renderer(self, col, cell, model, _iter, data):
+        if model.get_value(_iter, 13):
+            cell.set_visible(True)
+        else:
+            cell.set_visible(False)
 
     def _on_list_widget_icon_render(self, col, cell, model, _iter, data):
         if not self.player.currentTrackUri:
             cell.set_visible(False)
             return
 
-        if model.get_value(_iter, 10) == DiscoveryStatus.FAILED:
+        if not model.get_value(_iter, 13):
+            cell.set_visible(False)
+        elif model.get_value(_iter, 10) == DiscoveryStatus.FAILED:
             cell.set_property('icon-name', ERROR_ICON_NAME)
             cell.set_visible(True)
         elif model.get_value(_iter, 5).get_url() == self.player.currentTrackUri:
@@ -236,9 +301,21 @@ class AlbumWidget(Gtk.EventBox):
             GObject.TYPE_BOOLEAN,
             GObject.TYPE_INT,  # icon shown
             GObject.TYPE_BOOLEAN,
-            GObject.TYPE_INT
+            GObject.TYPE_INT,
+            GObject.TYPE_INT,       # 12 - disc number
+            GObject.TYPE_BOOLEAN,   # 13 - song:True  disc number:False
         )
 
+        self.playlist_model = self.model.filter_new(None)
+        self.playlist_model.set_visible_column(13)
+        self.view.set_model(self.playlist_model)
+
+        self.discs = {}
+
+    @log
+    def _filter_visible_func(self, model, _iter, data=None):
+        return model.iter_parent(_iter) is not None or model.iter_has_child(_iter)
+
     @log
     def update(self, artist, album, item, header_bar, selection_toolbar):
         self.selection_toolbar = selection_toolbar
@@ -259,7 +336,8 @@ class AlbumWidget(Gtk.EventBox):
             'clicked', self._on_header_cancel_button_clicked)
         self.view.connect('view-selection-changed',
                           self._on_view_selection_changed)
-        self.view.set_model(self.model)
+
+        # self.view.set_model(self.model)
         escaped_artist = GLib.markup_escape_text(artist)
         escaped_album = GLib.markup_escape_text(album)
         self.ui.get_object('artist_label').set_markup(escaped_artist)
@@ -308,16 +386,26 @@ class AlbumWidget(Gtk.EventBox):
     @log
     def add_item(self, source, prefs, track, remaining, data=None):
         if track:
-            self.tracks.append(track)
+            disc = track.get_album_disc()
+            if disc not in self.discs.keys():
+                self.discs[disc] = self.model.append()
+                self.model.set(self.discs[disc], [2, 5, 12, 13],
+                               ['<span color=\'gray\'>%s</span>' % (_("Disc ") + str(disc)),
+                               # [ (_("Disc ") + str(disc)),
+                               track, disc, False])
+            if (len(self.discs.keys()) > 1):
+                self.view.set_model(self.model)
+            self.tracks.append(track)  # FIXME: needed?
             self.duration = self.duration + track.get_duration()
             _iter = self.model.append()
             escapedTitle = AlbumArtCache.get_media_title(track, True)
             self.model.set(_iter,
-                           [0, 1, 2, 3, 4, 5, 9],
+                           [0, 1, 2, 3, 4, 5, 9, 12, 13],
                            [escapedTitle,
                             self.player.seconds_to_string(
                                 track.get_duration()),
-                            '', '', None, track, bool(track.get_lyrics())])
+                            None, '', None, track, bool(track.get_lyrics()),
+                            disc, True])
             self.ui.get_object('running_length_label_info').set_text(
                 _("%d min") % (int(self.duration / 60) + 1))
 
@@ -333,7 +421,7 @@ class AlbumWidget(Gtk.EventBox):
     @log
     def update_model(self, player, playlist, currentIter):
         # self is not our playlist, return
-        if (playlist != self.model):
+        if (playlist != self.playlist_model):
             return False
         currentSong = playlist.get_value(currentIter, 5)
         song_passed = False
diff --git a/libgd b/libgd
--- a/libgd
+++ b/libgd
@@ -1 +1 @@
-Subproject commit a0717ad8c078c07ea9d10aed385d30198fd24b03
+Subproject commit a0717ad8c078c07ea9d10aed385d30198fd24b03-dirty
