diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,17 @@
 
 ## HEAD
 
+## 3.2.0
+
+### Added
+
+* Text.XML.Soap module with XmlEnvelope stuff in it.
+* GHC 9 compatibility.
+
+### Removed
+
+* Old stackage files.
+
 ## 3.1.0
 
 ### Added
diff --git a/dom-parser.cabal b/dom-parser.cabal
--- a/dom-parser.cabal
+++ b/dom-parser.cabal
@@ -1,5 +1,5 @@
 name:                dom-parser
-version:             3.1.0
+version:             3.2.0
 synopsis:            Simple monadic DOM parser
 license:             MIT
 license-file:        LICENSE
@@ -9,10 +9,9 @@
 build-type:          Simple
 cabal-version:       >=1.10
 homepage:            https://github.com/typeable/dom-parser
-tested-with:         GHC == 7.10.3
-                   , GHC == 8.0.2
-                   , GHC == 8.2.2
-                   , GHC == 8.4.1
+tested-with:         GHC == 9.2.7
+                   , GHC == 9.4.8
+                   , GHC == 9.6.3
 extra-source-files:  CHANGELOG.md
                    , README.md
 
@@ -55,6 +54,7 @@
                      , text
                      , transformers
                      , xml-conduit
+                     , xml-conduit-writer
                      , xml-lens
   exposed-modules: Text.XML.DOM.Parser
                  , Text.XML.DOM.Parser.Attributes
@@ -64,6 +64,7 @@
                  , Text.XML.DOM.Parser.FromAttribute
                  , Text.XML.DOM.Parser.FromDom
                  , Text.XML.DOM.Parser.Types
+                 , Text.XML.Soap
 
 test-suite test
   type:             exitcode-stdio-1.0
diff --git a/src/Text/XML/DOM/Parser/Content.hs b/src/Text/XML/DOM/Parser/Content.hs
--- a/src/Text/XML/DOM/Parser/Content.hs
+++ b/src/Text/XML/DOM/Parser/Content.hs
@@ -114,8 +114,8 @@
     tvals = ["y", "yes", "t", "true", "1"]
     fvals = ["n", "no", "f", "false", "0"]
   in if
-    | lowt `elem` tvals -> Right True
-    | lowt `elem` fvals -> Right False
+    | lowt `L.elem` tvals -> Right True
+    | lowt `L.elem` fvals -> Right False
     | otherwise         ->
         Left $ "Could not read " <> t <> " as Bool"
 
diff --git a/src/Text/XML/DOM/Parser/Types.hs b/src/Text/XML/DOM/Parser/Types.hs
--- a/src/Text/XML/DOM/Parser/Types.hs
+++ b/src/Text/XML/DOM/Parser/Types.hs
@@ -89,8 +89,6 @@
     -- ^ Field for 'Show' instance and bulding usefull errors
   }
 
-makeLenses ''NameMatcher
-
 -- | Instance use 'matchCILocalName' as most general and liberal
 -- matching strategy (while XML is often malformed).
 --
@@ -121,6 +119,8 @@
   { _nmMatch = \n -> CI.mk (nameLocalName n) == CI.mk tname
   , _nmShow  = tname
   }
+
+makeLenses ''NameMatcher
 
 -- | Makes matcher which match name by 'Eq' with given
 --
diff --git a/src/Text/XML/Soap.hs b/src/Text/XML/Soap.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/XML/Soap.hs
@@ -0,0 +1,46 @@
+module Text.XML.Soap where
+
+import Control.Lens
+import Data.String
+import Text.XML
+import Text.XML.DOM.Parser
+import Text.XML.Writer
+
+data XmlEnvelope h b = XmlEnvelope
+  { _xeHeader :: !(Maybe h)
+  , _xeBody   :: !(Maybe b)
+  } deriving (Eq, Show)
+
+makeLenses ''XmlEnvelope
+
+xmlEnvelopeToDocument :: (ToXML h, ToXML b) => XmlEnvelope h b -> Document
+xmlEnvelopeToDocument xe = doc
+  where
+    sname n = fromString $ "{http://schemas.xmlsoap.org/soap/envelope/}" <> n
+    doc    =
+      Document
+        { documentPrologue = Prologue [] Nothing []
+        , documentRoot     =
+          Element
+            { elementName       = sname "Envelope"
+            , elementAttributes = mempty
+            , elementNodes      = [NodeElement header, NodeElement body]
+            }
+        , documentEpilogue = []
+        }
+    header =
+      Element
+        { elementName       = sname "Header"
+        , elementAttributes = mempty
+        , elementNodes      = render . toXML $ xe ^. xeHeader
+        }
+    body   =
+      Element
+        { elementName       = sname "Body"
+        , elementAttributes = mempty
+        , elementNodes      = render . toXML $ xe ^. xeBody
+        }
+
+instance (FromDom h, FromDom b) => FromDom (XmlEnvelope h b) where
+  fromDom = XmlEnvelope <$> inElemMay "Header" fromDom
+                        <*> inElemMay "Body" fromDom
