diff --git a/shell/rb-shell-player.c b/shell/rb-shell-player.c
index d039c12..80fe43e 100644
--- a/shell/rb-shell-player.c
+++ b/shell/rb-shell-player.c
@@ -201,7 +201,8 @@ static void rb_shell_player_volume_changed_cb (RBPlayer *player,
 					       float volume,
 					       RBShellPlayer *shell_player);
 
-
+static void update_play_pause_button (RBShellPlayer *player, 
+				      GtkAction *action);
 
 typedef struct {
 	/** Value of the state/play-order gconf key */
@@ -315,6 +316,9 @@ enum
 
 static GtkActionEntry rb_shell_player_actions [] =
 {
+	{ "ControlPlay", GTK_STOCK_MEDIA_PLAY, N_("_Play"), "<control>space",
+	  N_("Start playback"),
+	  G_CALLBACK (rb_shell_player_cmd_play) },
 	{ "ControlPrevious", GTK_STOCK_MEDIA_PREVIOUS, N_("Pre_vious"), "<alt>Left",
 	  N_("Start playing the previous song"),
 	  G_CALLBACK (rb_shell_player_cmd_previous) },
@@ -332,9 +336,6 @@ static guint rb_shell_player_n_actions = G_N_ELEMENTS (rb_shell_player_actions);
 
 static GtkToggleActionEntry rb_shell_player_toggle_entries [] =
 {
-	{ "ControlPlay", GTK_STOCK_MEDIA_PLAY, N_("_Play"), "<control>space",
-	  N_("Start playback"),
-	  G_CALLBACK (rb_shell_player_cmd_play) },
 	{ "ControlShuffle", GNOME_MEDIA_SHUFFLE, N_("Sh_uffle"), "<control>U",
 	  N_("Play songs in a random order"),
 	  G_CALLBACK (rb_shell_player_shuffle_changed_cb) },
@@ -3727,6 +3728,7 @@ _idle_unblock_signal_cb (gpointer data)
 	action = gtk_action_group_get_action (player->priv->actiongroup,
 					      "ControlPlay");
 
+	update_play_pause_button (player, action);
 	/* sync the active state of the action again */
 	g_object_get (player, "playing", &playing, NULL);
 	gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), playing);
@@ -3743,20 +3745,12 @@ rb_shell_player_playing_changed_cb (RBShellPlayer *player,
 				    gpointer user_data)
 {
 	GtkAction *action;
-	gboolean playing;
-	char *tooltip;
-
-	g_object_get (player, "playing", &playing, NULL);
+	gboolean playing = FALSE;
 	action = gtk_action_group_get_action (player->priv->actiongroup,
 					      "ControlPlay");
-	if (playing) {
-		tooltip = g_strdup (_("Stop playback"));
-	} else {
-		tooltip = g_strdup (_("Start playback"));
-	}
-	g_object_set (action, "tooltip", tooltip, NULL);
-	g_free (tooltip);
 
+	g_object_get (player, "playing", &playing, NULL);
+	update_play_pause_button (player, action);	
 	/* block the signal, so that it doesn't get stuck by triggering recursively,
 	 * and don't unblock it until whatever else is happening has finished.
 	 * don't block it again if it's already blocked, though.
@@ -3918,3 +3912,27 @@ rb_shell_player_remove_play_order (RBShellPlayer *player, const char *name)
 	g_hash_table_remove (player->priv->play_orders, name);
 }
 
+static void update_play_pause_button (RBShellPlayer *player, GtkAction *action)
+{
+	char *tooltip = NULL;
+	gboolean playing = FALSE;
+
+	g_object_get (player, "playing", &playing, NULL);
+	if (playing) {
+		if(rb_source_can_pause (player->priv->source)) {
+			tooltip = g_strdup (_("Pause playback"));
+			gtk_action_set_stock_id (action, GTK_STOCK_MEDIA_PAUSE);
+			gtk_action_set_label (action, _("_Pause"));
+		} else {
+			tooltip = g_strdup (_("Stop playback"));
+			gtk_action_set_stock_id (action, GTK_STOCK_MEDIA_STOP);
+			gtk_action_set_label (action, _("_Stop"));
+		}
+	} else {
+		tooltip = g_strdup (_("Start playback"));
+		gtk_action_set_stock_id (action, GTK_STOCK_MEDIA_PLAY);
+		gtk_action_set_label (action, _("_Play"));
+	}
+	g_object_set (action, "tooltip", tooltip, NULL);
+	g_free (tooltip);
+}
