diff -ur gnome-applets-2.19.1/mixer/applet.c gnome-applets-2.19.1.new/mixer/applet.c
--- gnome-applets-2.19.1/mixer/applet.c	2007-07-28 03:02:35.000000000 +0100
+++ gnome-applets-2.19.1.new/mixer/applet.c	2007-08-30 20:36:22.000000000 +0100
@@ -80,6 +80,9 @@
 
 static void	gnome_volume_applet_refresh	(GnomeVolumeApplet *applet,
 						 gboolean           force_refresh);
+
+static void     cb_notify_message (GstBus *bus, GstMessage *message, gpointer data);
+
 static gboolean	cb_check			(gpointer   data);
 
 static void	cb_volume			(GtkAdjustment *adj,
@@ -242,6 +245,12 @@
   /* i18n */
   ao = gtk_widget_get_accessible (GTK_WIDGET (applet));
   atk_object_set_name (ao, _("Volume Control"));
+
+  /* Bus for notifications */
+  applet->bus = gst_bus_new ();
+  gst_bus_add_signal_watch (applet->bus);
+  g_signal_connect (G_OBJECT (applet->bus), "message::element", 
+       (GCallback) cb_notify_message, applet);
 }
 
 /* Parse the list of tracks that are stored in GConf */
@@ -368,12 +377,33 @@
     return FALSE;
 
   applet->mixer = g_object_ref (active_element);
+  gst_element_set_bus (GST_ELEMENT (applet->mixer), applet->bus);
   applet->tracks = active_tracks;
   g_list_foreach (applet->tracks, (GFunc) g_object_ref, NULL);
 
   return TRUE;
 }
 
+static void
+gnome_volume_applet_setup_timeout (GnomeVolumeApplet *applet)
+{
+  gboolean need_timeout = TRUE;
+  need_timeout = ((gst_mixer_get_mixer_flags (GST_MIXER (applet->mixer)) &
+      GST_MIXER_FLAG_AUTO_NOTIFICATIONS) == 0);
+
+  if (need_timeout) {
+    if (applet->timeout == 0) {
+      applet->timeout = g_timeout_add (100, cb_check, applet);
+    }
+  }
+  else {
+    if (applet->timeout != 0) {
+      g_source_remove (applet->timeout);
+      applet->timeout = 0;
+    }
+  }
+}
+
 gboolean
 gnome_volume_applet_setup (GnomeVolumeApplet *applet,
 			   GList *elements)
@@ -436,9 +466,8 @@
   g_signal_connect (component, "ui-event", G_CALLBACK (cb_ui_event), applet);
 
   gnome_volume_applet_refresh (applet, TRUE);
-  if (res) {
-    applet->timeout = g_timeout_add (100, cb_check, applet);
-  }
+  if (res)
+    gnome_volume_applet_setup_timeout (applet);
 
   if (res) {
     /* gconf */
@@ -479,6 +508,11 @@
     g_list_free (applet->elements);
     applet->elements = NULL;
   }
+  gst_bus_remove_signal_watch (applet->bus);
+  if (applet->bus) {
+    gst_object_unref (applet->bus);
+    applet->bus = NULL;
+  }
 
   if (applet->tracks) {
     g_list_foreach (applet->tracks, (GFunc) g_object_unref, NULL);
@@ -1049,6 +1083,8 @@
 
   applet->lock = FALSE;
   applet->force_next_update = TRUE;
+
+  gnome_volume_applet_refresh (GNOME_VOLUME_APPLET (data), FALSE);
 }
 
 /*
@@ -1152,6 +1188,36 @@
 				"state", mute ? "1" : "0", NULL);
 }
 
+static void
+cb_notify_message (GstBus *bus, GstMessage *message, gpointer data)
+{
+  GnomeVolumeApplet *applet = GNOME_VOLUME_APPLET (data);
+  GstMixerMessageType type;
+  GstMixerTrack *first_track;
+  GstMixerTrack *track = NULL;
+
+  if (applet->tracks == NULL || 
+      GST_MESSAGE_SRC (message) != GST_OBJECT (applet->mixer)) {
+    /* No tracks, or not from our mixer - can't update anything anyway */
+    return; 
+  }
+
+  first_track = g_list_first (applet->tracks)->data;
+
+  /* This code only calls refresh if the first_track changes, because the
+   * refresh code only retrieves the current value from that track anyway */
+  type = gst_mixer_message_get_type (message);
+  if (type == GST_MIXER_MESSAGE_MUTE_TOGGLED) {
+    gst_mixer_message_parse_mute_toggled (message, &track, NULL);
+  }
+  else { 
+    gst_mixer_message_parse_volume_changed (message, &track, NULL, NULL);
+  }
+
+  if (first_track == track)
+    gnome_volume_applet_refresh (GNOME_VOLUME_APPLET (data), FALSE);
+}
+
 static gboolean
 cb_check (gpointer data)
 {
@@ -1214,6 +1280,8 @@
             /* save */
             gst_object_replace ((GstObject **) &applet->mixer, item->data);
             gst_element_set_state (old_element, GST_STATE_NULL);
+
+            gnome_volume_applet_setup_timeout (applet);
             newdevice = TRUE;
           }
           break;
diff -ur gnome-applets-2.19.1/mixer/applet.h gnome-applets-2.19.1.new/mixer/applet.h
--- gnome-applets-2.19.1/mixer/applet.h	2007-07-28 03:02:35.000000000 +0100
+++ gnome-applets-2.19.1.new/mixer/applet.h	2007-08-30 20:21:10.000000000 +0100
@@ -71,6 +71,7 @@
 
   /* element */
   GstMixer *mixer;
+  GstBus *bus;
   gboolean lock;
   gint state;
   GList *tracks;
