diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,12 @@
 # Revision history for eventuo11y
 
+## 0.8.0.0 -- 2023-01-17
+
+- Add `childEvents` and `causedEvents` fields to `MemoryEvent`
+- `inMemoryBackend`: Notify the caller when a parentless, causeless event is created
+- Rename `when` to `eventTime` in `TimedEventAction`
+- Put `listInMemoryBackend` into `IO`
+
 ## 0.7.1.0 -- 2023-01-14
 
 - Add `Observe.Event.Render.InMemory`
diff --git a/eventuo11y.cabal b/eventuo11y.cabal
--- a/eventuo11y.cabal
+++ b/eventuo11y.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.0
 name:               eventuo11y
-version:            0.7.1.0
+version:            0.8.0.0
 synopsis:           An event-oriented observability library
 description:
   Instrument your Haskell codebase with wide, semantically meaningful events.
diff --git a/src/Observe/Event/Render/InMemory.hs b/src/Observe/Event/Render/InMemory.hs
--- a/src/Observe/Event/Render/InMemory.hs
+++ b/src/Observe/Event/Render/InMemory.hs
@@ -41,9 +41,10 @@
 where
 
 import Control.Exception
-import Control.Monad.IO.Class
+import Control.Monad
 import Control.Monad.Primitive
 import Data.Kind
+import Data.Maybe
 import Data.Primitive.MutVar
 import Data.Time.Clock
 import Observe.Event.Backend
@@ -52,14 +53,21 @@
 --
 -- The 'reference' of an 'Event' from this 'EventBackend' will be a 'MemoryEvent',
 -- which can be examined to extract information about the 'Event'.
-listInMemoryBackend :: (PrimMonad m, MonadIO m) => EventBackend m (MemoryEvent m (ListAppendVector m) UTCTime s) s
+listInMemoryBackend ::
+  -- | Notify of an 'Event' with no parents or causes
+  (MemoryEvent IO (ListAppendVector IO) UTCTime s -> IO ()) ->
+  EventBackend IO (MemoryEvent IO (ListAppendVector IO) UTCTime s) s
 listInMemoryBackend = inMemoryBackend listInMemoryEffects
 
 -- | An 'EventBackend' whose 'Event's are essentially plain Haskell values.
 --
 -- The 'reference' of an 'Event' from this 'EventBackend' will be a 'MemoryEvent',
 -- which can be examined to extract information about the 'Event'.
-timelessListInMemoryBackend :: (PrimMonad m) => EventBackend m (MemoryEvent m (ListAppendVector m) () s) s
+timelessListInMemoryBackend ::
+  (PrimMonad m) =>
+  -- | Notify of an 'Event' with no parents or causes
+  (MemoryEvent m (ListAppendVector m) () s -> m ()) ->
+  EventBackend m (MemoryEvent m (ListAppendVector m) () s) s
 timelessListInMemoryBackend = inMemoryBackend timelessListInMemoryEffects
 
 -- | An 'EventBackend' whose 'Event's are essentially plain Haskell values.
@@ -69,25 +77,47 @@
 --
 -- [@appvec@]: An append-only vector type, see 'AppendVectorEffects'
 -- [@ts@]: A timestamp, see 'TimestampEffects'
-inMemoryBackend :: (Monad m) => InMemoryEffects m appvec ts -> EventBackend m (MemoryEvent m appvec ts s) s
-inMemoryBackend InMemoryEffects {..} =
+inMemoryBackend ::
+  (Monad m) =>
+  InMemoryEffects m appvec ts ->
+  -- | Notify of an 'Event' with no parents or causes
+  (MemoryEvent m appvec ts s -> m ()) ->
+  EventBackend m (MemoryEvent m appvec ts s) s
+inMemoryBackend (InMemoryEffects {..}) emitDisconnectedEvent =
   EventBackend
     { newEvent = \initArgs -> do
         start <- getTimestamp
         dynamicValues <- newVector
+        childEvents <- newVector
+        causedEvents <- newVector
+        let reference = MemoryEvent {dynamicValues = Just dynamicValues, ..}
+        hasParents <-
+          isJust
+            <$> traverse
+              (\(MemoryEvent {childEvents = cevs}) -> appendVector cevs reference)
+              (newEventParent initArgs)
+        hasCauses <-
+          not . null
+            <$> traverse
+              (\(MemoryEvent {causedEvents = cevs}) -> appendVector cevs reference)
+              (newEventCauses initArgs)
+        unless (hasParents || hasCauses) $ emitDisconnectedEvent reference
         pure $
           Event
-            { reference = MemoryEvent {dynamicValues = Just dynamicValues, ..},
-              addField = \f -> do
-                when <- getTimestamp
+            { addField = \f -> do
+                eventTime <- getTimestamp
                 appendVector dynamicValues $ TimedEventAction {act = AddField f, ..},
               finalize = \me -> do
-                when <- getTimestamp
-                appendVector dynamicValues $ TimedEventAction {act = Finalize me, ..}
+                eventTime <- getTimestamp
+                appendVector dynamicValues $ TimedEventAction {act = Finalize me, ..},
+              ..
             },
       emitImmediateEvent = \initArgs -> do
         start <- getTimestamp
-        pure $ MemoryEvent {dynamicValues = Nothing, ..}
+        let dynamicValues = Nothing
+        childEvents <- newVector
+        causedEvents <- newVector
+        pure $ MemoryEvent {..}
     }
   where
     AppendVectorEffects {..} = appendVectorEffects
@@ -107,7 +137,11 @@
     -- | Event information added during the event's lifecycle
     --
     -- 'Nothing' if this was the result of 'emitImmediateEvent' and thus had no lifecycle
-    dynamicValues :: !(Maybe (appvec (TimedEventAction ts f)))
+    dynamicValues :: !(Maybe (appvec (TimedEventAction ts f))),
+    -- | Direct children of this event
+    childEvents :: !(appvec (MemoryEvent m appvec ts s)),
+    -- | Events directly caused by this event
+    causedEvents :: !(appvec (MemoryEvent m appvec ts s))
   }
 
 -- | An action that occurred during an 'Event' at some time.
@@ -115,7 +149,7 @@
 -- [@ts@]: A timestamp, see 'TimestampEffects'
 data TimedEventAction ts f = TimedEventAction
   { -- | When the event occurred
-    when :: !ts,
+    eventTime :: !ts,
     -- | The action that occurred
     act :: !(EventAction f)
   }
@@ -147,11 +181,11 @@
     }
 
 -- | 'InMemoryEffects' based on 'listAppendVectorEffects' and 'ioTimestampEffects'.
-listInMemoryEffects :: (PrimMonad m, MonadIO m) => InMemoryEffects m (ListAppendVector m) UTCTime
+listInMemoryEffects :: InMemoryEffects IO (ListAppendVector IO) UTCTime
 listInMemoryEffects =
   InMemoryEffects
     { appendVectorEffects = listAppendVectorEffects,
-      timestampEffects = hoistTimestampEffects liftIO ioTimestampEffects
+      timestampEffects = ioTimestampEffects
     }
 
 -- | 'InMemoryEffects' based on 'listAppendVectorEffects' with meaningless timestamps.
