diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Mustache library changelog
 
+## v2.2.3
+
+- Quick fix to prevent catchSubstitute from reporting substitutions to the renderer.
+
 ## v2.2.2
 
 - Added a function to catch a substitution result
diff --git a/mustache.cabal b/mustache.cabal
--- a/mustache.cabal
+++ b/mustache.cabal
@@ -1,5 +1,5 @@
 name:                mustache
-version:             2.2.2
+version:             2.2.3
 synopsis:            A mustache template parser library.
 description:
   Allows parsing and rendering template files with mustache markup. See the
diff --git a/src/Text/Mustache.hs b/src/Text/Mustache.hs
--- a/src/Text/Mustache.hs
+++ b/src/Text/Mustache.hs
@@ -171,8 +171,17 @@
 
   , substituteValue, checkedSubstituteValue
 
-  -- ** Data Conversion
+  -- ** In Lambdas
+
+  , substituteNode, substituteAST, catchSubstitute
+
+  -- * Data Conversion
   , ToMustache, toMustache, object, (~>), (~=)
+
+  -- ** Utilities for lambdas
+
+  , overText
+
   ) where
 
 
@@ -180,3 +189,9 @@
 import           Text.Mustache.Compile
 import           Text.Mustache.Render
 import           Text.Mustache.Types
+import qualified Data.Text as T
+
+
+-- | Creates a 'Lambda' which first renders the contained section and then applies the supplied function
+overText :: (T.Text -> T.Text) -> Value
+overText f = toMustache $ fmap (f . snd) . catchSubstitute . substituteAST
diff --git a/src/Text/Mustache/Render.hs b/src/Text/Mustache/Render.hs
--- a/src/Text/Mustache/Render.hs
+++ b/src/Text/Mustache/Render.hs
@@ -103,7 +103,9 @@
 
 -- | Catch the results of running the inner substitution.
 catchSubstitute :: SubM a -> SubM (a, Text)
-catchSubstitute = fmap (second (T.concat . snd)) . SubM . listen . runSubM'
+catchSubstitute = fmap (second (T.concat . snd)) . SubM . hideResults . listen . runSubM'
+  where
+    hideResults = censor (\(errs, _) -> (errs, []))
 
 -- | Substitute an entire 'STree' rather than just a single 'Node'
 substituteAST :: STree -> SubM ()
diff --git a/test/unit/Spec.hs b/test/unit/Spec.hs
--- a/test/unit/Spec.hs
+++ b/test/unit/Spec.hs
@@ -185,6 +185,22 @@
         (object ["section" ~> ([] :: [T.Text])])
       `shouldBe` ""
 
+    it "substitutes a lambda by applying lambda to contained text" $
+      substitute
+        (toTemplate [Section (NamedData ["lambda"]) [TextBlock "t"]])
+        (object ["lambda" ~> (overText T.toUpper)])
+      `shouldBe` "T"
+
+
+    it "substitutes a lambda by applying lambda to the nested substitution results" $
+      substitute
+        (toTemplate [Section (NamedData ["lambda"]) [TextBlock "t", Variable escaped (NamedData ["inner"])]])
+        (object [ "lambda" ~> (overText T.toUpper)
+                , "inner" ~> ("var" :: T.Text)
+                ])
+      `shouldBe` "TVAR"
+
+
     it "substitutes a nested section" $
       substitute
         (toTemplate [Variable escaped (NamedData ["outer", "inner"])])
