diff --git a/dunai.cabal b/dunai.cabal
--- a/dunai.cabal
+++ b/dunai.cabal
@@ -1,5 +1,5 @@
 name:                dunai
-version:             0.5.1
+version:             0.5.2
 synopsis:            Generalised reactive framework supporting classic, arrowized and monadic FRP.
 homepage:            https://github.com/ivanperez-keera/dunai
 description:
@@ -57,6 +57,7 @@
   exposed-modules:   Control.Monad.Trans.MSF
                      Control.Monad.Trans.MSF.Except
                      Control.Monad.Trans.MSF.Maybe
+                     Control.Monad.Trans.MSF.List
                      Control.Monad.Trans.MSF.Random
                      Control.Monad.Trans.MSF.Reader
                      Control.Monad.Trans.MSF.RWS
diff --git a/src/Control/Monad/Trans/MSF/List.hs b/src/Control/Monad/Trans/MSF/List.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/Trans/MSF/List.hs
@@ -0,0 +1,43 @@
+module Control.Monad.Trans.MSF.List
+  ( module Control.Monad.Trans.MSF.List
+  , module Control.Monad.Trans.List
+  ) where
+
+-- External
+import Control.Monad.Trans.List
+  hiding (liftCallCC, liftCatch) -- Avoid conflicting exports
+
+-- Internal
+import Data.MonadicStreamFunction
+import Data.MonadicStreamFunction.InternalCore (MSF (MSF, unMSF))
+
+-- * List monad
+
+-- Name alternative (in the article): collect
+widthFirst :: (Functor m, Monad m) => MSF (ListT m) a b -> MSF m a [b]
+widthFirst msf = widthFirst' [msf] where
+    widthFirst' msfs = MSF $ \a -> do
+        (bs, msfs') <- unzip . concat <$> mapM (runListT . flip unMSF a) msfs
+        return (bs, widthFirst' msfs')
+
+
+-- Name alternatives: "choose", "parallely" (problematic because it's not multicore)
+sequenceS :: Monad m => [MSF m a b] -> MSF (ListT m) a b
+sequenceS msfs = MSF $ \a -> ListT $ sequence $ apply a <$> msfs
+  where
+    apply a msf = do
+        (b, msf') <- unMSF msf a
+        return (b, sequenceS [msf'])
+-- sequenceS = foldl (<+>) arrowzero . map liftMSFTrans
+
+-- | Apply an 'MSF' to every input.
+mapMSF :: Monad m => MSF m a b -> MSF m [a] [b]
+mapMSF = MSF . consume
+  where
+    consume :: Monad m => MSF m a t -> [a] -> m ([t], MSF m [a] [t])
+    consume sf []     = return ([], mapMSF sf)
+    consume sf (a:as) = do
+      (b, sf')   <- unMSF sf a
+      (bs, sf'') <- consume sf' as
+      b `seq` return (b:bs, sf'')
+
