diff --git a/configure b/configure
index 1f20bf3ca06707d6150dc560fd65989caf279e95..34400a78b12ce6ba67c11d98956842c4e56c2033 100755
--- a/configure
+++ b/configure
@@ -10360,7 +10360,7 @@ MAKE_DLL_RULES=dlls/Makedll.rules
 
 MAKE_PROG_RULES=programs/Makeprog.rules
 
-ac_config_files="$ac_config_files Make.rules dlls/Makedll.rules programs/Makeprog.rules Makefile console/Makefile controls/Makefile debugger/Makefile dlls/Makefile dlls/advapi32/Makefile dlls/avicap32/Makefile dlls/avifil32/Makefile dlls/comctl32/Makefile dlls/commdlg/Makefile dlls/crtdll/Makefile dlls/crypt32/Makefile dlls/dciman32/Makefile dlls/ddraw/Makefile dlls/devenum/Makefile dlls/dinput/Makefile dlls/dplay/Makefile dlls/dplayx/Makefile dlls/dsound/Makefile dlls/gdi/Makefile dlls/glu32/Makefile dlls/icmp/Makefile dlls/imagehlp/Makefile dlls/imm32/Makefile dlls/kernel/Makefile dlls/lzexpand/Makefile dlls/mapi32/Makefile dlls/mpr/Makefile dlls/msacm/Makefile dlls/msdmo/Makefile dlls/msimg32/Makefile dlls/msnet32/Makefile dlls/msrle32/Makefile dlls/msvcrt/Makefile dlls/msvcrt20/Makefile dlls/msvideo/Makefile dlls/netapi32/Makefile dlls/ntdll/Makefile dlls/odbc32/Makefile dlls/ole32/Makefile dlls/oleaut32/Makefile dlls/olecli/Makefile dlls/oledlg/Makefile dlls/olepro32/Makefile dlls/olesvr/Makefile dlls/opengl32/Makefile dlls/psapi/Makefile dlls/qcap/Makefile dlls/quartz/Makefile dlls/rasapi32/Makefile dlls/richedit/Makefile dlls/rpcrt4/Makefile dlls/serialui/Makefile dlls/setupapi/Makefile dlls/shdocvw/Makefile dlls/shell32/Makefile dlls/shfolder/Makefile dlls/shlwapi/Makefile dlls/sti/Makefile dlls/tapi32/Makefile dlls/ttydrv/Makefile dlls/twain/Makefile dlls/url/Makefile dlls/urlmon/Makefile dlls/user/Makefile dlls/version/Makefile dlls/win32s/Makefile dlls/winaspi/Makefile dlls/winedos/Makefile dlls/wineps/Makefile dlls/wininet/Makefile dlls/winmm/Makefile dlls/winmm/joystick/Makefile dlls/winmm/mcianim/Makefile dlls/winmm/mciavi/Makefile dlls/winmm/mcicda/Makefile dlls/winmm/mciseq/Makefile dlls/winmm/mciwave/Makefile dlls/winmm/midimap/Makefile dlls/winmm/wavemap/Makefile dlls/winmm/winearts/Makefile dlls/winmm/wineoss/Makefile dlls/winnls/Makefile dlls/winsock/Makefile dlls/winspool/Makefile dlls/wintrust/Makefile dlls/wow32/Makefile dlls/wsock32/Makefile dlls/x11drv/Makefile documentation/Makefile files/Makefile graphics/Makefile graphics/enhmetafiledrv/Makefile graphics/metafiledrv/Makefile graphics/win16drv/Makefile graphics/x11drv/Makefile if1632/Makefile include/Makefile library/Makefile libtest/Makefile loader/Makefile loader/ne/Makefile memory/Makefile misc/Makefile miscemu/Makefile msdos/Makefile objects/Makefile ole/Makefile programs/Makefile programs/avitools/Makefile programs/clock/Makefile programs/cmdlgtst/Makefile programs/control/Makefile programs/notepad/Makefile programs/osversioncheck/Makefile programs/progman/Makefile programs/regapi/Makefile programs/regtest/Makefile programs/uninstaller/Makefile programs/view/Makefile programs/wcmd/Makefile programs/wineconsole/Makefile programs/winemine/Makefile programs/winetest/Makefile programs/winhelp/Makefile programs/winver/Makefile relay32/Makefile scheduler/Makefile server/Makefile tools/Makefile tools/winapi/Makefile tools/winebuild/Makefile tools/winedump/Makefile tools/wmc/Makefile tools/wrc/Makefile tsx11/Makefile unicode/Makefile win32/Makefile windows/Makefile windows/x11drv/Makefile"
+ac_config_files="$ac_config_files Make.rules dlls/Makedll.rules programs/Makeprog.rules Makefile console/Makefile controls/Makefile debugger/Makefile dlls/Makefile dlls/advapi32/Makefile dlls/avicap32/Makefile dlls/avifil32/Makefile dlls/comctl32/Makefile dlls/commdlg/Makefile dlls/crtdll/Makefile dlls/crypt32/Makefile dlls/dciman32/Makefile dlls/ddraw/Makefile dlls/devenum/Makefile dlls/dinput/Makefile dlls/dplay/Makefile dlls/dplayx/Makefile dlls/dsound/Makefile dlls/gdi/Makefile dlls/glu32/Makefile dlls/icmp/Makefile dlls/imagehlp/Makefile dlls/imm32/Makefile dlls/kernel/Makefile dlls/lzexpand/Makefile dlls/mapi32/Makefile dlls/mpr/Makefile dlls/msacm/Makefile dlls/msacm/msg711/Makefile dlls/msdmo/Makefile dlls/msimg32/Makefile dlls/msnet32/Makefile dlls/msrle32/Makefile dlls/msvcrt/Makefile dlls/msvcrt20/Makefile dlls/msvideo/Makefile dlls/netapi32/Makefile dlls/ntdll/Makefile dlls/odbc32/Makefile dlls/ole32/Makefile dlls/oleaut32/Makefile dlls/olecli/Makefile dlls/oledlg/Makefile dlls/olepro32/Makefile dlls/olesvr/Makefile dlls/opengl32/Makefile dlls/psapi/Makefile dlls/qcap/Makefile dlls/quartz/Makefile dlls/rasapi32/Makefile dlls/richedit/Makefile dlls/rpcrt4/Makefile dlls/serialui/Makefile dlls/setupapi/Makefile dlls/shdocvw/Makefile dlls/shell32/Makefile dlls/shfolder/Makefile dlls/shlwapi/Makefile dlls/sti/Makefile dlls/tapi32/Makefile dlls/ttydrv/Makefile dlls/twain/Makefile dlls/url/Makefile dlls/urlmon/Makefile dlls/user/Makefile dlls/version/Makefile dlls/win32s/Makefile dlls/winaspi/Makefile dlls/winedos/Makefile dlls/wineps/Makefile dlls/wininet/Makefile dlls/winmm/Makefile dlls/winmm/joystick/Makefile dlls/winmm/mcianim/Makefile dlls/winmm/mciavi/Makefile dlls/winmm/mcicda/Makefile dlls/winmm/mciseq/Makefile dlls/winmm/mciwave/Makefile dlls/winmm/midimap/Makefile dlls/winmm/wavemap/Makefile dlls/winmm/winearts/Makefile dlls/winmm/wineoss/Makefile dlls/winnls/Makefile dlls/winsock/Makefile dlls/winspool/Makefile dlls/wintrust/Makefile dlls/wow32/Makefile dlls/wsock32/Makefile dlls/x11drv/Makefile documentation/Makefile files/Makefile graphics/Makefile graphics/enhmetafiledrv/Makefile graphics/metafiledrv/Makefile graphics/win16drv/Makefile graphics/x11drv/Makefile if1632/Makefile include/Makefile library/Makefile libtest/Makefile loader/Makefile loader/ne/Makefile memory/Makefile misc/Makefile miscemu/Makefile msdos/Makefile objects/Makefile ole/Makefile programs/Makefile programs/avitools/Makefile programs/clock/Makefile programs/cmdlgtst/Makefile programs/control/Makefile programs/notepad/Makefile programs/osversioncheck/Makefile programs/progman/Makefile programs/regapi/Makefile programs/regtest/Makefile programs/uninstaller/Makefile programs/view/Makefile programs/wcmd/Makefile programs/wineconsole/Makefile programs/winemine/Makefile programs/winetest/Makefile programs/winhelp/Makefile programs/winver/Makefile relay32/Makefile scheduler/Makefile server/Makefile tools/Makefile tools/winapi/Makefile tools/winebuild/Makefile tools/winedump/Makefile tools/wmc/Makefile tools/wrc/Makefile tsx11/Makefile unicode/Makefile win32/Makefile windows/Makefile windows/x11drv/Makefile"
 
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
@@ -10712,6 +10712,7 @@ do
   "dlls/mapi32/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/mapi32/Makefile" ;;
   "dlls/mpr/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/mpr/Makefile" ;;
   "dlls/msacm/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/msacm/Makefile" ;;
