diff --git a/patches/patchinstall.sh b/patches/patchinstall.sh
index ba08690a..7819b00a 100755
--- a/patches/patchinstall.sh
+++ b/patches/patchinstall.sh
@@ -370,6 +370,7 @@ patch_enable_all ()
 	enable_wined3d_Silence_FIXMEs="$1"
 	enable_winedevice_Fix_Relocation="$1"
 	enable_winemenubuilder_Desktop_Icon_Path="$1"
+	enable_winemp3_acm_MPEG3_StreamOpen="$1"
 	enable_wineps_drv_PostScript_Fixes="$1"
 	enable_winepulse_PulseAudio_Support="$1"
 	enable_winex11_CandidateWindowPos="$1"
@@ -1283,6 +1284,9 @@ patch_enable ()
 		winemenubuilder-Desktop_Icon_Path)
 			enable_winemenubuilder_Desktop_Icon_Path="$2"
 			;;
+		winemp3.acm-MPEG3_StreamOpen)
+			enable_winemp3_acm_MPEG3_StreamOpen="$2"
+			;;
 		wineps.drv-PostScript_Fixes)
 			enable_wineps_drv_PostScript_Fixes="$2"
 			;;
@@ -7460,6 +7464,18 @@ if test "$enable_winemenubuilder_Desktop_Icon_Path" -eq 1; then
 	) >> "$patchlist"
 fi
 
+# Patchset winemp3.acm-MPEG3_StreamOpen
+# |
+# | Modified files:
+# |   *	dlls/msacm32/tests/msacm.c, dlls/winemp3.acm/mpegl3.c
+# |
+if test "$enable_winemp3_acm_MPEG3_StreamOpen" -eq 1; then
+	patch_apply winemp3.acm-MPEG3_StreamOpen/0001-winemp3.acm-Check-input-format-in-MPEG3_StreamOpen.patch
+	(
+		echo '+    { "Michael Müller", "winemp3.acm: Check input format in MPEG3_StreamOpen.", 1 },';
+	) >> "$patchlist"
+fi
+
 # Patchset wineps.drv-PostScript_Fixes
 # |
 # | This patchset fixes the following Wine bugs:
