diff --git a/configure b/configure
--- a/configure
+++ b/configure
@@ -1,13 +1,13 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.65 for xmms2-client 0.0.2.0.
+# Generated by GNU Autoconf 2.67 for xmms2-client 0.0.2.0.
 #
 # Report bugs to <upwawet@gmail.com>.
 #
 #
 # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
-# Inc.
+# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software
+# Foundation, Inc.
 #
 #
 # This configure script is free software; the Free Software Foundation
@@ -318,7 +318,7 @@
       test -d "$as_dir" && break
     done
     test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
 
 
 } # as_fn_mkdir_p
@@ -358,19 +358,19 @@
 fi # as_fn_arith
 
 
-# as_fn_error ERROR [LINENO LOG_FD]
-# ---------------------------------
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
 # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
 # provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with status $?, using 1 if that was 0.
+# script with STATUS, using 1 if that was 0.
 as_fn_error ()
 {
-  as_status=$?; test $as_status -eq 0 && as_status=1
-  if test "$3"; then
-    as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-    $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
   fi
-  $as_echo "$as_me: error: $1" >&2
+  $as_echo "$as_me: error: $2" >&2
   as_fn_exit $as_status
 } # as_fn_error
 
@@ -532,7 +532,7 @@
 exec 6>&1
 
 # Name of the host.
-# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,
 # so uname gets run too.
 ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
 
@@ -674,8 +674,9 @@
   fi
 
   case $ac_option in
-  *=*)	ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
-  *)	ac_optarg=yes ;;
+  *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
+  *=)   ac_optarg= ;;
+  *)    ac_optarg=yes ;;
   esac
 
   # Accept the important Cygnus configure options, so we can diagnose typos.
@@ -720,7 +721,7 @@
     ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
     # Reject names that are not valid shell variable names.
     expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error "invalid feature name: $ac_useropt"
+      as_fn_error $? "invalid feature name: $ac_useropt"
     ac_useropt_orig=$ac_useropt
     ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
     case $ac_user_opts in
@@ -746,7 +747,7 @@
     ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
     # Reject names that are not valid shell variable names.
     expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error "invalid feature name: $ac_useropt"
+      as_fn_error $? "invalid feature name: $ac_useropt"
     ac_useropt_orig=$ac_useropt
     ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
     case $ac_user_opts in
@@ -950,7 +951,7 @@
     ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
     # Reject names that are not valid shell variable names.
     expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error "invalid package name: $ac_useropt"
+      as_fn_error $? "invalid package name: $ac_useropt"
     ac_useropt_orig=$ac_useropt
     ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
     case $ac_user_opts in
@@ -966,7 +967,7 @@
     ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'`
     # Reject names that are not valid shell variable names.
     expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null &&
-      as_fn_error "invalid package name: $ac_useropt"
+      as_fn_error $? "invalid package name: $ac_useropt"
     ac_useropt_orig=$ac_useropt
     ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'`
     case $ac_user_opts in
@@ -996,8 +997,8 @@
   | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
     x_libraries=$ac_optarg ;;
 
-  -*) as_fn_error "unrecognized option: \`$ac_option'
-Try \`$0 --help' for more information."
+  -*) as_fn_error $? "unrecognized option: \`$ac_option'
+Try \`$0 --help' for more information"
     ;;
 
   *=*)
@@ -1005,7 +1006,7 @@
     # Reject names that are not valid shell variable names.
     case $ac_envvar in #(
       '' | [0-9]* | *[!_$as_cr_alnum]* )
-      as_fn_error "invalid variable name: \`$ac_envvar'" ;;
+      as_fn_error $? "invalid variable name: \`$ac_envvar'" ;;
     esac
     eval $ac_envvar=\$ac_optarg
     export $ac_envvar ;;
@@ -1023,13 +1024,13 @@
 
 if test -n "$ac_prev"; then
   ac_option=--`echo $ac_prev | sed 's/_/-/g'`
-  as_fn_error "missing argument to $ac_option"
+  as_fn_error $? "missing argument to $ac_option"
 fi
 
 if test -n "$ac_unrecognized_opts"; then
   case $enable_option_checking in
     no) ;;
-    fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;;
+    fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;;
     *)     $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;;
   esac
 fi
@@ -1052,7 +1053,7 @@
     [\\/$]* | ?:[\\/]* )  continue;;
     NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
   esac
-  as_fn_error "expected an absolute directory name for --$ac_var: $ac_val"
+  as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val"
 done
 
 # There might be people who depend on the old broken behavior: `$host'
@@ -1066,8 +1067,8 @@
 if test "x$host_alias" != x; then
   if test "x$build_alias" = x; then
     cross_compiling=maybe
-    $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
-    If a cross compiler is detected then cross compile mode will be used." >&2
+    $as_echo "$as_me: WARNING: if you wanted to set the --build type, don't use --host.
+    If a cross compiler is detected then cross compile mode will be used" >&2
   elif test "x$build_alias" != "x$host_alias"; then
     cross_compiling=yes
   fi
@@ -1082,9 +1083,9 @@
 ac_pwd=`pwd` && test -n "$ac_pwd" &&
 ac_ls_di=`ls -di .` &&
 ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
-  as_fn_error "working directory cannot be determined"
+  as_fn_error $? "working directory cannot be determined"
 test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
-  as_fn_error "pwd does not report name of working directory"
+  as_fn_error $? "pwd does not report name of working directory"
 
 
 # Find the source files, if location was not specified.
