***************
*** 45,50 ****
          private uint popup_timeout_id;
          private bool in_popup;
          private bool in_thumbnail_region;
          
          public ClassicTrackInfoDisplay () : base ()
          {
--- 48,61 ----
          private uint popup_timeout_id;
          private bool in_popup;
          private bool in_thumbnail_region;
+         private bool in_artist_region;
+         private bool in_album_region;
+         private double artist_min_x, artist_max_x, album_min_x, album_max_x;
+         private static Gdk.Cursor hand_cursor = new Gdk.Cursor (Gdk.CursorType.Hand1);
+         private static Gdk.Cursor arrow_cursor = new Gdk.Cursor (Gdk.CursorType.Arrow);
+         private static Gdk.Color blue_color = new Gdk.Color (0, 0, 255);
+         private string link_color_hex;
+         private bool is_hovering;
          
          public ClassicTrackInfoDisplay () : base ()
          {
***************
*** 148,169 ****
              double offset = Allocation.Height + 10, y = 0;
              double x = Allocation.X + offset;
              double width = Allocation.Width - offset;
-             int fl_width, fl_height, sl_width, sl_height;
  
              // Set up the text layouts
              Pango.Layout first_line_layout = null;
              CairoExtensions.CreateLayout (this, cr, ref first_line_layout);
              first_line_layout.Width = (int)(width * Pango.Scale.PangoScale);
              first_line_layout.Ellipsize = Pango.EllipsizeMode.End;
-                         
-             Pango.Layout second_line_layout = first_line_layout.Copy ();
              
              // Compute the layout coordinates
              first_line_layout.SetMarkup (GetFirstLineText (track));
              first_line_layout.GetPixelSize (out fl_width, out fl_height);
-             second_line_layout.SetMarkup (GetSecondLineText (track));
-             second_line_layout.GetPixelSize (out sl_width, out sl_height);
              
              if (fl_height + sl_height > Allocation.Height) {
                  SetSizeRequest (-1, fl_height + sl_height);
              }
--- 178,238 ----
              double offset = Allocation.Height + 10, y = 0;
              double x = Allocation.X + offset;
              double width = Allocation.Width - offset;
+             int fl_width, fl_height, sl_height = 0;
  
              // Set up the text layouts
              Pango.Layout first_line_layout = null;
              CairoExtensions.CreateLayout (this, cr, ref first_line_layout);
              first_line_layout.Width = (int)(width * Pango.Scale.PangoScale);
              first_line_layout.Ellipsize = Pango.EllipsizeMode.End;
              
              // Compute the layout coordinates
              first_line_layout.SetMarkup (GetFirstLineText (track));
              first_line_layout.GetPixelSize (out fl_width, out fl_height);
              
+             IList<TrackInfoPhrase> second_line_phrases = GetSecondLineText (track);
+             
+             List<Pango.Layout> second_line_layouts = new List<Pango.Layout> ();
+             
+             for (int i = 0; i < second_line_phrases.Count; i++) {
+                 Pango.Layout layout = null;
+                 CairoExtensions.CreateLayout (this, cr, ref layout);
+                 string phrase_format = "{0}<span color=\"{1}\"{2}>{3}</span>{4}";
+                 
+                 TrackInfoPhrase phrase = second_line_phrases [i];
+                 
+                 if (phrase.Property == TrackInfoProperty.None) {
+                     layout.SetMarkup (string.Format (phrase_format,
+                                                      (i == 0 ? string.Empty : " "),
+                                                      CairoExtensions.ColorGetHex (TextLightColor, false),
+                                                      " size=\"small\"",
+                                                      GLib.Markup.EscapeText (phrase.Text),
+                                                      " "));
+                 } else if (phrase.Property == TrackInfoProperty.AlbumName && AlbumSelected != null ||
+                            phrase.Property == TrackInfoProperty.ArtistName && ArtistSelected != null) {
+                     layout.SetMarkup (string.Format (phrase_format,
+                                                      string.Empty,
+                                                      link_color_hex,
+                                                      string.Empty,
+                                                      GLib.Markup.EscapeText (phrase.Text),
+                                                      string.Empty));
+                 } else {
+                     layout.SetMarkup (string.Format (phrase_format,
+                                                      string.Empty,
+                                                      CairoExtensions.ColorGetHex (TextColor, false),
+                                                      string.Empty,
+                                                      GLib.Markup.EscapeText (phrase.Text),
+                                                      string.Empty));
+                 }
+                 
+                 int phrase_width, phrase_height;
+                 layout.GetPixelSize (out phrase_width, out phrase_height);
+                 if (phrase_height > sl_height)
+                     sl_height = phrase_height;
+                 
+                 second_line_layouts.Add (layout);
+             }
+             
              if (fl_height + sl_height > Allocation.Height) {
                  SetSizeRequest (-1, fl_height + sl_height);
              }
***************
*** 181,195 ****
  
              if (!renderArtistAlbum) {
                  first_line_layout.Dispose ();
-                 second_line_layout.Dispose ();
                  return;
              }
              
              cr.MoveTo (x, y + fl_height);
-             PangoCairoHelper.ShowLayout (cr, second_line_layout);
              
              first_line_layout.Dispose ();
-             second_line_layout.Dispose ();
          }
          
  #endregion
--- 250,284 ----
  
              if (!renderArtistAlbum) {
                  first_line_layout.Dispose ();
+                 foreach (Pango.Layout layout in second_line_layouts)
+                     layout.Dispose ();
                  return;
              }
              
              cr.MoveTo (x, y + fl_height);
+             for (int i = 0; i < second_line_layouts.Count; i++) {
+                 Pango.Layout layout = second_line_layouts [i];
+                 int phrase_width, phrase_height;
+                 layout.GetPixelSize (out phrase_width, out phrase_height);
+                 
+                 PangoCairoHelper.ShowLayout (cr, layout);
+                 double next_x = x + phrase_width;
+                 
+                 if (second_line_phrases [i].Property == TrackInfoProperty.AlbumName) {
+                     album_min_x = x - Allocation.X;
+                     album_max_x = next_x - Allocation.X;
+                 } else if (second_line_phrases [i].Property == TrackInfoProperty.ArtistName) {
+                     artist_min_x = x - Allocation.X;
+                     artist_max_x = next_x - Allocation.X;
+                 }
+                 
+                 x = next_x;
+                 cr.MoveTo (x, y + fl_height);
+             }
              
              first_line_layout.Dispose ();
+             foreach (Pango.Layout layout in second_line_layouts)
+                 layout.Dispose ();
          }
          
  #endregion
