diff --git a/CHANGES b/CHANGES
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,9 @@
+Version 0.3.4.3 released 26 Sep 2010
+
+* runShellCommand: reverted to older version with temp files.
+  The new version caused lazy-IO related problems with large
+  files. Thanks to Pavel Perikov diagnosing the problem.
+
 Version 0.3.4.2 released 03 Aug 2010
 
 * gitInit:  Set up repository to allow push to the current
diff --git a/Data/FileStore/Utils.hs b/Data/FileStore/Utils.hs
--- a/Data/FileStore/Utils.hs
+++ b/Data/FileStore/Utils.hs
@@ -37,24 +37,28 @@
 import System.Exit (ExitCode(..))
 import System.FilePath ((</>), takeDirectory)
 import System.IO (openTempFile, hClose)
-import System.Process (runInteractiveProcess, waitForProcess)
+import System.Process (runProcess, waitForProcess)
 import qualified Data.ByteString.Lazy as B
 
 import Data.FileStore.Types (SearchMatch(..), FileStoreError(IllegalResourceName, NotFound, UnknownError), SearchQuery(..))
 
--- | Run shell command and return error status, standard output, and error
--- output.  Assumes UTF-8 locale. Note that this does not go through \/bin\/sh!
+-- | Run shell command and return error status, standard output, and error output.  Assumes
+-- UTF-8 locale. Note that this does not actually go through \/bin\/sh!
 runShellCommand :: FilePath                     -- ^ Working directory
                 -> Maybe [(String, String)]     -- ^ Environment
                 -> String                       -- ^ Command
                 -> [String]                     -- ^ Arguments
                 -> IO (ExitCode, B.ByteString, B.ByteString)
-runShellCommand wd env cmd args = do
-  (hInp, hOut, hErr, ph) <- runInteractiveProcess (encodeString cmd) (map encodeString args) (Just wd) env
-  hClose hInp
-  output <- B.hGetContents hOut
-  errorOutput <- B.hGetContents hErr
-  status <- waitForProcess ph
+runShellCommand workingDir environment command optionList = do
+  tempPath <- catch getTemporaryDirectory (\_ -> return ".")
+  (outputPath, hOut) <- openTempFile tempPath "out"
+  (errorPath, hErr) <- openTempFile tempPath "err"
+  hProcess <- runProcess (encodeString command) (map encodeString optionList) (Just workingDir) environment Nothing (Just hOut) (Just hErr)
+  status <- waitForProcess hProcess
+  errorOutput <- B.readFile errorPath
+  output <- B.readFile outputPath
+  removeFile errorPath
+  removeFile outputPath
   return (status, errorOutput, output)
 
 -- | Do a three way merge, using either git merge-file or RCS merge.  Assumes
diff --git a/filestore.cabal b/filestore.cabal
--- a/filestore.cabal
+++ b/filestore.cabal
@@ -1,5 +1,5 @@
 Name:                filestore
-Version:             0.3.4.2
+Version:             0.3.4.3
 Cabal-version:       >= 1.2
 Build-type:          Custom
 Tested-with:         GHC==6.10.1
