diff --git a/Source/IO.hs b/Source/IO.hs
--- a/Source/IO.hs
+++ b/Source/IO.hs
@@ -64,6 +64,7 @@
 import qualified Text.IO as TIO
 import Text
 import Textual
+import Printer
 import Path
 import qualified System.Path.PartClass as PC
 import Exception
diff --git a/Source/Printer.hs b/Source/Printer.hs
new file mode 100644
--- /dev/null
+++ b/Source/Printer.hs
@@ -0,0 +1,11 @@
+module Printer
+    (
+     module Text.Printer,
+     module Text.Printer.Integral,
+     module Text.Printer.Fractional
+    ) where
+
+
+import Text.Printer
+import Text.Printer.Integral
+import Text.Printer.Fractional
diff --git a/Source/Random.hs b/Source/Random.hs
new file mode 100644
--- /dev/null
+++ b/Source/Random.hs
@@ -0,0 +1,25 @@
+{-|
+Module:             Random
+Description:        Lifted random value functions using the system random number generator.
+Copyright:          © 2017 All rights reserved.
+License:            GPL-3
+Maintainer:         Evan Cofsky <evan@theunixman.com>
+Stability:          experimental
+Portability:        POSIX
+-}
+
+module Random (randomR, random) where
+
+import Unicode
+import System.IO (IO)
+import IO.Base
+import qualified System.Random as R
+
+-- | Generate an endless range of random numbers between @[a, a]@
+-- inclusive. (This is 'R.randomRIO' lifted.)
+randomR ∷ (R.Random a, MonadBase IO m) ⇒ (a, a) → m a
+randomR = liftBase ∘ R.randomRIO
+
+-- | Generate an endless stream of values. (This is 'R.randomIO' lifted.)
+random ∷ (R.Random a, MonadBase IO m) ⇒ m a
+random = liftBase R.randomIO
diff --git a/Source/Textual.hs b/Source/Textual.hs
--- a/Source/Textual.hs
+++ b/Source/Textual.hs
@@ -1,10 +1,11 @@
-{-# LANGUAGE DeriveFoldable #-}
 module Textual
     (
      module Data.Textual,
-     module Text.Printer
+     module Data.Textual.Integral,
+     module Data.Textual.Fractional
     ) where
 
 
 import Data.Textual
-import Text.Printer hiding ((<>))
+import Data.Textual.Integral
+import Data.Textual.Fractional
diff --git a/Tests/TestSTMHub.hs b/Tests/TestSTMHub.hs
new file mode 100644
--- /dev/null
+++ b/Tests/TestSTMHub.hs
@@ -0,0 +1,37 @@
+{-# LANGUAGE TemplateHaskell, OverloadedStrings #-}
+{-# OPTIONS_GHC -Wno-orphans #-}
+
+{-|
+Module:             TestSTMHub
+Description:        Test reading lines from text files.
+Copyright:          © 2017 All rights reserved.
+License:            GPL-3
+Maintainer:         Evan Cofsky <evan@theunixman.com>
+Stability:          experimental
+Portability:        POSIX
+-}
+
+module TestSTMHub where
+
+import Lawless
+import Text hiding (text)
+import STM
+
+import Arbitrary()
+import Test.Framework
+import Test.Framework.TH
+import Test.Framework.Providers.QuickCheck2 (testProperty)
+import Test.QuickCheck
+import Test.QuickCheck.Monadic
+import Line
+
+default (Text)
+
+prop_CheckSingle ∷ [Line] → Property
+prop_CheckSingle lns = monadicIO $ do
+    
+    m ← run $ readWriteLines lns
+    assert (lns == m)
+
+properties ∷ Test
+properties = $(testGroupGenerator)
diff --git a/liblawless.cabal b/liblawless.cabal
--- a/liblawless.cabal
+++ b/liblawless.cabal
@@ -1,5 +1,5 @@
 name:                liblawless
-version:             0.23.1
+version:             0.24.0
 synopsis:            Prelude based on protolude for GHC 8 and beyond.
 license:             GPL-3
 license-file:        LICENSE
@@ -29,7 +29,7 @@
 source-repository this
   type:     git
   location:   https://gitlab.com/theunixman/liblawless.git
-  tag: v0.23.1
+  tag: v0.24.0
 
 library
   ghc-options: -Wall -Wno-redundant-constraints -Wno-type-defaults -O2
@@ -48,7 +48,9 @@
                   Map
                   Networking
                   Parser
+                  Printer
                   Path
+                  Random
                   Set
                   STM
                   STM.Base
@@ -103,6 +105,7 @@
                 hjsonschema                >= 1.6.2 && < 1.7,
                 lens                       >= 4.14 && < 4.16,
                 lifted-async  >= 0.9.1.1 && < 0.10,
+                lifted-base  >= 0.2.3 && < 0.3,
                 machines                   >= 0.6.1 && < 0.7,
                 managed             >= 1.0.5 && < 1.1,
                 monad-control >= 1.0.1.0 && < 1.1,