@@ -1123,11 +1124,11 @@
 fi
 if test ! -r "$srcdir/$ac_unique_file"; then
   test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
-  as_fn_error "cannot find sources ($ac_unique_file) in $srcdir"
+  as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir"
 fi
 ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
 ac_abs_confdir=`(
-	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg"
+	cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg"
 	pwd)`
 # When building in place, set srcdir=.
 if test "$ac_abs_confdir" = "$ac_pwd"; then
@@ -1167,7 +1168,7 @@
       --help=short        display options specific to this package
       --help=recursive    display the short help of all the included packages
   -V, --version           display version information and exit
-  -q, --quiet, --silent   do not print \`checking...' messages
+  -q, --quiet, --silent   do not print \`checking ...' messages
       --cache-file=FILE   cache test results in FILE [disabled]
   -C, --config-cache      alias for \`--cache-file=config.cache'
   -n, --no-create         do not create output files
@@ -1297,9 +1298,9 @@
 if $ac_init_version; then
   cat <<\_ACEOF
 xmms2-client configure 0.0.2.0
-generated by GNU Autoconf 2.65
+generated by GNU Autoconf 2.67
 
-Copyright (C) 2009 Free Software Foundation, Inc.
+Copyright (C) 2010 Free Software Foundation, Inc.
 This configure script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it.
 _ACEOF
@@ -1314,7 +1315,7 @@
 running configure, to aid debugging if configure makes a mistake.
 
 It was created by xmms2-client $as_me 0.0.2.0, which was
-generated by GNU Autoconf 2.65.  Invocation command line was
+generated by GNU Autoconf 2.67.  Invocation command line was
 
   $ $0 $@
 
@@ -1424,11 +1425,9 @@
   {
     echo
 
-    cat <<\_ASBOX
-## ---------------- ##
+    $as_echo "## ---------------- ##
 ## Cache variables. ##
-## ---------------- ##
-_ASBOX
+## ---------------- ##"
     echo
     # The following way of writing the cache mishandles newlines in values,
 (
@@ -1462,11 +1461,9 @@
 )
     echo
 
-    cat <<\_ASBOX
-## ----------------- ##
+    $as_echo "## ----------------- ##
 ## Output variables. ##
-## ----------------- ##
-_ASBOX
+## ----------------- ##"
     echo
     for ac_var in $ac_subst_vars
     do
@@ -1479,11 +1476,9 @@
     echo
 
     if test -n "$ac_subst_files"; then
-      cat <<\_ASBOX
-## ------------------- ##
+      $as_echo "## ------------------- ##
 ## File substitutions. ##
-## ------------------- ##
-_ASBOX
+## ------------------- ##"
       echo
       for ac_var in $ac_subst_files
       do
@@ -1497,11 +1492,9 @@
     fi
 
     if test -s confdefs.h; then
-      cat <<\_ASBOX
-## ----------- ##
+      $as_echo "## ----------- ##
 ## confdefs.h. ##
-## ----------- ##
-_ASBOX
+## ----------- ##"
       echo
       cat confdefs.h
       echo
@@ -1556,7 +1549,12 @@
 ac_site_file1=NONE
 ac_site_file2=NONE
 if test -n "$CONFIG_SITE"; then
-  ac_site_file1=$CONFIG_SITE
+  # We do not want a PATH search for config.site.
+  case $CONFIG_SITE in #((
+    -*)  ac_site_file1=./$CONFIG_SITE;;
+    */*) ac_site_file1=$CONFIG_SITE;;
+    *)   ac_site_file1=./$CONFIG_SITE;;
+  esac
 elif test "x$prefix" != xNONE; then
   ac_site_file1=$prefix/share/config.site
   ac_site_file2=$prefix/etc/config.site
@@ -1571,7 +1569,11 @@
     { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5
 $as_echo "$as_me: loading site script $ac_site_file" >&6;}
     sed 's/^/| /' "$ac_site_file" >&5
-    . "$ac_site_file"
+    . "$ac_site_file" \
+      || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "failed to load site script $ac_site_file
+See \`config.log' for more details" "$LINENO" 5 ; }
   fi
 done
 
@@ -1647,7 +1649,7 @@
 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
   { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5
 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;}
-  as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
+  as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5
 fi
 ## -------------------- ##
 ## Main body of script. ##
@@ -1864,7 +1866,7 @@
 fi
 
 
-ac_config_files="$ac_config_files xmms2-client.buildinfo Makefile src/Makefile src/Control/Makefile src/Control/Monad/Makefile src/XMMS2/Makefile src/XMMS2/Client/Makefile src/XMMS2/Client/Types/Makefile src/XMMS2/Client/Bindings/Makefile src/XMMS2/Client/Bindings/Types/Makefile"
+ac_config_files="$ac_config_files xmms2-client.buildinfo Makefile src/Makefile src/XMMS2/Makefile src/XMMS2/Client/Makefile src/XMMS2/Client/Types/Makefile src/XMMS2/Client/Bindings/Makefile src/XMMS2/Client/Bindings/Types/Makefile"
 
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
@@ -1985,6 +1987,7 @@
 
 ac_libobjs=
 ac_ltlibobjs=
+U=
 for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
   # 1. Remove the extension, and $U if already installed.
   ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
@@ -2146,19 +2149,19 @@
 (unset CDPATH) >/dev/null 2>&1 && unset CDPATH
 
 
-# as_fn_error ERROR [LINENO LOG_FD]
-# ---------------------------------
+# as_fn_error STATUS ERROR [LINENO LOG_FD]
+# ----------------------------------------
 # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
 # provided, also output the error to LOG_FD, referencing LINENO. Then exit the
-# script with status $?, using 1 if that was 0.
+# script with STATUS, using 1 if that was 0.
 as_fn_error ()
 {
-  as_status=$?; test $as_status -eq 0 && as_status=1
-  if test "$3"; then
-    as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-    $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3
+  as_status=$1; test $as_status -eq 0 && as_status=1
+  if test "$4"; then
+    as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+    $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
   fi
-  $as_echo "$as_me: error: $1" >&2
+  $as_echo "$as_me: error: $2" >&2
   as_fn_exit $as_status
 } # as_fn_error
 
@@ -2354,7 +2357,7 @@
       test -d "$as_dir" && break
     done
     test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir"
+  } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
 
 
 } # as_fn_mkdir_p
@@ -2408,7 +2411,7 @@
 # values after options handling.
 ac_log="
 This file was extended by xmms2-client $as_me 0.0.2.0, which was
-generated by GNU Autoconf 2.65.  Invocation command line was
+generated by GNU Autoconf 2.67.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
   CONFIG_HEADERS  = $CONFIG_HEADERS
@@ -2461,10 +2464,10 @@
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
 xmms2-client config.status 0.0.2.0
-configured by $0, generated by GNU Autoconf 2.65,
+configured by $0, generated by GNU Autoconf 2.67,
   with options \\"\$ac_cs_config\\"
 
-Copyright (C) 2009 Free Software Foundation, Inc.
+Copyright (C) 2010 Free Software Foundation, Inc.
 This config.status script is free software; the Free Software Foundation
 gives unlimited permission to copy, distribute and modify it."
 
@@ -2479,11 +2482,16 @@
 while test $# != 0
 do
   case $1 in
-  --*=*)
+  --*=?*)
     ac_option=`expr "X$1" : 'X\([^=]*\)='`
     ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
     ac_shift=:
     ;;
+  --*=)
+    ac_option=`expr "X$1" : 'X\([^=]*\)='`
+    ac_optarg=
+    ac_shift=:
+    ;;
   *)
     ac_option=$1
     ac_optarg=$2
@@ -2505,6 +2513,7 @@
     $ac_shift
     case $ac_optarg in
     *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
+    '') as_fn_error $? "missing file argument" ;;
     esac
     as_fn_append CONFIG_FILES " '$ac_optarg'"
     ac_need_defaults=false;;
@@ -2515,7 +2524,7 @@
     ac_cs_silent=: ;;
 
   # This is an error.
-  -*) as_fn_error "unrecognized option: \`$1'
+  -*) as_fn_error $? "unrecognized option: \`$1'
 Try \`$0 --help' for more information." ;;
 
   *) as_fn_append ac_config_targets " $1"
@@ -2567,15 +2576,13 @@
     "xmms2-client.buildinfo") CONFIG_FILES="$CONFIG_FILES xmms2-client.buildinfo" ;;
     "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
     "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;;
-    "src/Control/Makefile") CONFIG_FILES="$CONFIG_FILES src/Control/Makefile" ;;
-    "src/Control/Monad/Makefile") CONFIG_FILES="$CONFIG_FILES src/Control/Monad/Makefile" ;;
     "src/XMMS2/Makefile") CONFIG_FILES="$CONFIG_FILES src/XMMS2/Makefile" ;;
     "src/XMMS2/Client/Makefile") CONFIG_FILES="$CONFIG_FILES src/XMMS2/Client/Makefile" ;;
     "src/XMMS2/Client/Types/Makefile") CONFIG_FILES="$CONFIG_FILES src/XMMS2/Client/Types/Makefile" ;;
     "src/XMMS2/Client/Bindings/Makefile") CONFIG_FILES="$CONFIG_FILES src/XMMS2/Client/Bindings/Makefile" ;;
     "src/XMMS2/Client/Bindings/Types/Makefile") CONFIG_FILES="$CONFIG_FILES src/XMMS2/Client/Bindings/Types/Makefile" ;;
 
-  *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
+  *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5 ;;
   esac
 done
 
@@ -2611,7 +2618,7 @@
 {
   tmp=./conf$$-$RANDOM
   (umask 077 && mkdir "$tmp")
-} || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5
+} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
 
 # Set up the scripts for CONFIG_FILES section.
 # No need to generate them if there are no CONFIG_FILES.
@@ -2628,7 +2635,7 @@
 fi
 ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
 if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
-  ac_cs_awk_cr='\r'
+  ac_cs_awk_cr='\\r'
 else
   ac_cs_awk_cr=$ac_cr
 fi
@@ -2642,18 +2649,18 @@
   echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' &&
   echo "_ACEOF"
 } >conf$$subs.sh ||
-  as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
-ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'`
+  as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
+ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'`
 ac_delim='%!_!# '
 for ac_last_try in false false false false false :; do
   . ./conf$$subs.sh ||
