diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,15 +1,12 @@
 Forms Data Format
 =================
 
-The Forms Data Format, or FDF for short, is a horrible data format thought up
-by Adobe. Its only redeeming feature is that in practice it's much simpler
-than PDF.
+The Forms Data Format, or [FDF](https://helpx.adobe.com/acrobat/kb/acrobat-forms-form-data-web.html) for short, is a
+horrible data format thought up by Adobe. Its only redeeming feature is that in practice it's much simpler than PDF.
 
-This Haskell package is hacked together to parse and re-serialize *some* files
-in FDF format. It certainly does not support the full range of possible FDF
-files. I tried to follow the specification but gave up.
+This Haskell package is hacked together to parse and re-serialize *some* files in FDF format. It certainly does not
+support the full range of possible FDF files. I tried to follow the specification but gave up.
 
-The main purpose of the package is to allow parsing and serializing [Canadian
-tax forms](https://github.com/blamario/canadian-income-tax) in FDF format.
-For that purpose this hack seems sufficient. If you find it doesn't work for
-some other FDF files, feel free to contribute.
+The main purpose of the package is to allow parsing and serializing [Canadian tax
+forms](https://github.com/blamario/canadian-income-tax) in FDF format.  For that purpose this hack seems
+sufficient. If you find it doesn't work for some other FDF files, feel free to contribute some code.
diff --git a/forms-data-format.cabal b/forms-data-format.cabal
--- a/forms-data-format.cabal
+++ b/forms-data-format.cabal
@@ -1,6 +1,6 @@
 cabal-version:      2.4
 name:               forms-data-format
-version:            0.1
+version:            0.2
 
 synopsis: Parse and serialize FDF, the Forms Data Format
 
diff --git a/src/Text/FDF.hs b/src/Text/FDF.hs
--- a/src/Text/FDF.hs
+++ b/src/Text/FDF.hs
@@ -3,6 +3,8 @@
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE TypeApplications #-}
 
+-- | Parse and serialize between FDF files and `Map [Text] Text`.
+
 module Text.FDF (FDF (FDF, body), Field (Field, name, value, kids),
                  mapWithKey, mapFieldWithKey,
                  foldMapWithKey, foldMapFieldWithKey,
@@ -26,12 +28,14 @@
 
 type Parser = PEG.Parser (Rank2.Only FDF)
 
+-- | Parsed FDF data structure
 data FDF = FDF {
   header :: ByteString,
   body :: Field,
   trailer :: ByteString}
   deriving (Show)
 
+-- | The body of FDF is a tree of nestable 'Field's.
 data Field = Field {
   name :: Text,
   value :: Maybe Text,
@@ -121,7 +125,7 @@
 begin = string "<<" *> lineEnd <?> "<<"
 
 end :: Parser ByteStringUTF8 ByteStringUTF8
-end = string ">>" *> takeCharsWhile (== ' ') *> moptional lineEnd <?> ">>"
+end = string ">>" *> takeCharsWhile (== ' ') *> moptional lineEnd *> pure mempty <?> ">>"
 
 line :: Parser ByteStringUTF8 ByteStringUTF8
 line = takeCharsWhile (`notElem` ['\r', '\n']) <> lineEnd <?> "line"