+  "dlls/msacm/msg711/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/msacm/msg711/Makefile" ;;
   "dlls/msdmo/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/msdmo/Makefile" ;;
   "dlls/msimg32/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/msimg32/Makefile" ;;
   "dlls/msnet32/Makefile" ) CONFIG_FILES="$CONFIG_FILES dlls/msnet32/Makefile" ;;
@@ -10843,7 +10844,7 @@ do
   "programs/winetest/tests" ) CONFIG_COMMANDS="$CONFIG_COMMANDS programs/winetest/tests" ;;
   "include/wine/version.h" ) CONFIG_COMMANDS="$CONFIG_COMMANDS include/wine/version.h" ;;
   "include/config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS include/config.h" ;;
-  *) { { echo "$as_me:10846: error: invalid argument: $ac_config_target" >&5
+  *) { { echo "$as_me:10847: error: invalid argument: $ac_config_target" >&5
 echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
    { (exit 1); exit 1; }; };;
   esac
@@ -11115,7 +11116,7 @@ done; }
   esac
 
   if test x"$ac_file" != x-; then
-    { echo "$as_me:11118: creating $ac_file" >&5
+    { echo "$as_me:11119: creating $ac_file" >&5
 echo "$as_me: creating $ac_file" >&6;}
     rm -f "$ac_file"
   fi
@@ -11133,7 +11134,7 @@ echo "$as_me: creating $ac_file" >&6;}
       -) echo $tmp/stdin ;;
       [\\/$]*)
          # Absolute (can't be DOS-style, as IFS=:)
-         test -f "$f" || { { echo "$as_me:11136: error: cannot find input file: $f" >&5
+         test -f "$f" || { { echo "$as_me:11137: error: cannot find input file: $f" >&5
 echo "$as_me: error: cannot find input file: $f" >&2;}
    { (exit 1); exit 1; }; }
          echo $f;;
@@ -11146,7 +11147,7 @@ echo "$as_me: error: cannot find input file: $f" >&2;}
            echo $srcdir/$f
          else
            # /dev/null tree
-           { { echo "$as_me:11149: error: cannot find input file: $f" >&5
+           { { echo "$as_me:11150: error: cannot find input file: $f" >&5
 echo "$as_me: error: cannot find input file: $f" >&2;}
    { (exit 1); exit 1; }; }
          fi;;
@@ -11207,7 +11208,7 @@ for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
   * )   ac_file_in=$ac_file.in ;;
   esac
 
-  test x"$ac_file" != x- && { echo "$as_me:11210: creating $ac_file" >&5
+  test x"$ac_file" != x- && { echo "$as_me:11211: creating $ac_file" >&5
 echo "$as_me: creating $ac_file" >&6;}
 
   # First look for the input files in the build tree, otherwise in the
@@ -11218,7 +11219,7 @@ echo "$as_me: creating $ac_file" >&6;}
       -) echo $tmp/stdin ;;
       [\\/$]*)
          # Absolute (can't be DOS-style, as IFS=:)
