diff --git a/Bundled/SHA256.hs b/Bundled/SHA256.hs
--- a/Bundled/SHA256.hs
+++ b/Bundled/SHA256.hs
@@ -1,16 +1,8 @@
 {-# LANGUAGE CPP, ForeignFunctionInterface #-}
 
--- |
--- Module:    Data.Digest.SHA256
--- Copyright: Zooko O'Whielacronx
--- License:   GPL
---
--- Stability: experimental
-
--- ByteString-based, zero-copying binding to Crypto++'s sha interface
-
--- thanks to Don Stewart <dons@galois.com>, Matthew Sackman
--- <matthew@wellquite.org>, Brian O'Sullivan, lispy, Adam Langley
+-- Private interface to a C implementation of SHA 256. Originally based on code
+-- by Zooko O'Whielacronx, but rewritten since. Therefore, BSD applies, as for
+-- the rest of hashed-storage.
 
 module Bundled.SHA256 ( sha256 ) where
 
@@ -27,6 +19,5 @@
              return $! digest
 
 -- void sha256sum(const unsigned char *d, size_t n, unsigned char *md);
---
 foreign import ccall unsafe "sha2.h hashed_storage_sha256" c_sha256
     :: Ptr CChar -> CSize -> Ptr Word8 -> IO ()
diff --git a/Storage/Hashed/Darcs.hs b/Storage/Hashed/Darcs.hs
--- a/Storage/Hashed/Darcs.hs
+++ b/Storage/Hashed/Darcs.hs
@@ -141,6 +141,14 @@
               do hash <- sha256 <$> readBlob blob
                  return $ File (Blob con hash)
 
+darcsAddMissingHashes :: (Monad m, Functor m) => Tree m -> m (Tree m)
+darcsAddMissingHashes = updateTree update
+    where update (SubTree t) = return . SubTree $ t { treeHash = darcsTreeHash t }
+          update (File blob@(Blob con NoHash)) =
+              do hash <- sha256 <$> readBlob blob
+                 return $ File (Blob con hash)
+          update x = return x
+
 -------------------------------------------
 -- Reading darcs pristine data
 --
@@ -215,7 +223,8 @@
 hashedTreeIO action t dir =
     do runTreeMonad action $ initialState t syncHashed
     where syncHashed ch = do
-            modify $ \st -> st { tree = darcsUpdateDirHashes $ tree st }
+            hashed <- liftIO . darcsAddMissingHashes =<< gets tree
+            modify $ \st -> st { tree = hashed }
             forM_ (reverse $ S.toList ch) $ \c -> do
                 current <- gets tree
                 case find current c of
diff --git a/Storage/Hashed/Monad.hs b/Storage/Hashed/Monad.hs
--- a/Storage/Hashed/Monad.hs
+++ b/Storage/Hashed/Monad.hs
@@ -167,7 +167,11 @@
            markChanged p
            maybeFlush
         where blob = File $ Blob (return con) hash
-              hash = sha256 con
+              hash = NoHash -- we would like to say "sha256 con" here, but due
+                            -- to strictness of Hash in Blob, this would often
+                            -- lead to unnecessary computation which would then
+                            -- be discarded anyway; we rely on the sync
+                            -- implementation to fix up any NoHash occurrences
 
     createDirectory p =
         do expandTo p
diff --git a/hashed-storage.cabal b/hashed-storage.cabal
--- a/hashed-storage.cabal
+++ b/hashed-storage.cabal
@@ -1,5 +1,5 @@
 name:          hashed-storage
-version:       0.4.4
+version:       0.4.5
 synopsis:      Hashed file storage support code.
 
 description:   Support code for reading and manipulating hashed file storage
