diff --git a/app/App/Commands.hs b/app/App/Commands.hs
--- a/app/App/Commands.hs
+++ b/app/App/Commands.hs
@@ -6,7 +6,6 @@
 import App.Commands.CreateIbIndex
 import App.Commands.CreateIndex
 import App.Commands.Demo
-import Data.Semigroup                ((<>))
 import Options.Applicative
 
 commands :: Parser (IO ())
diff --git a/app/App/Commands/Count.hs b/app/App/Commands/Count.hs
--- a/app/App/Commands/Count.hs
+++ b/app/App/Commands/Count.hs
@@ -15,7 +15,6 @@
 import Control.Lens
 import Control.Monad
 import Data.Generics.Product.Any
-import Data.Semigroup                             ((<>))
 import Data.Text                                  (Text)
 import GHC.Generics
 import HaskellWorks.Data.TreeCursor
diff --git a/app/App/Commands/CreateBlankedXml.hs b/app/App/Commands/CreateBlankedXml.hs
--- a/app/App/Commands/CreateBlankedXml.hs
+++ b/app/App/Commands/CreateBlankedXml.hs
@@ -12,7 +12,6 @@
 
 import Control.Lens
 import Data.Generics.Product.Any
-import Data.Semigroup                                   ((<>))
 import HaskellWorks.Data.Xml.Succinct.Cursor.BlankedXml
 import Options.Applicative                              hiding (columns)
 
diff --git a/app/App/Commands/CreateBpIndex.hs b/app/App/Commands/CreateBpIndex.hs
--- a/app/App/Commands/CreateBpIndex.hs
+++ b/app/App/Commands/CreateBpIndex.hs
@@ -12,7 +12,6 @@
 
 import Control.Lens
 import Data.Generics.Product.Any
-import Data.Semigroup                                   ((<>))
 import HaskellWorks.Data.Xml.Internal.ToIbBp64
 import HaskellWorks.Data.Xml.Succinct.Cursor.BlankedXml
 import Options.Applicative                              hiding (columns)
diff --git a/app/App/Commands/CreateIbIndex.hs b/app/App/Commands/CreateIbIndex.hs
--- a/app/App/Commands/CreateIbIndex.hs
+++ b/app/App/Commands/CreateIbIndex.hs
@@ -12,7 +12,6 @@
 
 import Control.Lens
 import Data.Generics.Product.Any
-import Data.Semigroup                                   ((<>))
 import HaskellWorks.Data.Xml.Internal.ToIbBp64
 import HaskellWorks.Data.Xml.Succinct.Cursor.BlankedXml
 import Options.Applicative                              hiding (columns)
diff --git a/app/App/Commands/CreateIndex.hs b/app/App/Commands/CreateIndex.hs
--- a/app/App/Commands/CreateIndex.hs
+++ b/app/App/Commands/CreateIndex.hs
@@ -14,7 +14,6 @@
 import Control.Lens
 import Control.Monad
 import Data.Generics.Product.Any
-import Data.Semigroup                                   ((<>))
 import HaskellWorks.Data.Xml.Internal.ToIbBp64
 import HaskellWorks.Data.Xml.Succinct.Cursor.BlankedXml
 import HaskellWorks.Data.Xml.Succinct.Cursor.MMap
diff --git a/app/App/Commands/Demo.hs b/app/App/Commands/Demo.hs
--- a/app/App/Commands/Demo.hs
+++ b/app/App/Commands/Demo.hs
@@ -12,7 +12,6 @@
 
 import Data.Foldable
 import Data.Maybe
-import Data.Semigroup                             ((<>))
 import Data.Text                                  (Text)
 import HaskellWorks.Data.TreeCursor
 import HaskellWorks.Data.Xml.Decode
diff --git a/app/Main.hs b/app/Main.hs
--- a/app/Main.hs
+++ b/app/Main.hs
@@ -2,7 +2,6 @@
 
 import App.Commands
 import Control.Monad
-import Data.Semigroup      ((<>))
 import Options.Applicative
 
 main :: IO ()
