diff --git a/NEWS b/NEWS
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,15 @@
+Darcs 2.4.4, 9 May 2010
+
+ * Important changes in Darcs 2.4.4
+
+   * darcs builds on Windows with GHC 6.10 (and GHC 6.12).
+   * darcs (built with GHC 6.12 on Windows) works with SSH again
+
+ * Issues resolved in Darcs 2.4.4
+
+   * 1814: Apply binary mode to ssh process and patch file handles.
+
+
 Darcs 2.4.3, 9 May 2010
 
  * Important changes in Darcs 2.4.3
diff --git a/darcs.cabal b/darcs.cabal
--- a/darcs.cabal
+++ b/darcs.cabal
@@ -1,5 +1,5 @@
 Name:           darcs
-version:        2.4.3
+version:        2.4.4
 License:        GPL
 License-file:   COPYING
 Author:         David Roundy <droundy@darcs.net>, <darcs-users@darcs.net>
diff --git a/release/distributed-context b/release/distributed-context
--- a/release/distributed-context
+++ b/release/distributed-context
@@ -1,1 +1,1 @@
-Just "\nContext:\n\n[TAG 2.4.3\nEric Kow <kowey@darcs.net>**20100509132315\n Ignore-this: 1a920525d0cd01c352d5a2893bbea10d\n] \n"
+Just "\nContext:\n\n[TAG 2.4.4\nEric Kow <kowey@darcs.net>**20100515090819\n Ignore-this: 7d1a0e6a17c2be314f6ab1607bbcac13\n] \n"
diff --git a/src/Darcs/External.hs b/src/Darcs/External.hs
--- a/src/Darcs/External.hs
+++ b/src/Darcs/External.hs
@@ -22,7 +22,7 @@
 import Control.Monad ( when, zipWithM_, filterM, liftM2 )
 import System.Exit ( ExitCode(..) )
 import System.Environment ( getEnv, getProgName )
