diff --git a/shell/rb-shell-player.c b/shell/rb-shell-player.c
index d039c12..e569f94 100644
--- a/shell/rb-shell-player.c
+++ b/shell/rb-shell-player.c
@@ -201,7 +201,7 @@ static void rb_shell_player_volume_changed_cb (RBPlayer *player,
 					       float volume,
 					       RBShellPlayer *shell_player);
 
-
+static void update_play_pause_button(GtkAction *action, RBShellPlayer *player);
 
 typedef struct {
 	/** Value of the state/play-order gconf key */
@@ -3727,6 +3727,7 @@ _idle_unblock_signal_cb (gpointer data)
 	action = gtk_action_group_get_action (player->priv->actiongroup,
 					      "ControlPlay");
 
+        update_play_pause_button(action, player);
 	/* 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 +3744,14 @@ 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 the play/pause button */
+        update_play_pause_button(action, player);	
 	/* 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 +3913,38 @@ rb_shell_player_remove_play_order (RBShellPlayer *player, const char *name)
 	g_hash_table_remove (player->priv->play_orders, name);
 }
 
+
+/**
+ * update_play_pause_button:
+ * @action: Action entry that this function will modify
+ * @player: The #RBShellPlayer
+ * 
+ * Updates the play pause button/tooltip based on the current state of the
+ * player as well as type of source. E.g while playing internet radio, play 
+ * button becomes STOP but while playing MP3 tracks from the disk, the play
+ * button becomes PAUSE.
+ */
+static void update_play_pause_button(GtkAction *action, RBShellPlayer *player)
+{
+	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);
+}