diff --git a/doctest/DoctestDriver.hs b/doctest/DoctestDriver.hs
new file mode 100644
--- /dev/null
+++ b/doctest/DoctestDriver.hs
@@ -0,0 +1,12 @@
+{-# LANGUAGE CPP #-}
+
+#if MIN_VERSION_GLASGOW_HASKELL(8,4,4,0)
+{-# OPTIONS_GHC -F -pgmF doctest-discover #-}
+#else
+module Main where
+
+import qualified System.IO as IO
+
+main :: IO ()
+main = IO.putStrLn "WARNING: doctest will not run on GHC versions earlier than 8.4.4"
+#endif
diff --git a/hw-xml.cabal b/hw-xml.cabal
--- a/hw-xml.cabal
+++ b/hw-xml.cabal
@@ -1,7 +1,7 @@
 cabal-version: 2.2
 
 name:                 hw-xml
-version:              0.5.0.0
+version:              0.5.1.0
 synopsis:             XML parser based on succinct data structures.
 description:          XML parser based on succinct data structures. Please see README.md
 category:             Data, XML, Succinct Data Structures, Data Structures
@@ -10,11 +10,11 @@
 author:               John Ky,
                       Alexey Raga
 maintainer:           alexey.raga@gmail.com
-copyright:            2016-2019 John Ky
+copyright:            2016-2020 John Ky
                   ,   2016-2019 Alexey Raga
 license:              BSD-3-Clause
 license-file:         LICENSE
-tested-with:          GHC == 8.8.1, GHC == 8.6.5, GHC == 8.4.4, GHC == 8.2.2
+tested-with:          GHC == 8.10.1, GHC == 8.8.3, GHC == 8.6.5, GHC == 8.4.4
 build-type:           Simple
 extra-source-files:   README.md
 data-files:           data/catalog.xml
@@ -23,18 +23,20 @@
   type: git
   location: https://github.com/haskell-works/hw-xml
 
-common base                       { build-depends: base                       >= 4.10       && < 5      }
+common base                       { build-depends: base                       >= 4.11       && < 5      }
 
 common ansi-wl-pprint             { build-depends: ansi-wl-pprint             >= 0.6.9      && < 0.7    }
 common array                      { build-depends: array                      >= 0.5.2.0    && < 0.6    }
 common attoparsec                 { build-depends: attoparsec                 >= 0.13.2.2   && < 0.14   }
 common bytestring                 { build-depends: bytestring                 >= 0.10.8.2   && < 0.11   }
 common cereal                     { build-depends: cereal                     >= 0.5.8.1    && < 0.6    }
-common containers                 { build-depends: containers                 >= 0.6.2.1    && < 0.7    }
+common containers                 { build-depends: containers                 >= 0.5.10.2   && < 0.7    }
 common criterion                  { build-depends: criterion                  >= 1.5.5.0    && < 1.6    }
 common deepseq                    { build-depends: deepseq                    >= 1.4.3.0    && < 1.5    }
+common doctest                    { build-depends: doctest                    >= 0.16.2     && < 0.17   }
+common doctest-discover           { build-depends: doctest-discover           >= 0.2        && < 0.3    }
 common generic-lens               { build-depends: generic-lens               >= 1.2.0.1    && < 1.3    }
-common ghc-prim                   { build-depends: ghc-prim                   >= 0.5        && < 0.6    }
+common ghc-prim                   { build-depends: ghc-prim                   >= 0.5        && < 0.7    }
 common hedgehog                   { build-depends: hedgehog                   >= 1.0        && < 1.1    }
 common hspec                      { build-depends: hspec                      >= 2.5        && < 3.0    }
 common hw-balancedparens          { build-depends: hw-balancedparens          >= 0.3.0.1    && < 0.4    }
@@ -49,8 +51,8 @@
 common mtl                        { build-depends: mtl                        >= 2.2.2      && < 3      }
 common optparse-applicative       { build-depends: optparse-applicative       >= 0.15.1.0   && < 0.16   }
 common resourcet                  { build-depends: resourcet                  >= 1.2.2      && < 1.3    }
-common text                       { build-depends: text                       >= 1.2.4.0    && < 1.3    }
-common transformers               { build-depends: transformers               >= 0.5.5.0    && < 0.6    }
+common text                       { build-depends: text                       >= 1.2.3.2    && < 1.3    }
+common transformers               { build-depends: transformers               >= 0.5        && < 0.6    }
 common vector                     { build-depends: vector                     >= 0.12.0.3   && < 0.13   }
 common word8                      { build-depends: word8                      >= 0.1.3      && < 0.2    }
 
@@ -145,8 +147,7 @@
                       , text
                       , vector
   main-is:              Main.hs
-  other-modules:        Paths_hw_xml
-                        App.Commands
+  other-modules:        App.Commands
                         App.Commands.Count
                         App.Commands.CreateBlankedXml
                         App.Commands.CreateBpIndex
@@ -159,7 +160,6 @@
                         App.XPath.Types
                         App.Show
                         App.Naive
-  autogen-modules:      Paths_hw_xml
   hs-source-dirs:       app
   ghc-options:          -threaded -rtsopts -with-rtsopts=-N -O2 -Wall -msse4.2
 
@@ -185,7 +185,6 @@
   ghc-options:        -threaded -rtsopts -with-rtsopts=-N
   default-language:   Haskell2010
   build-tool-depends: hspec-discover:hspec-discover
-  autogen-modules:    Paths_hw_xml
   other-modules:      HaskellWorks.Data.Xml.Internal.BlankSpec
                       HaskellWorks.Data.Xml.RawValueSpec
                       HaskellWorks.Data.Xml.Succinct.Cursor.BalancedParensSpec
@@ -194,7 +193,6 @@
                       HaskellWorks.Data.Xml.Succinct.CursorSpec
                       HaskellWorks.Data.Xml.Token.TokenizeSpec
                       HaskellWorks.Data.Xml.TypeSpec
-                      Paths_hw_xml
 
 benchmark bench
   import:             base, config
@@ -208,8 +206,17 @@
                     , vector
   type:               exitcode-stdio-1.0
   main-is:            Main.hs
-  other-modules:      Paths_hw_xml
   build-depends:      hw-xml
-  autogen-modules:    Paths_hw_xml
   hs-source-dirs:     bench
   ghc-options:        -O2 -Wall -msse4.2
+
+test-suite doctest
+  import:               base, config
+                      , doctest
+                      , doctest-discover
+                      , hw-xml
+  type:                 exitcode-stdio-1.0
+  ghc-options:          -threaded
+  main-is:              DoctestDriver.hs
+  HS-Source-Dirs:       doctest
+  build-tool-depends:   doctest-discover:doctest-discover
diff --git a/src/HaskellWorks/Data/Xml/Decode.hs b/src/HaskellWorks/Data/Xml/Decode.hs
--- a/src/HaskellWorks/Data/Xml/Decode.hs
+++ b/src/HaskellWorks/Data/Xml/Decode.hs
@@ -6,7 +6,6 @@
 import Control.Lens
 import Control.Monad
 import Data.Foldable
-import Data.Semigroup                      ((<>))
 import Data.Text                           (Text)
 import HaskellWorks.Data.Xml.DecodeError
 import HaskellWorks.Data.Xml.DecodeResult
diff --git a/src/HaskellWorks/Data/Xml/Internal/Blank.hs b/src/HaskellWorks/Data/Xml/Internal/Blank.hs
--- a/src/HaskellWorks/Data/Xml/Internal/Blank.hs
+++ b/src/HaskellWorks/Data/Xml/Internal/Blank.hs
@@ -8,7 +8,6 @@
   ) where
 
 import Data.ByteString                      (ByteString)
-import Data.Semigroup                       ((<>))
 import Data.Word
 import Data.Word8
 import HaskellWorks.Data.Xml.Internal.Words
diff --git a/src/HaskellWorks/Data/Xml/RawValue.hs b/src/HaskellWorks/Data/Xml/RawValue.hs
--- a/src/HaskellWorks/Data/Xml/RawValue.hs
+++ b/src/HaskellWorks/Data/Xml/RawValue.hs
@@ -11,7 +11,6 @@
 
 import Data.ByteString                      (ByteString)
 import Data.List
-import Data.Semigroup                       ((<>))
 import Data.Text                            (Text)
 import HaskellWorks.Data.Xml.Grammar
 import HaskellWorks.Data.Xml.Internal.Show
diff --git a/src/HaskellWorks/Data/Xml/Succinct/Index.hs b/src/HaskellWorks/Data/Xml/Succinct/Index.hs
--- a/src/HaskellWorks/Data/Xml/Succinct/Index.hs
+++ b/src/HaskellWorks/Data/Xml/Succinct/Index.hs
@@ -12,7 +12,6 @@
 where
 
 import Control.Arrow
-import Data.Monoid
 import Data.Text                                 (Text)
 import HaskellWorks.Data.Bits.BitWise
 import HaskellWorks.Data.Drop
diff --git a/src/HaskellWorks/Data/Xml/Type.hs b/src/HaskellWorks/Data/Xml/Type.hs
--- a/src/HaskellWorks/Data/Xml/Type.hs
+++ b/src/HaskellWorks/Data/Xml/Type.hs
@@ -18,7 +18,7 @@
 import qualified Data.ByteString                  as BS
 import qualified HaskellWorks.Data.BalancedParens as BP
 
-{-# ANN module ("HLint: Ignore Reduce duplication"  :: String) #-}
+{-# ANN module ("HLint: ignore Reduce duplication"  :: String) #-}
 
 data XmlType
   = XmlTypeElement
diff --git a/src/HaskellWorks/Data/Xml/Value.hs b/src/HaskellWorks/Data/Xml/Value.hs
--- a/src/HaskellWorks/Data/Xml/Value.hs
+++ b/src/HaskellWorks/Data/Xml/Value.hs
@@ -19,7 +19,6 @@
   ) where
 
 import Control.Lens
-import Data.Semigroup                      ((<>))
 import Data.Text                           (Text)
 import HaskellWorks.Data.Xml.Internal.Show
 import HaskellWorks.Data.Xml.RawDecode
diff --git a/test/HaskellWorks/Data/Xml/Internal/BlankSpec.hs b/test/HaskellWorks/Data/Xml/Internal/BlankSpec.hs
--- a/test/HaskellWorks/Data/Xml/Internal/BlankSpec.hs
+++ b/test/HaskellWorks/Data/Xml/Internal/BlankSpec.hs
@@ -4,7 +4,6 @@
 module HaskellWorks.Data.Xml.Internal.BlankSpec (spec) where
 
 import Data.Char
-import Data.Semigroup                       ((<>))
 import HaskellWorks.Data.ByteString
 import HaskellWorks.Data.Xml.Internal.Blank
 import HaskellWorks.Hspec.Hedgehog
diff --git a/test/HaskellWorks/Data/Xml/RawValueSpec.hs b/test/HaskellWorks/Data/Xml/RawValueSpec.hs
--- a/test/HaskellWorks/Data/Xml/RawValueSpec.hs
+++ b/test/HaskellWorks/Data/Xml/RawValueSpec.hs
@@ -13,7 +13,6 @@
 module HaskellWorks.Data.Xml.RawValueSpec (spec) where
 
 import Control.Monad
-import Data.Semigroup                                  ((<>))
 import Data.String
 import Data.Text                                       (Text)
 import Data.Word
diff --git a/test/HaskellWorks/Data/Xml/Succinct/Cursor/BalancedParensSpec.hs b/test/HaskellWorks/Data/Xml/Succinct/Cursor/BalancedParensSpec.hs
--- a/test/HaskellWorks/Data/Xml/Succinct/Cursor/BalancedParensSpec.hs
+++ b/test/HaskellWorks/Data/Xml/Succinct/Cursor/BalancedParensSpec.hs
@@ -5,7 +5,6 @@
   ( spec
   ) where
 
-import Data.Monoid                                      ((<>))
 import Data.String
 import HaskellWorks.Data.Bits.BitShown
 import HaskellWorks.Data.ByteString
@@ -19,7 +18,7 @@
 
 import qualified Data.ByteString as BS
 
-{-# ANN module ("HLint: Ignore Redundant do"        :: String) #-}
+{-# ANN module ("HLint: ignore Redundant do"        :: String) #-}
 
 spec :: Spec
 spec = describe "HaskellWorks.Data.Xml.Succinct.Cursor.BalancedParensSpec" $ do
diff --git a/test/HaskellWorks/Data/Xml/Succinct/Cursor/BlankedXmlSpec.hs b/test/HaskellWorks/Data/Xml/Succinct/Cursor/BlankedXmlSpec.hs
--- a/test/HaskellWorks/Data/Xml/Succinct/Cursor/BlankedXmlSpec.hs
+++ b/test/HaskellWorks/Data/Xml/Succinct/Cursor/BlankedXmlSpec.hs
@@ -10,7 +10,7 @@
 import Hedgehog
 import Test.Hspec
 
-{-# ANN module ("HLint: Ignore Redundant do"        :: String) #-}
+{-# ANN module ("HLint: ignore Redundant do"        :: String) #-}
 
 spec :: Spec
 spec = describe "HaskellWorks.Data.Xml.Succinct.Cursor.BlankedXmlSpec" $ do
diff --git a/test/HaskellWorks/Data/Xml/Succinct/Cursor/InterestBitsSpec.hs b/test/HaskellWorks/Data/Xml/Succinct/Cursor/InterestBitsSpec.hs
--- a/test/HaskellWorks/Data/Xml/Succinct/Cursor/InterestBitsSpec.hs
+++ b/test/HaskellWorks/Data/Xml/Succinct/Cursor/InterestBitsSpec.hs
@@ -3,7 +3,6 @@
 
 module HaskellWorks.Data.Xml.Succinct.Cursor.InterestBitsSpec(spec) where
 
-import Data.Monoid                                        ((<>))
 import Data.String
 import Data.Word
 import HaskellWorks.Data.Bits.BitShown
diff --git a/test/HaskellWorks/Data/Xml/Succinct/CursorSpec.hs b/test/HaskellWorks/Data/Xml/Succinct/CursorSpec.hs
--- a/test/HaskellWorks/Data/Xml/Succinct/CursorSpec.hs
+++ b/test/HaskellWorks/Data/Xml/Succinct/CursorSpec.hs
@@ -13,7 +13,6 @@
 module HaskellWorks.Data.Xml.Succinct.CursorSpec(spec) where
 
 import Control.Monad
-import Data.Semigroup                                  ((<>))
 import Data.Word
 import HaskellWorks.Data.BalancedParens.BalancedParens
 import HaskellWorks.Data.BalancedParens.Simple