-import System.IO ( hPutStr, hPutStrLn, hClose,
+import System.IO ( hSetBinaryMode, hPutStr, hPutStrLn, hClose,
                    openBinaryFile, IOMode( ReadMode ),
                    openBinaryTempFile,
                    hIsTerminalDevice, stdout, stderr, Handle )
@@ -316,6 +316,8 @@
 pipeDoc c args inp = withoutNonBlock $ withoutProgress $
     do debugMessage $ unwords (c:args)
        (i,o,e,pid) <- runInteractiveProcess c args Nothing Nothing
+       hSetBinaryMode i True
+       hSetBinaryMode o True
        mvare <- newEmptyMVar
        forkIO ((Ratified.hGetContents e >>= -- ratify: immediately consumed
                 hPutStr stderr)
diff --git a/src/Darcs/SlurpDirectory/Internal.hs b/src/Darcs/SlurpDirectory/Internal.hs
--- a/src/Darcs/SlurpDirectory/Internal.hs
+++ b/src/Darcs/SlurpDirectory/Internal.hs
@@ -69,17 +69,9 @@
 
 import Darcs.Patch.FileName ( FileName, fn2fp, fp2fn, norm_path, break_on_dir,
                               own_name, superName )
-#if mingw32_HOST_OS && __GLASGOW_HASKELL__ < 612
-import Data.Int ( Int64 )
-#else
 import System.Posix.Types ( FileOffset )
-#endif
 
 #include "impossible.h"
-
-#if mingw32_HOST_OS && __GLASGOW_HASKELL__ < 612
-type FileOffset = Int64
-#endif
 
 data Slurpy = Slurpy !FileName !SlurpyContents
 
diff --git a/src/Ssh.hs b/src/Ssh.hs
--- a/src/Ssh.hs
+++ b/src/Ssh.hs
@@ -16,7 +16,7 @@
 import Data.Bits ( (.&.) )
 import System.Random ( randomIO )
 #endif
-import System.IO ( Handle, hPutStr, hPutStrLn, hGetLine, hClose, hFlush )
+import System.IO ( Handle, hSetBinaryMode, hPutStr, hPutStrLn, hGetLine, hClose, hFlush )
 import System.IO.Unsafe ( unsafePerformIO )
 import System.Directory ( doesFileExist, createDirectoryIfMissing )
 import Control.Monad ( when )
@@ -58,6 +58,8 @@
                                                   "transfer-mode","--repodir",cleanrepodir repoid]
                        debugMessage $ "ssh "++unwords sshargs
                        (i,o,e,_) <- runInteractiveProcess ssh sshargs Nothing Nothing
+                       hSetBinaryMode i True
+                       hSetBinaryMode o True
                        l <- hGetLine o
                        if l == "Hello user, I am darcs transfer mode"
                            then return ()
diff --git a/tests/add-formerly-pl.sh b/tests/add-formerly-pl.sh
--- a/tests/add-formerly-pl.sh
+++ b/tests/add-formerly-pl.sh
@@ -16,26 +16,22 @@
 mkdir oof.d
 darcs add foo.d
 darcs add oof.d
-not darcs add foo.d 2> log
-grep -i directory log
+not darcs add foo.d 2>&1 | grep -i directory
 # Try adding the same directory when it's already in the repo
-not darcs add foo.d oof.d 2> log
-grep -i directories log
+not darcs add foo.d oof.d 2>&1 | grep -i directories
 
 # Make sure that messages about files call them files
 touch bar
 touch baz
 darcs add bar
 darcs add baz
-not darcs add bar 2> log
-grep -i 'following file is' log
-not darcs add bar baz 2> log
-grep -i 'following files are' log
+not darcs add bar 2>&1 | grep -i "following file is"
+not darcs add bar baz 2>&1 | grep -i "following files are"
 
 # Make sure that messages about both files and directories say so
-not darcs add bar foo.d 2> log
-grep -i 'files and directories' log
+not darcs add bar foo.d 2>&1 | grep -i 'files and directories'
 
+
 # Make sure that parent directories are added for files
 mkdir -p a.d/aa.d/aaa.d
 mkdir -p b.d/bb.d
@@ -56,8 +52,7 @@
 darcs add -rv d.d | grep 'd.d/foo'
 
 # 'adding a non-existent dir and file gives the expected message
-not darcs add notadir/notafile 2> log
-grep -i 'does not exist' log
+not darcs add notadir/notafile 2>&1 | grep -i 'does not exist'
 
 cd ..
 rm -rf temp1
diff --git a/tests/issue381.sh b/tests/issue381.sh
--- a/tests/issue381.sh
+++ b/tests/issue381.sh
@@ -35,7 +35,7 @@
 
 chmod +x editor
 
-DARCS_EDITOR='bash editor' darcs send --debug --author=me -a --output=bundle --edit-description ../temp2
+DARCS_EDITOR='bash editor' darcs send --author=me -a --output=bundle --edit-description ../temp2
 
 echo === beginning of bundle > ===
 cat bundle
diff --git a/tests/mv-formerly-pl.sh b/tests/mv-formerly-pl.sh
--- a/tests/mv-formerly-pl.sh
+++ b/tests/mv-formerly-pl.sh
@@ -30,10 +30,9 @@
 touch ping
 touch pong
 darcs add ping pong
-not darcs mv ping pong &> out
-cat out
-grep 'already exists' out
 
+not darcs mv ping pong 2>&1 | grep "already exists"
+
 # case sensitivity series
 # -----------------------
 # these are tests designed to check out darcs behave wrt to renames
@@ -59,13 +58,9 @@
 
 if test -e is_it_cs; then
   # regardless of case-ok, we do NOT want this mv at all
-  not darcs mv cs-n-1 CS-Y-1 &> out
-  cat out
-  grep 'already exists' out
+  not darcs mv cs-n-1 CS-Y-1 2>&1 | grep "already exists"
 
-  not darcs mv --case-ok cs-n-1 CS-Y-1 &> out
-  cat out
-  grep 'already exists' out
+  not darcs mv --case-ok cs-n-1 CS-Y-1 2>&1 | grep "already exists"
 fi
 
 # if the new file does not already exist - we allow it
@@ -88,13 +83,9 @@
 if ln cs-n-3 CS-N-3; then # checking if we support hard links
   ln cs-y-3 CS-Y-3
   # regardless of case-ok, we do NOT want this mv at all
-  not darcs mv cs-n-3 CS-N-3 &> out
-  cat out
-  grep 'already exists' out
+  not darcs mv cs-n-3 CS-N-3 2>&1 | grep "already exists"
 
-  not darcs mv --case-ok cs-y-3 CS-Y-3 &> out
-  cat out
-  grep 'already exists' out
+  not darcs mv --case-ok cs-y-3 CS-Y-3 2>&1 | grep "already exists"
 fi
 
 # parasites - we don't allow weird stuff like mv foo bar/foo just because
@@ -104,13 +95,9 @@
 touch 'cs-y-4'; touch 'foo.d/cs-y-4';
 darcs add cs-n-4
 # regardless of case-ok, we do NOT want this mv at all
-not darcs mv cs-n-4 foo.d/cs-n-4 &> out
-cat out
-grep 'already exists' out
+not darcs mv cs-n-4 foo.d/cs-n-4 2>&1 | grep "already exists"
 
-not darcs mv --case-ok cs-y-4 foo.d/cs-y-4 &> out
-cat out
-grep 'already exists' out
+not darcs mv --case-ok cs-y-4 foo.d/cs-y-4 2>&1 | grep "already exists"
 
 # ---------------------------
 # end case sensitivity series
