diff --git a/gvc-mixer-control.c b/gvc-mixer-control.c
index e62edf4..2177956 100644
--- a/gvc-mixer-control.c
+++ b/gvc-mixer-control.c
@@ -1776,6 +1776,7 @@ update_source_output (GvcMixerControl             *control,
 {
         GvcMixerStream *stream;
         gboolean        is_new;
+        pa_volume_t     max_volume;
         const char     *name;
 
 #if 1
@@ -1802,10 +1803,14 @@ update_source_output (GvcMixerControl             *control,
         name = (const char *)g_hash_table_lookup (control->priv->clients,
                                                   GUINT_TO_POINTER (info->client));
 
+        max_volume = pa_cvolume_max (&info->volume);
+
         gvc_mixer_stream_set_name (stream, name);
         gvc_mixer_stream_set_description (stream, info->name);
         set_application_id_from_proplist (stream, info->proplist);
         set_is_event_stream_from_proplist (stream, info->proplist);
+        gvc_mixer_stream_set_volume (stream, (guint)max_volume);
+        gvc_mixer_stream_set_is_muted (stream, info->mute);
         set_icon_name_from_proplist (stream, info->proplist, "audio-input-microphone");
 
         if (is_new) {
diff --git a/gvc-mixer-source-output.c b/gvc-mixer-source-output.c
index dc856d0..664bb94 100644
--- a/gvc-mixer-source-output.c
+++ b/gvc-mixer-source-output.c
@@ -30,6 +30,8 @@
 #include <pulse/pulseaudio.h>
 
 #include "gvc-mixer-source-output.h"
+#include "gvc-mixer-stream-private.h"
+#include "gvc-channel-map-private.h"
 
 #define GVC_MIXER_SOURCE_OUTPUT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GVC_TYPE_MIXER_SOURCE_OUTPUT, GvcMixerSourceOutputPrivate))
 
@@ -45,8 +47,33 @@ G_DEFINE_TYPE (GvcMixerSourceOutput, gvc_mixer_source_output, GVC_TYPE_MIXER_STR
 static gboolean
 gvc_mixer_source_output_push_volume (GvcMixerStream *stream, gpointer *op)
 {
-        /* FIXME: */
-        *op = NULL;
+        pa_operation        *o;
+        guint                index;
+        const GvcChannelMap *map;
+        pa_context          *context;
+        const pa_cvolume    *cv;
+
+        index = gvc_mixer_stream_get_index (stream);
+
+        map = gvc_mixer_stream_get_channel_map (stream);
+
+        cv = gvc_channel_map_get_cvolume(map);
+
+        context = gvc_mixer_stream_get_pa_context (stream);
+
+        o = pa_context_set_source_output_volume (context,
+                                                 index,
+                                                 cv,
+                                                 NULL,
+                                                 NULL);
+
+        if (o == NULL) {
+                g_warning ("pa_context_set_source_output_volume() failed");
+                return FALSE;
+        }
+
+        *op = o;
+
         return TRUE;
 }
 
@@ -54,7 +81,26 @@ static gboolean
 gvc_mixer_source_output_change_is_muted (GvcMixerStream *stream,
                                       gboolean        is_muted)
 {
-        /* FIXME: */
+        pa_operation *o;
+        guint         index;
+        pa_context   *context;
+
+        index = gvc_mixer_stream_get_index (stream);
+        context = gvc_mixer_stream_get_pa_context (stream);
+
+        o = pa_context_set_source_output_mute (context,
+                                               index,
+                                               is_muted,
+                                               NULL,
+                                               NULL);
+
+        if (o == NULL) {
+                g_warning ("pa_context_set_source_output_mute_by_index() failed");
+                return FALSE;
+        }
+
+        pa_operation_unref(o);
+
         return TRUE;
 }
 
