diff --git a/Data/DTD/Cache.hs b/Data/DTD/Cache.hs
--- a/Data/DTD/Cache.hs
+++ b/Data/DTD/Cache.hs
@@ -10,6 +10,9 @@
     , newDTDCacheFile
     , loadAttrMap
     , UnresolvedEntity (..)
+    , AttrMap
+    , EntityMap
+    , Att (..)
     ) where
 
 import qualified Text.XML as X
diff --git a/Data/DTD/Parse.hs b/Data/DTD/Parse.hs
--- a/Data/DTD/Parse.hs
+++ b/Data/DTD/Parse.hs
@@ -64,17 +64,11 @@
                 C.$= streamUnresolved
                 C.$= CL.concatMap id
                 C.$= resolveEnum rr
-    addCatch = id -- FIXME
-    {-
-    addCatch src = C.Source
-        { C.sourcePull = do
-            res <- C.sourcePull src `Lifted.catch` (lift . throw rr)
-            return $ case res of
-                C.Open src' val -> C.Open (addCatch src') val
-                C.Closed -> C.Closed
-        , C.sourceClose = return ()
-        }
-        -}
+    addCatch (C.Open src close x) = C.Open (addCatch src) (addCatch' close) x
+    addCatch C.Closed = C.Closed
+    addCatch (C.SourceM msrc close) = C.SourceM (addCatch' $ liftM addCatch msrc) (addCatch' close)
+
+    addCatch' m = m `Lifted.catch` throw rr
 
 throw :: C.MonadThrow m => ResolveReader -> SomeException -> m a
 throw rr e =
diff --git a/dtd.cabal b/dtd.cabal
--- a/dtd.cabal
+++ b/dtd.cabal
@@ -1,5 +1,5 @@
 Name:                dtd
-Version:             0.4.0
+Version:             0.4.1
 Synopsis:            Parse and render DTD files
 Homepage:            http://github.com/snoyberg/xml
 License:             BSD3
