diff --git a/src/mclient.h b/src/mclient.h
index b9e3f5e..70164e2 100644
--- a/src/mclient.h
+++ b/src/mclient.h
@@ -378,7 +378,8 @@ extern void cli_get_cover_art (void);
 extern void mclient_browse_by_cover (void);
 extern void mclient_browse_by_cover_widget (void);
 extern void mclient_localmenu_hide_all_widgets(void);
-
+extern int fetch_cover_image(char *,char *);
+extern void mclient_get_browser_cover_art(int, mvp_widget_t *, mvp_widget_t *);
 
 /*
  * Track which music server is being used (none, slim, UPNP,...)
@@ -465,4 +466,12 @@ extern char pending_cli_string[MAX_CMD_SIZE];
  */
 extern remote_buttons_type remote_buttons;
 
+/*
+ * Track last n (100?) locally cached album cover names.
+ */
+#define CACHED_ALBUM_COVERS_MAX 100
+extern char cached_album_covers_names[CACHED_ALBUM_COVERS_MAX][50]; 
+extern unsigned int cached_album_covers_head;
+extern unsigned int cached_album_covers_tail;
+
 #endif /* MCLIENT_H */
diff --git a/src/mclient_cli.c b/src/mclient_cli.c
index d3350c8..a281313 100644
--- a/src/mclient_cli.c
+++ b/src/mclient_cli.c
@@ -735,14 +735,13 @@ cli_parse_response(int socket_handle_cli, mclient_cmd * response)
 	    // Cycle through tags until they are all gone.
             for (tag_field = 2; ((strchr(response->param[tag_field], ':') != NULL)&& (tag_field < MAX_PARAMS)); tag_field++)
             {
-printf("TEST>>> Working on param:%s\n", response->param[tag_field]);///###
 	        strncpy(tag, strtok_r(response->param[tag_field], ":", (char **)&id_buffer), 50);
 
                 if (strcmp(tag, "id") == 0)
                 {
                     // There is a conflict.  The album and title responses both have "id" tags.  We
                     // need to separate them.
-	            if (strncmp("albums", response->cmd, strlen("titles")) == 0)
+	            if (strncmp("albums", response->cmd, strlen("albums")) == 0)
                     {
 	                // Parse the album ID number.  Expect 2 fields separated by ":"s.
 	                cli_data.album_id_for_cover_art[cli_data.album_index_1_of_6_for_cover_art]
@@ -759,7 +758,7 @@ printf("TEST>>> Working on param:%s\n", response->param[tag_field]);///###
                 {
                     // There is a conflict.  The album and title responses both have "id" tags.  We
                     // need to separate them.
-	            if (strncmp("albums", response->cmd, strlen("titles")) == 0)
+	            if (strncmp("albums", response->cmd, strlen("albums")) == 0)
                     {
 	                // Parse the album name.  Expect 2 fields separated by ":"s.
 	                strncpy(cli_data.album_name_for_cover_art[cli_data.album_index_1_of_6_for_cover_art],
@@ -811,13 +810,46 @@ printf("TEST>>> Working on param:%s\n", response->param[tag_field]);///###
                     cli_data.rescanning_in_progress = atoi(strtok_r(NULL, "\n", (char **)&id_buffer));
                 }
             }
-///TEST START
-   if (strncmp("albums", response->cmd, strlen("albums")) == 0)
-	printf("TEST>>>Found albums, expected 3 tag items found %d - 1.\n", tag_field); /// ###
-   if (strncmp("titles", response->cmd, strlen("titles")) == 0)
-	printf("TEST>>>Found titles, expected 7 tag items found %d - 1.\n", tag_field); /// ###
-///TEST END
-
+/// ### START
+	            if (strncmp("albums", response->cmd, strlen("albums")) == 0)
+		    {
+			printf("Albums <-data found:\n");
+printf(" album_id:%d\n",
+cli_data.album_id_for_cover_art[cli_data.album_index_1_of_6_for_cover_art]
+	);
+printf(" track_id:%d\n",
+cli_data.track_id_for_cover_art[cli_data.album_index_1_of_6_for_cover_art]
+	);
+printf(" album_name:%s\n",
+cli_data.album_name_for_cover_art[cli_data.album_index_1_of_6_for_cover_art]
+	);
+printf(" artist_name:%s\n",
+cli_data.artist_name_for_cover_art[cli_data.album_index_1_of_6_for_cover_art]
+	);
+printf(" rescannin_status:%d\n",
+cli_data.rescanning_in_progress
+	);
+		    }
+		    else
+		    {
+			printf("Titles <-data found:\n");
+printf(" album_id:%d\n",
+cli_data.album_id_for_cover_art[cli_data.album_index_1_of_6_for_cover_art]
+	);
+printf(" track_id:%d\n",
+cli_data.track_id_for_cover_art[cli_data.album_index_1_of_6_for_cover_art]
+	);
+printf(" album_name:%s\n",
+cli_data.album_name_for_cover_art[cli_data.album_index_1_of_6_for_cover_art]
+	);
+printf(" artist_name:%s\n",
+cli_data.artist_name_for_cover_art[cli_data.album_index_1_of_6_for_cover_art]
+	);
+printf(" rescannin_status:%d\n",
+cli_data.rescanning_in_progress
+	);
+		    }
+// ### END
 	    cli_data.pending_proc_for_cover_art = TRUE;
 	}
 	else if (strncmp("info", response->cmd, strlen("info")) == 0)
@@ -839,25 +871,26 @@ printf("TEST>>> Working on param:%s\n", response->param[tag_field]);///###
 void
 cli_get_cover_art()
 {
-    char url_string[100];
-    int retcode;
+    char url_string[200];
+    char cached_image_filename[50];
+
+    sprintf(cached_image_filename, "/tmp/cover_current");
 
     sprintf(url_string, "http://%s:9000/music/current/cover?player=%s\n", mclient_server,
 	    decoded_player_id);
-    current = strdup(url_string);
-    retcode = http_main();
-    printf("mclient:cli_get_cover_art: PULLING NEW ART WORK. retcode:%d\n", retcode);
-    if (retcode == HTTP_IMAGE_FILE_JPEG)
+    printf("mclient:cli_get_cover_art: PULLING NEW ART WORK FROM:%s.\n", url_string);
+    if(fetch_cover_image(cached_image_filename, url_string) == 0)
     {
-	mvpw_load_image_fd(fd);
-	if (mvpw_load_image_jpeg(mclient_sub_image, NULL) == 0)
+	if(mvpw_set_image(mclient_sub_image, cached_image_filename) == 0)
 	{
-	    mvpw_show_image_jpeg(mclient_sub_image);
-	    av_wss_update_aspect(WSS_ASPECT_UNKNOWN);
 	    // As we have a valid image, expose it.
 	    mvpw_hide(mclient_sub_alt_image);
 	    mvpw_show(mclient_sub_image);
 	}
+	else
+	{
+		printf("mclient: Problem displaying image.\n");
+	}
     }
     else
     {
@@ -868,9 +901,6 @@ cli_get_cover_art()
 	mvpw_show(mclient_sub_alt_image);
 	mvpw_set_text_str(mclient_sub_alt_image, "   No ArtWork\n     for\n    this album");
     }
-    close(fd);
-    fd = -1;
-    free(current);
 }
 
 /*
@@ -1714,3 +1744,44 @@ cli_send_discovery(int socket_handle_cli)
     sprintf(cmd, "listen 1\n");
     cli_send_packet(socket_handle_cli, cmd);
 }
+
+// Get cover image from URL "url_string" and save it to /tmp/<filename>.
+int fetch_cover_image(char *filename,char *url_string)
+{
+	int retcode;
+
+	current = strdup(url_string);
+	retcode = http_main();
+	free(current);
+
+	if (
+		(retcode==HTTP_IMAGE_FILE_JPEG) ||
+		(retcode==HTTP_IMAGE_FILE_PNG) ||
+		(retcode==HTTP_IMAGE_FILE_GIF) 
+	   ) 
+	{
+		char buf[STREAM_PACKET_SIZE];
+		FILE *outfile = fopen(filename, "wb");
+		retcode = 0;
+		int nitems = -1;
+		while (nitems && gui_state == MVPMC_STATE_MCLIENT) {
+			nitems = read(fd,buf, STREAM_PACKET_SIZE);
+			if (nitems < 0 ){
+				if ( (errno==EAGAIN || errno==EINTR)  ) {
+					usleep(100000);
+					continue;
+				} else {
+					retcode = -1;
+					break;
+				}
+			}
+			fwrite(buf,1, nitems, outfile);
+		}
+		fclose(outfile);
+	} else {
+		retcode = -1;
+	}
+	close(fd);
+	return retcode;
+}
+
diff --git a/src/mclient_mvpmc.c b/src/mclient_mvpmc.c
index 63819e0..4eee278 100644
--- a/src/mclient_mvpmc.c
+++ b/src/mclient_mvpmc.c
@@ -134,6 +134,13 @@ static int debug = 0;
 */
 char pending_cli_string[MAX_CMD_SIZE];
 
+/*
+ * Number of album covers to keep locally cached.
+ */
+char cached_album_covers_names[CACHED_ALBUM_COVERS_MAX][50];
+unsigned int cached_album_covers_head = 0;
+unsigned int cached_album_covers_tail = 0;
+
 void
 receive_mpeg_data(int s, receive_mpeg_header * data, int bytes_read)
 {
@@ -1345,9 +1352,7 @@ mclient_browse_by_cover(void)
     // ...that get's you back the 1st track from the album.  Now you have that track's ID.
     // http://<server's ip addr>:9000/music/<track's ID>/cover.jpg
 
-    char url_string[100];
     char no_cover_art_text[500];
-    int retcode;
     int album_number;
 
     // State machine for requesting album and track id information.
@@ -1542,213 +1547,27 @@ mclient_browse_by_cover(void)
 	    mvpw_set_text_str(mclient_sub_alt_image_2_3, no_cover_art_text);
 
 	    // Pull cover art for all 6 albums.
-	    sprintf(url_string,
-		    "http://%s:9000/music/%d/cover\n", mclient_server,
-		    cli_data.track_id_for_cover_art[0]);
-	    current = strdup(url_string);
-	    retcode = http_main();
-	    if (retcode == HTTP_IMAGE_FILE_JPEG)
-	    {
-		mvpw_load_image_fd(fd);
-		if (mvpw_load_image_jpeg(mclient_sub_image_1_1, NULL) == 0)
-		{
-		    mvpw_show_image_jpeg(mclient_sub_image_1_1);
-		    mvpw_show(mclient_sub_image_1_1);
-		    mvpw_raise(mclient_sub_image_1_1);
-		}
-	    }
-	    else
-	    {
-		mvpw_hide(mclient_sub_image_1_1);
-		mvpw_show(mclient_sub_alt_image_1_1);
-		mvpw_raise(mclient_sub_alt_image_1_1);
-		sprintf(no_cover_art_text, "%s...\nNo ArtWork for this album.",
-			cli_data.album_name_for_cover_art[0]);
-		mvpw_set_text_str(mclient_sub_alt_image_1_1, no_cover_art_text);
-	    }
-	    close(fd);
-	    fd = -1;
-	    // Set up for another call here as this case does not
-	    // deal w/the CLI parsing function where this normally
-	    // happens.
-	    cli_data.pending_proc_for_cover_art = TRUE;
-	    free(current);
+            mclient_get_browser_cover_art(0, mclient_sub_image_1_1, mclient_sub_alt_image_1_1);
 	    break;
 
 	case DISPLAY_2ND_COVER_COVERART:
-	    sprintf(url_string,
-		    "http://%s:9000/music/%d/cover\n", mclient_server,
-		    cli_data.track_id_for_cover_art[1]);
-	    current = strdup(url_string);
-	    retcode = http_main();
-	    if (retcode == HTTP_IMAGE_FILE_JPEG)
-	    {
-		mvpw_load_image_fd(fd);
-		if (mvpw_load_image_jpeg(mclient_sub_image_1_2, NULL) == 0)
-		{
-		    mvpw_show_image_jpeg(mclient_sub_image_1_2);
-		    mvpw_show(mclient_sub_image_1_2);
-		    mvpw_raise(mclient_sub_image_1_2);
-		}
-	    }
-	    else
-	    {
-		mvpw_hide(mclient_sub_image_1_2);
-		mvpw_show(mclient_sub_alt_image_1_2);
-		mvpw_raise(mclient_sub_alt_image_1_2);
-		sprintf(no_cover_art_text, "%s...\nNo ArtWork for this album.",
-			cli_data.album_name_for_cover_art[1]);
-		mvpw_set_text_str(mclient_sub_alt_image_1_2, no_cover_art_text);
-	    }
-	    close(fd);
-	    fd = -1;
-	    // Set up for another call here as this case does not
-	    // deal w/the CLI parsing function where this normally
-	    // happens.
-	    cli_data.pending_proc_for_cover_art = TRUE;
-	    free(current);
+            mclient_get_browser_cover_art(1, mclient_sub_image_1_2, mclient_sub_alt_image_1_2);
 	    break;
 
 	case DISPLAY_3RD_COVER_COVERART:
-	    sprintf(url_string,
-		    "http://%s:9000/music/%d/cover\n", mclient_server,
-		    cli_data.track_id_for_cover_art[2]);
-	    current = strdup(url_string);
-	    retcode = http_main();
-	    if (retcode == HTTP_IMAGE_FILE_JPEG)
-	    {
-		mvpw_load_image_fd(fd);
-		if (mvpw_load_image_jpeg(mclient_sub_image_1_3, NULL) == 0)
-		{
-		    mvpw_show_image_jpeg(mclient_sub_image_1_3);
-		    mvpw_show(mclient_sub_image_1_3);
-		    mvpw_raise(mclient_sub_image_1_3);
-		}
-	    }
-	    else
-	    {
-		mvpw_hide(mclient_sub_image_1_3);
-		mvpw_show(mclient_sub_alt_image_1_3);
-		mvpw_raise(mclient_sub_alt_image_1_3);
-		sprintf(no_cover_art_text, "%s...\nNo ArtWork for this album.",
-			cli_data.album_name_for_cover_art[2]);
-		mvpw_set_text_str(mclient_sub_alt_image_1_3, no_cover_art_text);
-	    }
-	    close(fd);
-	    fd = -1;
-	    // Set up for another call here as this case does not
-	    // deal w/the CLI parsing function where this normally
-	    // happens.
-	    cli_data.pending_proc_for_cover_art = TRUE;
-	    free(current);
+            mclient_get_browser_cover_art(2, mclient_sub_image_1_3, mclient_sub_alt_image_1_3);
 	    break;
 
 	case DISPLAY_4TH_COVER_COVERART:
-	    sprintf(url_string,
-		    "http://%s:9000/music/%d/cover\n", mclient_server,
-		    cli_data.track_id_for_cover_art[3]);
-	    current = strdup(url_string);
-	    retcode = http_main();
-	    if (retcode == HTTP_IMAGE_FILE_JPEG)
-	    {
-		mvpw_load_image_fd(fd);
-		if (mvpw_load_image_jpeg(mclient_sub_image_2_1, NULL) == 0)
-		{
-		    mvpw_show_image_jpeg(mclient_sub_image_2_1);
-		    mvpw_show(mclient_sub_image_2_1);
-		    mvpw_raise(mclient_sub_image_2_1);
-		}
-	    }
-	    else
-	    {
-		mvpw_hide(mclient_sub_image_2_1);
-		mvpw_show(mclient_sub_alt_image_2_1);
-		mvpw_raise(mclient_sub_alt_image_2_1);
-		sprintf(no_cover_art_text, "%s...\nNo ArtWork for this album.",
-			cli_data.album_name_for_cover_art[3]);
-		mvpw_set_text_str(mclient_sub_alt_image_2_1, no_cover_art_text);
-	    }
-	    close(fd);
-	    fd = -1;
-	    // Set up for another call here as this case does not
-	    // deal w/the CLI parsing function where this normally
-	    // happens.
-	    cli_data.pending_proc_for_cover_art = TRUE;
-	    free(current);
+            mclient_get_browser_cover_art(3, mclient_sub_image_2_1, mclient_sub_alt_image_2_1);
 	    break;
 
 	case DISPLAY_5TH_COVER_COVERART:
-	    sprintf(url_string,
-		    "http://%s:9000/music/%d/cover\n", mclient_server,
-		    cli_data.track_id_for_cover_art[4]);
-	    current = strdup(url_string);
-	    retcode = http_main();
-	    if (retcode == HTTP_IMAGE_FILE_JPEG)
-	    {
-		mvpw_load_image_fd(fd);
-		if (mvpw_load_image_jpeg(mclient_sub_image_2_2, NULL) == 0)
-		{
-		    mvpw_show_image_jpeg(mclient_sub_image_2_2);
-		    mvpw_show(mclient_sub_image_2_2);
-		    mvpw_raise(mclient_sub_image_2_2);
-		}
-	    }
-	    else
-	    {
-		mvpw_hide(mclient_sub_image_2_2);
-		mvpw_show(mclient_sub_alt_image_2_2);
-		mvpw_raise(mclient_sub_alt_image_2_2);
-		sprintf(no_cover_art_text, "%s...\nNo ArtWork for this album.",
-			cli_data.album_name_for_cover_art[4]);
-		mvpw_set_text_str(mclient_sub_alt_image_2_2, no_cover_art_text);
-	    }
-	    close(fd);
-	    fd = -1;
-	    // Set up for another call here as this case does not
-	    // deal w/the CLI parsing function where this normally
-	    // happens.
-	    cli_data.pending_proc_for_cover_art = TRUE;
-	    free(current);
+            mclient_get_browser_cover_art(4, mclient_sub_image_2_2, mclient_sub_alt_image_2_2);
 	    break;
 
 	case DISPLAY_6TH_COVER_COVERART:
-	    sprintf(url_string,
-		    "http://%s:9000/music/%d/cover\n", mclient_server,
-		    cli_data.track_id_for_cover_art[5]);
-	    current = strdup(url_string);
-	    retcode = http_main();
-	    if (retcode == HTTP_IMAGE_FILE_JPEG)
-	    {
-		mvpw_load_image_fd(fd);
-		if (mvpw_load_image_jpeg(mclient_sub_image_2_3, NULL) == 0)
-		{
-		    mvpw_show_image_jpeg(mclient_sub_image_2_3);
-		    mvpw_show(mclient_sub_image_2_3);
-		    mvpw_raise(mclient_sub_image_2_3);
-		}
-	    }
-	    else
-	    {
-		mvpw_hide(mclient_sub_image_2_3);
-		mvpw_show(mclient_sub_alt_image_2_3);
-		mvpw_raise(mclient_sub_alt_image_2_3);
-		mvpw_set_text_str(mclient_sub_alt_image_2_3, "   No ArtWork\n     for\n    this album");
-		sprintf(no_cover_art_text, "%s...\nNo ArtWork for this album.",
-			cli_data.album_name_for_cover_art[5]);
-		mvpw_set_text_str(mclient_sub_alt_image_2_3, no_cover_art_text);
-	    }
-	    close(fd);
-	    fd = -1;
-
-	    // Show browserbar.
-	    mvpw_show(mclient_sub_browsebar);
-	    mvpw_raise(mclient_sub_browsebar);
-
-	    // Set up for another call here as this case does not
-	    // deal w/the CLI parsing function where this normally
-	    // happens.
-	    cli_data.pending_proc_for_cover_art = TRUE;
-	    free(current);
+            mclient_get_browser_cover_art(5, mclient_sub_image_2_3, mclient_sub_alt_image_2_3);
 	    break;
 
 	case GET_TOTAL_NUM_ALBUMS:
@@ -1779,6 +1598,71 @@ mclient_browse_by_cover(void)
 }
 
 void
+mclient_get_browser_cover_art(int index, mvp_widget_t * mclient_sub_image, mvp_widget_t * mclient_sub_alt_image)
+{
+    char url_string[100];
+    char no_cover_art_text[500];
+    char cached_image_filename[50];
+    int	 ret_val;
+
+	    sprintf(url_string, "http://%s:9000/music/%d/cover_100x100\n", mclient_server,
+		    cli_data.track_id_for_cover_art[index]);
+	    sprintf(cached_image_filename, "/tmp/cover_%d", cli_data.track_id_for_cover_art[index]);
+            printf("mclient: Album cover URL:%s local file name:%s\n", url_string, cached_image_filename);
+
+            // If file does not exits, get new image.
+            ret_val = -1;
+            if (access(cached_image_filename,R_OK) != 0)
+            {
+		printf("TEST>>> Didn't find the cover image:%s, getting another one.\n", cached_image_filename);///###
+		unsigned int tries = 0;
+		while ((ret_val != 0) && (tries++ < 4))
+		{
+                	ret_val = fetch_cover_image(cached_image_filename, url_string); 
+		}
+		// New cover?  Log it.
+		if (ret_val == 0)
+		{
+			// Too many covers? Delet oldest.
+			printf("TEST>>> Too many covers? head+1:%d tail:%d\n", (cached_album_covers_head + 1) % CACHED_ALBUM_COVERS_MAX, cached_album_covers_tail);///###
+			if (((cached_album_covers_head + 1) % CACHED_ALBUM_COVERS_MAX) == cached_album_covers_tail)
+			{
+				// Delet album cover pointed at by tail.
+				unlink(cached_album_covers_names[cached_album_covers_tail]);
+				printf("TEST>>> Deleting this cover:%s\n", cached_album_covers_names[cached_album_covers_tail]);///###
+				cached_album_covers_tail = (cached_album_covers_tail + 1) % CACHED_ALBUM_COVERS_MAX;
+			}
+			cached_album_covers_head = (cached_album_covers_head + 1) % CACHED_ALBUM_COVERS_MAX;
+			strncpy(cached_album_covers_names[cached_album_covers_head],cached_image_filename,strlen(cached_image_filename));
+		}
+            }
+            else
+            {
+		ret_val = 0;
+		printf("TEST>>> Found the cover image:%s, use the one we have.\n", cached_image_filename);///###
+            }
+
+            if((mvpw_set_image(mclient_sub_image, cached_image_filename) == 0) && (ret_val == 0))
+	    {
+		    mvpw_show(mclient_sub_image);
+		    mvpw_raise(mclient_sub_image);
+	    }
+	    else
+	    {
+		mvpw_hide(mclient_sub_image);
+		mvpw_show(mclient_sub_alt_image);
+		mvpw_raise(mclient_sub_alt_image);
+		sprintf(no_cover_art_text, "%s...\nNo ArtWork for this album.",
+			cli_data.album_name_for_cover_art[index]);
+		mvpw_set_text_str(mclient_sub_alt_image, no_cover_art_text);
+	    }
+	    // Set up for another call here as this case does not
+	    // deal w/the CLI parsing function where this normally
+	    // happens.
+	    cli_data.pending_proc_for_cover_art = TRUE;
+}
+
+void
 mclient_browse_by_cover_widget(void)
 {
     // State machine for updating album cover widgets

