diff --git a/System/IO/Strict.hs b/System/IO/Strict.hs
new file mode 100644
--- /dev/null
+++ b/System/IO/Strict.hs
@@ -0,0 +1,72 @@
+-----------------------------------------------------------------------------
+-- |
+-- Module      :  System.IO.Strict
+-- Copyright   :  (c) Don Stewart 2007
+-- License     :  BSD-style (see the file libraries/base/LICENSE)
+-- 
+-- Maintainer  :  dons@galois.com
+-- Stability   :  stable
+-- Portability :  portable
+--
+-- The standard IO input functions using strict IO.
+--
+-----------------------------------------------------------------------------
+
+module System.IO.Strict (
+
+    -- * Strict Handle IO
+    hGetContents,              -- :: Handle -> IO [Char]
+
+    -- * Strict String IO wrappers
+    getContents,               -- :: IO String
+    readFile,                  -- :: FilePath -> IO String
+    interact                   -- :: (String -> String) -> IO ()
+
+  ) where
+
+import Prelude ( String, (>>=), last, seq, return, (.), (=<<), FilePath)
+import System.IO (IO)
+import qualified System.IO as IO
+
+-- -----------------------------------------------------------------------------
+-- Strict hGetContents
+
+-- | Computation 'hGetContents' @hdl@ returns the list of characters
+-- corresponding to the unread portion of the channel or file managed
+-- by @hdl@, which is immediate closed.
+--
+-- Items are read strictly from the input Handle.
+--
+-- This operation may fail with:
+--
+--  * 'isEOFError' if the end of file has been reached.
+
+hGetContents    :: IO.Handle -> IO.IO String
+hGetContents h  = IO.hGetContents h >>= \s -> last s `seq` return s
+
+-- -----------------------------------------------------------------------------
+-- Standard IO
+
+-- | The 'getContents' operation returns all user input as a single string,
+-- which is read stirctly (same as 'hGetContents' 'stdin').
+
+getContents     :: IO String
+getContents     =  hGetContents IO.stdin
+{-# INLINE getContents #-}
+
+-- | The 'interact' function takes a function of type @String->String@
+-- as its argument.  The entire input from the standard input device is
+-- passed to this function as its argument, and the resulting string is
+-- output on the standard output device.
+
+interact        ::  (String -> String) -> IO ()
+interact f      =   IO.putStr . f =<< getContents
+{-# INLINE interact #-}
+
+-- | The 'readFile' function reads a file and
+-- returns the contents of the file as a string.
+-- The file is read lazily, on demand, as with 'getContents'.
+
+readFile        :: FilePath -> IO String
+readFile name   =  IO.openFile name IO.ReadMode >>= hGetContents
+{-# INLINE readFile #-}
diff --git a/strict.cabal b/strict.cabal
--- a/strict.cabal
+++ b/strict.cabal
@@ -1,14 +1,15 @@
 Name:           strict
-Version:        0.2
-Synopsis:       Strict data types
-Category:       Data
+Version:        0.3
+Synopsis:       Strict data types and String IO.
+Category:       Data, System
 Description:
         This package provides strict versions of some standard Haskell data
-        types (pairs, Maybe and Either at the moment).
+        types (pairs, Maybe and Either). It also contains strict IO
+        operations.
 License:        BSD3
 License-File:   LICENSE
 Author:         Roman Leshchinskiy <rl@cse.unsw.edu.au>
-Maintainer:     Roman Leshchinskiy <rl@cse.unsw.edu.au>
+Maintainer:     Don Stewart <dons@galois.com>
 Copyright:      (c) 2006-2007 by Roman Leshchinskiy
 Homepage:       http://www.cse.unsw.edu.au/~rl/code/strict.html
 Cabal-Version: >= 1.2
@@ -21,9 +22,10 @@
   else
     build-depends:     base < 3
   exposed-modules:
-        Data.Strict.Tuple,
-        Data.Strict.Maybe,
-        Data.Strict.Either,
+        Data.Strict.Tuple
+        Data.Strict.Maybe
+        Data.Strict.Either
         Data.Strict
+        System.IO.Strict
   ghc-options:    -Wall -Werror -O2
   extensions:     CPP