-    as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
 
   ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X`
   if test $ac_delim_n = $ac_delim_num; then
     break
   elif $ac_last_try; then
-    as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5
+    as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5
   else
     ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
   fi
@@ -2742,20 +2749,28 @@
 else
   cat
 fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \
-  || as_fn_error "could not setup config files machinery" "$LINENO" 5
+  || as_fn_error $? "could not setup config files machinery" "$LINENO" 5
 _ACEOF
 
-# VPATH may cause trouble with some makes, so we remove $(srcdir),
-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# VPATH may cause trouble with some makes, so we remove sole $(srcdir),
+# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and
 # trailing colons and then remove the whole line if VPATH becomes empty
 # (actually we leave an empty line to preserve line numbers).
 if test "x$srcdir" = x.; then
-  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
-s/:*\$(srcdir):*/:/
-s/:*\${srcdir}:*/:/
-s/:*@srcdir@:*/:/
-s/^\([^=]*=[	 ]*\):*/\1/
+  ac_vpsub='/^[	 ]*VPATH[	 ]*=[	 ]*/{
+h
+s///
+s/^/:/
+s/[	 ]*$/:/
+s/:\$(srcdir):/:/g
+s/:\${srcdir}:/:/g
+s/:@srcdir@:/:/g
+s/^:*//
 s/:*$//
+x
+s/\(=[	 ]*\).*/\1/
+G
+s/\n//
 s/^[^=]*=[	 ]*$//
 }'
 fi
@@ -2773,7 +2788,7 @@
   esac
   case $ac_mode$ac_tag in
   :[FHL]*:*);;
-  :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;;
+  :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5 ;;
   :[FH]-) ac_tag=-:-;;
   :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
   esac
@@ -2801,7 +2816,7 @@
 	   [\\/$]*) false;;
 	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
 	   esac ||
-	   as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;;
+	   as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5 ;;
       esac
       case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
       as_fn_append ac_file_inputs " '$ac_f'"
@@ -2828,7 +2843,7 @@
 
     case $ac_tag in
     *:-:* | *:-) cat >"$tmp/stdin" \
-      || as_fn_error "could not create $ac_file" "$LINENO" 5 ;;
+      || as_fn_error $? "could not create $ac_file" "$LINENO" 5  ;;
     esac
     ;;
   esac
@@ -2954,22 +2969,22 @@
 $ac_datarootdir_hack
 "
 eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \
-  || as_fn_error "could not create $ac_file" "$LINENO" 5
+  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
 
 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
   { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
   { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
   { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined." >&5
+which seems to be undefined.  Please make sure it is defined" >&5
 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined." >&2;}
+which seems to be undefined.  Please make sure it is defined" >&2;}
 
   rm -f "$tmp/stdin"
   case $ac_file in
   -) cat "$tmp/out" && rm -f "$tmp/out";;
   *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";;
   esac \
-  || as_fn_error "could not create $ac_file" "$LINENO" 5
+  || as_fn_error $? "could not create $ac_file" "$LINENO" 5
  ;;
 
 
@@ -2984,7 +2999,7 @@
 ac_clean_files=$ac_clean_files_save
 
 test $ac_write_fail = 0 ||
-  as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5
+  as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5
 
 
 # configure is writing to config.log, and then calls config.status.
@@ -3005,7 +3020,7 @@
   exec 5>>config.log
   # Use ||, not &&, to avoid exiting from the if with $? = 1, which
   # would make configure fail if this is the last instruction.
-  $ac_cs_success || as_fn_exit $?
+  $ac_cs_success || as_fn_exit 1
 fi
 if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
   { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5
diff --git a/configure.ac b/configure.ac
--- a/configure.ac
+++ b/configure.ac
@@ -15,8 +15,6 @@
 AC_CONFIG_FILES(xmms2-client.buildinfo
                 Makefile
 				src/Makefile
-                src/Control/Makefile
-                src/Control/Monad/Makefile
 				src/XMMS2/Makefile
 				src/XMMS2/Client/Makefile
                 src/XMMS2/Client/Types/Makefile
diff --git a/src/Control/Makefile.in b/src/Control/Makefile.in
deleted file mode 100644
--- a/src/Control/Makefile.in
+++ /dev/null
@@ -1,1 +0,0 @@
-include @abs_top_srcdir@/Makefile
diff --git a/src/Control/Monad/Makefile.in b/src/Control/Monad/Makefile.in
deleted file mode 100644
--- a/src/Control/Monad/Makefile.in
+++ /dev/null
@@ -1,1 +0,0 @@
-include @abs_top_srcdir@/Makefile
diff --git a/src/Control/Monad/ToIO.hs b/src/Control/Monad/ToIO.hs
deleted file mode 100644
--- a/src/Control/Monad/ToIO.hs
+++ /dev/null
@@ -1,38 +0,0 @@
--- -*-haskell-*-
---  XMMS2 client library.
---
---  Author:  Oleg Belozeorov
---  Created: 14 Jan. 2010
---
---  Copyright (C) 2009-2010 Oleg Belozeorov
---
---  This library is free software; you can redistribute it and/or
---  modify it under the terms of the GNU Lesser General Public
---  License as published by the Free Software Foundation; either
---  version 3 of the License, or (at your option) any later version.
---
---  This library is distributed in the hope that it will be useful,
---  but WITHOUT ANY WARRANTY; without even the implied warranty of
---  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
---  Lesser General Public License for more details.
---
-
-module Control.Monad.ToIO
-  ( MonadToIO (..)
-  ) where
-
-import Control.Monad.Reader
-
-
-class Monad m => MonadToIO m where
-  toIO :: m (m a -> IO a)
-          
-
-instance MonadToIO IO where
-  toIO = return id
-
-instance MonadToIO m => MonadToIO (ReaderT r m) where
-  toIO = do
-    r <- ask
-    w <- lift toIO
-    return $ w . flip runReaderT r
diff --git a/src/XMMS2/Client/Coll.hs b/src/XMMS2/Client/Coll.hs
--- a/src/XMMS2/Client/Coll.hs
+++ b/src/XMMS2/Client/Coll.hs
@@ -81,31 +81,31 @@
                                   , name      = name }
 
 
-collGet :: Connection -> String -> String -> IO (Result Coll)
+collGet :: Connection -> String -> String -> IO (Result Default Coll)
 collGet xmmsc name ns =
   liftResult $ B.collGet xmmsc name ns
 
-collList :: Connection -> String -> IO (Result [String])
+collList :: Connection -> String -> IO (Result Default [String])
 collList xmmsc ns =
   liftResult $ B.collList xmmsc ns
 
-collSave :: Connection -> Coll -> String -> String -> IO (Result ())
+collSave :: Connection -> Coll -> String -> String -> IO (Result Default ())
 collSave xmmsc coll name ns =
   liftResult $ B.collSave xmmsc coll name ns
 
-collRemove :: Connection -> String -> String -> IO (Result ())
+collRemove :: Connection -> String -> String -> IO (Result Default ())
 collRemove xmmsc name ns =
   liftResult $ B.collRemove xmmsc name ns
 
-collRename :: Connection -> String -> String -> String -> IO (Result ())
+collRename :: Connection -> String -> String -> String -> IO (Result Default ())
 collRename xmmsc from to ns =
   liftResult $ B.collRename xmmsc from to ns
 
-collIdlistFromPlaylistFile :: Connection -> String -> IO (Result Coll)
+collIdlistFromPlaylistFile :: Connection -> String -> IO (Result Default Coll)
 collIdlistFromPlaylistFile xmmsc file =
   liftResult $ B.collIdlistFromPlaylistFile xmmsc file
 
-collSync :: Connection -> IO (Result ())
+collSync :: Connection -> IO (Result Default ())
 collSync xmmsc =
   liftResult $ B.collSync xmmsc
 
@@ -115,11 +115,11 @@
   [String]   ->
   Int        ->
   Int        ->
-  IO (Result [Int32])
+  IO (Result Default [Int32])
 collQueryIds xmmsc coll order start len = do
   order' <- valueNew order
   liftResult $ B.collQueryIds xmmsc coll order' start len
 
 
-broadcastCollectionChanged :: Connection -> IO (Result CollectionChange)
+broadcastCollectionChanged :: Connection -> IO (Result Broadcast CollectionChange)
 broadcastCollectionChanged = liftResult . B.broadcastCollectionChanged
diff --git a/src/XMMS2/Client/Medialib.hs b/src/XMMS2/Client/Medialib.hs
--- a/src/XMMS2/Client/Medialib.hs
+++ b/src/XMMS2/Client/Medialib.hs
@@ -54,27 +54,27 @@
       return BrowseEntry { entryPath = path, entryIsDir = dirp }
 
 
-medialibAddEntry :: Connection -> String -> IO (Result ())
+medialibAddEntry :: Connection -> String -> IO (Result Default ())
 medialibAddEntry xmmsc url =
   liftResult $ B.medialibAddEntry xmmsc url
 
-medialibAddEntryFull :: Connection -> String -> [String] -> IO (Result ())
+medialibAddEntryFull :: Connection -> String -> [String] -> IO (Result Default ())
 medialibAddEntryFull xmmsc url args =
   liftResult $ B.medialibAddEntryFull xmmsc url =<< valueNew args
 
-medialibAddEntryEncoded :: Connection -> String -> IO (Result ())
+medialibAddEntryEncoded :: Connection -> String -> IO (Result Default ())
 medialibAddEntryEncoded xmmsc url =
   liftResult $ B.medialibAddEntryEncoded xmmsc url
 
-medialibGetInfo :: Connection -> Int32 -> IO (Result PropDict)
+medialibGetInfo :: Connection -> Int32 -> IO (Result Default PropDict)
 medialibGetInfo xmmsc id =
   liftResult $ B.medialibGetInfo xmmsc id
 
-medialibGetId :: Connection -> String -> IO (Result Int32)
+medialibGetId :: Connection -> String -> IO (Result Default Int32)
 medialibGetId xmmsc url =
   liftResult $ B.medialibGetId xmmsc url
 
-medialibGetIdEncoded :: Connection -> String -> IO (Result Int32)
+medialibGetIdEncoded :: Connection -> String -> IO (Result Default Int32)
 medialibGetIdEncoded xmmsc url =
   liftResult $ B.medialibGetIdEncoded xmmsc url
 
@@ -84,7 +84,7 @@
   Maybe String           ->
   String                 ->
   Property               ->
-  IO (Result ())
+  IO (Result Default ())
 medialibEntryPropertySet xmmsc id (Just src) key (PropInt32 val) =
   liftResult $ B.medialibEntryPropertySetIntWithSource xmmsc id src key val
 medialibEntryPropertySet xmmsc id Nothing key (PropInt32 val) =
@@ -99,17 +99,17 @@
   Int32                     ->
   Maybe String              ->
   String                    ->
-  IO (Result ())
+  IO (Result Default ())
 medialibEntryPropertyRemove xmmsc id (Just src) key =
   liftResult $ B.medialibEntryPropertyRemoveWithSource xmmsc id src key
 medialibEntryPropertyRemove xmmsc id Nothing key =
   liftResult $ B.medialibEntryPropertyRemove xmmsc id key
 
-xformMediaBrowse :: Connection -> String -> IO (Result [BrowseEntry])
+xformMediaBrowse :: Connection -> String -> IO (Result Default [BrowseEntry])
 xformMediaBrowse xmmsc url =
   liftResult $ B.xformMediaBrowse xmmsc url
 
 
-broadcastMedialibEntryChanged :: Connection -> IO (Result Int32)
+broadcastMedialibEntryChanged :: Connection -> IO (Result Broadcast Int32)
 broadcastMedialibEntryChanged =
   liftResult . B.broadcastMedialibEntryChanged
diff --git a/src/XMMS2/Client/Playback.hs b/src/XMMS2/Client/Playback.hs
--- a/src/XMMS2/Client/Playback.hs
+++ b/src/XMMS2/Client/Playback.hs
@@ -51,64 +51,64 @@
   valueGet v = (toEnum . fromIntegral) <$> getInt v
 
 
-playbackStop :: Connection -> IO (Result ())
+playbackStop :: Connection -> IO (Result Default ())
 playbackStop xmmsc =
   liftResult $ B.playbackStop xmmsc
 
-playbackTickle :: Connection -> IO (Result ())
+playbackTickle :: Connection -> IO (Result Default ())
 playbackTickle xmmsc =
   liftResult $ B.playbackTickle xmmsc
 
-playbackStart :: Connection -> IO (Result ())
+playbackStart :: Connection -> IO (Result Default ())
 playbackStart xmmsc =
   liftResult $ B.playbackStart xmmsc
 
-playbackPause :: Connection -> IO (Result ())
+playbackPause :: Connection -> IO (Result Default ())
 playbackPause xmmsc =
   liftResult $ B.playbackPause xmmsc
 
-playbackCurrentId :: Connection -> IO (Result Int32)
+playbackCurrentId :: Connection -> IO (Result Default Int32)
 playbackCurrentId xmmsc =
   liftResult $ B.playbackCurrentId xmmsc
 
-playbackSeekMs :: Connection -> Int32 -> SeekMode -> IO (Result ())
+playbackSeekMs :: Connection -> Int32 -> SeekMode -> IO (Result Default ())
 playbackSeekMs xmmsc pos whence
   = liftResult $ B.playbackSeekMs xmmsc pos whence
 
-playbackSeekSamples :: Connection -> Int32 -> SeekMode -> IO (Result ())
+playbackSeekSamples :: Connection -> Int32 -> SeekMode -> IO (Result Default ())
 playbackSeekSamples xmmsc pos whence =
   liftResult $ B.playbackSeekSamples xmmsc pos whence
 
-playbackPlaytime :: Connection -> IO (Result Int32)
+playbackPlaytime :: Connection -> IO (Result Default Int32)
 playbackPlaytime xmmsc =
   liftResult $ B.playbackPlaytime xmmsc
 
-playbackStatus :: Connection -> IO (Result PlaybackStatus)
+playbackStatus :: Connection -> IO (Result Default PlaybackStatus)
 playbackStatus xmmsc =
   liftResult $ B.playbackStatus xmmsc
 
-playbackVolumeSet :: Connection -> String -> Int -> IO (Result ())
+playbackVolumeSet :: Connection -> String -> Int -> IO (Result Default ())
 playbackVolumeSet xmmsc chan vol =
   liftResult $ B.playbackVolumeSet xmmsc chan vol
 
-playbackVolumeGet :: Connection -> IO (Result (Dict Int32))
+playbackVolumeGet :: Connection -> IO (Result Default (Dict Int32))
 playbackVolumeGet xmmsc =
   liftResult $ B.playbackVolumeGet xmmsc
 
 
-broadcastPlaybackVolumeChanged :: Connection -> IO (Result (Dict Int32))
+broadcastPlaybackVolumeChanged :: Connection -> IO (Result Broadcast (Dict Int32))
 broadcastPlaybackVolumeChanged =
   liftResult . B.broadcastPlaybackVolumeChanged
 
-broadcastPlaybackStatus :: Connection -> IO (Result PlaybackStatus)
+broadcastPlaybackStatus :: Connection -> IO (Result Broadcast PlaybackStatus)
 broadcastPlaybackStatus =
   liftResult . B.broadcastPlaybackStatus
 
-broadcastPlaybackCurrentId :: Connection -> IO (Result Int32)
+broadcastPlaybackCurrentId :: Connection -> IO (Result Broadcast Int32)
 broadcastPlaybackCurrentId =
   liftResult . B.broadcastPlaybackCurrentId
 
 
-signalPlaybackPlaytime :: Connection -> IO (Result Int32)
+signalPlaybackPlaytime :: Connection -> IO (Result Signal Int32)
 signalPlaybackPlaytime =
   liftResult . B.signalPlaybackPlaytime
diff --git a/src/XMMS2/Client/Playlist.hs b/src/XMMS2/Client/Playlist.hs
--- a/src/XMMS2/Client/Playlist.hs
+++ b/src/XMMS2/Client/Playlist.hs
@@ -147,7 +147,7 @@
   :: Connection
   -> Maybe String
   -> URL
-  -> IO (Result ())
+  -> IO (Result Default ())
 playlistAddURL xmmsc name url =
   liftResult $ B.playlistAddURL xmmsc name url
 
@@ -155,7 +155,7 @@
   Connection   ->
   Maybe String ->
   MediaId      ->
-  IO (Result ())
+  IO (Result Default ())
 playlistAddId xmmsc name id =
   liftResult $ B.playlistAddId xmmsc name id
 
@@ -163,7 +163,7 @@
   Connection       ->
   Maybe String     ->
   EncodedURL       ->
-  IO (Result ())
+  IO (Result Default ())
 playlistAddEncoded xmmsc name url =
   liftResult $ B.playlistAddEncoded xmmsc name url
 
@@ -171,7 +171,7 @@
   Connection      ->
   Maybe String    ->
   Coll            ->
-  IO (Result ())
+  IO (Result Default ())
 playlistAddIdlist xmmsc name idlist =
   liftResult $ B.playlistAddIdlist xmmsc name idlist
 
@@ -180,7 +180,7 @@
   Maybe String        ->
   Coll                ->
   [String]            ->
-  IO (Result ())
+  IO (Result Default ())
 playlistAddCollection xmmsc name coll order =
   liftResult $ B.playlistAddCollection xmmsc name coll =<< newList order
 
@@ -188,35 +188,35 @@
   Connection        ->
   Maybe String      ->
   Int               ->
-  IO (Result ())
+  IO (Result Default ())
 playlistRemoveEntry xmmsc name num =
   liftResult $ B.playlistRemoveEntry xmmsc name num
 
 playlistClear  ::
   Connection   ->
   Maybe String ->
-  IO (Result ())
+  IO (Result Default ())
 playlistClear xmmsc name =
   liftResult $ B.playlistClear xmmsc name
 
 playlistListEntries ::
   Connection        ->
   Maybe String      ->
-  IO (Result [MediaId])
+  IO (Result Default [MediaId])
 playlistListEntries xmmsc name =
   liftResult $ B.playlistListEntries xmmsc name
 
 playlistSetNext ::
   Connection    ->
   Int32         ->
-  IO (Result ())
+  IO (Result Default ())
 playlistSetNext xmmsc num =
   liftResult $ B.playlistSetNext xmmsc num
 
 playlistSetNextRel ::
   Connection       ->
   Int32            ->
-  IO (Result ())
+  IO (Result Default ())
 playlistSetNextRel xmmsc num =
   liftResult $ B.playlistSetNextRel xmmsc num
 
@@ -227,21 +227,21 @@
   -> Maybe String
   -> Int
   -> Int
-  -> IO (Result ())
+  -> IO (Result Default ())
 playlistMoveEntry xmmsc name from to =
   liftResult $ B.playlistMoveEntry xmmsc name from to
 
 playlistCurrentPos ::
   Connection       ->
   Maybe String     ->
-  IO (Result PlaylistPosition)
+  IO (Result Default PlaylistPosition)
 playlistCurrentPos xmmsc name =
   liftResult $ B.playlistCurrentPos xmmsc name
 
 -- | Retrieve the name of the active playlist.
 playlistCurrentActive ::
   Connection          ->
-  IO (Result String)
+  IO (Result Default String)
 playlistCurrentActive xmmsc =
   liftResult $ B.playlistCurrentActive xmmsc
 
@@ -250,7 +250,7 @@
   Maybe String   ->
   Int            ->
   MediaId        ->
-  IO (Result ())
+  IO (Result Default ())
 playlistInsertId xmmsc name pos id =
   liftResult $ B.playlistInsertId xmmsc name pos id
 
@@ -258,7 +258,7 @@
   Connection   ->
   Maybe String ->
   URL          ->
-  IO (Result ())
+  IO (Result Default ())
 playlistRAdd xmmsc name url =
   liftResult $ B.playlistRAdd xmmsc name url
 
@@ -266,7 +266,7 @@
   Connection        ->
   Maybe String      ->
   EncodedURL        ->
-  IO (Result ())
+  IO (Result Default ())
 playlistRAddEncoded xmmsc name url =
   liftResult $ B.playlistRAddEncoded xmmsc name url
 
@@ -276,18 +276,18 @@
 
 broadcastPlaylistChanged ::
   Connection             ->
-  IO (Result PlaylistChange)
+  IO (Result Broadcast PlaylistChange)
 broadcastPlaylistChanged =
   liftResult . B.broadcastPlaylistChanged
 
 broadcastPlaylistCurrentPos ::
   Connection                ->
-  IO (Result ())
+  IO (Result Broadcast ())
 broadcastPlaylistCurrentPos =
   liftResult . B.broadcastPlaylistCurrentPos
 
 broadcastPlaylistLoaded ::
   Connection            ->
-  IO (Result String)
+  IO (Result Broadcast String)
 broadcastPlaylistLoaded =
   liftResult . B.broadcastPlaylistLoaded
diff --git a/src/XMMS2/Client/Result.hs b/src/XMMS2/Client/Result.hs
--- a/src/XMMS2/Client/Result.hs
+++ b/src/XMMS2/Client/Result.hs
@@ -22,17 +22,21 @@
   , liftResult
   , resultWait
   , resultGetValue
-  , ResultM
+  , ResultM (..)
+  , (>>*)
   , resultRawValue
   , result
   , resultLength
-  , (>>*)
+  , Default
+  , Signal
+  , Broadcast
+  , persist
   ) where
 
 import Control.Applicative
 import Control.Monad.Trans
 import Control.Monad.Reader
-import Control.Monad.ToIO
+import Control.Monad.State
 
 import XMMS2.Client.Types
 
@@ -40,36 +44,47 @@
 import qualified XMMS2.Client.Bindings.Result as B
 
 
-newtype Result a = Result B.Result
-
-liftResult = (return . Result =<<)
+newtype Result c a = Result B.Result
 
+liftResult = liftM Result
 
 resultWait (Result r) = B.resultWait r
 
 resultGetValue (Result r) = B.resultGetValue r
 
 
-newtype RVC a = RVC { value :: Value }
+newtype ResultM c a b
+  = ResultM { unResultM :: ReaderT Value (StateT Bool IO) b }
+  deriving (Functor, Monad, MonadIO)
 
-type ResultM m a b = ReaderT (RVC a) m b
+execResultM :: ResultM c a b -> Value -> IO Bool
+execResultM r v = execStateT (runReaderT (unResultM r) v) False
 
-runResultM :: (MonadIO m, MonadToIO m) => ResultM m a b -> Value -> m b
-runResultM f v = runReaderT f $ RVC v
 
+(>>*) :: IO (Result c a) -> ResultM c a b -> IO ()
+f >>* h = do
+  (Result result) <- f
+  B.resultNotifierSet result $ execResultM h
 
-resultRawValue :: (ValueGet a, MonadIO m, MonadToIO m) => ResultM m a Value
-resultRawValue = value <$> ask
+resultRawValue :: ResultM c a Value
+resultRawValue = ResultM ask
 
-result :: (ValueGet a, MonadIO m, MonadToIO m) => ResultM m a a
+result :: ValueGet a => ResultM c a a
 result = resultRawValue >>= liftIO . valueGet
 
-resultLength :: (ValueGet a, ValueGet [a], MonadIO m, MonadToIO m) => ResultM m [a] Integer
+resultLength :: (ValueGet a, ValueGet [a]) => ResultM c [a] Integer
 resultLength = resultRawValue >>= liftIO . listGetSize
 
 
-(>>*) :: (ValueGet a, MonadIO m, MonadToIO m) => m (Result a) -> ResultM m a Bool -> m ()
-f >>* h = do
-  (Result result)  <- f
-  wrapper          <- toIO
-  liftIO $ B.resultNotifierSet result $ \v -> wrapper (runResultM h v)
+class PersistentResultClass c
+
+data Default
+
+data Signal
+instance PersistentResultClass Signal
+
+data Broadcast
+instance PersistentResultClass Broadcast
+
+persist :: PersistentResultClass c => ResultM c a ()
+persist = ResultM $ put True
diff --git a/src/XMMS2/Client/Stats.hs b/src/XMMS2/Client/Stats.hs
--- a/src/XMMS2/Client/Stats.hs
+++ b/src/XMMS2/Client/Stats.hs
@@ -34,6 +34,6 @@
 {-# DEPRECATED pluginList "Use mainListPlugins" #-}
 pluginList = mainListPlugins
 
-mainListPlugins :: Connection -> PluginType -> IO (Result [Dict Data])
+mainListPlugins :: Connection -> PluginType -> IO (Result Default [Dict Data])
 mainListPlugins xmmsc ptype =
   liftResult $ B.mainListPlugins xmmsc ptype
diff --git a/xmms2-client.cabal b/xmms2-client.cabal
--- a/xmms2-client.cabal
+++ b/xmms2-client.cabal
@@ -1,5 +1,5 @@
 name:               xmms2-client
-version:            0.0.3.9
+version:            0.0.4.0
 
 author:             Oleg Belozeorov
 maintainer:         Oleg Belozeorov <upwawet@gmail.com>
@@ -28,8 +28,6 @@
                     src/XMMS2/Client/Bindings/Types/Makefile.in,
                     src/XMMS2/Client/Makefile.in,
                     src/XMMS2/Client/Types/Makefile.in,
-                    src/Control/Makefile.in,
-                    src/Control/Monad/Makefile.in,
                     Makefile.in
 
 extra-tmp-files:    config.status, config.log,
@@ -37,8 +35,7 @@
                     hlint.out
 
 library
-  exposed-modules:  Control.Monad.ToIO,
-                    XMMS2.Client,
+  exposed-modules:  XMMS2.Client,
                     XMMS2.Client.Types,
                     XMMS2.Client.Types.Value,
                     XMMS2.Client.Types.Coll,
@@ -73,7 +70,8 @@
                     XMMS2.Utils
   c-sources:		src/c/xmms2hs-client.c
   include-dirs:		src/c
-  build-depends:	base >= 4 && < 5, haskell98, utf8-string, mtl, containers
+  build-depends:	base >= 4 && < 5, haskell98, utf8-string, mtl,
+                    containers
   build-tools:		c2hs
   hs-source-dirs:   ., src
   extensions:       ForeignFunctionInterface,
@@ -87,7 +85,8 @@
                     EmptyDataDecls,
                     FlexibleContexts,
                     ScopedTypeVariables,
-                    OverlappingInstances
+                    OverlappingInstances,
+                    GeneralizedNewtypeDeriving
 
 
 source-repository head
@@ -99,4 +98,4 @@
   type:             git
   location:         git://github.com/upwawet/xmms2hs.git
   subdir:           client
-  tag:              v0.0.3.9
+  tag:              v0.0.4.0
