diff --git a/CHANGELOG.markdown b/CHANGELOG.markdown
--- a/CHANGELOG.markdown
+++ b/CHANGELOG.markdown
@@ -1,3 +1,11 @@
+0.7.0.0
+-------
+* Fix date conversion. `recordedEventCreateEpoch` is no longer exposed.
+* Add `waitTillCatchup` and `hasCaughtUp` functions.
+* Add `exactStream` `ExpectedVersion` smart constructor. As the result,
+`ExpectedVersion` constructors are no longer exposed. You have to use
+`anyStream`, `noStream`, `emptyStream` or `exactStream` instead.
+
 0.6.0.1
 -------
 No changes
diff --git a/Database/EventStore.hs b/Database/EventStore.hs
--- a/Database/EventStore.hs
+++ b/Database/EventStore.hs
@@ -65,6 +65,8 @@
     , catchupAwait
     , catchupStream
     , catchupUnsubscribe
+    , waitTillCatchup
+    , hasCaughtUp
      -- * Results
     , AllEventsSlice(..)
     , DeleteResult(..)
@@ -85,7 +87,11 @@
     , positionStart
     , positionEnd
       -- * Misc
-    , ExpectedVersion(..)
+    , ExpectedVersion
+    , anyStream
+    , noStream
+    , emptyStream
+    , exactStream
       -- * Re-export
     , module Control.Concurrent.Async
     ) where
diff --git a/Database/EventStore/Catchup.hs b/Database/EventStore/Catchup.hs
--- a/Database/EventStore/Catchup.hs
+++ b/Database/EventStore/Catchup.hs
@@ -19,6 +19,8 @@
     , catchupAllStart
     , catchupStream
     , catchupUnsubscribe
+    , waitTillCatchup
+    , hasCaughtUp
     ) where
 
 --------------------------------------------------------------------------------
@@ -58,7 +60,8 @@
     = Catchup
       { catchupStream :: Text
         -- ^ The name of the stream to which the subscription is subscribed.
-      , catchupChan        :: Chan (Either CatchupError ResolvedEvent)
+      , catchupChan :: Chan (Either CatchupError ResolvedEvent)
+      , catchupSubMVar :: MVar Subscription
       , catchupUnsubscribe :: IO ()
         -- ^ Asynchronously unsubscribes from the stream.
       }
