diff --git a/NEWS b/NEWS
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,31 @@
+This file lists the user-visible interesting changes between releases. For a
+full list of changes to the source, see the ChangeLog.
+
+
+
+razom-text-util 0.1.2.0 -- 2015-06-18
+=====================================
+
+General, build and documentation changes:
+
+* (None)
+
+New APIs, features and enhancements:
+
+* Add `tokenizeText` function, producing tokens from lazy Text input
+
+Bug fixes:
+
+* `literal` regex accepts empty literals, e.g. as in `{{}}::<typeuid>`
+
+Dependency changes:
+
+* Adapt to smaoin-0.3
+
+
+
+
+
 razom-text-util 0.1.1.0 -- 2015-05-30
 =====================================
 
diff --git a/razom-text-util.cabal b/razom-text-util.cabal
--- a/razom-text-util.cabal
+++ b/razom-text-util.cabal
@@ -1,5 +1,5 @@
 name:                razom-text-util
-version:             0.1.1.0
+version:             0.1.2.0
 synopsis:            Common text/parsing tools for Razom language packages.
 description:         This is a library of utilities for writing code that
                      handles semantic information documents (text files). It is
@@ -34,8 +34,9 @@
   -- other-extensions:    
   build-depends:       base              >=4.7 && <5
                      , regex-applicative >=0.3.1
-                     , smaoin            >=0.1.0.0
-                     , text-position     >=0.1.0.0
+                     , smaoin            >=0.3
+                     , text              >=1.2
+                     , text-position     >=0.1
   hs-source-dirs:      src
   default-language:    Haskell2010
 
@@ -44,8 +45,8 @@
   type:                exitcode-stdio-1.0
   hs-source-dirs:      test
   main-is:             test.hs
-  build-depends:       base              >=4.7 && <5
+  build-depends:       base
                      , QuickCheck        >=2.8
                      , razom-text-util
-                     , regex-applicative >=0.3.1
-                     , smaoin            >=0.1.1.1
+                     , regex-applicative
+                     , smaoin
diff --git a/src/Text/Razom/Lexer.hs b/src/Text/Razom/Lexer.hs
--- a/src/Text/Razom/Lexer.hs
+++ b/src/Text/Razom/Lexer.hs
@@ -15,11 +15,14 @@
 
 module Text.Razom.Lexer
     ( tokenizeString
+    , tokenizeText
     , tokenizeFile
     )
 where
 
+import Control.Monad (liftM)
 import Data.Position
+import qualified Data.Text.Lazy as T
 import Text.Razom.Types
 import Text.Regex.Applicative
 import System.IO
@@ -30,12 +33,15 @@
         re'   = many $ bless re
         syms' = fst $ enrich adv syms
     in case findLongestPrefix re' syms' of
-        Just (ts, [])                      ->
+        Just (ts, [])                    ->
             Right $ depos ts
-        Just (ts, ((Positioned c pos):ps)) ->
-            Left $ LexError pos (depos ts) (c : (depos ps))
-        Nothing                            ->
+        Just (ts, Positioned c pos : ps) ->
+            Left $ LexError pos (depos ts) (c : depos ps)
+        Nothing                          ->
             Left $ LexError firstPosition [] syms
 
+tokenizeText :: Advance Char -> Regex t -> T.Text -> LexResult t
+tokenizeText adv re = tokenizeString adv re . T.unpack
+
 tokenizeFile :: Advance Char -> Regex t -> FilePath -> IO (LexResult t)
-tokenizeFile adv re fp = readFile fp >>= return . tokenizeString adv re
+tokenizeFile adv re fp = liftM (tokenizeString adv re) $ readFile fp
diff --git a/src/Text/Razom/Number.hs b/src/Text/Razom/Number.hs
--- a/src/Text/Razom/Number.hs
+++ b/src/Text/Razom/Number.hs
@@ -30,7 +30,7 @@
 where
 
 import Data.Char (digitToInt, isOctDigit)
-import Data.Smaoin (RealNum (..))
+import Data.Smaoin (RealNum, realnum)
 import Text.Razom.Types
 import Text.Regex.Applicative
 import Text.Regex.Applicative.Common
@@ -71,5 +71,5 @@
 -- >>> fromDigits [1, 4, 2] [8, 5, 7]
 -- RealNum 142857 -3
 fromDigits :: [Int] -> [Int] -> RealNum
-fromDigits s e = RealNum (fromIntegral $ digitsToNum 10 $ s ++ e)
+fromDigits s e = realnum (fromIntegral $ digitsToNum 10 $ s ++ e)
                          (fromIntegral $ negate $ length e)
diff --git a/src/Text/Razom/Value.hs b/src/Text/Razom/Value.hs
--- a/src/Text/Razom/Value.hs
+++ b/src/Text/Razom/Value.hs
@@ -32,7 +32,7 @@
 literal :: Regex String
 literal = string "{{" *> lbody <* string "}}"
     where
-    lbody = snd <$> withMatched (some lpart)
+    lbody = snd <$> withMatched (many lpart)
     lpart = Nothing <$ lchar <|> Nothing <$ sym '\\' <* psym isGraphical
     lchar = psym $ \ c -> isGraphical c && c /= '\\' && c /= '}'
 
@@ -48,7 +48,7 @@
 -- | Given an escaped value literal, do minimal default unescapes: for the
 -- escape character and for the closing delimiter.
 unescapeMinimal :: String -> String
-unescapeMinimal [] = []
+unescapeMinimal []             = []
 unescapeMinimal ('\\':'\\':cs) = '\\' : unescapeMinimal cs
 unescapeMinimal ('\\':'}':cs)  = '}'  : unescapeMinimal cs
 unescapeMinimal ('\\':c:cs)    = '\\' : c : unescapeMinimal cs
diff --git a/test/test.hs b/test/test.hs
--- a/test/test.hs
+++ b/test/test.hs
@@ -14,7 +14,7 @@
  -}
 
 import Control.Monad (unless)
-import Data.Smaoin (RealNum (..))
+import Data.Smaoin (realnum)
 import System.Exit
 import Test.QuickCheck
 import Test.QuickCheck.Test
@@ -32,7 +32,7 @@
                 && digitsToNum 16 [15, 15]           == 255
 
 prop_fromDigits :: Bool
-prop_fromDigits = fromDigits [1, 4, 2] [8, 5, 7] == RealNum 142857 (-3)
+prop_fromDigits = fromDigits [1, 4, 2] [8, 5, 7] == realnum 142857 (-3)
 
 prop_uid :: Bool
 prop_uid = match uid "<12<34\\>46\\\\7>" == Just "12<34>46\\7"
