--- orig/shell/rb-shell-player.c
+++ mod/shell/rb-shell-player.c
@@ -842,7 +842,6 @@
 {
 	char *unescaped = gnome_vfs_unescape_string_for_display (location);
 	char *msg = g_strdup_printf (_("Opening %s..."), unescaped);
-	gboolean was_playing;
 /* 	gboolean use_buffering = rb_uri_is_iradio (location); */
 
 	rb_debug ("%s", msg);
@@ -850,8 +849,6 @@
 	g_free (unescaped);
 	g_free (msg);
 
-	was_playing = rb_player_playing (player->priv->mmplayer);
-
 	rb_player_close (player->priv->mmplayer, error);
 	if (error && *error)
 		return;
@@ -881,16 +878,6 @@
 		return;
 	}
 	rb_player_open (player->priv->mmplayer, location, error);
-	if (error && *error)
-		return;
-
-	rb_player_play (player->priv->mmplayer, error);
-	if (error && *error)
-		return;
-
-	if (!was_playing) {
-		g_object_notify (G_OBJECT (player), "playing");
-	}
 }
 
 static void
@@ -916,11 +903,18 @@
 static void
 rb_shell_player_play (RBShellPlayer *player, GError **error)
 {
+	gboolean was_playing;
 	RBEntryView *songs = rb_source_get_entry_view (player->priv->selected_source);
 
+	was_playing = rb_player_playing (player->priv->mmplayer);
+
 	rb_player_play (player->priv->mmplayer, error);
 	if (error && *error)
 		return;
+	
+	if (!was_playing) {
+		g_object_notify (G_OBJECT (player), "playing");
+	}
 
 	rb_entry_view_set_playing (songs, TRUE);
 
@@ -929,7 +923,7 @@
 }
 
 static void
-rb_shell_player_set_playing_entry (RBShellPlayer *player, RhythmDBEntry *entry)
+rb_shell_player_set_entry (RBShellPlayer *player, RhythmDBEntry *entry)
 {
 	GError *error = NULL;
 	RBEntryView *songs;
@@ -942,7 +936,6 @@
 	rb_shell_player_open_entry (player, entry, &error);
 	if (error == NULL) {
 		rb_shell_player_sync_replaygain (player, entry);
-		rb_shell_player_play (player, &error);
 	}
 
 	if (error != NULL) {
@@ -954,6 +947,30 @@
 	rb_entry_view_set_playing_entry (songs, entry);
 	rb_shell_player_sync_with_source (player);
 	rb_shell_player_sync_buttons (player);
+
+}
+
+static void
+rb_shell_player_set_playing_entry (RBShellPlayer *player, RhythmDBEntry *entry)
+{
+	GError *error = NULL;
+
+	rb_shell_player_set_entry (player, entry);
+	rb_shell_player_play (player, &error);
+
+	if (error != NULL) {
+		rb_error_dialog (error->message);
+	}
+}
+
+static void
+rb_shell_player_set_entry_with_current_state (RBShellPlayer *player, RhythmDBEntry *entry)
+{
+	if (rb_player_playing (player->priv->mmplayer)) {
+		rb_shell_player_set_playing_entry (player, entry);
+	} else {
+		rb_shell_player_set_entry (player, entry);
+	}
 }
 
 static void
@@ -1111,7 +1128,7 @@
 				entry = rb_play_order_get_previous (player->priv->play_order);
 				if (entry) {
 					rb_play_order_go_previous (player->priv->play_order);
-					rb_shell_player_set_playing_entry (player, entry);
+					rb_shell_player_set_entry_with_current_state (player, entry);
 				} else {
 					/* Is this the right thing to do when there's no previous song? */
 					rb_debug ("No previous entry, restarting song");
@@ -1130,7 +1147,7 @@
 			if (entry) {
 				rb_debug ("previous station found, doing previous");
 				rb_play_order_go_previous (player->priv->play_order);
-				rb_shell_player_set_playing_entry (player, entry);
+				rb_shell_player_set_entry_with_current_state (player, entry);
 			}
 		}
 
@@ -1250,7 +1267,7 @@
 		
 		if (entry) {
 			rb_play_order_go_next (player->priv->play_order);
-			rb_shell_player_set_playing_entry (player, entry);
+			rb_shell_player_set_entry_with_current_state (player, entry);
 		} else {
 			rb_debug ("No next entry, stopping playback");
 			rb_shell_player_set_playing_source (player, NULL);



