diff --git a/examples/tests/unit-tests.hs b/examples/tests/unit-tests.hs
--- a/examples/tests/unit-tests.hs
+++ b/examples/tests/unit-tests.hs
@@ -546,5 +546,5 @@
     switch1, once1, once2, cycle1, split1, split2 {-, mergeWith1, mergeWith2, mergeWith3,
     coalesce1-} ]
 
-main = {-forever $ -} runTestTT tests
+main = forever $ runTestTT tests
 
diff --git a/sodium.cabal b/sodium.cabal
--- a/sodium.cabal
+++ b/sodium.cabal
@@ -1,5 +1,5 @@
 name:                sodium
-version:             0.10.0.1
+version:             0.10.0.2
 synopsis:            Sodium Reactive Programming (FRP) System
 description:         
   A general purpose Reactive Programming (FRP) system. This is part of a project to
@@ -49,6 +49,8 @@
    * 0.10.0.0 - Add Monoid instance to Event - thanks Finlay Thompson.
   .
    * 0.10.0.1 - Fix finalizer issue that caused breakage in ghc-7.8 - thanks Luite Stegeman.
+  .
+   * 0.10.0.2 - Second attempt.
 
 license:             BSD3
 license-file:        LICENSE
diff --git a/src/FRP/Sodium/Plain.hs b/src/FRP/Sodium/Plain.hs
--- a/src/FRP/Sodium/Plain.hs
+++ b/src/FRP/Sodium/Plain.hs
@@ -87,7 +87,8 @@
 -- Must be data not newtype, because we need to attach finalizers to it
 data Sample a = Sample {
         unSample :: IO a,
-        sDep     :: Dep
+        sDep     :: Dep,
+        sampleKeepAlive :: IORef ()
     }
 
 instance R.Context Plain where
@@ -205,7 +206,7 @@
 -- | An event that never fires.
 never :: Event a
 never = Event {
-        getListenRaw = return $ Listen $ \_ _ _ -> return (return ()), 
+        getListenRaw = return $ Listen (\_ _ _ -> return (return ())) undefined, 
         evCacheRef   = unsafeNewIORef Nothing undefined,
         eDep         = undefined
     }
@@ -256,8 +257,9 @@
             bs <- readIORef bsRef
             let newCurrent = fromJust (bsUpdate bs)
             writeIORef bsRef $ newCurrent `seq` BehaviorState newCurrent Nothing
+    keepAliveRef <- ioReactive $ newIORef ()
     sample <- ioReactive $ addCleanup_Sample unlistener
-        (Sample (bsCurrent <$> readIORef bsRef) (dep ea))
+        (Sample (bsCurrent <$> readIORef bsRef) (dep ea) keepAliveRef)
     let beh = sample `seq` Behavior {
                 updates_   = ea,
                 sampleImpl = sample
@@ -558,7 +560,9 @@
 schedulePost :: [Reactive ()] -> Reactive ()
 schedulePost tasks = Reactive $ modify $ \as -> as { asPost = Seq.fromList tasks >< asPost as }
 
-data Listen a = Listen { runListen_ :: Maybe (MVar Node) -> Bool -> (a -> Reactive ()) -> Reactive (IO ()) }
+data Listen a = Listen { runListen_ :: Maybe (MVar Node) -> Bool -> (a -> Reactive ()) -> Reactive (IO ())
+                       , listenerKeepAlive  :: IORef ()
+                       }
 
 -- | Unwrap an event's listener machinery.
 getListen :: Event a -> Reactive (Listen a)
@@ -608,7 +612,7 @@
 
 wrap :: (Maybe (MVar Node) -> Bool -> (a -> Reactive ()) -> Reactive (IO ())) -> IO (Listen a)
 {-# NOINLINE wrap #-}
-wrap l = return (Listen l)
+wrap l = Listen l <$> newIORef ()
 
 touch :: a -> IO ()
 {-# NOINLINE touch #-}
@@ -708,8 +712,8 @@
       where
         cacheRef = unsafeNewIORef Nothing e
         getListen' =
-            return $ Listen $ \mNodeRef suppressEarlierFirings handle -> do
-                linkedListen e mNodeRef suppressEarlierFirings (handle . f)
+            return $ Listen (\mNodeRef suppressEarlierFirings handle -> do
+                linkedListen e mNodeRef suppressEarlierFirings (handle . f)) undefined
 
 instance Functor (R.Behavior Plain) where
     f `fmap` Behavior e s =
@@ -717,12 +721,12 @@
       where
         fe = f `fmap` e
         s' = unSample s
-        fs = s' `seq` Sample (f `fmap` s') (dep s)
+        fs = s' `seq` Sample (f `fmap` s') (dep s) undefined
 
 constant :: a -> Behavior a
 constant a = Behavior {
         updates_   = never,
-        sampleImpl = Sample (return a) undefined
+        sampleImpl = Sample (return a) undefined undefined
     }
 
 data BehaviorState a = BehaviorState {
@@ -743,14 +747,14 @@
 finalizeListen :: Listen a -> IO () -> IO (Listen a)
 {-# NOINLINE finalizeListen #-}
 finalizeListen l unlisten = do
-    addFinalizer l unlisten
+    mkWeakIORef (listenerKeepAlive l) unlisten
     return l
 
 -- | Add a finalizer to a Reactive.
 finalizeSample :: Sample a -> IO () -> IO (Sample a)
 {-# NOINLINE finalizeSample #-}
 finalizeSample s unlisten = do
-    addFinalizer s unlisten
+    mkWeakIORef (sampleKeepAlive s) unlisten
     return s
 
 newtype Unlistener = Unlistener (MVar (Maybe (IO ())))
@@ -841,6 +845,7 @@
     b1@(Behavior e1 s1) <*> b2@(Behavior e2 s2) = Behavior u s
       where
         cacheRef = unsafeNewIORef Nothing s2
+        keepaliveRef = unsafeNewIORef () s2
         u = Event gl cacheRef (dep (e1,e2))
         s1' = unSample s1
         s2' = unSample s2
@@ -859,7 +864,7 @@
                     push (f a)
                 return (un1 >> un2)
             addCleanup_Listen unlistener l
-        s = s1' `seq` s2' `seq` Sample (($) <$> s1' <*> s2') (dep (s1, s2))
+        s = s1' `seq` s2' `seq` Sample (($) <$> s1' <*> s2') (dep (s1, s2)) keepaliveRef
 
 {-
 -- | Cross the specified event over to a different partition.