diff --git a/patches/winemp3.acm-MPEG3_StreamOpen/0001-winemp3.acm-Check-input-format-in-MPEG3_StreamOpen.patch b/patches/winemp3.acm-MPEG3_StreamOpen/0001-winemp3.acm-Check-input-format-in-MPEG3_StreamOpen.patch
new file mode 100644
index 00000000..869bed3c
--- /dev/null
+++ b/patches/winemp3.acm-MPEG3_StreamOpen/0001-winemp3.acm-Check-input-format-in-MPEG3_StreamOpen.patch
@@ -0,0 +1,138 @@
+From 46192b44294e309aa90131cd00f44127cbd9a49f Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Michael=20M=C3=BCller?= <michael@fds-team.de>
+Date: Sun, 21 Aug 2016 02:36:47 +0200
+Subject: winemp3.acm: Check input format in MPEG3_StreamOpen.
+
+---
+ dlls/msacm32/tests/msacm.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++
+ dlls/winemp3.acm/mpegl3.c  | 15 +++++++++-
+ 2 files changed, 85 insertions(+), 1 deletion(-)
+
+diff --git a/dlls/msacm32/tests/msacm.c b/dlls/msacm32/tests/msacm.c
+index 812a1bb..efe34b1 100644
+--- a/dlls/msacm32/tests/msacm.c
++++ b/dlls/msacm32/tests/msacm.c
+@@ -826,9 +826,80 @@ todo_wine
+     ok(rc == MMSYSERR_INVALPARAM, "failed with error 0x%x\n", rc);
+ }
+ 
++void test_mp3(void)
++{
++    MPEGLAYER3WAVEFORMAT src;
++    WAVEFORMATEX dst;
++    HACMSTREAM has;
++    DWORD output;
++    MMRESULT mr;
++
++    src.wfx.wFormatTag = WAVE_FORMAT_MPEGLAYER3;
++    src.wfx.nSamplesPerSec = 11025;
++    src.wfx.wBitsPerSample = 0;
++    src.wfx.nChannels = 1;
++    src.wfx.nBlockAlign = 576;
++    src.wfx.nAvgBytesPerSec = 2000;
++
++    src.wID = MPEGLAYER3_ID_MPEG;
++    src.fdwFlags = 0;
++    src.nBlockSize = 576;
++    src.nFramesPerBlock = 1;
++    src.nCodecDelay = 0;
++
++    dst.cbSize = 0;
++    dst.wFormatTag = WAVE_FORMAT_PCM;
++    dst.nSamplesPerSec = 11025;
++    dst.wBitsPerSample = 16;
++    dst.nChannels = 1;
++    dst.nBlockAlign = dst.wBitsPerSample * dst.nChannels / 8;
++    dst.nAvgBytesPerSec = dst.nSamplesPerSec * dst.nBlockAlign;
++
++    src.wfx.cbSize = 0;
++
++    mr = acmStreamOpen(&has, NULL, (WAVEFORMATEX*)&src, &dst, NULL, 0, 0, 0);
++    ok(mr == ACMERR_NOTPOSSIBLE, "expected error ACMERR_NOTPOSSIBLE, got 0x%x\n", mr);
++    if (mr == MMSYSERR_NOERROR) acmStreamClose(has, 0);
++
++    src.wfx.cbSize = MPEGLAYER3_WFX_EXTRA_BYTES;
++    src.wID = 0;
++
++    mr = acmStreamOpen(&has, NULL, (WAVEFORMATEX*)&src, &dst, NULL, 0, 0, 0);
++    ok(mr == ACMERR_NOTPOSSIBLE, "expected error ACMERR_NOTPOSSIBLE, got 0x%x\n", mr);
++    if (mr == MMSYSERR_NOERROR) acmStreamClose(has, 0);
++
++    src.wID = MPEGLAYER3_ID_MPEG;
++    src.nBlockSize = 0;
++
++    mr = acmStreamOpen(&has, NULL, (WAVEFORMATEX*)&src, &dst, NULL, 0, 0, 0);
++    ok(mr == MMSYSERR_NOERROR, "failed with error 0x%x\n", mr);
++    mr = acmStreamClose(has, 0);
++    ok(mr == MMSYSERR_NOERROR, "failed with error 0x%x\n", mr);
++
++    src.nBlockSize = 576;
++    src.wfx.nAvgBytesPerSec = 0;
++
++    mr = acmStreamOpen(&has, NULL, (WAVEFORMATEX*)&src, &dst, NULL, 0, 0, 0);
++    ok(mr == MMSYSERR_NOERROR, "failed with error 0x%x\n", mr);
++    /* causes a division by zero exception */
++    if (0) acmStreamSize(has, 4000, &output, ACM_STREAMSIZEF_SOURCE);
++    mr = acmStreamClose(has, 0);
++    ok(mr == MMSYSERR_NOERROR, "failed with error 0x%x\n", mr);
++
++    src.wfx.nAvgBytesPerSec = 2000;
++
++    mr = acmStreamOpen(&has, NULL, (WAVEFORMATEX*)&src, &dst, NULL, 0, 0, 0);
++    ok(mr == MMSYSERR_NOERROR, "failed with error 0x%x\n", mr);
++    mr = acmStreamSize(has, 4000, &output, ACM_STREAMSIZEF_SOURCE);
++    ok(mr == MMSYSERR_NOERROR, "failed with error 0x%x\n", mr);
++    mr = acmStreamClose(has, 0);
++    ok(mr == MMSYSERR_NOERROR, "failed with error 0x%x\n", mr);
++}
++
+ START_TEST(msacm)
+ {
+     driver_tests();
+     test_prepareheader();
+     test_acmFormatSuggest();
++    test_mp3();
+ }
+diff --git a/dlls/winemp3.acm/mpegl3.c b/dlls/winemp3.acm/mpegl3.c
+index 37993b4..b6595e6 100644
+--- a/dlls/winemp3.acm/mpegl3.c
++++ b/dlls/winemp3.acm/mpegl3.c
+@@ -215,6 +215,7 @@ static void MPEG3_Reset(PACMDRVSTREAMINSTANCE adsi, AcmMpeg3Data* aad)
+  */
+ static	LRESULT	MPEG3_StreamOpen(PACMDRVSTREAMINSTANCE adsi)
+ {
++    LRESULT error = MMSYSERR_NOTSUPPORTED;
+     AcmMpeg3Data*	aad;
+     int err;
+ 
+@@ -238,6 +239,18 @@ static	LRESULT	MPEG3_StreamOpen(PACMDRVSTREAMINSTANCE adsi)
+               adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_MPEG) &&
+              adsi->pwfxDst->wFormatTag == WAVE_FORMAT_PCM)
+     {
++        if (adsi->pwfxSrc->wFormatTag == WAVE_FORMAT_MPEGLAYER3)
++        {
++            MPEGLAYER3WAVEFORMAT *formatmp3 = (MPEGLAYER3WAVEFORMAT *)adsi->pwfxSrc;
++
++            if (adsi->pwfxSrc->cbSize < MPEGLAYER3_WFX_EXTRA_BYTES ||
++                formatmp3->wID != MPEGLAYER3_ID_MPEG)
++            {
++                error = ACMERR_NOTPOSSIBLE;
++                goto theEnd;
++            }
++        }
++
+ 	/* resampling or mono <=> stereo not available
+          * MPEG3 algo only define 16 bit per sample output
+          */
+@@ -261,7 +274,7 @@ static	LRESULT	MPEG3_StreamOpen(PACMDRVSTREAMINSTANCE adsi)
+  theEnd:
+     HeapFree(GetProcessHeap(), 0, aad);
+     adsi->dwDriver = 0L;
+-    return MMSYSERR_NOTSUPPORTED;
++    return error;
+ }
+ 
+ /***********************************************************************
+-- 
+2.9.0
+
diff --git a/patches/winemp3.acm-MPEG3_StreamOpen/definition b/patches/winemp3.acm-MPEG3_StreamOpen/definition
new file mode 100644
index 00000000..e1c2bb52
--- /dev/null
+++ b/patches/winemp3.acm-MPEG3_StreamOpen/definition
@@ -0,0 +1 @@
+Fixes: Check input format in MPEG3_StreamOpen