diff --git a/purebred-email.cabal b/purebred-email.cabal
--- a/purebred-email.cabal
+++ b/purebred-email.cabal
@@ -2,7 +2,7 @@
 -- documentation, see http://haskell.org/cabal/users-guide/
 
 name:                purebred-email
-version:             0.1.0.0
+version:             0.1.0.1
 synopsis:            types and parser for email messages (including MIME)
 description:
   The purebred email library.  RFC 5322, MIME, etc.
@@ -35,7 +35,7 @@
   tests/golden/*.golden
 cabal-version:       >=1.10
 tested-with:
-  GHC==8.0.2, GHC==8.2.2, GHC==8.4.4, GHC==8.6.3
+  GHC==8.0.2, GHC==8.2.2, GHC==8.4.4, GHC==8.6.5, GHC==8.8.1
 
 homepage:            https://github.com/purebred-mua/purebred-email
 bug-reports:         https://github.com/purebred-mua/purebred-email/issues
diff --git a/src/Data/MIME.hs b/src/Data/MIME.hs
--- a/src/Data/MIME.hs
+++ b/src/Data/MIME.hs
@@ -613,7 +613,7 @@
     multipartBody =
       skipTillString dashBoundary *> crlf -- FIXME transport-padding
       *> part `sepBy` crlf
-      <* string "--" <* crlf <* void takeTillEnd
+      <* string "--" <* takeTillEnd
 
 -- | Serialise a given `MIMEMessage` into a ByteString. The message is
 -- serialised as is. No additional headers are set.
diff --git a/test-vectors/nested-multipart.eml b/test-vectors/nested-multipart.eml
new file mode 100644
--- /dev/null
+++ b/test-vectors/nested-multipart.eml
@@ -0,0 +1,16 @@
+Content-Type: multipart/mixed; boundary=boundary1
+MIME-Version: 1.0
+Date: Thu, 4 May 2017 03:08:43 +1000 (EST)
+From: foo@bar
+To: my@email.test
+Subject: Pretty subject
+
+--boundary1
+Content-Type: multipart/alternative; boundary=boundary2
+
+--boundary2
+Content-Type: text/plain
+
+Bla bla bla
+--boundary2--
+--boundary1--
diff --git a/tests/MIME.hs b/tests/MIME.hs
--- a/tests/MIME.hs
+++ b/tests/MIME.hs
@@ -19,20 +19,28 @@
 
 module MIME where
 
+import Control.Monad ((<=<), void)
 import Data.Char (toUpper)
 
 import Control.Lens
+import qualified Data.ByteString as B
 import qualified Data.Text as T
 
 import Test.Tasty (TestTree, testGroup)
-import Test.Tasty.HUnit ((@?=), testCase)
+import Test.Tasty.HUnit ((@?=), Assertion, assertFailure, testCase)
 import Test.Tasty.QuickCheck
 import Test.QuickCheck.Instances ()
 
 import Data.MIME
 
 unittests :: TestTree
-unittests =
+unittests = testGroup "MIME tests"
+  [ testContentDisposition
+  , testParse
+  ]
+
+testContentDisposition :: TestTree
+testContentDisposition =
   testGroup "content disposition"
     [ testCase "read empty (plain; should fail)" $
         preview lFilename
@@ -133,3 +141,13 @@
   where
     lFilename = headers . contentDisposition . filename
     stripPath = snd . T.breakOnEnd "/"
+
+testParse :: TestTree
+testParse = testGroup "parsing tests"
+  [ testCase "nested multipart" $
+      testParseFile "test-vectors/nested-multipart.eml"
+  ]
+
+testParseFile :: FilePath -> Assertion
+testParseFile =
+  either assertFailure (void . pure) . parse (message mime) <=< B.readFile
