diff --git a/CHANGELOG b/CHANGELOG
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,6 @@
+5.8.1
+  - Fixed "refresh" to work as advertised (see #104)
+
 5.8
   - API change: EvPaste input event now provides paste data as a raw
     ByteString rather than a String to allow the application to decode
diff --git a/src/Graphics/Vty.hs b/src/Graphics/Vty.hs
--- a/src/Graphics/Vty.hs
+++ b/src/Graphics/Vty.hs
@@ -162,10 +162,13 @@
             writeIORef lastUpdateRef $ Just updateData
             writeIORef lastPicRef $ Just inPic'
 
-    let innerRefresh 
-            =   writeIORef lastUpdateRef Nothing
-            >>  readIORef lastPicRef 
-            >>= maybe ( return () ) ( \pic -> innerUpdate pic ) 
+    let innerRefresh = do
+            writeIORef lastUpdateRef Nothing
+            bounds <- displayBounds out
+            dc <- displayContext out bounds
+            writeIORef (assumedStateRef $ contextDevice dc) initialAssumedState
+            mPic <- readIORef lastPicRef
+            maybe (return ()) innerUpdate mPic
 
     let gkey = do k <- atomically $ readTChan $ _eventChannel input
                   case k of 
diff --git a/vty.cabal b/vty.cabal
--- a/vty.cabal
+++ b/vty.cabal
@@ -1,5 +1,5 @@
 name:                vty
-version:             5.8
+version:             5.8.1
 license:             BSD3
 license-file:        LICENSE
 author:              AUTHORS
