diff --git a/README.markdown b/README.markdown
--- a/README.markdown
+++ b/README.markdown
@@ -62,9 +62,11 @@
 
 &nbsp;&nbsp;&nbsp;&nbsp;&#x2612;&nbsp;&nbsp;2017-03-16  v0.8.0.0  [Tidy up the API](https://github.com/iconnect/regex/milestone/10)
 
-&nbsp;&nbsp;&nbsp;&nbsp;&#x2612;&nbsp;&nbsp;2017-03-18  v0.9.0.0  [Finish tidying up the API, Add type-safe replacement templates and exploit TemplateHaskellQuotes](https://github.com/iconnect/regex/milestone/9)
+&nbsp;&nbsp;&nbsp;&nbsp;&#x2612;&nbsp;&nbsp;2017-03-24  v0.9.0.0  [Finish tidying up the API, Add type-safe replacement templates and exploit TemplateHaskellQuotes](https://github.com/iconnect/regex/milestone/9)
 
-&nbsp;&nbsp;&nbsp;&nbsp;&#x2612;&nbsp;&nbsp;2017-03-18  v0.10.0.0 [Tweak TypeSafe SearchReplace templates](https://github.com/iconnect/regex/milestone/11)
+&nbsp;&nbsp;&nbsp;&nbsp;&#x2612;&nbsp;&nbsp;2017-03-25  v0.10.0.0 [Tweak TypeSafe SearchReplace templates](https://github.com/iconnect/regex/milestone/11)
+
+&nbsp;&nbsp;&nbsp;&nbsp;&#x2612;&nbsp;&nbsp;2017-03-26  v0.10.0.1 [Fix release](https://github.com/iconnect/regex/issues/88)
 
 &nbsp;&nbsp;&nbsp;&nbsp;&#x2610;&nbsp;&nbsp;2017-03-31  v1.0.0.0  [First stable release](https://github.com/iconnect/regex/milestone/3)
 
diff --git a/Text/RE/Internal/SearchReplace.hs b/Text/RE/Internal/SearchReplace.hs
new file mode 100644
--- /dev/null
+++ b/Text/RE/Internal/SearchReplace.hs
@@ -0,0 +1,84 @@
+{-# LANGUAGE NoImplicitPrelude          #-}
+{-# LANGUAGE RecordWildCards            #-}
+{-# LANGUAGE CPP                        #-}
+#if __GLASGOW_HASKELL__ >= 800
+{-# OPTIONS_GHC -fno-warn-redundant-constraints #-}
+{-# LANGUAGE TemplateHaskellQuotes      #-}
+#else
+{-# LANGUAGE QuasiQuotes                #-}
+{-# LANGUAGE TemplateHaskell            #-}
+#endif
+{-# OPTIONS_GHC -fno-warn-orphans       #-}
+
+module Text.RE.Internal.SearchReplace
+  ( unsafeCompileSearchReplace_
+  , compileSearchReplace_
+  , compileSearchAndReplace_
+  ) where
+
+import qualified Data.HashMap.Strict            as HMS
+import           Prelude.Compat
+import           Text.RE.Internal.NamedCaptures
+import           Text.RE.Types.Capture
+import           Text.RE.Types.CaptureID
+import           Text.RE.Types.Matches
+import           Text.RE.Types.Replace
+import           Text.RE.Types.SearchReplace
+import qualified Text.Regex.TDFA                as TDFA
+
+
+-- | warapper on 'compileSearchReplace_' that will generate an error
+-- if any compilation errors are found
+unsafeCompileSearchReplace_ :: (String->s)
+                            -> (String->Either String re)
+                            -> String
+                            -> SearchReplace re s
+unsafeCompileSearchReplace_ pk cf = either err id . compileSearchReplace_ pk cf
+  where
+    err msg = error $ "unsafeCompileSearchReplace_: " ++ msg
+
+-- | compile a SearchReplace template generating errors if the RE or
+-- the template are not well formed -- all capture references being checked
+compileSearchReplace_ :: (Monad m,Functor m)
+                      => (String->s)
+                      -> (String->Either String re)
+                      -> String
+                      -> m (SearchReplace re s)
+compileSearchReplace_ pack compile_re sr_tpl = either fail return $ do
+    case mainCaptures $ sr_tpl $=~ "///" of
+      [cap] ->
+        compileSearchAndReplace_ pack compile_re
+                      (capturePrefix cap) (captureSuffix cap)
+      _ -> Left $ "bad search-replace template syntax: " ++ sr_tpl
+
+-- | compile 'SearcgReplace' from two strings containing the RE
+-- and the replacement template
+compileSearchAndReplace_ :: (Monad m,Functor m)
+                         => (String->s)
+                         -> (String->Either String re)
+                         -> String
+                         -> String
+                         -> m (SearchReplace re s)
+compileSearchAndReplace_ pack compile_re re_s tpl = either fail return $ do
+    re           <- compile_re re_s
+    ((n,cnms),_) <- extractNamedCaptures re_s
+    mapM_ (check n cnms) $ templateCaptures id tpl
+    return $ SearchReplace re $ pack tpl
+  where
+    check :: Int -> CaptureNames -> CaptureID -> Either String ()
+    check n cnms cid = case cid of
+      IsCaptureOrdinal co -> check_co n    co
+      IsCaptureName    cn -> check_cn cnms cn
+
+    check_co n (CaptureOrdinal i) = case i <= n of
+      True  -> return ()
+      False -> Left $ "capture ordinal out of range: " ++
+                                      show i ++ " >= " ++ show n
+
+    check_cn cnms cnm = case cnm `HMS.member` cnms of
+      True  -> return ()
+      False -> Left $ "capture name not defined: " ++
+                                      show (getCaptureName cnm)
+
+($=~) :: String -> String -> Matches String
+($=~) = (TDFA.=~)
diff --git a/changelog b/changelog
--- a/changelog
+++ b/changelog
@@ -1,5 +1,8 @@
 -*-change-log-*-
 
+0.10.0.1 Chris Dornan <chris.dornan@irisconnect.co.uk> 2017-03-26
+  * Fix sub-package cabal files (#88)
+
 0.10.0.0 Chris Dornan <chris.dornan@irisconnect.co.uk> 2017-03-25
   * Tweak Type-Safe SearchReplace templates (#86)
   * Add escape methods to IsRegex (#87)
diff --git a/regex.cabal b/regex.cabal
--- a/regex.cabal
+++ b/regex.cabal
@@ -1,5 +1,5 @@
 Name:                   regex
-Version:                0.10.0.0
+Version:                0.10.0.1
 Synopsis:               Toolkit for regex-base
 Description:            A Regular Expression Toolkit for regex-base with
                         Compile-time checking of RE syntax, data types for
@@ -31,7 +31,7 @@
 Source-Repository this
     Type:               git
     Location:           https://github.com/iconnect/regex.git
-    Tag:                0.10.0.0
+    Tag:                0.10.0.1
 
 
 
@@ -75,6 +75,7 @@
 
     Other-Modules:
       Text.RE.Internal.QQ
+      Text.RE.Internal.SearchReplace
       Text.RE.Internal.SearchReplace.TDFA
       Text.RE.Internal.SearchReplace.TDFA.ByteString
       Text.RE.Internal.SearchReplace.TDFA.ByteString.Lazy
