diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,16 @@
 Brick changelog
 ---------------
 
+0.22
+----
+
+API changes:
+ * Core: added txtWrapWith and strWrapWith functions to provide control
+   over wrapping behavior by specifying custom wrapping settings.
+
+Other changes:
+ * Updated TextWrapDemo.hs to demonstrate customizing wrapping settings.
+
 0.21
 ----
 
diff --git a/brick.cabal b/brick.cabal
--- a/brick.cabal
+++ b/brick.cabal
@@ -1,5 +1,5 @@
 name:                brick
-version:             0.21
+version:             0.22
 synopsis:            A declarative terminal user interface library
 description:
   Write terminal applications painlessly with 'brick'! You write an
@@ -118,7 +118,8 @@
   main-is:             TextWrapDemo.hs
   build-depends:       base,
                        brick,
-                       text
+                       text,
+                       word-wrap
 
 executable brick-cache-demo
   if !flag(demos)
diff --git a/programs/TextWrapDemo.hs b/programs/TextWrapDemo.hs
--- a/programs/TextWrapDemo.hs
+++ b/programs/TextWrapDemo.hs
@@ -2,12 +2,21 @@
 
 import Data.Monoid ((<>))
 import Brick
+import Text.Wrap (defaultWrapSettings, preserveIndentation)
 
 ui :: Widget ()
-ui = strWrap $ "Hello, world! This line is long enough that " <>
-               "it's likely to wrap on your terminal if your window " <>
-               "isn't especially wide. Try narrowing and widening " <>
-               "the window to see what happens to this text."
+ui =
+    t1 <=> (padTop (Pad 1) t2)
+    where
+      t1 = strWrap $ "Hello, world! This line is long enough that " <>
+                     "it's likely to wrap on your terminal if your window " <>
+                     "isn't especially wide. Try narrowing and widening " <>
+                     "the window to see what happens to this text."
+      settings = defaultWrapSettings { preserveIndentation = True }
+      t2 = strWrapWith settings $
+          "This text wraps\n" <>
+          "   with different settings to preserve indentation\n" <>
+          "   so that long lines wrap in nicer way."
 
 main :: IO ()
 main = simpleMain ui
diff --git a/src/Brick/Widgets/Core.hs b/src/Brick/Widgets/Core.hs
--- a/src/Brick/Widgets/Core.hs
+++ b/src/Brick/Widgets/Core.hs
@@ -13,8 +13,10 @@
   , raw
   , txt
   , txtWrap
+  , txtWrapWith
   , str
   , strWrap
+  , strWrapWith
   , fill
 
   -- * Padding
@@ -103,7 +105,7 @@
 import qualified Graphics.Vty as V
 import Control.DeepSeq
 
-import Text.Wrap (wrapTextToLines, defaultWrapSettings)
+import Text.Wrap (wrapTextToLines, WrapSettings, defaultWrapSettings)
 
 import Brick.Types
 import Brick.Types.Internal
@@ -201,20 +203,28 @@
             else ""
 
 -- | Make a widget from a string, but wrap the words in the input's
--- lines at the available width.
+-- lines at the available width using the default wrapping settings.
 strWrap :: String -> Widget n
-strWrap = txtWrap . T.pack
+strWrap = strWrapWith defaultWrapSettings
 
+-- | Make a widget from a string, but wrap the words in the input's
+-- lines at the available width using the specified wrapping settings.
+strWrapWith :: WrapSettings -> String -> Widget n
+strWrapWith settings t = txtWrapWith settings $ T.pack t
+
 safeTextWidth :: T.Text -> Int
 safeTextWidth = V.safeWcswidth . T.unpack
 
 -- | Make a widget from text, but wrap the words in the input's lines at
--- the available width.
+-- the available width using the default wrapping settings.
 txtWrap :: T.Text -> Widget n
-txtWrap s =
+txtWrap = txtWrapWith defaultWrapSettings
+
+txtWrapWith :: WrapSettings -> T.Text -> Widget n
+txtWrapWith settings s =
     Widget Fixed Fixed $ do
       c <- getContext
-      let theLines = fixEmpty <$> wrapTextToLines defaultWrapSettings (c^.availWidthL) s
+      let theLines = fixEmpty <$> wrapTextToLines settings (c^.availWidthL) s
           fixEmpty l | T.null l = " "
                      | otherwise = l
       case force theLines of
