diff -rup gnome-sound-effectsd-0.1.0/src/gsed-daemon.c gnome-sound-effectsd/src/gsed-daemon.c
--- gnome-sound-effectsd-0.1.0/src/gsed-daemon.c        2007-06-07 11:10:31.000000000 +0200
+++ gnome-sound-effectsd/src/gsed-daemon.c      2007-06-17 08:44:16.000000000 +0200
@@ -9,8 +9,6 @@ static void gse_daemon_class_init       (GseDa
 static void gse_daemon_init            (GseDaemon* daemon);
 static void gse_daemon_finalize                (GObject* object);
 
-#define GSE_DAEMON_GET_PRIVATE(obj)    (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GSE_TYPE_DAEMON, GseDaemonPrivate))
-
 struct _GseDaemonPrivate {
        GHashTable* sounds;
        GMainLoop* main_loop;
@@ -57,9 +55,23 @@ static gboolean
 bus_call (GstBus* bus, GstMessage* msg, gpointer data)
 {
        switch (GST_MESSAGE_TYPE (msg)) {
-               case GST_MESSAGE_EOS:
+               case GST_MESSAGE_EOS: {
                        g_debug ("End of stream");
+
+                       if (data) {
+                               GstState state, state_pending;
+                               GstStateChangeReturn ret;
+                               ret = gst_element_get_state (data, &state, &state_pending, 300 * GST_MSECOND);
+                               g_debug ("State after EOF: %s, pending: %s, state change: %s", gst_element_state_get_name (state), gst_element_state_get_name (state_pending), gst_element_state_change_return_get_name (ret));
+                               ret = gst_element_set_state (data, GST_STATE_NULL);
+                               g_debug ("Set GST_STATE_NULL: %s", gst_element_state_change_return_get_name (ret));
+                               ret = gst_element_get_state (data, &state, &state_pending, 300 * GST_MSECOND);
+                               g_debug ("State after Set GST_STATE_NULL: %s, pending: %s, state change: %s", gst_element_state_get_name (state), gst_element_state_get_name (state_pending), gst_element_state_change_return_get_name (ret));
+
+                       }
+
                        break;
+               }
 
                case GST_MESSAGE_ERROR: {
                        GError* error;
@@ -189,35 +201,7 @@ gse_daemon_load_sound (GseDaemon* daemon
                return FALSE;
        }
 
-       ret = gst_element_set_state (play, GST_STATE_PAUSED);
-       g_debug ("State change to PAUSED returned %s", gst_element_state_change_return_get_name (ret));
-       if (ret == GST_STATE_CHANGE_FAILURE) {
-               gchar* gst_error = parse_gst_error (bus);
-               g_set_error (error,
-                            GSE_DAEMON_ERROR,
-                            GSE_DAEMON_ERROR_LOADING,
-                            "Couldn't load \"%s\": %s",
-                            path,
-                            gst_error
-                           );
-               return FALSE;
-       }
-
-       ret = gst_element_get_state (play, &state, &state_pending, 700 * GST_MSECOND);
-       g_debug ("State after loading: %s, pending: %s, state change: %s", gst_element_state_get_name (state), gst_element_state_get_name (state_pending), gst_element_state_change_return_get_name (ret));
-       if (ret == GST_STATE_CHANGE_FAILURE) {
-               gchar* gst_error = parse_gst_error (bus);
-               g_set_error (error,
-                            GSE_DAEMON_ERROR,
-                            GSE_DAEMON_ERROR_LOADING,
-                            "Couldn't load \"%s\": %s",
-                            path,
-                            gst_error
-                           );
-               return FALSE;
-       }
-
-       gst_bus_add_watch (bus, bus_call, NULL);
+       gst_bus_add_watch (bus, bus_call, play);
        g_object_unref (bus);
        g_hash_table_insert (daemon->priv->sounds, g_strdup (key), play);
        return TRUE;
@@ -375,7 +359,7 @@ gse_daemon_init (GseDaemon* daemon)
 {
        g_debug ("gse_daemon_init ()");
 
-       daemon->priv = GSE_DAEMON_GET_PRIVATE (daemon);
+       daemon->priv = G_TYPE_INSTANCE_GET_PRIVATE (daemon, GSE_TYPE_DAEMON, GseDaemonPrivate);
 
        daemon->priv->sounds = g_hash_table_new (&g_str_hash, &g_str_equal);
 }
@@ -390,7 +374,7 @@ gse_daemon_finalize (GObject* object)
        g_return_if_fail (GSE_IS_DAEMON (object));
 
        daemon = GSE_DAEMON (object);
-       daemon->priv = GSE_DAEMON_GET_PRIVATE (daemon);
+       daemon->priv = G_TYPE_INSTANCE_GET_PRIVATE (daemon, GSE_TYPE_DAEMON, GseDaemonPrivate);
 
        g_hash_table_foreach (daemon->priv->sounds, delete_sound, NULL);
        g_hash_table_unref (daemon->priv->sounds);
