diff --git a/addon.xml b/addon.xml
index 17e7f1e0eeee9f82990364fd8b4fa64787019f10..161574c8a24db2563362a3252cd8b5dc8ac2f6da 100644
--- a/addon.xml
+++ b/addon.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <addon id="script.spotify.screensaver"
     name="Spotify Screensaver"
-    version="0.0.16"
+    version="0.0.17"
     provider-name="BenoƮt Harrault">
     <requires>
         <import addon="xbmc.python" version="2.25.0"/>
diff --git a/gui.py b/gui.py
index 23ba4065f4cbe7315435fb13381d8d3b5d37a2d9..4a0728e438cbfb059f4eeae8c0a6c2bc610de992 100644
--- a/gui.py
+++ b/gui.py
@@ -49,6 +49,7 @@ class GUI(xbmcgui.WindowXMLDialog):
         self.Monitor = MyMonitor(action=self._exit)
         self.stop = False
         self.last_spotify_event = ''
+        self.current_track_id = ''
 
     def _get_settings(self):
         # read addon settings
@@ -124,8 +125,9 @@ class GUI(xbmcgui.WindowXMLDialog):
         event_value = event_split[2] if len(event_split) > 2 else ''
 
         if event_type == 'changed' or event_type == 'playing':
-            self._reload_images(event_value)
-            self.next = True
+            if (self.current_track_id != event_value):
+                self._reload_images(event_value)
+                self.next = True
         elif event_type == 'preloading':
             self._preload_images(event_value)
         elif (
@@ -150,30 +152,44 @@ class GUI(xbmcgui.WindowXMLDialog):
         self.log('preload images for track: ' + track_id)
 
         track_data = self._get_track_data(track_id)
-        track_name = track_data.get('track_name')
-        track_artists = track_data.get('track_artists')
-        track_image_url = track_data.get('track_image_url')
-
-        notification = (
-            'Notification("Next:", "' + ', '.join(track_artists)
-            + ' - ' + track_name
-            + '", 29000, ' + track_image_url + ')'
-        )
-        xbmc.executebuiltin(notification)
+
+        if track_data is None:
+            self.log('failed to get next track data', xbmc.LOGERROR)
+        else:
+            track_name = track_data.get('track_name')
+            track_artists = track_data.get('track_artists')
+            track_image_url = track_data.get('track_image_url')
+
+            if ((track_name is None)
+                or (track_artists is None)
+                    or (track_image_url is None)):
+                self.log('failed to parse next track data', xbmc.LOGERROR)
+            else:
+                artists_string = ', '.join(track_artists).replace('"', '\"')
+
+                notification = (
+                    'Notification("Next:", "'
+                    + str(artists_string) + ' - ' + str(track_name)
+                    + '", 29000, ' + str(track_image_url) + ')'
+                )
+
+                xbmc.executebuiltin(notification)
 
     def _reload_images(self, track_id):
         self.log('load images for track: ' + track_id)
         self.PanelItems = self.getControl(101)
         self.PanelItems.reset()
         self.PanelItems.addItems(self._build_items_list(track_id))
+        self.current_track_id = track_id
 
     def _remove_images(self):
         self.log('no played track. remove images')
         self.PanelItems = self.getControl(101)
         self.PanelItems.reset()
+        self.current_track_id = ''
 
     def _fix_encoding(self, string):
-        return string.encode('utf-8')
+        return str(string.encode('utf-8'))
 
     def _get_track_data(self, track_id, try_count=1):
         self.log('track_id: [' + str(track_id) + ']')
@@ -200,84 +216,102 @@ class GUI(xbmcgui.WindowXMLDialog):
             # album/track image
             album = data.get('album')
             if album is None:
-                self.log('failed to get album from API', xbmc.LOGERROR)
-                self.log(json.dumps(data), xbmc.LOGERROR)
-
-                if json.dumps(data) == '{"error": {"status": 401, "message": "The access token expired"}}':
-                    self.log('trying to refresh access token')
-                    self._init_spotify_access_token()
-                    self.log('retry get image')
-                    self._get_track_data(track_id, try_count + 1)
+                self.log(
+                    'failed to get album from API: '
+                    + json.dumps(data), xbmc.LOGERROR)
+
+                error_string = ('{"error": {"status": 401, '
+                                + '"message": "The access token expired"}}')
+                if json.dumps(data) == error_string:
+                    if try_count < 3:
+                        self.log('trying to refresh access token')
+                        self._init_spotify_access_token()
+                        self.log('retry get image')
+                        return self._get_track_data(track_id, try_count + 1)
+                    else:
+                        self.log('giving up', xbmc.LOGERROR)
                 else:
                     self.log('unknown error getting image', xbmc.LOGERROR)
             else:
-                self.log('ok got album from API')
-                self.log(json.dumps(album))
+                self.log('ok got album from API: ' + json.dumps(album))
                 # get artists
                 artists = album.get('artists')
                 if artists is None:
-                    self.log('failed to get artists from API', xbmc.LOGERROR)
-                    self.log(json.dumps(album), xbmc.LOGERROR)
+                    self.log(
+                        'failed to get artists from API: '
+                        + json.dumps(album), xbmc.LOGERROR)
                 else:
-                    self.log('ok got artists from API')
-                    self.log(json.dumps(artists))
+                    self.log('ok got artists from API: ' + json.dumps(artists))
                     for artist in artists:
                         artist_name = artist.get('name')
                         if artist_name is None:
                             self.log(
-                                'failed to get artist_name from API',
-                                xbmc.LOGERROR)
-                            self.log(json.dumps(artist), xbmc.LOGERROR)
+                                'failed to get artist_name from API: '
+                                + json.dumps(artist), xbmc.LOGERROR)
                         else:
-                            self.log('ok got artist_name from API')
-                            self.log(json.dumps(artist_name))
-
-                            track_data['track_artists'].append(self._fix_encoding(artist_name))
+                            self.log(
+                                'ok got artist_name from API: '
+                                + json.dumps(artist_name))
+                            track_data['track_artists'].append(
+                                self._fix_encoding(artist_name))
 
                 # get images
                 images = album.get('images')
                 if images is None:
-                    self.log('failed to get images from API', xbmc.LOGERROR)
-                    self.log(json.dumps(album), xbmc.LOGERROR)
+                    self.log(
+                        'failed to get images from API: '
+                        + json.dumps(album), xbmc.LOGERROR)
                 else:
-                    self.log('ok got images from API')
-                    self.log(json.dumps(images))
+                    self.log('ok got images from API: ' + json.dumps(images))
                     image = images[0]
                     if image is None:
-                        self.log('failed to get image from API', xbmc.LOGERROR)
-                        self.log(json.dumps(images), xbmc.LOGERROR)
+                        self.log(
+                            'failed to get image from API: '
+                            + json.dumps(images), xbmc.LOGERROR)
                     else:
-                        self.log('ok got image from API')
-                        self.log(json.dumps(image))
+                        self.log('ok got image from API: ' + json.dumps(image))
                         track_image_url = image.get('url')
                         if track_image_url is None:
                             self.log(
-                                'failed to get track_image_url from API',
-                                xbmc.LOGERROR)
-                            self.log(json.dumps(image), xbmc.LOGERROR)
+                                'failed to get track_image_url from API: '
+                                + json.dumps(image), xbmc.LOGERROR)
                         else:
-                            self.log('ok got track_image_url from API')
-                            self.log(track_image_url)
+                            self.log(
+                                'ok got track_image_url from API: '
+                                + track_image_url)
                             track_data['track_image_url'] = track_image_url
         except Exception as e:
             self.log('failed to get track data: ' + str(e), xbmc.LOGERROR)
 
+        self.log('track_name: ' + track_data.get('track_name', ''))
+        self.log('track_artists: ' + str(track_data.get('track_artists', [])))
+        self.log('track_image_url: ' + track_data.get('track_image_url', ''))
+
         return track_data
 
     def _build_items_list(self, track_id):
         imageLST = []
 
         track_data = self._get_track_data(track_id)
-        track_name = track_data.get('track_name')
-        track_artists = track_data.get('track_artists')
-        track_image_url = track_data.get('track_image_url')
-
-        imageLST.append(
-            xbmcgui.ListItem(
-                ', '.join(track_artists) + ' - ' + track_name,
-                thumbnailImage=track_image_url
-            )
-        )
+        if track_data is None:
+            self.log('failed to get next track data', xbmc.LOGERROR)
+        else:
+            track_name = track_data.get('track_name')
+            track_artists = track_data.get('track_artists')
+            track_image_url = track_data.get('track_image_url')
+
+            if ((track_name is None)
+                or (track_artists is None)
+                    or (track_image_url is None)):
+                self.log('failed to parse next track data', xbmc.LOGERROR)
+            else:
+                artists_string = ', '.join(track_artists)
+                imageLST.append(
+                    xbmcgui.ListItem(
+                        artists_string + ' - ' + track_name,
+                        thumbnailImage=track_image_url
+                    )
+                )
 
         return imageLST