@@ -101,6 +104,7 @@
     let catchup = Catchup
                   { catchupStream      = stream_id
                   , catchupChan        = chan
+                  , catchupSubMVar     = var
                   , catchupUnsubscribe = do
                       cancel as
                       sub_m <- tryTakeMVar var
@@ -136,6 +140,7 @@
     let catchup = Catchup
                   { catchupStream      = ""
                   , catchupChan        = chan
+                  , catchupSubMVar     = var
                   , catchupUnsubscribe = do
                       cancel as
                       sub_m <- tryTakeMVar var
@@ -214,3 +219,17 @@
 
             writeChan chan (Left e)
             throwIO e
+
+--------------------------------------------------------------------------------
+-- | Waits until 'Catchup' subscription catch-up its stream.
+waitTillCatchup :: Catchup -> IO ()
+waitTillCatchup c = do
+    _ <- readMVar $ catchupSubMVar c
+    return ()
+
+--------------------------------------------------------------------------------
+-- | Non blocking version of `waitTillCatchup`.
+hasCaughtUp :: Catchup -> IO Bool
+hasCaughtUp c = do
+    res <- tryReadMVar $ catchupSubMVar c
+    return $ isJust res
diff --git a/Database/EventStore/Internal/Types.hs b/Database/EventStore/Internal/Types.hs
--- a/Database/EventStore/Internal/Types.hs
+++ b/Database/EventStore/Internal/Types.hs
@@ -15,7 +15,7 @@
 module Database.EventStore.Internal.Types where
 
 --------------------------------------------------------------------------------
-import Control.Applicative ((<|>))
+import Control.Applicative
 import Control.Exception
 import Data.ByteString (ByteString)
 import Data.ByteString.Lazy (fromStrict, toStrict)
@@ -23,6 +23,7 @@
 import Data.Maybe
 import Data.Typeable
 import Data.Word
+import Foreign.C.Types (CTime(..))
 import GHC.Generics (Generic)
 
 --------------------------------------------------------------------------------
@@ -120,18 +121,13 @@
 --   idempotency assurances given by the EventStore.
 --
 --   The EventStore  will assure idempotency for all operations using any value
---   in 'ExpectedVersion' except for 'Any'. When using 'Any' the EventStore will
+--   in 'ExpectedVersion' except for 'anyStream'. When using 'anyStream' the EventStore will
 --   do its best to assure idempotency but will not guarantee idempotency.
 data ExpectedVersion
     = Any
-      -- ^ This write should not conflict with anything and should always
-      --   succeed.
     | NoStream
-      -- ^ The stream being written to should not yet exist. If it does exist
-      --   treat that as a concurrency problem.
     | EmptyStream
-      -- ^ The stream should exist and should be empty. If it does not exist or
-      --   is not empty, treat that as a concurrency problem.
+    | Exact Int32
     deriving Show
 
 --------------------------------------------------------------------------------
@@ -139,8 +135,34 @@
 expVersionInt32 Any         = -2
 expVersionInt32 NoStream    = -1
 expVersionInt32 EmptyStream = 0
+expVersionInt32 (Exact i)   = i
 
 --------------------------------------------------------------------------------
+-- | This write should not conflict with anything and should always succeed.
+anyStream :: ExpectedVersion
+anyStream = Any
+
+--------------------------------------------------------------------------------
+-- | The stream being written to should not yet exist. If it does exist
+--   treat that as a concurrency problem.
+noStream :: ExpectedVersion
+noStream = NoStream
+
+--------------------------------------------------------------------------------
+-- | The stream should exist and should be empty. If it does not exist or
+--   is not empty, treat that as a concurrency problem.
+emptyStream :: ExpectedVersion
+emptyStream =EmptyStream
+
+--------------------------------------------------------------------------------
+-- | States that the last event written to the stream should have a
+--   sequence number matching your expected value.
+exactStream :: Int32 -> ExpectedVersion
+exactStream i
+    | i < 0     = error $ "expected version must be >= 0, but is " ++ show i
+    | otherwise = Exact i
+
+--------------------------------------------------------------------------------
 -- EventStore Messages
 --------------------------------------------------------------------------------
 data OpResult
@@ -396,22 +418,22 @@
         -- ^ Indicates whether the content is internally marked as json.
       , recordedEventCreated :: !(Maybe UTCTime)
         -- ^ Representing when this event was created in the system.
-      , recordedEventCreatedEpoch :: !(Maybe Integer)
-        -- ^ Representing the milliseconds since the epoch when the event was
-        --   created in the system.
       }
     deriving Show
 
 --------------------------------------------------------------------------------
+toUTC :: Int64 -> UTCTime
+toUTC = posixSecondsToUTCTime . (/1000) . realToFrac . CTime
+
+--------------------------------------------------------------------------------
 newRecordedEvent :: EventRecord -> RecordedEvent
 newRecordedEvent er = re
   where
     evt_id      = getField $ eventRecordId er
     evt_uuid    = fromJust $ fromByteString $ fromStrict evt_id
     data_type   = getField $ eventRecordDataType er
-    created     = getField $ eventRecordCreated er
     epoch       = getField $ eventRecordCreatedEpoch er
-    utc_created = fmap (posixSecondsToUTCTime . fromInteger . toInteger) created
+    utc_created = fmap toUTC epoch
 
     re = RecordedEvent
          { recordedEventStreamId     = getField $ eventRecordStreamId er
@@ -422,7 +444,6 @@
          , recordedEventMetadata     = getField $ eventRecordMetadata er
          , recordedEventIsJson       = data_type == 1
          , recordedEventCreated      = utc_created
-         , recordedEventCreatedEpoch = fmap toInteger epoch
          }
 
 --------------------------------------------------------------------------------
diff --git a/eventstore.cabal b/eventstore.cabal
--- a/eventstore.cabal
+++ b/eventstore.cabal
@@ -10,7 +10,7 @@
 -- PVP summary:      +-+------- breaking API changes
 --                   | | +----- non-breaking API additions
 --                   | | | +--- code changes with no API change
-version:             0.6.0.1
+version:             0.7.0.0
 
 -- A short (one-line) description of the package.
 synopsis: EventStore TCP Client
