diff --git a/bearriver.cabal b/bearriver.cabal
--- a/bearriver.cabal
+++ b/bearriver.cabal
@@ -1,5 +1,5 @@
 name:                bearriver
-version:             0.10.4.1
+version:             0.10.4.2
 synopsis:            A replacement of Yampa based on Monadic Stream Functions.
 description:         A Yampa replacement built using Dunai.
 homepage:            keera.co.uk
@@ -23,7 +23,7 @@
                        FRP.Yampa.AffineSpace,
                        FRP.BearRiver
 
-  build-depends:       base >=4.7 && <5, transformers >=0.3, mtl, dunai
+  build-depends:       base >=4.7 && <5, transformers >=0.3, mtl, dunai, MonadRandom
   hs-source-dirs:      src/
   default-language:    Haskell2010
 
diff --git a/src/FRP/BearRiver.hs b/src/FRP/BearRiver.hs
--- a/src/FRP/BearRiver.hs
+++ b/src/FRP/BearRiver.hs
@@ -12,19 +12,24 @@
 -- there do not seem to exist any obvious limitations.
 
 import           Control.Applicative
-import           Control.Arrow                as X
-import qualified Control.Category             as Category
-import           Control.Monad                (mapM)
---import           Control.Monad.Reader
+import           Control.Arrow                                  as X
+import qualified Control.Category                               as Category
+import           Control.Monad                                  (mapM)
+import           Control.Monad.Random
 import           Control.Monad.Trans.Maybe
 import           Control.Monad.Trans.MSF
-import           Data.Traversable             as T
+import           Control.Monad.Trans.MSF.Except                 as MSF
+import           Control.Monad.Trans.MSF.Random
 import           Data.Functor.Identity
 import           Data.Maybe
-import           Data.MonadicStreamFunction   as X hiding (reactimate, switch, sum, trace)
-import qualified Data.MonadicStreamFunction   as MSF
-import           Data.MonadicStreamFunction.ArrowLoop
-import           FRP.Yampa.VectorSpace        as X
+import           Data.MonadicStreamFunction                     as X hiding (reactimate,
+                                                                      sum,
+                                                                      switch,
+                                                                      trace)
+import qualified Data.MonadicStreamFunction                     as MSF
+import           Data.MonadicStreamFunction.Instances.ArrowLoop
+import           Data.Traversable                               as T
+import           FRP.Yampa.VectorSpace                          as X
 
 type Time  = Double
 type DTime = Double
@@ -153,6 +158,21 @@
                   ct = if t' < 0 then constant (NoEvent, t') else go
               return ((e, t'), ct)
 
+occasionally :: MonadRandom m 
+             => Time -- ^ The time /q/ after which the event should be produced on average
+             -> b    -- ^ Value to produce at time of event
+             -> SF m a (Event b)
+occasionally tAvg b
+  | tAvg <= 0 = error "dunai: Non-positive average interval in occasionally."
+  | otherwise = proc _ -> do
+      r   <- getRandomRS (0, 1) -< ()
+      dt  <- timeDelta          -< ()
+      let p = 1 - exp (-(dt / tAvg))
+      returnA -< if r < p then Event b else NoEvent
+ where
+  timeDelta :: Monad m => SF m a DTime
+  timeDelta = arrM_ ask
+
 (-->) :: Monad m => b -> SF m a b -> SF m a b
 b0 --> sf = MSF $ \a -> do
   (_, ct) <- unMSF sf a
@@ -209,7 +229,7 @@
   let b' = f a a dt b
   return (b, iterFrom f b')
 
-reactimate :: IO a -> (Bool -> IO (DTime, Maybe a)) -> (Bool -> b -> IO Bool) -> SF Identity a b -> IO ()
+reactimate :: Monad m => m a -> (Bool -> m (DTime, Maybe a)) -> (Bool -> b -> m Bool) -> SF Identity a b -> m ()
 reactimate senseI sense actuate sf = do
   -- runMaybeT $ MSF.reactimate $ liftMSFTrans (senseSF >>> sfIO) >>> actuateSF
   MSF.reactimateB $ senseSF >>> sfIO >>> actuateSF
@@ -234,6 +254,4 @@
 -- * Auxiliary
 
 -- ** Tuples
-
 dup  x     = (x,x)
-swap (x,y) = (y,x)