-         test -f "$f" || { { echo "$as_me:11221: error: cannot find input file: $f" >&5
+         test -f "$f" || { { echo "$as_me:11222: error: cannot find input file: $f" >&5
 echo "$as_me: error: cannot find input file: $f" >&2;}
    { (exit 1); exit 1; }; }
          echo $f;;
@@ -11231,7 +11232,7 @@ echo "$as_me: error: cannot find input file: $f" >&2;}
            echo $srcdir/$f
          else
            # /dev/null tree
-           { { echo "$as_me:11234: error: cannot find input file: $f" >&5
+           { { echo "$as_me:11235: error: cannot find input file: $f" >&5
 echo "$as_me: error: cannot find input file: $f" >&2;}
    { (exit 1); exit 1; }; }
          fi;;
@@ -11348,7 +11349,7 @@ cat >>$CONFIG_STATUS <<\EOF
   rm -f $tmp/in
   if test x"$ac_file" != x-; then
     if cmp -s $ac_file $tmp/config.h 2>/dev/null; then
-      { echo "$as_me:11351: $ac_file is unchanged" >&5
+      { echo "$as_me:11352: $ac_file is unchanged" >&5
 echo "$as_me: $ac_file is unchanged" >&6;}
     else
       ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
@@ -11399,50 +11400,50 @@ for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
   ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
 
   case $ac_dest in
-    dlls/ddraw/d3ddevice ) test -d "dlls/ddraw/d3ddevice" || ({ echo "$as_me:11402: creating dlls/ddraw/d3ddevice" >&5
+    dlls/ddraw/d3ddevice ) test -d "dlls/ddraw/d3ddevice" || ({ echo "$as_me:11403: creating dlls/ddraw/d3ddevice" >&5
 echo "$as_me: creating dlls/ddraw/d3ddevice" >&6;} && mkdir "dlls/ddraw/d3ddevice") ;;
-    dlls/ddraw/dclipper ) test -d "dlls/ddraw/dclipper" || ({ echo "$as_me:11404: creating dlls/ddraw/dclipper" >&5
+    dlls/ddraw/dclipper ) test -d "dlls/ddraw/dclipper" || ({ echo "$as_me:11405: creating dlls/ddraw/dclipper" >&5
 echo "$as_me: creating dlls/ddraw/dclipper" >&6;} && mkdir "dlls/ddraw/dclipper") ;;
-    dlls/ddraw/ddraw ) test -d "dlls/ddraw/ddraw" || ({ echo "$as_me:11406: creating dlls/ddraw/ddraw" >&5
+    dlls/ddraw/ddraw ) test -d "dlls/ddraw/ddraw" || ({ echo "$as_me:11407: creating dlls/ddraw/ddraw" >&5
 echo "$as_me: creating dlls/ddraw/ddraw" >&6;} && mkdir "dlls/ddraw/ddraw") ;;
-    dlls/ddraw/direct3d ) test -d "dlls/ddraw/direct3d" || ({ echo "$as_me:11408: creating dlls/ddraw/direct3d" >&5
+    dlls/ddraw/direct3d ) test -d "dlls/ddraw/direct3d" || ({ echo "$as_me:11409: creating dlls/ddraw/direct3d" >&5
 echo "$as_me: creating dlls/ddraw/direct3d" >&6;} && mkdir "dlls/ddraw/direct3d") ;;
-    dlls/ddraw/dpalette ) test -d "dlls/ddraw/dpalette" || ({ echo "$as_me:11410: creating dlls/ddraw/dpalette" >&5
+    dlls/ddraw/dpalette ) test -d "dlls/ddraw/dpalette" || ({ echo "$as_me:11411: creating dlls/ddraw/dpalette" >&5
 echo "$as_me: creating dlls/ddraw/dpalette" >&6;} && mkdir "dlls/ddraw/dpalette") ;;
-    dlls/ddraw/dsurface ) test -d "dlls/ddraw/dsurface" || ({ echo "$as_me:11412: creating dlls/ddraw/dsurface" >&5
+    dlls/ddraw/dsurface ) test -d "dlls/ddraw/dsurface" || ({ echo "$as_me:11413: creating dlls/ddraw/dsurface" >&5
 echo "$as_me: creating dlls/ddraw/dsurface" >&6;} && mkdir "dlls/ddraw/dsurface") ;;
-    dlls/dinput/joystick ) test -d "dlls/dinput/joystick" || ({ echo "$as_me:11414: creating dlls/dinput/joystick" >&5
+    dlls/dinput/joystick ) test -d "dlls/dinput/joystick" || ({ echo "$as_me:11415: creating dlls/dinput/joystick" >&5
 echo "$as_me: creating dlls/dinput/joystick" >&6;} && mkdir "dlls/dinput/joystick") ;;
-    dlls/dinput/keyboard ) test -d "dlls/dinput/keyboard" || ({ echo "$as_me:11416: creating dlls/dinput/keyboard" >&5
+    dlls/dinput/keyboard ) test -d "dlls/dinput/keyboard" || ({ echo "$as_me:11417: creating dlls/dinput/keyboard" >&5
 echo "$as_me: creating dlls/dinput/keyboard" >&6;} && mkdir "dlls/dinput/keyboard") ;;
-    dlls/dinput/mouse ) test -d "dlls/dinput/mouse" || ({ echo "$as_me:11418: creating dlls/dinput/mouse" >&5
+    dlls/dinput/mouse ) test -d "dlls/dinput/mouse" || ({ echo "$as_me:11419: creating dlls/dinput/mouse" >&5
 echo "$as_me: creating dlls/dinput/mouse" >&6;} && mkdir "dlls/dinput/mouse") ;;
-    dlls/kernel/messages ) test -d "dlls/kernel/messages" || ({ echo "$as_me:11420: creating dlls/kernel/messages" >&5
+    dlls/kernel/messages ) test -d "dlls/kernel/messages" || ({ echo "$as_me:11421: creating dlls/kernel/messages" >&5
 echo "$as_me: creating dlls/kernel/messages" >&6;} && mkdir "dlls/kernel/messages") ;;
-    dlls/kernel/tests ) test -d "dlls/kernel/tests" || ({ echo "$as_me:11422: creating dlls/kernel/tests" >&5
+    dlls/kernel/tests ) test -d "dlls/kernel/tests" || ({ echo "$as_me:11423: creating dlls/kernel/tests" >&5
 echo "$as_me: creating dlls/kernel/tests" >&6;} && mkdir "dlls/kernel/tests") ;;
-    dlls/user/dde ) test -d "dlls/user/dde" || ({ echo "$as_me:11424: creating dlls/user/dde" >&5
+    dlls/user/dde ) test -d "dlls/user/dde" || ({ echo "$as_me:11425: creating dlls/user/dde" >&5
 echo "$as_me: creating dlls/user/dde" >&6;} && mkdir "dlls/user/dde") ;;
-    dlls/user/resources ) test -d "dlls/user/resources" || ({ echo "$as_me:11426: creating dlls/user/resources" >&5
+    dlls/user/resources ) test -d "dlls/user/resources" || ({ echo "$as_me:11427: creating dlls/user/resources" >&5
 echo "$as_me: creating dlls/user/resources" >&6;} && mkdir "dlls/user/resources") ;;
-    dlls/user/tests ) test -d "dlls/user/tests" || ({ echo "$as_me:11428: creating dlls/user/tests" >&5
+    dlls/user/tests ) test -d "dlls/user/tests" || ({ echo "$as_me:11429: creating dlls/user/tests" >&5
 echo "$as_me: creating dlls/user/tests" >&6;} && mkdir "dlls/user/tests") ;;
-    dlls/wineps/data ) test -d "dlls/wineps/data" || ({ echo "$as_me:11430: creating dlls/wineps/data" >&5
+    dlls/wineps/data ) test -d "dlls/wineps/data" || ({ echo "$as_me:11431: creating dlls/wineps/data" >&5
 echo "$as_me: creating dlls/wineps/data" >&6;} && mkdir "dlls/wineps/data") ;;
-    include/wine ) test -d "include/wine" || ({ echo "$as_me:11432: creating include/wine" >&5
+    include/wine ) test -d "include/wine" || ({ echo "$as_me:11433: creating include/wine" >&5
 echo "$as_me: creating include/wine" >&6;} && mkdir "include/wine") ;;
-    programs/regapi/tests ) test -d "programs/regapi/tests" || ({ echo "$as_me:11434: creating programs/regapi/tests" >&5
+    programs/regapi/tests ) test -d "programs/regapi/tests" || ({ echo "$as_me:11435: creating programs/regapi/tests" >&5
 echo "$as_me: creating programs/regapi/tests" >&6;} && mkdir "programs/regapi/tests") ;;
-    programs/winetest/tests ) test -d "programs/winetest/tests" || ({ echo "$as_me:11436: creating programs/winetest/tests" >&5
+    programs/winetest/tests ) test -d "programs/winetest/tests" || ({ echo "$as_me:11437: creating programs/winetest/tests" >&5
 echo "$as_me: creating programs/winetest/tests" >&6;} && mkdir "programs/winetest/tests") ;;
-    include/wine/version.h ) { echo "$as_me:11438: creating include/wine/version.h" >&5
+    include/wine/version.h ) { echo "$as_me:11439: creating include/wine/version.h" >&5
 echo "$as_me: creating include/wine/version.h" >&6;}
 cat >$tmp/version.h <<CEOF
 /* Generated automatically by configure; DO NOT EDIT! */
 #define WINE_RELEASE_INFO "Wine version $wine_version"
 CEOF
 if cmp -s $tmp/version.h include/wine/version.h 2>/dev/null; then
-  { echo "$as_me:11445: include/wine/version.h is unchanged" >&5
+  { echo "$as_me:11446: include/wine/version.h is unchanged" >&5
 echo "$as_me: include/wine/version.h is unchanged" >&6;}
   rm -f $tmp/version.h
 else
diff --git a/configure.ac b/configure.ac
index 0fb3e8528458d84b01e72580e493fadddafa6989..9e54a47548cecbf91c4493c8c5c7714bfb0ef038 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1322,6 +1322,7 @@ dlls/lzexpand/Makefile
 dlls/mapi32/Makefile
 dlls/mpr/Makefile
 dlls/msacm/Makefile
+dlls/msacm/msg711/Makefile
 dlls/msdmo/Makefile
 dlls/msimg32/Makefile
 dlls/msnet32/Makefile
diff --git a/dlls/Makefile.in b/dlls/Makefile.in
index c59028185daa6dee8f74b65752e37f927a14f644..0f667db8cf91459376abeaffc2d9ed0c5b5624f0 100644
--- a/dlls/Makefile.in
+++ b/dlls/Makefile.in
@@ -38,6 +38,7 @@ SUBDIRS = \
 	mapi32 \
 	mpr \
 	msacm \
+	msacm/msg711 \
 	msdmo \
 	msimg32 \
 	msnet32 \
@@ -149,6 +150,7 @@ all: \
 	msacm.drv$(DLLEXT) \
 	msacm32.dll$(DLLEXT) \
 	msdmo.dll$(DLLEXT) \
+	msg711.drv$(DLLEXT) \
 	msimg32.dll$(DLLEXT) \
 	msnet32.dll$(DLLEXT) \
 	msrle32.dll$(DLLEXT) \
@@ -333,6 +335,9 @@ msacm32.dll$(DLLEXT) msacm.dll$(DLLEXT): msacm/msacm32.dll$(DLLEXT)
 msdmo.dll$(DLLEXT): msdmo/msdmo.dll$(DLLEXT)
 	$(RM) $@ && $(LN_S) msdmo/msdmo.dll$(DLLEXT) $@
 
+msg711.drv$(DLLEXT): msacm/msg711/msg711.drv$(DLLEXT)
+	$(RM) $@ && $(LN_S) msacm/msg711/msg711.drv$(DLLEXT) $@
+
 msimg32.dll$(DLLEXT): msimg32/msimg32.dll$(DLLEXT)
 	$(RM) $@ && $(LN_S) msimg32/msimg32.dll$(DLLEXT) $@
 
@@ -577,8 +582,11 @@ msacm/msacm32.dll$(DLLEXT): dummy winmm.dll$(DLLEXT) user32.dll$(DLLEXT) \
   advapi32.dll$(DLLEXT) kernel32.dll$(DLLEXT) ntdll.dll$(DLLEXT)
 	@cd msacm && $(MAKE) msacm32.dll$(DLLEXT)
 
-msdmo/msdmo.dll$(DLLEXT): dummy ole32.dll$(DLLEXT) user32.dll$(DLLEXT) \
-  advapi32.dll$(DLLEXT) kernel32.dll$(DLLEXT) ntdll.dll$(DLLEXT)
+msacm/msg711/msg711.drv$(DLLEXT): dummy winmm.dll$(DLLEXT) user32.dll$(DLLEXT) \
+  kernel32.dll$(DLLEXT) ntdll.dll$(DLLEXT)
+	@cd msacm/msg711 && $(MAKE) msg711.drv$(DLLEXT)
+
+msdmo/msdmo.dll$(DLLEXT): dummy ntdll.dll$(DLLEXT)
 	@cd msdmo && $(MAKE) msdmo.dll$(DLLEXT)
 
 msimg32/msimg32.dll$(DLLEXT): dummy ntdll.dll$(DLLEXT)
diff --git a/dlls/msacm/msg711/.cvsignore b/dlls/msacm/msg711/.cvsignore
new file mode 100644
index 0000000000000000000000000000000000000000..915220894232a500e0612e7d894d1ea4702d1173
--- /dev/null
+++ b/dlls/msacm/msg711/.cvsignore
@@ -0,0 +1,2 @@
+Makefile
+msg711.drv.spec.c
diff --git a/dlls/msacm/msg711/Makefile.in b/dlls/msacm/msg711/Makefile.in
new file mode 100644
index 0000000000000000000000000000000000000000..c6495f73c6113d2e31e2fab3bfdf1e8947fd6eca
--- /dev/null
+++ b/dlls/msacm/msg711/Makefile.in
@@ -0,0 +1,14 @@
+TOPSRCDIR = @top_srcdir@
+TOPOBJDIR = ../../..
+SRCDIR    = @srcdir@
+VPATH     = @srcdir@
+MODULE    = msg711.drv
+
+LDDLLFLAGS = @LDDLLFLAGS@
+SYMBOLFILE = $(MODULE).tmp.o
+
+C_SRCS = msg711.c
+
+@MAKE_DLL_RULES@
+
+### Dependencies:
diff --git a/dlls/msacm/msg711/msg711.c b/dlls/msacm/msg711/msg711.c
new file mode 100644
index 0000000000000000000000000000000000000000..93d088c33ba888b6cf108a084dd96f2d05d39325
--- /dev/null
+++ b/dlls/msacm/msg711/msg711.c
@@ -0,0 +1,830 @@
+/*
+ * msg711.drv - G711 codec driver
+ *
+ * Copyright 2001 Hidenori Takeshima
+ *
+ * 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 2.1 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.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ *
+ * FIXME - no encoding.
+ */
+
+#include "config.h"
+
+#include "windef.h"
+#include "winbase.h"
+#include "wingdi.h"
+#include "winnls.h"
+#include "winuser.h"
+#include "mmsystem.h"
+#include "msacm.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(msg711);
+
+
+/***********************************************************************/
+
+#define ACMDM_DRIVER_NOTIFY             (ACMDM_BASE + 1)
+#define ACMDM_DRIVER_DETAILS            (ACMDM_BASE + 10)
+
+#define ACMDM_HARDWARE_WAVE_CAPS_INPUT  (ACMDM_BASE + 20)
+#define ACMDM_HARDWARE_WAVE_CAPS_OUTPUT (ACMDM_BASE + 21)
+
+#define ACMDM_FORMATTAG_DETAILS         (ACMDM_BASE + 25)
+#define ACMDM_FORMAT_DETAILS            (ACMDM_BASE + 26)
+#define ACMDM_FORMAT_SUGGEST            (ACMDM_BASE + 27)
+
+#define ACMDM_FILTERTAG_DETAILS         (ACMDM_BASE + 50)
+#define ACMDM_FILTER_DETAILS            (ACMDM_BASE + 51)
+
+#define ACMDM_STREAM_OPEN               (ACMDM_BASE + 76)
+#define ACMDM_STREAM_CLOSE              (ACMDM_BASE + 77)
+#define ACMDM_STREAM_SIZE               (ACMDM_BASE + 78)
+#define ACMDM_STREAM_CONVERT            (ACMDM_BASE + 79)
+#define ACMDM_STREAM_RESET              (ACMDM_BASE + 80)
+#define ACMDM_STREAM_PREPARE            (ACMDM_BASE + 81)
+#define ACMDM_STREAM_UNPREPARE          (ACMDM_BASE + 82)
+#define ACMDM_STREAM_UPDATE             (ACMDM_BASE + 83)
+
+typedef struct _ACMDRVSTREAMINSTANCE
+{
+  DWORD           cbStruct;
+  PWAVEFORMATEX   pwfxSrc;
+  PWAVEFORMATEX   pwfxDst;
+  PWAVEFILTER     pwfltr;
+  DWORD           dwCallback;
+  DWORD           dwInstance;
+  DWORD           fdwOpen;
+  DWORD           fdwDriver;
+  DWORD           dwDriver;
+  HACMSTREAM    has;
+} ACMDRVSTREAMINSTANCE, *PACMDRVSTREAMINSTANCE;
+
+typedef struct _ACMDRVSTREAMHEADER *PACMDRVSTREAMHEADER;
+typedef struct _ACMDRVSTREAMHEADER {
+  DWORD  cbStruct;
+  DWORD  fdwStatus;
+  DWORD  dwUser;
+  LPBYTE pbSrc;
+  DWORD  cbSrcLength;
+  DWORD  cbSrcLengthUsed;
+  DWORD  dwSrcUser;
+  LPBYTE pbDst;
+  DWORD  cbDstLength;
+  DWORD  cbDstLengthUsed;
+  DWORD  dwDstUser;
+
+  DWORD fdwConvert;
+  PACMDRVSTREAMHEADER *padshNext;
+  DWORD fdwDriver;
+  DWORD dwDriver;
+
+  /* Internal fields for ACM */
+  DWORD  fdwPrepared;
+  DWORD  dwPrepared;
+  LPBYTE pbPreparedSrc;
+  DWORD  cbPreparedSrcLength;
+  LPBYTE pbPreparedDst;
+  DWORD  cbPreparedDstLength;
+} ACMDRVSTREAMHEADER;
+
+typedef struct _ACMDRVSTREAMSIZE
+{
+  DWORD cbStruct;
+  DWORD fdwSize;
+  DWORD cbSrcLength;
+  DWORD cbDstLength;
+} ACMDRVSTREAMSIZE, *PACMDRVSTREAMSIZE;
+
+typedef struct _ACMDRVFORMATSUGGEST
+{
+  DWORD           cbStruct;
+  DWORD           fdwSuggest;
+  PWAVEFORMATEX   pwfxSrc;
+  DWORD           cbwfxSrc;
+  PWAVEFORMATEX   pwfxDst;
+  DWORD           cbwfxDst;
+} ACMDRVFORMATSUGGEST, *PACMDRVFORMATSUGGEST;
+
+
+
+
+/***********************************************************************/
+
+enum CodecType
+{
+	CodecType_Invalid,
+	CodecType_EncMuLaw,
+	CodecType_EncALaw,
+	CodecType_DecMuLaw,
+	CodecType_DecALaw,
+};
+
+typedef struct CodecImpl
+{
+	int	dummy;
+} CodecImpl;
+
+/***********************************************************************/
+
+static const WORD dec_mulaw[256] =
+{
+	0x8284, 0x8684, 0x8A84, 0x8E84, 0x9284, 0x9684, 0x9A84, 0x9E84,
+	0xA284, 0xA684, 0xAA84, 0xAE84, 0xB284, 0xB684, 0xBA84, 0xBE84,
+	0xC184, 0xC384, 0xC584, 0xC784, 0xC984, 0xCB84, 0xCD84, 0xCF84,
+	0xD184, 0xD384, 0xD584, 0xD784, 0xD984, 0xDB84, 0xDD84, 0xDF84,
+	0xE104, 0xE204, 0xE304, 0xE404, 0xE504, 0xE604, 0xE704, 0xE804,
+	0xE904, 0xEA04, 0xEB04, 0xEC04, 0xED04, 0xEE04, 0xEF04, 0xF004,
+	0xF0C4, 0xF144, 0xF1C4, 0xF244, 0xF2C4, 0xF344, 0xF3C4, 0xF444,
+	0xF4C4, 0xF544, 0xF5C4, 0xF644, 0xF6C4, 0xF744, 0xF7C4, 0xF844,
+	0xF8A4, 0xF8E4, 0xF924, 0xF964, 0xF9A4, 0xF9E4, 0xFA24, 0xFA64,
+	0xFAA4, 0xFAE4, 0xFB24, 0xFB64, 0xFBA4, 0xFBE4, 0xFC24, 0xFC64,
+	0xFC94, 0xFCB4, 0xFCD4, 0xFCF4, 0xFD14, 0xFD34, 0xFD54, 0xFD74,
+	0xFD94, 0xFDB4, 0xFDD4, 0xFDF4, 0xFE14, 0xFE34, 0xFE54, 0xFE74,
+	0xFE8C, 0xFE9C, 0xFEAC, 0xFEBC, 0xFECC, 0xFEDC, 0xFEEC, 0xFEFC,
+	0xFF0C, 0xFF1C, 0xFF2C, 0xFF3C, 0xFF4C, 0xFF5C, 0xFF6C, 0xFF7C,
+	0xFF88, 0xFF90, 0xFF98, 0xFFA0, 0xFFA8, 0xFFB0, 0xFFB8, 0xFFC0,
+	0xFFC8, 0xFFD0, 0xFFD8, 0xFFE0, 0xFFE8, 0xFFF0, 0xFFF8, 0x0000,
+	0x7D7C, 0x797C, 0x757C, 0x717C, 0x6D7C, 0x697C, 0x657C, 0x617C,
+	0x5D7C, 0x597C, 0x557C, 0x517C, 0x4D7C, 0x497C, 0x457C, 0x417C,
+	0x3E7C, 0x3C7C, 0x3A7C, 0x387C, 0x367C, 0x347C, 0x327C, 0x307C,
+	0x2E7C, 0x2C7C, 0x2A7C, 0x287C, 0x267C, 0x247C, 0x227C, 0x207C,
+	0x1EFC, 0x1DFC, 0x1CFC, 0x1BFC, 0x1AFC, 0x19FC, 0x18FC, 0x17FC,
+	0x16FC, 0x15FC, 0x14FC, 0x13FC, 0x12FC, 0x11FC, 0x10FC, 0x0FFC,
+	0x0F3C, 0x0EBC, 0x0E3C, 0x0DBC, 0x0D3C, 0x0CBC, 0x0C3C, 0x0BBC,
+	0x0B3C, 0x0ABC, 0x0A3C, 0x09BC, 0x093C, 0x08BC, 0x083C, 0x07BC,
+	0x075C, 0x071C, 0x06DC, 0x069C, 0x065C, 0x061C, 0x05DC, 0x059C,
+	0x055C, 0x051C, 0x04DC, 0x049C, 0x045C, 0x041C, 0x03DC, 0x039C,
+	0x036C, 0x034C, 0x032C, 0x030C, 0x02EC, 0x02CC, 0x02AC, 0x028C,
+	0x026C, 0x024C, 0x022C, 0x020C, 0x01EC, 0x01CC, 0x01AC, 0x018C,
+	0x0174, 0x0164, 0x0154, 0x0144, 0x0134, 0x0124, 0x0114, 0x0104,
+	0x00F4, 0x00E4, 0x00D4, 0x00C4, 0x00B4, 0x00A4, 0x0094, 0x0084,
+	0x0078, 0x0070, 0x0068, 0x0060, 0x0058, 0x0050, 0x0048, 0x0040,
+	0x0038, 0x0030, 0x0028, 0x0020, 0x0018, 0x0010, 0x0008, 0x0000,
+};
+
+static const WORD dec_alaw[256] =
+{
+	0xEA80, 0xEB80, 0xE880, 0xE980, 0xEE80, 0xEF80, 0xEC80, 0xED80,
+	0xE280, 0xE380, 0xE080, 0xE180, 0xE680, 0xE780, 0xE480, 0xE580,
+	0xF540, 0xF5C0, 0xF440, 0xF4C0, 0xF740, 0xF7C0, 0xF640, 0xF6C0,
+	0xF140, 0xF1C0, 0xF040, 0xF0C0, 0xF340, 0xF3C0, 0xF240, 0xF2C0,
+	0xAA00, 0xAE00, 0xA200, 0xA600, 0xBA00, 0xBE00, 0xB200, 0xB600,
+	0x8A00, 0x8E00, 0x8200, 0x8600, 0x9A00, 0x9E00, 0x9200, 0x9600,
+	0xD500, 0xD700, 0xD100, 0xD300, 0xDD00, 0xDF00, 0xD900, 0xDB00,
+	0xC500, 0xC700, 0xC100, 0xC300, 0xCD00, 0xCF00, 0xC900, 0xCB00,
+	0xFEA8, 0xFEB8, 0xFE88, 0xFE98, 0xFEE8, 0xFEF8, 0xFEC8, 0xFED8,
+	0xFE28, 0xFE38, 0xFE08, 0xFE18, 0xFE68, 0xFE78, 0xFE48, 0xFE58,
+	0xFFA8, 0xFFB8, 0xFF88, 0xFF98, 0xFFE8, 0xFFF8, 0xFFC8, 0xFFD8,
+	0xFF28, 0xFF38, 0xFF08, 0xFF18, 0xFF68, 0xFF78, 0xFF48, 0xFF58,
+	0xFAA0, 0xFAE0, 0xFA20, 0xFA60, 0xFBA0, 0xFBE0, 0xFB20, 0xFB60,
+	0xF8A0, 0xF8E0, 0xF820, 0xF860, 0xF9A0, 0xF9E0, 0xF920, 0xF960,
+	0xFD50, 0xFD70, 0xFD10, 0xFD30, 0xFDD0, 0xFDF0, 0xFD90, 0xFDB0,
+	0xFC50, 0xFC70, 0xFC10, 0xFC30, 0xFCD0, 0xFCF0, 0xFC90, 0xFCB0,
+	0x1580, 0x1480, 0x1780, 0x1680, 0x1180, 0x1080, 0x1380, 0x1280,
+	0x1D80, 0x1C80, 0x1F80, 0x1E80, 0x1980, 0x1880, 0x1B80, 0x1A80,
+	0x0AC0, 0x0A40, 0x0BC0, 0x0B40, 0x08C0, 0x0840, 0x09C0, 0x0940,
+	0x0EC0, 0x0E40, 0x0FC0, 0x0F40, 0x0CC0, 0x0C40, 0x0DC0, 0x0D40,
+	0x5600, 0x5200, 0x5E00, 0x5A00, 0x4600, 0x4200, 0x4E00, 0x4A00,
+	0x7600, 0x7200, 0x7E00, 0x7A00, 0x6600, 0x6200, 0x6E00, 0x6A00,
+	0x2B00, 0x2900, 0x2F00, 0x2D00, 0x2300, 0x2100, 0x2700, 0x2500,
+	0x3B00, 0x3900, 0x3F00, 0x3D00, 0x3300, 0x3100, 0x3700, 0x3500,
+	0x0158, 0x0148, 0x0178, 0x0168, 0x0118, 0x0108, 0x0138, 0x0128,
+	0x01D8, 0x01C8, 0x01F8, 0x01E8, 0x0198, 0x0188, 0x01B8, 0x01A8,
+	0x0058, 0x0048, 0x0078, 0x0068, 0x0018, 0x0008, 0x0038, 0x0028,
+	0x00D8, 0x00C8, 0x00F8, 0x00E8, 0x0098, 0x0088, 0x00B8, 0x00A8,
+	0x0560, 0x0520, 0x05E0, 0x05A0, 0x0460, 0x0420, 0x04E0, 0x04A0,
+	0x0760, 0x0720, 0x07E0, 0x07A0, 0x0660, 0x0620, 0x06E0, 0x06A0,
+	0x02B0, 0x0290, 0x02F0, 0x02D0, 0x0230, 0x0210, 0x0270, 0x0250,
+	0x03B0, 0x0390, 0x03F0, 0x03D0, 0x0330, 0x0310, 0x0370, 0x0350,
+};
+
+static LONG MSG711_Decode( const WORD* pdec, BYTE* pbDst, DWORD cbDstLength, DWORD* pcbDstLengthUsed, BYTE* pbSrc, DWORD cbSrcLength, DWORD* pcbSrcLengthUsed )
+{
+	DWORD	cSample;
+	WORD	w;
+
+	cSample = cbSrcLength;
+	if ( cSample > (cbDstLength>>1) )
+		cSample = (cbDstLength>>1);
+
+	*pcbSrcLengthUsed = cSample;
+	*pcbDstLengthUsed = cSample << 1;
+
+	while ( cSample-- > 0 )
+	{
+		w = pdec[*pbSrc++];
+		*pbDst++ = LOBYTE(w);
+		*pbDst++ = HIBYTE(w);
+	}
+
+	return MMSYSERR_NOERROR;
+}
+
+
+/***********************************************************************/
+
+static LONG Codec_DrvQueryConfigure( CodecImpl* This )
+{
+	return MMSYSERR_NOTSUPPORTED;
+}
+
+static LONG Codec_DrvConfigure( CodecImpl* This, HWND hwnd, DRVCONFIGINFO* pinfo )
+{
+	return MMSYSERR_NOTSUPPORTED;
+}
+
+static LONG Codec_DriverDetails( ACMDRIVERDETAILSW* pDrvDetails )
+{
+	if ( pDrvDetails->cbStruct < sizeof(ACMDRIVERDETAILSW) )
+		return MMSYSERR_INVALPARAM;
+
+	ZeroMemory( pDrvDetails, sizeof(ACMDRIVERDETAILSW) );
+	pDrvDetails->cbStruct = sizeof(ACMDRIVERDETAILSW);
+
+	pDrvDetails->fccType = ACMDRIVERDETAILS_FCCTYPE_AUDIOCODEC;
+	pDrvDetails->fccComp = ACMDRIVERDETAILS_FCCCOMP_UNDEFINED;
+	pDrvDetails->wMid = 0xff;	/* FIXME? */
+	pDrvDetails->wPid = 0x00;	/* FIXME? */
+	pDrvDetails->vdwACM = 0x01000000;	/* FIXME? */
+	pDrvDetails->vdwDriver = 0x01000000;	/* FIXME? */
+	pDrvDetails->fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CODEC;
+	pDrvDetails->cFormatTags = 3;
+	pDrvDetails->cFilterTags = 0;
+	pDrvDetails->hicon = (HICON)NULL;
+	MultiByteToWideChar( CP_ACP, 0, "WineG711", -1,
+		pDrvDetails->szShortName,
+		sizeof(pDrvDetails->szShortName)/sizeof(WCHAR) );
+	MultiByteToWideChar( CP_ACP, 0, "Wine G711 codec", -1,
+		pDrvDetails->szLongName,
+		sizeof(pDrvDetails->szLongName)/sizeof(WCHAR) );
+    MultiByteToWideChar( CP_ACP, 0, "Brought to you by the Wine team...", -1,
+		pDrvDetails->szCopyright,
+		sizeof(pDrvDetails->szCopyright)/sizeof(WCHAR) );
+	MultiByteToWideChar( CP_ACP, 0, "Refer to LICENSE file", -1,
+		pDrvDetails->szLicensing,
+		sizeof(pDrvDetails->szLicensing)/sizeof(WCHAR) );
+	pDrvDetails->szFeatures[0] = 0;
+
+	return MMSYSERR_NOERROR;
+}
+
+static LONG Codec_QueryAbout( void )
+{
+	return MMSYSERR_NOTSUPPORTED;
+}
+
+static LONG Codec_About( HWND hwnd )
+{
+	return MMSYSERR_NOTSUPPORTED;
+}
+
+/***********************************************************************/
+
+static LONG Codec_FormatTagDetails( CodecImpl* This, ACMFORMATTAGDETAILSW* pFmtTagDetails, DWORD dwFlags )
+{
+	FIXME( "enumerate tags\n" );
+
+	switch ( dwFlags )
+	{
+	case ACM_FORMATTAGDETAILSF_INDEX:
+		switch ( pFmtTagDetails->dwFormatTagIndex )
+		{
+		case 0:
+			pFmtTagDetails->dwFormatTag = 7;	/* Mu-Law */
+			break;
+		case 1:
+			pFmtTagDetails->dwFormatTag = 6;	/* A-Law */
+			break;
+		case 2:
+			pFmtTagDetails->dwFormatTag = 1;	/* PCM */
+			break;
+		default:
+			return ACMERR_NOTPOSSIBLE;
+		}
+		break;
+	case ACM_FORMATTAGDETAILSF_FORMATTAG:
+		switch ( pFmtTagDetails->dwFormatTag )
+		{
+		case 7:	/* Mu-Law */
+			pFmtTagDetails->dwFormatTagIndex = 0;
+			break;
+		case 6:	/* A-Law */
+			pFmtTagDetails->dwFormatTagIndex = 1;
+			break;
+		case 1:	/* PCM */
+			pFmtTagDetails->dwFormatTagIndex = 2;
+			break;
+		default:
+			return ACMERR_NOTPOSSIBLE;
+		}
+		break;
+	case ACM_FORMATTAGDETAILSF_LARGESTSIZE:
+		if ( pFmtTagDetails->dwFormatTag != 0 &&
+			 pFmtTagDetails->dwFormatTag != 1 &&
+			 pFmtTagDetails->dwFormatTag != 6 &&
+			 pFmtTagDetails->dwFormatTag != 7 )
+			return ACMERR_NOTPOSSIBLE;
+		pFmtTagDetails->dwFormatTagIndex = 0;
+		break;
+	default:
+		return MMSYSERR_NOTSUPPORTED;
+	}
+
+	pFmtTagDetails->fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CODEC;
+	pFmtTagDetails->cbFormatSize = sizeof(WAVEFORMATEX);
+	pFmtTagDetails->cStandardFormats = 3;	/* FIXME */
+	pFmtTagDetails->szFormatTag[0] = 0;	/* FIXME */
+
+	return MMSYSERR_NOERROR;
+}
+
+static LONG Codec_FormatDetails( CodecImpl* This, ACMFORMATDETAILSW* pFmtDetails, DWORD dwFlags )
+{
+	FIXME( "enumerate standard formats\n" );
+
+	if ( pFmtDetails->cbStruct < sizeof(ACMFORMATDETAILSW) )
+		return MMSYSERR_INVALPARAM;
+	pFmtDetails->cbStruct = sizeof(ACMFORMATDETAILSW);
+
+	switch ( dwFlags )
+	{
+	case ACM_FORMATDETAILSF_INDEX:
+		switch ( pFmtDetails->dwFormatIndex )
+		{
+		case 0:
+			pFmtDetails->dwFormatTag = 7;	/* Mu-Law */
+			break;
+		case 1:
+			pFmtDetails->dwFormatTag = 6;	/* A-Law */
+			break;
+		case 2:
+			pFmtDetails->dwFormatTag = 1;	/* PCM */
+			break;
+		default:
+			return MMSYSERR_INVALPARAM;
+		}
+		break;
+	case ACM_FORMATDETAILSF_FORMAT:
+		switch ( pFmtDetails->dwFormatTag )
+		{
+		case 7:	/* Mu-Law */
+			pFmtDetails->dwFormatIndex = 0;
+			break;
+		case 6:	/* A-Law */
+			pFmtDetails->dwFormatIndex = 1;
+			break;
+		case 1:	/* PCM */
+			pFmtDetails->dwFormatIndex = 2;
+			break;
+		default:
+			return ACMERR_NOTPOSSIBLE;
+		}
+		break;
+	default:
+		return MMSYSERR_NOTSUPPORTED;
+	}
+
+	pFmtDetails->fdwSupport = ACMDRIVERDETAILS_SUPPORTF_CODEC;
+	pFmtDetails->pwfx->wFormatTag = pFmtDetails->dwFormatTag;
+	pFmtDetails->pwfx->nChannels = 1;
+	pFmtDetails->pwfx->nSamplesPerSec = 8000;
+	pFmtDetails->pwfx->wBitsPerSample = 8;
+	if ( pFmtDetails->dwFormatTag == 1 )
+	{
+		pFmtDetails->cbwfx = sizeof(PCMWAVEFORMAT);
+	}
+	else
+	{
+		pFmtDetails->pwfx->cbSize = 0;
+		pFmtDetails->cbwfx = sizeof(WAVEFORMATEX);
+	}
+	pFmtDetails->szFormat[0] = 0;	/* FIXME */
+
+    return MMSYSERR_NOERROR;
+}
+
+
+static LONG Codec_FormatSuggest( CodecImpl* This, ACMDRVFORMATSUGGEST* pFmtSuggest )
+{
+	DWORD	fdwSuggest;
+
+	FIXME( "get suggested format\n" );
+
+	if ( pFmtSuggest->cbStruct != sizeof(ACMDRVFORMATSUGGEST) )
+		return MMSYSERR_INVALPARAM;
+
+	if ( pFmtSuggest->cbwfxSrc < sizeof(PCMWAVEFORMAT) ||
+		 pFmtSuggest->cbwfxDst < sizeof(PCMWAVEFORMAT) )
+		return MMSYSERR_INVALPARAM;
+
+	fdwSuggest = pFmtSuggest->fdwSuggest;
+
+	if ( fdwSuggest & ACM_FORMATSUGGESTF_NCHANNELS )
+	{
+		if ( pFmtSuggest->pwfxSrc->nChannels != pFmtSuggest->pwfxDst->nChannels )
+			return ACMERR_NOTPOSSIBLE;
+		fdwSuggest &= ~ACM_FORMATSUGGESTF_NCHANNELS;
+	}
+
+	if ( fdwSuggest & ACM_FORMATSUGGESTF_NSAMPLESPERSEC )
+	{
+		if ( pFmtSuggest->pwfxSrc->nSamplesPerSec != pFmtSuggest->pwfxDst->nSamplesPerSec )
+			return ACMERR_NOTPOSSIBLE;
+		fdwSuggest &= ~ACM_FORMATSUGGESTF_NSAMPLESPERSEC;
+	}
+
+	if ( pFmtSuggest->pwfxSrc->wFormatTag == 1 )
+	{
+		/* Compressor */
+		if ( pFmtSuggest->cbwfxDst < sizeof(WAVEFORMATEX) )
+			return MMSYSERR_INVALPARAM;
+		if ( pFmtSuggest->pwfxSrc->wBitsPerSample != 16 )
+			return ACMERR_NOTPOSSIBLE;
+
+		if ( fdwSuggest & ACM_FORMATSUGGESTF_WFORMATTAG )
+		{
+			if ( pFmtSuggest->pwfxDst->wFormatTag != 6 &&
+				 pFmtSuggest->pwfxDst->wFormatTag != 7 )
+				return ACMERR_NOTPOSSIBLE;
+			fdwSuggest &= ~ACM_FORMATSUGGESTF_WFORMATTAG;
+		}
+
+		if ( fdwSuggest & ACM_FORMATSUGGESTF_WBITSPERSAMPLE )
+		{
+			if ( pFmtSuggest->pwfxDst->wBitsPerSample != 8 )
+				return ACMERR_NOTPOSSIBLE;
+			fdwSuggest &= ~ACM_FORMATSUGGESTF_WFORMATTAG;
+		}
+
+		if ( fdwSuggest != 0 )
+			return MMSYSERR_INVALFLAG;
+
+		if ( !(fdwSuggest & ACM_FORMATSUGGESTF_WFORMATTAG) )
+			pFmtSuggest->pwfxDst->wFormatTag = 7;
+		pFmtSuggest->pwfxDst->nChannels = pFmtSuggest->pwfxSrc->nChannels;
+		pFmtSuggest->pwfxDst->nSamplesPerSec = pFmtSuggest->pwfxSrc->nSamplesPerSec;
+		pFmtSuggest->pwfxDst->nAvgBytesPerSec = pFmtSuggest->pwfxSrc->nSamplesPerSec * pFmtSuggest->pwfxSrc->nChannels;
+		pFmtSuggest->pwfxDst->nBlockAlign = pFmtSuggest->pwfxSrc->nChannels;
+		pFmtSuggest->pwfxDst->wBitsPerSample = 8;
+		pFmtSuggest->pwfxDst->cbSize = 0;
+
+		FIXME( "no compressor" );
+		return ACMERR_NOTPOSSIBLE;
+	}
+	else
+	{
+		/* Decompressor */
+		if ( pFmtSuggest->cbwfxSrc < sizeof(WAVEFORMATEX) )
+			return MMSYSERR_INVALPARAM;
+		if ( pFmtSuggest->pwfxSrc->wFormatTag != 6 &&
+			 pFmtSuggest->pwfxSrc->wFormatTag != 7 )
+			return ACMERR_NOTPOSSIBLE;
+		if ( pFmtSuggest->pwfxSrc->wBitsPerSample != 8 )
+			return ACMERR_NOTPOSSIBLE;
+
+		if ( fdwSuggest & ACM_FORMATSUGGESTF_WFORMATTAG )
+		{
+			if ( pFmtSuggest->pwfxDst->wFormatTag != 1 )
+				return ACMERR_NOTPOSSIBLE;
+			fdwSuggest &= ~ACM_FORMATSUGGESTF_WFORMATTAG;
+		}
+
+		if ( fdwSuggest & ACM_FORMATSUGGESTF_WBITSPERSAMPLE )
+		{
+			if ( pFmtSuggest->pwfxDst->wBitsPerSample != 16 )
+				return ACMERR_NOTPOSSIBLE;
+			fdwSuggest &= ~ACM_FORMATSUGGESTF_WFORMATTAG;
+		}
+
+		if ( fdwSuggest != 0 )
+			return MMSYSERR_INVALFLAG;
+
+		pFmtSuggest->pwfxDst->wFormatTag = 1;
+		pFmtSuggest->pwfxDst->nChannels = pFmtSuggest->pwfxSrc->nChannels;
+		pFmtSuggest->pwfxDst->nSamplesPerSec = pFmtSuggest->pwfxSrc->nSamplesPerSec;
+		pFmtSuggest->pwfxDst->nAvgBytesPerSec = pFmtSuggest->pwfxSrc->nSamplesPerSec * pFmtSuggest->pwfxSrc->nChannels * 2;
+		pFmtSuggest->pwfxDst->nBlockAlign = pFmtSuggest->pwfxSrc->nChannels * 2;
+		pFmtSuggest->pwfxDst->wBitsPerSample = 16;
+	}
+
+	return MMSYSERR_NOERROR;
+}
+
+static LONG Codec_FilterTagDetails( CodecImpl* This, ACMFILTERTAGDETAILSW* pFilterTagDetails, DWORD dwFlags )
+{
+	/* This is a codec driver. */
+	return MMSYSERR_NOTSUPPORTED;
+}
+
+static LONG Codec_FilterDetails( CodecImpl* This, ACMFILTERDETAILSW* pFilterDetails, DWORD dwFlags )
+{
+	/* This is a codec driver. */
+	return MMSYSERR_NOTSUPPORTED;
+}
+
+static LONG Codec_StreamOpen( CodecImpl* This, ACMDRVSTREAMINSTANCE* pStreamInst )
+{
+	enum CodecType	codectype = CodecType_Invalid;
+
+	if ( pStreamInst->cbStruct != sizeof(ACMDRVSTREAMINSTANCE) )
+	{
+		TRACE("invalid size of struct\n");
+		return MMSYSERR_INVALPARAM;
+	}
+
+	if ( pStreamInst->fdwOpen & (~(ACM_STREAMOPENF_ASYNC|ACM_STREAMOPENF_NONREALTIME|ACM_STREAMOPENF_QUERY|CALLBACK_EVENT|CALLBACK_FUNCTION|CALLBACK_WINDOW)) )
+	{
+		TRACE("unknown flags\n");
+		return MMSYSERR_INVALFLAG;
+	}
+
+	/* No support for async operations. */
+	if ( pStreamInst->fdwOpen & ACM_STREAMOPENF_ASYNC )
+		return MMSYSERR_INVALFLAG;
+
+	/* This is a codec driver. */
+	if ( pStreamInst->pwfxSrc->nChannels != pStreamInst->pwfxDst->nChannels || pStreamInst->pwfxSrc->nSamplesPerSec != pStreamInst->pwfxDst->nSamplesPerSec )
+		return ACMERR_NOTPOSSIBLE;
+	if ( pStreamInst->pwfltr != NULL )
+		return ACMERR_NOTPOSSIBLE;
+
+	if ( pStreamInst->pwfxSrc->wFormatTag == 1 )
+	{
+		if ( pStreamInst->pwfxSrc->wBitsPerSample != 16 )
+			return ACMERR_NOTPOSSIBLE;
+		if ( pStreamInst->pwfxDst->wBitsPerSample != 8 )
+			return ACMERR_NOTPOSSIBLE;
+
+		/* Queried as a compressor */
+		FIXME( "Compressor is not implemented now\n" );
+		return ACMERR_NOTPOSSIBLE;
+	}
+	else
+	if ( pStreamInst->pwfxDst->wFormatTag == 1 )
+	{
+		if ( pStreamInst->pwfxDst->wBitsPerSample != 16 )
+			return ACMERR_NOTPOSSIBLE;
+		if ( pStreamInst->pwfxSrc->wBitsPerSample != 8 )
+			return ACMERR_NOTPOSSIBLE;
+
+		switch ( pStreamInst->pwfxSrc->wFormatTag )
+		{
+		case 6: /* A-Law */
+			TRACE( "A-Law deompressor\n" );
+			codectype = CodecType_DecALaw;
+			break;
+		case 7: /* Mu-Law */
+			TRACE( "Mu-Law deompressor\n" );
+			codectype = CodecType_DecMuLaw;
+			break;
+		default:
+			return ACMERR_NOTPOSSIBLE;
+		}
+	}
+	else
+	{
+		return ACMERR_NOTPOSSIBLE;
+	}
+
+	if ( pStreamInst->fdwOpen & ACM_STREAMOPENF_QUERY )
+		return MMSYSERR_NOERROR;
+
+	pStreamInst->dwDriver = (DWORD)codectype;
+
+	return MMSYSERR_NOERROR;
+}
+
+static LONG Codec_StreamClose( CodecImpl* This, ACMDRVSTREAMINSTANCE* pStreamInst )
+{
+	return MMSYSERR_NOERROR;
+}
+
+static LONG Codec_StreamSize( CodecImpl* This, ACMDRVSTREAMINSTANCE* pStreamInst, ACMDRVSTREAMSIZE* pStreamSize )
+{
+	enum CodecType	codectype;
+	LONG	res;
+
+	if ( pStreamSize->cbStruct != sizeof(ACMDRVSTREAMSIZE) )
+		return MMSYSERR_INVALPARAM;
+
+	codectype = (enum CodecType)pStreamInst->dwDriver;
+
+	res = MMSYSERR_NOERROR;
+	switch ( codectype )
+	{
+	case CodecType_EncMuLaw:
+	case CodecType_EncALaw:
+		if ( pStreamSize->fdwSize == ACM_STREAMSIZEF_SOURCE )
+			pStreamSize->cbDstLength = pStreamSize->cbSrcLength >> 1;
+		else
+		if ( pStreamSize->fdwSize == ACM_STREAMSIZEF_DESTINATION )
+			pStreamSize->cbSrcLength = pStreamSize->cbDstLength << 1;
+		else
+			res = MMSYSERR_INVALFLAG;
+		break;
+	case CodecType_DecMuLaw:
+	case CodecType_DecALaw:
+		if ( pStreamSize->fdwSize == ACM_STREAMSIZEF_SOURCE )
+			pStreamSize->cbDstLength = pStreamSize->cbSrcLength << 1;
+		else
+		if ( pStreamSize->fdwSize == ACM_STREAMSIZEF_DESTINATION )
+			pStreamSize->cbSrcLength = pStreamSize->cbDstLength >> 1;
+		else
+			res = MMSYSERR_INVALFLAG;
+		break;
+	default:
+		ERR( "CodecType_Invalid\n" );
+		res = MMSYSERR_NOTSUPPORTED;
+		break;
+	}
+
+	return res;
+}
+
+static LONG Codec_StreamConvert( CodecImpl* This, ACMDRVSTREAMINSTANCE* pStreamInst, ACMDRVSTREAMHEADER* pStreamHdr )
+{
+	enum CodecType	codectype;
+	LONG	res;
+
+	codectype = (enum CodecType)pStreamInst->dwDriver;
+
+	res = MMSYSERR_NOTSUPPORTED;
+	switch ( codectype )
+	{
+	case CodecType_EncMuLaw:
+		FIXME( "CodecType_EncMuLaw\n" );
+		break;
+	case CodecType_EncALaw:
+		FIXME( "CodecType_EncALaw\n" );
+		break;
+	case CodecType_DecMuLaw:
+		TRACE( "CodecType_DecMuLaw\n" );
+		res = MSG711_Decode( dec_mulaw, pStreamHdr->pbDst, pStreamHdr->cbDstLength, &pStreamHdr->cbDstLengthUsed, pStreamHdr->pbSrc, pStreamHdr->cbSrcLength, &pStreamHdr->cbSrcLengthUsed );
+		break;
+	case CodecType_DecALaw:
+		TRACE( "CodecType_DecALaw\n" );
+		res = MSG711_Decode( dec_alaw, pStreamHdr->pbDst, pStreamHdr->cbDstLength, &pStreamHdr->cbDstLengthUsed, pStreamHdr->pbSrc, pStreamHdr->cbSrcLength, &pStreamHdr->cbSrcLengthUsed );
+		break;
+	default:
+		ERR( "CodecType_Invalid\n" );
+		break;
+	}
+
+	return res;
+}
+
+static LONG Codec_StreamReset( CodecImpl* This, ACMDRVSTREAMINSTANCE* pStreamInst, DWORD dwFlags )
+{
+	return MMSYSERR_NOTSUPPORTED;
+}
+
+static LONG Codec_StreamPrepare( CodecImpl* This, ACMDRVSTREAMINSTANCE* pStreamInst, ACMDRVSTREAMHEADER* pStreamHdr )
+{
+	return MMSYSERR_NOTSUPPORTED;
+}
+
+static LONG Codec_StreamUnprepare( CodecImpl* This, ACMDRVSTREAMINSTANCE* pStreamInst, ACMDRVSTREAMHEADER* pStreamHdr )
+{
+	return MMSYSERR_NOTSUPPORTED;
+}
+
+
+
+/***********************************************************************/
+
+static CodecImpl* Codec_AllocDriver( void )
+{
+	CodecImpl*	This;
+
+	This = HeapAlloc( GetProcessHeap(), 0, sizeof(CodecImpl) );
+	if ( This == NULL )
+		return NULL;
+	ZeroMemory( This, sizeof(CodecImpl) );
+
+	/* initialize members. */
+
+	return This;
+}
+
+static void Codec_Close( CodecImpl* This )
+{
+
+	HeapFree( GetProcessHeap(), 0, This );
+}
+
+
+
+/***********************************************************************/
+
+LONG WINAPI MSG711_DriverProc(
+	DWORD dwDriverId, HDRVR hdrvr, UINT msg, LONG lParam1, LONG lParam2 )
+{
+	TRACE( "DriverProc(%08lx,%08x,%08x,%08lx,%08lx)\n",
+			 dwDriverId, hdrvr, msg, lParam1, lParam2 );
+
+	switch ( msg )
+	{
+	case DRV_LOAD:
+		TRACE("DRV_LOAD\n");
+		return TRUE;
+	case DRV_FREE:
+		TRACE("DRV_FREE\n");
+		return TRUE;
+	case DRV_OPEN:
+		TRACE("DRV_OPEN\n");
+		return (LONG)Codec_AllocDriver();
+	case DRV_CLOSE:
+		TRACE("DRV_CLOSE\n");
+		Codec_Close( (CodecImpl*)dwDriverId );
+		return TRUE;
+	case DRV_ENABLE:
+		TRACE("DRV_ENABLE\n");
+		return TRUE;
+	case DRV_DISABLE:
+		TRACE("DRV_DISABLE\n");
+		return TRUE;
+	case DRV_QUERYCONFIGURE:
+		TRACE("DRV_QUERYCONFIGURE\n");
+		return Codec_DrvQueryConfigure( (CodecImpl*)dwDriverId );
+	case DRV_CONFIGURE:
+		TRACE("DRV_CONFIGURE\n");
+		return Codec_DrvConfigure( (CodecImpl*)dwDriverId,
+					(HWND)lParam1, (DRVCONFIGINFO*)lParam2 );
+	case DRV_INSTALL:
+		TRACE("DRV_INSTALL\n");
+		return DRVCNF_OK;
+	case DRV_REMOVE:
+		TRACE("DRV_REMOVE\n");
+		return 0;
+	case DRV_POWER:
+		TRACE("DRV_POWER\n");
+		return TRUE;
+
+	case ACMDM_DRIVER_NOTIFY:
+		return MMSYSERR_NOERROR;
+	case ACMDM_DRIVER_DETAILS:
+		return Codec_DriverDetails((ACMDRIVERDETAILSW*)lParam1);
+	case ACMDM_DRIVER_ABOUT:
+		TRACE("ACMDM_DRIVER_ABOUT\n");
+		return (lParam1 == -1) ? Codec_QueryAbout() : Codec_About( (HWND)lParam1 );
+
+	case ACMDM_HARDWARE_WAVE_CAPS_INPUT:
+		return MMSYSERR_NOTSUPPORTED;
+	case ACMDM_HARDWARE_WAVE_CAPS_OUTPUT:
+		return MMSYSERR_NOTSUPPORTED;
+
+	case ACMDM_FORMATTAG_DETAILS:
+		return Codec_FormatTagDetails( (CodecImpl*)dwDriverId, (ACMFORMATTAGDETAILSW*)lParam1, (DWORD)lParam2 );
+	case ACMDM_FORMAT_DETAILS:
+		return Codec_FormatDetails( (CodecImpl*)dwDriverId, (ACMFORMATDETAILSW*)lParam1, (DWORD)lParam2 );
+	case ACMDM_FORMAT_SUGGEST:
+		return Codec_FormatSuggest( (CodecImpl*)dwDriverId, (ACMDRVFORMATSUGGEST*)lParam1 );
+
+	case ACMDM_FILTERTAG_DETAILS:
+		return Codec_FilterTagDetails( (CodecImpl*)dwDriverId, (ACMFILTERTAGDETAILSW*)lParam1, (DWORD)lParam2 );
+	case ACMDM_FILTER_DETAILS:
+		return Codec_FilterDetails( (CodecImpl*)dwDriverId, (ACMFILTERDETAILSW*)lParam1, (DWORD)lParam2 );
+
+	case ACMDM_STREAM_OPEN:
+		return Codec_StreamOpen( (CodecImpl*)dwDriverId, (ACMDRVSTREAMINSTANCE*)lParam1 );
+	case ACMDM_STREAM_CLOSE:
+		return Codec_StreamClose( (CodecImpl*)dwDriverId, (ACMDRVSTREAMINSTANCE*)lParam1 );
+	case ACMDM_STREAM_SIZE:
+		return Codec_StreamSize( (CodecImpl*)dwDriverId, (ACMDRVSTREAMINSTANCE*)lParam1, (ACMDRVSTREAMSIZE*)lParam2 );
+	case ACMDM_STREAM_CONVERT:
+		return Codec_StreamConvert( (CodecImpl*)dwDriverId, (ACMDRVSTREAMINSTANCE*)lParam1, (ACMDRVSTREAMHEADER*)lParam2 );
+	case ACMDM_STREAM_RESET:
+		return Codec_StreamReset( (CodecImpl*)dwDriverId, (ACMDRVSTREAMINSTANCE*)lParam1, (DWORD)lParam2 );
+	case ACMDM_STREAM_PREPARE:
+		return Codec_StreamPrepare( (CodecImpl*)dwDriverId, (ACMDRVSTREAMINSTANCE*)lParam1, (ACMDRVSTREAMHEADER*)lParam2 );
+	case ACMDM_STREAM_UNPREPARE:
+		return Codec_StreamUnprepare( (CodecImpl*)dwDriverId, (ACMDRVSTREAMINSTANCE*)lParam1, (ACMDRVSTREAMHEADER*)lParam2 );
+
+	}
+
+	return DefDriverProc( dwDriverId, hdrvr, msg, lParam1, lParam2 );
+}
+
+/***********************************************************************/
+
+BOOL WINAPI MSG711_DllMain( HINSTANCE hInst, DWORD dwReason, LPVOID lpvReserved )
+{
+	TRACE( "(%08x,%08lx,%p)\n",hInst,dwReason,lpvReserved );
+
+	return TRUE;
+}
diff --git a/dlls/msacm/msg711/msg711.drv.spec b/dlls/msacm/msg711/msg711.drv.spec
new file mode 100644
index 0000000000000000000000000000000000000000..af037590a2c1afa5cad47f2b55848ee34c8bb9d0
--- /dev/null
+++ b/dlls/msacm/msg711/msg711.drv.spec
@@ -0,0 +1,13 @@
+name msg711
+file msg711.drv
+type win32
+init MSG711_DllMain
+
+import winmm.dll
+import user32.dll
+import kernel32.dll
+import ntdll.dll
+
+debug_channels (msg711)
+
+@ stdcall DriverProc(long long long long long) MSG711_DriverProc
diff --git a/documentation/samples/system.ini b/documentation/samples/system.ini
index ad4ffd66f472ca030cbc29cc7bbfae4a79bf5e32..c10a7d4b68bb88ed1c884c5bc774d5f64476f1f2 100644
--- a/documentation/samples/system.ini
+++ b/documentation/samples/system.ini
@@ -9,4 +9,5 @@ MPEGVideo=mciqtz.drv
 
 [drivers32]
 VIDC.MRLE=msrle32.dll
+msacm.msg711=msg711.drv