diff --git a/acid-state.cabal b/acid-state.cabal
--- a/acid-state.cabal
+++ b/acid-state.cabal
@@ -7,7 +7,7 @@
 -- The package version. See the Haskell package versioning policy
 -- (http://www.haskell.org/haskellwiki/Package_versioning_policy) for
 -- standards guiding when and how versions should be incremented.
-Version:             0.8.0
+Version:             0.8.1
 
 -- A short (one-line) description of the package.
 Synopsis:            Add ACID guarantees to any serializable Haskell data structure.
diff --git a/examples/RemoteServer.hs b/examples/RemoteServer.hs
--- a/examples/RemoteServer.hs
+++ b/examples/RemoteServer.hs
@@ -2,7 +2,6 @@
 module Main (main) where
 
 import Data.Acid
-import Data.Acid.Local
 import Data.Acid.Remote (acidServer)
 
 import Control.Exception (bracket)
@@ -17,11 +16,6 @@
 main :: IO ()
 main =
     bracket
-      (do putStrLn "Loading checkpoint"
-          mkAcid <- prepareLocalState $ StressState 0
-          putStrLn "Waiting for lock/replaying events"
-          acid <- mkAcid
-          putStrLn "Done."
-          return acid)
+      (openLocalState $ StressState 0)
       closeAcidState
       (\s -> acidServer s (PortNumber 8080))
diff --git a/src/Data/Acid/Memory.hs b/src/Data/Acid/Memory.hs
--- a/src/Data/Acid/Memory.hs
+++ b/src/Data/Acid/Memory.hs
@@ -7,7 +7,7 @@
 -- Maintainer  :  lemmih@gmail.com
 -- Portability :  non-portable (uses GHC extensions)
 --
--- AcidState container without a transaction log. Mostly used for testing. 
+-- AcidState container without a transaction log. Mostly used for testing.
 --
 
 module Data.Acid.Memory
@@ -22,6 +22,7 @@
 import Control.Monad.State            ( runState )
 import Data.ByteString.Lazy           ( ByteString )
 import Data.Typeable                  ( Typeable )
+import Data.IORef                     ( IORef, newIORef, readIORef, writeIORef )
 
 import Data.SafeCopy                  ( SafeCopy(..) )
 
@@ -41,6 +42,7 @@
 -}
 data MemoryState st
     = MemoryState { localCore    :: Core st
+                  , localCopy    :: IORef st
                   } deriving (Typeable)
 
 -- | Create an AcidState given an initial value.
@@ -49,7 +51,8 @@
               -> IO (AcidState st)
 openMemoryState initialState
     = do core <- mkCore (eventsToMethods acidEvents) initialState
-         return $ toAcidState MemoryState { localCore = core }
+         ref  <- newIORef initialState
+         return $ toAcidState MemoryState { localCore = core, localCopy = ref }
 
 
 -- | Issue an Update event and return immediately. The event is not durable
@@ -67,6 +70,7 @@
     = do mvar <- newEmptyMVar
          modifyCoreState_ (localCore acidState) $ \st ->
            do let !(result, !st') = runState hotMethod st
+              writeIORef (localCopy acidState) st'
               putMVar mvar result
               return st'
          return mvar
@@ -77,6 +81,7 @@
     = do mvar <- newEmptyMVar
          modifyCoreState_ (localCore acidState) $ \st ->
            do let !(result, !st') = runState coldMethod st
+              writeIORef (localCopy acidState) st'
               putMVar mvar result
               return st'
          return mvar
@@ -85,20 +90,16 @@
 -- | Issue a Query event and wait for its result. Events may be issued in parallel.
 memoryQuery  :: QueryEvent event  => MemoryState (EventState event) -> event -> IO (EventResult event)
 memoryQuery acidState event
-    = do mvar <- newEmptyMVar
-         withCoreState (localCore acidState) $ \st ->
-           do let (result, _st) = runState hotMethod st
-              putMVar mvar result
-         takeMVar mvar
+    = do st <- readIORef (localCopy acidState)
+         let (result, _st) = runState hotMethod st
+         return result
     where hotMethod = lookupHotMethod (coreMethods (localCore acidState)) event
 
 memoryQueryCold  :: MemoryState st -> Tagged ByteString -> IO ByteString
 memoryQueryCold acidState event
-    = do mvar <- newEmptyMVar
-         withCoreState (localCore acidState) $ \st ->
-           do let (result, _st) = runState coldMethod st
-              putMVar mvar result
-         takeMVar mvar
+    = do st <- readIORef (localCopy acidState)
+         let (result, _st) = runState coldMethod st
+         return result
     where coldMethod = lookupColdMethod (localCore acidState) event
 
 -- | This is a nop with the memory backend.
