diff --git a/interlude-l.cabal b/interlude-l.cabal
--- a/interlude-l.cabal
+++ b/interlude-l.cabal
@@ -1,5 +1,5 @@
 name:                interlude-l
-version:             0.1.0.1
+version:             0.1.0.2
 synopsis:            Prelude replacement based on protolude
 description:         Prelude replacement based on protolude
 license:             BSD3
@@ -23,4 +23,8 @@
                      , lens == 4.13.*
                      , aeson == 0.9.*
                      , witherable == 0.1.*
+                     , transformers == 0.4.*
+                     , mtl == 2.2.*
+                     , monad-control
+                     , MonadRandom
   ghc-options:         -Wall
diff --git a/src/Interlude.hs b/src/Interlude.hs
--- a/src/Interlude.hs
+++ b/src/Interlude.hs
@@ -1,12 +1,16 @@
-{-# LANGUAGE UndecidableInstances, MultiParamTypeClasses, FlexibleInstances, FlexibleContexts #-}
+{-# LANGUAGE UndecidableInstances, MultiParamTypeClasses, FlexibleInstances, FlexibleContexts
+           , NoMonomorphismRestriction, OverloadedStrings #-}
+{-# OPTIONS_GHC -fno-warn-orphans #-}
 module Interlude ( module X, unsafeTail, unsafeHead, unsafeLast, unsafeInit
-                 , PShow(..), perror ) where
+                 , pshow, perror, pread, noWarnUndefined, perrorToFile ) where
 
 import qualified Prelude
 import Protolude as X hiding ( (&), catch, throw, try, (<.>), wait, error, filter, ordNub
-                             , catMaybes, mapMaybe )
+                             , catMaybes, mapMaybe, handle, catches, Handler(..) )
 import Prelude as X (error)
-import Control.Monad.Catch as X (MonadThrow, MonadCatch, catch, throwM, try)
+import Control.Monad.Catch as X ( MonadThrow, MonadCatch, catch, throwM, try, handle, catches
+                                , Handler(..), handleIf, catchIf )
+import Control.Monad.Trans.Class as X
 import Control.Monad.State as X (modify')
 import Control.Lens.Operators as X
 import Control.Lens.TH as X
@@ -18,6 +22,10 @@
 import Data.Char as X
 import Data.Witherable as X
 import Data.String
+import Control.Monad.Trans.Control as X (MonadBaseControl, MonadTransControl)
+import Control.Monad.Random as X
+import GHC.IO
+import System.IO (writeFile)
 
 unsafeTail :: [a] -> [a]
 unsafeTail = Prelude.tail
@@ -31,11 +39,19 @@
 unsafeInit :: [a] -> [a]
 unsafeInit = Prelude.init
 
-class Prelude.Show a => PShow a stringLike where
-    pshow :: a -> stringLike
-
-instance (Prelude.Show a, IsString stringLike) => PShow a stringLike where
-    pshow = fromString . show
+pshow :: (Show a, IsString c) => a -> c
+pshow = fromString . show
 
 perror :: StringConv stringLike String => stringLike -> a
 perror = error . toS
+
+pread :: (Read a, StringConv stringLike String) => stringLike -> a
+pread = Prelude.read . toS
+
+noWarnUndefined :: a
+noWarnUndefined = Prelude.undefined
+
+perrorToFile :: StringConv stringLike String => Text -> stringLike -> a
+perrorToFile path err = unsafePerformIO $ do
+    writeFile (toS path) (toS err)
+    perror (take 100 (toS err :: String) <> "...REST OF ERROR IN " <> toS path)
