diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,14 @@
 # eventium-memory Changelog
 
+## 0.7.0
+
+### Breaking changes
+
+- `ProjectionCache` type parameters reordered to put the monad before the payload
+  (`ProjectionCache key position m encoded`; `GlobalProjectionCache m encoded`,
+  `VersionedProjectionCache m encoded`), following the `eventium-core` change —
+  behaviour unchanged, update explicit type signatures.
+
 ## 0.6.1
 
 - Raise `base` lower bound to `>= 4.20` (GHC 9.10) to match the supported toolchain.
diff --git a/eventium-memory.cabal b/eventium-memory.cabal
--- a/eventium-memory.cabal
+++ b/eventium-memory.cabal
@@ -5,7 +5,7 @@
 -- see: https://github.com/sol/hpack
 
 name:           eventium-memory
-version:        0.6.1
+version:        0.7.0
 synopsis:       In-memory implementations for eventium
 description:    Eventium-memory provides in-memory implementations of event stores and projection caches
                 for the Eventium event sourcing framework. This package is ideal for development, testing, and prototyping
@@ -49,7 +49,7 @@
   build-depends:
       base >=4.20 && <5
     , containers >=0.6 && <0.8
-    , eventium-core >=0.6.1 && <0.7.0
+    , eventium-core >=0.7.0 && <0.8.0
     , mtl >=2.2 && <2.4
     , safe ==0.3.*
     , stm ==2.5.*
@@ -89,7 +89,7 @@
       HUnit
     , base >=4.20 && <5
     , containers >=0.6 && <0.8
-    , eventium-core >=0.6.1 && <0.7.0
+    , eventium-core >=0.7.0 && <0.8.0
     , eventium-testkit
     , hspec
     , mtl >=2.2 && <2.4
diff --git a/src/Eventium/ProjectionCache/Memory.hs b/src/Eventium/ProjectionCache/Memory.hs
--- a/src/Eventium/ProjectionCache/Memory.hs
+++ b/src/Eventium/ProjectionCache/Memory.hs
@@ -38,7 +38,7 @@
 tvarProjectionCache ::
   (Ord key) =>
   TVar (ProjectionMap key position encoded) ->
-  ProjectionCache key position encoded STM
+  ProjectionCache key position STM encoded
 tvarProjectionCache tvar =
   ProjectionCache
     { storeSnapshot = \uuid version projState -> modifyTVar' tvar (storeProjectionInMap uuid version projState),
@@ -50,7 +50,7 @@
   (MonadState s m, Ord key) =>
   (s -> ProjectionMap key position encoded) ->
   (s -> ProjectionMap key position encoded -> s) ->
-  ProjectionCache key position encoded m
+  ProjectionCache key position m encoded
 embeddedStateProjectionCache getMap setMap =
   ProjectionCache
     { storeSnapshot = \uuid version projState -> modify' (storeSnapshot uuid version projState),
diff --git a/tests/Eventium/ProcessManagerSpec.hs b/tests/Eventium/ProcessManagerSpec.hs
--- a/tests/Eventium/ProcessManagerSpec.hs
+++ b/tests/Eventium/ProcessManagerSpec.hs
@@ -2,10 +2,16 @@
 
 module Eventium.ProcessManagerSpec (spec) where
 
+import Control.Concurrent.STM
 import Data.IORef
+import qualified Data.Map.Strict as Map
+import Data.Maybe (isJust)
+import Eventium.EventHandler (EventHandler (..))
 import Eventium.ProcessManager
 import Eventium.Projection
+import Eventium.ProjectionCache.Memory (tvarProjectionCache)
 import Eventium.Store.Class
+import Eventium.Store.Memory (emptyEventMap, tvarGlobalEventStoreReader)
 import Eventium.UUID
 import Test.Hspec
 
@@ -71,6 +77,26 @@
             ]
           finalState = latestProjection proj events
       finalState.pendingTransfers `shouldBe` [(target, 30), (target, 50)]
+
+  describe "cachedProcessManagerEventHandler" $ do
+    it "dispatches effects and advances the snapshot cache" $ do
+      eventsTVar <- newTVarIO emptyEventMap
+      cacheTVar <- newTVarIO Map.empty
+      dispatchedTVar <- newTVarIO ([] :: [(UUID, TestCommand)])
+      let reader = tvarGlobalEventStoreReader eventsTVar
+          cache = tvarProjectionCache cacheTVar
+          dispatcher =
+            fireAndForgetDispatcher $ \uuid cmd ->
+              modifyTVar' dispatchedTVar (++ [(uuid, cmd)])
+          handler = cachedProcessManagerEventHandler testProcessManager reader cache dispatcher
+          target = uuidFromInteger 2
+          event = StreamEvent (uuidFromInteger 1) 0 (emptyMetadata "") (TransferInitiated target 50)
+      atomically $ case handler of EventHandler f -> f event
+      dispatched <- readTVarIO dispatchedTVar
+      dispatched `shouldBe` [(target, AcceptCredit 50)]
+      -- The handler persisted a snapshot for the global projection (key = ()).
+      snap <- readTVarIO cacheTVar
+      Map.lookup () snap `shouldSatisfy` isJust
 
   describe "runProcessManagerEffects" $ do
     it "should dispatch commands via the dispatch function" $ do
