diff --git a/gnome-volume-control/src/gvc-applet.c b/gnome-volume-control/src/gvc-applet.c
index ae89e71..5a3d23a 100644
--- a/gnome-volume-control/src/gvc-applet.c
+++ b/gnome-volume-control/src/gvc-applet.c
@@ -131,6 +131,15 @@ gvc_applet_dispose (GObject *object)
 }
 
 static void
+update_mixer_control (GvcApplet *applet)
+{
+        gvc_stream_status_icon_set_mixer_control (applet->priv->input_status_icon,
+                                                  applet->priv->control);
+        gvc_stream_status_icon_set_mixer_control (applet->priv->output_status_icon,
+                                                  applet->priv->control);
+}
+
+static void
 update_default_source (GvcApplet *applet)
 {
         GvcMixerStream *stream;
@@ -166,6 +175,7 @@ on_control_ready (GvcMixerControl *control,
 {
         update_default_sink (applet);
         update_default_source (applet);
+        update_mixer_control (applet);
 }
 
 static void
@@ -268,10 +278,12 @@ gvc_applet_init (GvcApplet *applet)
         applet->priv = GVC_APPLET_GET_PRIVATE (applet);
 
         applet->priv->output_status_icon = gvc_stream_status_icon_new (NULL,
+                                                                       NULL,
                                                                        output_icon_names);
         gvc_stream_status_icon_set_display_name (applet->priv->output_status_icon,
                                                  _("Output"));
         applet->priv->input_status_icon = gvc_stream_status_icon_new (NULL,
+                                                                      NULL,
                                                                       input_icon_names);
         gvc_stream_status_icon_set_display_name (applet->priv->input_status_icon,
                                                  _("Input"));
diff --git a/gnome-volume-control/src/gvc-stream-status-icon.c b/gnome-volume-control/src/gvc-stream-status-icon.c
index 37131ea..0e8f6a2 100644
--- a/gnome-volume-control/src/gvc-stream-status-icon.c
+++ b/gnome-volume-control/src/gvc-stream-status-icon.c
@@ -32,18 +32,20 @@
 #include "gvc-mixer-stream.h"
 #include "gvc-channel-bar.h"
 #include "gvc-stream-status-icon.h"
+#include "gvc-mixer-sink.h"
 
 #define GVC_STREAM_STATUS_ICON_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GVC_TYPE_STREAM_STATUS_ICON, GvcStreamStatusIconPrivate))
 
 struct GvcStreamStatusIconPrivate
 {
-        char          **icon_names;
-        GvcMixerStream *mixer_stream;
-        GtkWidget      *dock;
-        GtkWidget      *bar;
-        guint           current_icon;
-        char           *display_name;
-        gboolean        thaw;
+        char           **icon_names;
+        GvcMixerControl *mixer_control;
+        GvcMixerStream  *mixer_stream;
+        GtkWidget       *dock;
+        GtkWidget       *bar;
+        guint            current_icon;
+        char            *display_name;
+        gboolean         thaw;
 };
 
 enum
@@ -52,6 +54,7 @@ enum
         PROP_DISPLAY_NAME,
         PROP_MIXER_STREAM,
         PROP_ICON_NAMES,
+        PROP_MIXER_CONTROL,
 };
 
 static void     gvc_stream_status_icon_class_init (GvcStreamStatusIconClass *klass);
@@ -212,6 +215,23 @@ on_menu_mute_toggled (GtkMenuItem         *item,
 }
 
 static void
+on_menu_activate_select_sink (GtkMenuItem         *item,
+                              GvcStreamStatusIcon *icon)
+{
+        guint           id;
+        GvcMixerStream *stream;
+
+        id = GPOINTER_TO_INT(g_object_get_data (G_OBJECT(item), "stream_id"));
+        stream = gvc_mixer_control_lookup_stream_id (icon->priv->mixer_control, id);
+        if (stream == NULL) {
+                g_warning ("Unable to find stream for id: %u", id);
+                return;
+        }
+
+        gvc_mixer_control_set_default_sink (icon->priv->mixer_control, stream);
+}
+
+static void
 on_menu_activate_open_volume_control (GtkMenuItem *item,
                                       GvcStreamStatusIcon   *icon)
 {
@@ -246,9 +266,15 @@ on_status_icon_popup_menu (GtkStatusIcon       *status_icon,
                            guint                activate_time,
                            GvcStreamStatusIcon *icon)
 {
-        GtkWidget *menu;
-        GtkWidget *item;
-        GtkWidget *image;
+        GtkWidget      *menu;
+        GtkWidget      *item;
+        GtkWidget      *image;
+        GSList         *streams;
+        GvcMixerStream *stream;
+        GSList         *l;
+        GSList         *group;
+        GtkWidget      *submenu;
+        guint           n;
 
         menu = gtk_menu_new ();
 
@@ -271,6 +297,58 @@ on_status_icon_popup_menu (GtkStatusIcon       *status_icon,
                           icon);
         gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
 
+        if (icon->priv->mixer_control != NULL) {
+
+                submenu = gtk_menu_new ();
+                group = NULL;
+                n = 0;
+
+                streams = gvc_mixer_control_get_streams (icon->priv->mixer_control);
+                for (l = streams; l != NULL; l = l->next) {
+                        stream = l->data;
+
+                        if (GVC_IS_MIXER_SINK (stream)) {
+
+                                item = gtk_radio_menu_item_new_with_label (group, gvc_mixer_stream_get_description (stream));
+                                group = gtk_radio_menu_item_get_group (GTK_RADIO_MENU_ITEM (item));
+
+                                guint id = gvc_mixer_stream_get_id (stream);
+                                g_object_set_data (G_OBJECT(item), "stream_id", GINT_TO_POINTER(id));
+
+                                if (stream == gvc_mixer_control_get_default_sink (icon->priv->mixer_control))
+                                        gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE);
+
+                                gtk_menu_shell_append (GTK_MENU_SHELL (submenu), item);
+                                n++;
+                        }
+                }
+                g_slist_free (streams);
+
+                /* show selection menu only when there is more than one sink */
+                if (n > 1) {
+                        for (l = group; l != NULL; l = l->next) {
+                                item = l->data;
+                                g_signal_connect (item,
+                                                "activate",
+                                                G_CALLBACK (on_menu_activate_select_sink),
+                                                icon);
+                        }
+
+                        item = gtk_separator_menu_item_new ();
+                        gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+
+                        item = gtk_menu_item_new_with_mnemonic (_("Select _Output"));
+                        gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
+
+                        gtk_widget_show_all (submenu);
+                        gtk_menu_item_set_submenu (GTK_MENU_ITEM(item), submenu);
+                }
+                else {
+                        g_object_ref_sink (submenu);
+                        g_object_unref (submenu);
+                }
+        }
+
         gtk_widget_show_all (menu);
         gtk_menu_popup (GTK_MENU (menu),
                         NULL,
@@ -514,6 +592,30 @@ gvc_stream_status_icon_set_display_name (GvcStreamStatusIcon *icon,
 }
 
 void
+gvc_stream_status_icon_set_mixer_control (GvcStreamStatusIcon *icon,
+                                          GvcMixerControl     *control)
+{
+        g_return_if_fail (GVC_STREAM_STATUS_ICON (icon));
+
+        if (control != NULL) {
+                g_object_ref (control);
+        }
+
+        if (icon->priv->mixer_control != NULL) {
+                g_object_unref (icon->priv->mixer_control);
+                icon->priv->mixer_control = NULL;
+        }
+
+        icon->priv->mixer_control = control;
+
+        if (icon->priv->mixer_control != NULL) {
+                g_object_ref (icon->priv->mixer_control);
+        }
+
+        g_object_notify (G_OBJECT (icon), "mixer-control");
+}
+
+void
 gvc_stream_status_icon_set_mixer_stream (GvcStreamStatusIcon *icon,
                                          GvcMixerStream      *stream)
 {
@@ -569,6 +671,9 @@ gvc_stream_status_icon_set_property (GObject       *object,
         GvcStreamStatusIcon *self = GVC_STREAM_STATUS_ICON (object);
 
         switch (prop_id) {
+        case PROP_MIXER_CONTROL:
+                gvc_stream_status_icon_set_mixer_control (self, g_value_get_object (value));
+                break;
         case PROP_MIXER_STREAM:
                 gvc_stream_status_icon_set_mixer_stream (self, g_value_get_object (value));
                 break;
@@ -594,6 +699,9 @@ gvc_stream_status_icon_get_property (GObject     *object,
         GvcStreamStatusIconPrivate *priv = self->priv;
 
         switch (prop_id) {
+        case PROP_MIXER_CONTROL:
+                g_value_set_object (value, priv->mixer_control);
+                break;
         case PROP_MIXER_STREAM:
                 g_value_set_object (value, priv->mixer_stream);
                 break;
@@ -722,6 +830,13 @@ gvc_stream_status_icon_class_init (GvcStreamStatusIconClass *klass)
         object_class->get_property = gvc_stream_status_icon_get_property;
 
         g_object_class_install_property (object_class,
+                                         PROP_MIXER_CONTROL,
+                                         g_param_spec_object ("mixer-control",
+                                                              "mixer control",
+                                                              "mixer control",
+                                                              GVC_TYPE_MIXER_CONTROL,
+                                                              G_PARAM_READWRITE|G_PARAM_CONSTRUCT));
+        g_object_class_install_property (object_class,
                                          PROP_MIXER_STREAM,
                                          g_param_spec_object ("mixer-stream",
                                                               "mixer stream",
@@ -802,11 +917,13 @@ gvc_stream_status_icon_finalize (GObject *object)
 }
 
 GvcStreamStatusIcon *
-gvc_stream_status_icon_new (GvcMixerStream *stream,
-                            const char    **icon_names)
+gvc_stream_status_icon_new (GvcMixerControl *control,
+                            GvcMixerStream  *stream,
+                            const char     **icon_names)
 {
         GObject *icon;
         icon = g_object_new (GVC_TYPE_STREAM_STATUS_ICON,
+                             "mixer-control", control,
                              "mixer-stream", stream,
                              "icon-names", icon_names,
                              NULL);
diff --git a/gnome-volume-control/src/gvc-stream-status-icon.h b/gnome-volume-control/src/gvc-stream-status-icon.h
index 55887f3..482a4b3 100644
--- a/gnome-volume-control/src/gvc-stream-status-icon.h
+++ b/gnome-volume-control/src/gvc-stream-status-icon.h
@@ -23,6 +23,7 @@
 
 #include <glib-object.h>
 #include "gvc-mixer-stream.h"
+#include "gvc-mixer-control.h"
 
 G_BEGIN_DECLS
 
@@ -48,7 +49,8 @@ typedef struct
 
 GType                 gvc_stream_status_icon_get_type            (void);
 
-GvcStreamStatusIcon * gvc_stream_status_icon_new                 (GvcMixerStream      *stream,
+GvcStreamStatusIcon * gvc_stream_status_icon_new                 (GvcMixerControl     *control,
+                                                                  GvcMixerStream      *stream,
                                                                   const char         **icon_names);
 
 void                  gvc_stream_status_icon_set_icon_names      (GvcStreamStatusIcon *icon,
@@ -57,6 +59,8 @@ void                  gvc_stream_status_icon_set_display_name    (GvcStreamStatu
                                                                   const char          *display_name);
 void                  gvc_stream_status_icon_set_mixer_stream    (GvcStreamStatusIcon *icon,
                                                                   GvcMixerStream      *stream);
+void                  gvc_stream_status_icon_set_mixer_control   (GvcStreamStatusIcon *icon,
+                                                                  GvcMixerControl     *control);
 
 G_END_DECLS
 
