diff --git a/event-list.cabal b/event-list.cabal
--- a/event-list.cabal
+++ b/event-list.cabal
@@ -1,5 +1,5 @@
 Name:             event-list
-Version:          0.0.9.1
+Version:          0.0.10
 License:          GPL
 License-File:     LICENSE
 Author:           Henning Thielemann <haskell@henning-thielemann.de>
@@ -26,7 +26,7 @@
 Source-Repository this
   type:     darcs
   location: http://darcs.haskell.org/event-list/
-  tag:      0.0.9.1
+  tag:      0.0.10
 
 Flag splitBase
   description: Choose the new smaller, split-up base package.
@@ -42,7 +42,9 @@
   If flag(splitBase)
     Build-Depends: base >= 2 && <5
   Else
-    Build-Depends: base >= 1.0 && < 2
+    Build-Depends:
+      special-functors >= 1.0 && <1.1,
+      base >= 1.0 && < 2
 
   GHC-Options:      -Wall
   Hs-Source-Dirs:   src
diff --git a/src/Data/AlternatingList/List/Disparate.hs b/src/Data/AlternatingList/List/Disparate.hs
--- a/src/Data/AlternatingList/List/Disparate.hs
+++ b/src/Data/AlternatingList/List/Disparate.hs
@@ -1,5 +1,5 @@
 {- |
-Copyright   :  (c) Henning Thielemann 2007
+Copyright   :  (c) Henning Thielemann 2007-2009
 
 Maintainer  :  haskell@henning-thielemann.de
 Stability   :  stable
@@ -13,9 +13,10 @@
    (T,
     fromPairList, toPairList,
     map, mapFirst, mapSecond,
+    zipWithFirst, zipWithSecond,
     concatMonoid, concatMapMonoid,
     sequence, sequence_,
-    mapM, mapM_, mapFirstM, mapSecondM,
+    traverse, traverse_, traverseFirst, traverseSecond,
     getFirsts, getSeconds, length, genericLength,
     empty, singleton, null,
     cons, snoc, viewL, viewR, switchL, switchR, mapHead, mapLast,
@@ -25,7 +26,6 @@
     splitAt, take, drop,
     genericSplitAt, genericTake, genericDrop,
     spanFirst, spanSecond,
-    zipWithFirst, zipWithSecond,
    ) where
 
 import Data.Tuple.HT (mapSnd, mapPair, )
@@ -33,13 +33,17 @@
 import qualified Data.List as List
 import qualified Data.List.HT as ListHT
 import qualified Control.Monad as Monad
+import qualified Control.Applicative as Applicative
+import qualified Data.Traversable as Trav
+
+import Control.Applicative (Applicative, pure, )
 import Data.Monoid (Monoid, mempty, mappend, )
 
 import Test.QuickCheck (Arbitrary, arbitrary, coarbitrary)
 
 import Prelude hiding
    (null, foldr, map, concat, cycle, length, take, drop, splitAt,
-    sequence, sequence_, mapM, mapM_)
+    sequence, sequence_, )
 
 
 data Pair a b =
@@ -107,6 +111,15 @@
 mapSecond g = lift (List.map (mapPairSecond g))
 
 
+zipWithFirst :: (a0 -> a1 -> a2) -> [a0] -> T a1 b -> T a2 b
+zipWithFirst f xs =
+   lift $ zipWith (\x (Pair a b) -> Pair (f x a) b) xs
+
+zipWithSecond :: (b0 -> b1 -> b2) -> [b0] -> T a b1 -> T a b2
+zipWithSecond f xs =
+   lift $ zipWith (\x (Pair a b) -> Pair a (f x b)) xs
+
+
 concatMonoid :: Monoid m =>
    T m m -> m
 concatMonoid =
@@ -120,41 +133,41 @@
    concatMonoid . map f g
 
 
-sequence :: Monad m =>
+sequence :: Applicative m =>
    T (m a) (m b) -> m (T a b)
 sequence =
-   Monad.liftM Cons .
-   Monad.mapM (\(Pair a b) -> Monad.liftM2 Pair a b) .
+   Applicative.liftA Cons .
+   Trav.traverse (\(Pair a b) -> Applicative.liftA2 Pair a b) .
    decons
 
-sequence_ :: (Monad m, Monoid d) =>
+sequence_ :: (Applicative m, Monoid d) =>
    T (m d) (m d) -> m d
 sequence_ =
-   foldr (Monad.liftM2 mappend) (Monad.liftM2 mappend) $ return mempty
---   Monad.mapM_ (\(Pair a b) -> Monad.liftM2 mappend a b) . decons
+   foldr (Applicative.liftA2 mappend) (Applicative.liftA2 mappend) $ pure mempty
+--   Trav.traverse_ (\(Pair a b) -> Applicative.liftA2 mappend a b) . decons
 
 
-mapM :: Monad m =>
+traverse :: Applicative m =>
    (a0 -> m a1) -> (b0 -> m b1) ->
    T a0 b0 -> m (T a1 b1)
-mapM aAction bAction =
+traverse aAction bAction =
    sequence . map aAction bAction
 
-mapM_ :: (Monad m, Monoid d) =>
+traverse_ :: (Applicative m, Monoid d) =>
    (a -> m d) -> (b -> m d) -> T a b -> m d
-mapM_ aAction bAction =
+traverse_ aAction bAction =
    sequence_ . map aAction bAction
 
 
-mapFirstM :: Monad m =>
+traverseFirst :: Applicative m =>
    (a0 -> m a1) -> T a0 b -> m (T a1 b)
-mapFirstM aAction =
-   mapM aAction return
+traverseFirst aAction =
+   traverse aAction pure
 
-mapSecondM :: Monad m =>
+traverseSecond :: Applicative m =>
    (b0 -> m b1) -> T a b0 -> m (T a b1)
-mapSecondM bAction =
-   mapM return bAction
+traverseSecond bAction =
+   traverse pure bAction
 
 
 getFirsts :: T a b -> [a]
@@ -290,11 +303,3 @@
           viewBodyL)
       empty
 -}
-
-zipWithFirst :: (a0 -> a1 -> a2) -> [a0] -> T a1 b -> T a2 b
-zipWithFirst f xs =
-   Cons . zipWith (\x (Pair a b) -> Pair (f x a) b) xs . decons
-
-zipWithSecond :: (b0 -> b1 -> b2) -> [b0] -> T a b1 -> T a b2
-zipWithSecond f xs =
-   Cons . zipWith (\x (Pair a b) -> Pair a (f x b)) xs . decons
diff --git a/src/Data/AlternatingList/List/Mixed.hs b/src/Data/AlternatingList/List/Mixed.hs
--- a/src/Data/AlternatingList/List/Mixed.hs
+++ b/src/Data/AlternatingList/List/Mixed.hs
@@ -1,5 +1,5 @@
 {- |
-Copyright   :  (c) Henning Thielemann 2007
+Copyright   :  (c) Henning Thielemann 2007-2009
 
 Maintainer  :  haskell@henning-thielemann.de
 Stability   :  stable
@@ -39,7 +39,7 @@
 import Data.Tuple.HT (mapFst, mapSnd, mapPair, )
 
 import Prelude hiding
-   (null, foldr, map, concat, sequence, sequence_, mapM, mapM_)
+   (null, foldr, map, concat, sequence, sequence_, )
 
 
 infixr 5 ./, /.
diff --git a/src/Data/AlternatingList/List/Uniform.hs b/src/Data/AlternatingList/List/Uniform.hs
--- a/src/Data/AlternatingList/List/Uniform.hs
+++ b/src/Data/AlternatingList/List/Uniform.hs
@@ -1,5 +1,5 @@
 {- |
-Copyright   :  (c) Henning Thielemann 2007
+Copyright   :  (c) Henning Thielemann 2007-2009
 
 Maintainer  :  haskell@henning-thielemann.de
 Stability   :  stable
@@ -12,9 +12,10 @@
 module Data.AlternatingList.List.Uniform
    (T(Cons),
     map, mapFirst, mapSecond,
+    zipWithFirst, zipWithSecond,
     concatMonoid, concatMapMonoid,
     sequence, sequence_,
-    mapM, mapM_, mapFirstM, mapSecondM,
+    traverse, traverse_, traverseFirst, traverseSecond,
     getFirsts, getSeconds, length, genericLength,
     fromFirstList, fromSecondList, fromEitherList,
     singleton, isSingleton,
@@ -32,9 +33,10 @@
 import qualified Data.AlternatingList.List.Disparate as Disp
 
 import qualified Control.Monad as Monad
+import qualified Control.Applicative as Applicative
 import qualified Data.List as List
 
-import Control.Monad (Monad, return, )
+import Control.Applicative (Applicative, pure, )
 import Data.Monoid (Monoid, mempty, mappend, )
 
 import Test.QuickCheck (Arbitrary, arbitrary, coarbitrary)
@@ -50,7 +52,7 @@
     Eq, Ord, Show, (>))
 -}
 import Prelude hiding
-   (null, foldr, map, concat, length, sequence, sequence_, mapM, mapM_)
+   (null, foldr, map, concat, length, sequence, sequence_, )
 
 
 {- |
@@ -94,7 +96,16 @@
 mapSecond g (Cons b xs) = Cons (g b) (Disp.mapSecond g xs)
 
 
+zipWithFirst :: (a0 -> a1 -> a2) -> [a0] -> T a1 b -> T a2 b
+zipWithFirst f xs (Cons a bs) =
+   Cons a $ Disp.zipWithFirst f xs bs
 
+zipWithSecond :: (b0 -> b1 -> b2) -> (b0,[b0]) -> T a b1 -> T a b2
+zipWithSecond f (x,xs) (Cons a bs) =
+   Cons (f x a) $ Disp.zipWithSecond f xs bs
+
+
+
 concatMonoid :: Monoid m =>
    T m m -> m
 concatMonoid =
@@ -108,38 +119,38 @@
    concatMonoid . map f g
 
 
-sequence :: Monad m =>
+sequence :: Applicative m =>
    T (m a) (m b) -> m (T a b)
 sequence (Cons b xs) =
-   Monad.liftM2 Cons b (Disp.sequence xs)
+   Applicative.liftA2 Cons b (Disp.sequence xs)
 
-sequence_ :: (Monad m, Monoid d) =>
+sequence_ :: (Applicative m, Monoid d) =>
    T (m d) (m d) -> m d
 sequence_ (Cons b xs) =
-   Monad.liftM2 mappend b $ Disp.sequence_ xs
+   Applicative.liftA2 mappend b $ Disp.sequence_ xs
 
 
-mapM :: Monad m =>
+traverse :: Applicative m =>
    (a0 -> m a1) -> (b0 -> m b1) ->
    T a0 b0 -> m (T a1 b1)
-mapM aAction bAction =
+traverse aAction bAction =
    sequence . map aAction bAction
 
-mapM_ :: (Monad m, Monoid d) =>
+traverse_ :: (Applicative m, Monoid d) =>
    (a -> m d) -> (b -> m d) -> T a b -> m d
-mapM_ aAction bAction =
+traverse_ aAction bAction =
    sequence_ . map aAction bAction
 
 
-mapFirstM :: Monad m =>
+traverseFirst :: Applicative m =>
    (a0 -> m a1) -> T a0 b -> m (T a1 b)
-mapFirstM aAction =
-   mapM aAction return
+traverseFirst aAction =
+   traverse aAction pure
 
-mapSecondM :: Monad m =>
+traverseSecond :: Applicative m =>
    (b0 -> m b1) -> T a b0 -> m (T a b1)
-mapSecondM bAction =
-   mapM return bAction
+traverseSecond bAction =
+   traverse pure bAction
 
 
 getFirsts :: T a b -> [a]
diff --git a/src/Data/EventList/Absolute/TimeBody.hs b/src/Data/EventList/Absolute/TimeBody.hs
--- a/src/Data/EventList/Absolute/TimeBody.hs
+++ b/src/Data/EventList/Absolute/TimeBody.hs
@@ -1,5 +1,5 @@
 {- |
-Copyright   :  (c) Henning Thielemann 2007
+Copyright   :  (c) Henning Thielemann 2007-2009
 
 Maintainer  :  haskell@henning-thielemann.de
 Stability   :  stable
@@ -13,6 +13,7 @@
     getTimes, getBodies, duration,
     mapBody, mapTime,
     concatMapMonoid,
+    traverse, traverse_, traverseBody, traverseTime,
     mapM, mapM_, mapBodyM, mapTimeM,
     merge, mergeBy, insert, insertBy,
     moveForward,
@@ -44,7 +45,10 @@
 import Data.List.HT (isAscending, isAscendingLazy, )
 import Data.Function.HT (compose2, )
 import Data.EventList.Utility (beforeBy, )
+
 import qualified Control.Monad as Monad
+import Control.Applicative (Applicative, WrappedMonad(WrapMonad, unwrapMonad), )
+
 import Control.Monad.Trans.State (state, evalState)
 
 import Prelude hiding (mapM, mapM_, null, foldr, filter, concat, cycle)
@@ -120,24 +124,47 @@
 concatMapMonoid f g =
    Disp.concatMapMonoid f g . decons
 
+
+traverse :: Applicative m =>
+   (time0 -> m time1) -> (body0 -> m body1) ->
+   T time0 body0 -> m (T time1 body1)
+traverse f g = liftA (Disp.traverse f g)
+
+traverse_ :: Applicative m =>
+   (time -> m ()) -> (body -> m ()) ->
+   T time body -> m ()
+traverse_ f g = Disp.traverse_ f g . decons
+
+
+traverseBody :: Applicative m =>
+   (body0 -> m body1) -> T time body0 -> m (T time body1)
+traverseBody f = liftA (Disp.traverseSecond f)
+
+traverseTime :: Applicative m =>
+   (time0 -> m time1) -> T time0 body -> m (T time1 body)
+traverseTime f = liftA (Disp.traverseFirst f)
+
+
 mapM :: Monad m =>
    (time0 -> m time1) -> (body0 -> m body1) ->
    T time0 body0 -> m (T time1 body1)
-mapM f g = liftM (Disp.mapM f g)
+mapM f g =
+   unwrapMonad . traverse (WrapMonad . f) (WrapMonad . g)
 
 mapM_ :: Monad m =>
    (time -> m ()) -> (body -> m ()) ->
    T time body -> m ()
-mapM_ f g = Disp.mapM_ f g . decons
+mapM_ f g =
+   unwrapMonad . traverse_ (WrapMonad . f) (WrapMonad . g)
 
 
 mapBodyM :: Monad m =>
    (body0 -> m body1) -> T time body0 -> m (T time body1)
-mapBodyM f = liftM (Disp.mapSecondM f)
+mapBodyM f = unwrapMonad . traverseBody (WrapMonad . f)
 
 mapTimeM :: Monad m =>
    (time0 -> m time1) -> T time0 body -> m (T time1 body)
-mapTimeM f = liftM (Disp.mapFirstM f)
+mapTimeM f = unwrapMonad . traverseTime (WrapMonad . f)
 
 
 {- |
@@ -213,7 +240,7 @@
          Mixed.consFirst t0 .
          Uniform.catMaybesFirst .
          flip evalState (Just t0) .
-         Uniform.mapFirstM (\time -> state $ \ oldTime ->
+         Uniform.traverseFirst (\time -> state $ \ oldTime ->
             (Monad.guard (time /= oldTime) >> time, time)) .
          Uniform.mapFirst Just) .
    decons
diff --git a/src/Data/EventList/Absolute/TimeBodyPrivate.hs b/src/Data/EventList/Absolute/TimeBodyPrivate.hs
--- a/src/Data/EventList/Absolute/TimeBodyPrivate.hs
+++ b/src/Data/EventList/Absolute/TimeBodyPrivate.hs
@@ -1,5 +1,5 @@
 {- |
-Copyright   :  (c) Henning Thielemann 2007
+Copyright   :  (c) Henning Thielemann 2007-2009
 
 Maintainer  :  haskell@henning-thielemann.de
 Stability   :  stable
@@ -12,7 +12,9 @@
 -- import qualified Data.AlternatingList.List.Mixed as Mixed
 
 import qualified Control.Monad as Monad
+import qualified Control.Applicative as Applicative
 
+import Control.Applicative (Applicative, )
 
 
 newtype T time body = Cons {decons :: Disp.T time body}
@@ -29,6 +31,11 @@
    (Disp.T time0 body0 -> Disp.T time1 body1) ->
    (T time0 body0 -> T time1 body1)
 lift f = Cons . f . decons
+
+liftA :: Applicative m =>
+   (Disp.T time0 body0 -> m (Disp.T time1 body1)) ->
+   (T time0 body0 -> m (T time1 body1))
+liftA f = Applicative.liftA Cons . f . decons
 
 liftM :: Monad m =>
    (Disp.T time0 body0 -> m (Disp.T time1 body1)) ->
diff --git a/src/Data/EventList/Absolute/TimeTime.hs b/src/Data/EventList/Absolute/TimeTime.hs
--- a/src/Data/EventList/Absolute/TimeTime.hs
+++ b/src/Data/EventList/Absolute/TimeTime.hs
@@ -1,5 +1,5 @@
 {- |
-Copyright   :  (c) Henning Thielemann 2007
+Copyright   :  (c) Henning Thielemann 2007-2009
 
 Maintainer  :  haskell@henning-thielemann.de
 Stability   :  stable
@@ -12,7 +12,9 @@
     pause, isPause,
     viewL, switchL, cons, snoc,
     mapBody, mapTime,
-    concatMapMonoid, mapM, mapM_, mapBodyM, mapTimeM,
+    concatMapMonoid,
+    traverse, traverse_, traverseBody, traverseTime,
+    mapM, mapM_, mapBodyM, mapTimeM,
     getTimes, getBodies, duration,
     merge, mergeBy, insert, insertBy,
     moveForward,
@@ -40,7 +42,10 @@
 import Data.Tuple.HT (mapSnd, mapPair, )
 import Data.Maybe.HT (toMaybe, )
 import Data.List.HT (isAscending, )
+
 import qualified Control.Monad as Monad
+import Control.Applicative (Applicative, WrappedMonad(WrapMonad, unwrapMonad), )
+
 import Control.Monad.Trans.State (state, evalState)
 
 import Data.Monoid (Monoid, )
@@ -107,24 +112,46 @@
    Uniform.concatMapMonoid g f . decons
 
 
+traverse :: Applicative m =>
+   (time0 -> m time1) -> (body0 -> m body1) ->
+   T time0 body0 -> m (T time1 body1)
+traverse f g = liftA (Uniform.traverse g f)
+
+traverse_ :: Applicative m =>
+   (time -> m ()) -> (body -> m ()) ->
+   T time body -> m ()
+traverse_ f g = Uniform.traverse_ g f . decons
+
+
+traverseBody :: Applicative m =>
+   (body0 -> m body1) -> T time body0 -> m (T time body1)
+traverseBody f = liftA (Uniform.traverseFirst f)
+
+traverseTime :: Applicative m =>
+   (time0 -> m time1) -> T time0 body -> m (T time1 body)
+traverseTime f = liftA (Uniform.traverseSecond f)
+
+
 mapM :: Monad m =>
    (time0 -> m time1) -> (body0 -> m body1) ->
    T time0 body0 -> m (T time1 body1)
-mapM f g = liftM (Uniform.mapM g f)
+mapM f g =
+   unwrapMonad . traverse (WrapMonad . f) (WrapMonad . g)
 
 mapM_ :: Monad m =>
    (time -> m ()) -> (body -> m ()) ->
    T time body -> m ()
-mapM_ f g = Uniform.mapM_ g f . decons
+mapM_ f g =
+   unwrapMonad . traverse_ (WrapMonad . f) (WrapMonad . g)
 
 
 mapBodyM :: Monad m =>
    (body0 -> m body1) -> T time body0 -> m (T time body1)
-mapBodyM = liftM . Uniform.mapFirstM
+mapBodyM f = unwrapMonad . traverseBody (WrapMonad . f)
 
 mapTimeM :: Monad m =>
    (time0 -> m time1) -> T time0 body -> m (T time1 body)
-mapTimeM = liftM . Uniform.mapSecondM
+mapTimeM f = unwrapMonad . traverseTime (WrapMonad . f)
 
 
 
@@ -175,7 +202,7 @@
       Mixed.mapFirstInit
          (Uniform.catMaybesFirst .
           flip evalState (Just t0) .
-          Uniform.mapFirstM (\time -> state $ \ oldTime ->
+          Uniform.traverseFirst (\time -> state $ \ oldTime ->
              (Monad.guard (time /= oldTime) >> time, time)) .
           Uniform.mapFirst Just)) .
    decons
diff --git a/src/Data/EventList/Absolute/TimeTimePrivate.hs b/src/Data/EventList/Absolute/TimeTimePrivate.hs
--- a/src/Data/EventList/Absolute/TimeTimePrivate.hs
+++ b/src/Data/EventList/Absolute/TimeTimePrivate.hs
@@ -1,5 +1,5 @@
 {- |
-Copyright   :  (c) Henning Thielemann 2007
+Copyright   :  (c) Henning Thielemann 2007-2009
 
 Maintainer  :  haskell@henning-thielemann.de
 Stability   :  stable
@@ -18,8 +18,11 @@
 import Data.Tuple.HT (mapFst, )
 
 import qualified Control.Monad as Monad
+import qualified Control.Applicative as Applicative
 
+import Control.Applicative (Applicative, )
 
+
 newtype T time body = Cons {decons :: Uniform.T body time}
    deriving (Eq, Ord, Show)
 
@@ -33,6 +36,11 @@
    (Uniform.T body0 time0 -> Uniform.T body1 time1) ->
    (T time0 body0 -> T time1 body1)
 lift f = Cons . f . decons
+
+liftA :: Applicative m =>
+   (Uniform.T body0 time0 -> m (Uniform.T body1 time1)) ->
+   (T time0 body0 -> m (T time1 body1))
+liftA f = Applicative.liftA Cons . f . decons
 
 liftM :: Monad m =>
    (Uniform.T body0 time0 -> m (Uniform.T body1 time1)) ->
diff --git a/src/Data/EventList/Relative/BodyBody.hs b/src/Data/EventList/Relative/BodyBody.hs
--- a/src/Data/EventList/Relative/BodyBody.hs
+++ b/src/Data/EventList/Relative/BodyBody.hs
@@ -1,5 +1,5 @@
 {- |
-Copyright   :  (c) Henning Thielemann 2007
+Copyright   :  (c) Henning Thielemann 2007-2009
 
 Maintainer  :  haskell@henning-thielemann.de
 Stability   :  stable
@@ -19,6 +19,7 @@
 -- import qualified Data.AlternatingList.List.Disparate as Disp
 import qualified Data.AlternatingList.List.Uniform as Uniform
 
+import Control.Applicative (Applicative, WrappedMonad(WrapMonad, unwrapMonad), liftA, )
 import Data.Monoid (Monoid, )
 
 import Prelude hiding (mapM)
@@ -29,7 +30,14 @@
    T time body -> m
 concatMapMonoid f g = Uniform.concatMapMonoid f g . decons
 
+traverse :: Applicative m =>
+   (time0 -> m time1) -> (body0 -> m body1) ->
+   T time0 body0 -> m (T time1 body1)
+traverse f g =
+   liftA Cons . Uniform.traverse f g . decons
+
 mapM :: Monad m =>
    (time0 -> m time1) -> (body0 -> m body1) ->
    T time0 body0 -> m (T time1 body1)
-mapM f g = liftM (Uniform.mapM f g)
+mapM f g =
+   unwrapMonad . traverse (WrapMonad . f) (WrapMonad . g)
diff --git a/src/Data/EventList/Relative/BodyTime.hs b/src/Data/EventList/Relative/BodyTime.hs
--- a/src/Data/EventList/Relative/BodyTime.hs
+++ b/src/Data/EventList/Relative/BodyTime.hs
@@ -1,5 +1,5 @@
 {- |
-Copyright   :  (c) Henning Thielemann 2007
+Copyright   :  (c) Henning Thielemann 2007-2009
 
 Maintainer  :  haskell@henning-thielemann.de
 Stability   :  stable
@@ -12,7 +12,7 @@
 module Data.EventList.Relative.BodyTime
    (T, empty,
     fromPairList, toPairList,
-    concatMapMonoid, mapM,
+    concatMapMonoid, traverse, mapM,
     foldr, foldrPair,
     cons, snoc, viewL, viewR, switchL, switchR,
     span,
@@ -23,6 +23,7 @@
 import qualified Data.AlternatingList.List.Disparate as Disp
 -- import qualified Data.AlternatingList.List.Uniform as Uniform
 
+import Control.Applicative (Applicative, WrappedMonad(WrapMonad, unwrapMonad), liftA, )
 import Data.Monoid (Monoid, )
 
 import Data.Tuple.HT (mapFst, mapSnd, mapPair, )
@@ -44,11 +45,17 @@
 concatMapMonoid f g =
    Disp.concatMapMonoid g f . decons
 
+traverse :: Applicative m =>
+   (time0 -> m time1) -> (body0 -> m body1) ->
+   T time0 body0 -> m (T time1 body1)
+traverse timeAction bodyAction =
+   liftA Cons . Disp.traverse bodyAction timeAction . decons
+
 mapM :: Monad m =>
    (time0 -> m time1) -> (body0 -> m body1) ->
    T time0 body0 -> m (T time1 body1)
 mapM timeAction bodyAction =
-   liftM (Disp.mapM bodyAction timeAction)
+   unwrapMonad . traverse (WrapMonad . timeAction) (WrapMonad . bodyAction)
 
 
 foldr :: (body -> a -> b) -> (time -> b -> a) -> b -> T time body -> b
diff --git a/src/Data/EventList/Relative/TimeBody.hs b/src/Data/EventList/Relative/TimeBody.hs
--- a/src/Data/EventList/Relative/TimeBody.hs
+++ b/src/Data/EventList/Relative/TimeBody.hs
@@ -1,5 +1,5 @@
 {- |
-Copyright   :  (c) Henning Thielemann 2007
+Copyright   :  (c) Henning Thielemann 2007-2009
 
 Maintainer  :  haskell@henning-thielemann.de
 Stability   :  stable
@@ -25,7 +25,10 @@
     fromPairList, toPairList,
     getTimes, getBodies, duration,
     mapBody, mapTime,
-    concatMapMonoid, mapM, mapM_, mapBodyM, mapTimeM,
+    zipWithBody, zipWithTime,
+    concatMapMonoid,
+    traverse, traverse_, traverseBody, traverseTime,
+    mapM, mapM_, mapBodyM, mapTimeM,
     foldr, foldrPair,
     merge, mergeBy, insert, insertBy,
     moveForward,
@@ -51,6 +54,7 @@
 import qualified Data.List as List
 import qualified Data.EventList.Utility as Utility
 
+import Control.Applicative (Applicative, WrappedMonad(WrapMonad, unwrapMonad), )
 import Data.Monoid (Monoid, )
 
 import qualified Numeric.NonNegative.Class as NonNeg
@@ -123,31 +127,65 @@
 mapTime f = lift (Disp.mapFirst f)
 
 
+zipWithBody ::
+   (body0 -> body1 -> body2) ->
+   [body0] -> T time body1 -> T time body2
+zipWithBody f = lift . Disp.zipWithSecond f
 
+zipWithTime ::
+   (time0 -> time1 -> time2) ->
+   [time0] -> T time1 body -> T time2 body
+zipWithTime f = lift . Disp.zipWithFirst f
+
+
+
 concatMapMonoid :: Monoid m =>
    (time -> m) -> (body -> m) ->
    T time body -> m
 concatMapMonoid f g =
    Disp.concatMapMonoid f g . decons
 
+
+traverse :: Applicative m =>
+   (time0 -> m time1) -> (body0 -> m body1) ->
+   T time0 body0 -> m (T time1 body1)
+traverse f g = liftA (Disp.traverse f g)
+
+traverse_ :: Applicative m =>
+   (time -> m ()) -> (body -> m ()) ->
+   T time body -> m ()
+traverse_ f g = Disp.traverse_ f g . decons
+
+
+traverseBody :: Applicative m =>
+   (body0 -> m body1) -> T time body0 -> m (T time body1)
+traverseBody f = liftA (Disp.traverseSecond f)
+
+traverseTime :: Applicative m =>
+   (time0 -> m time1) -> T time0 body -> m (T time1 body)
+traverseTime f = liftA (Disp.traverseFirst f)
+
+
 mapM :: Monad m =>
    (time0 -> m time1) -> (body0 -> m body1) ->
    T time0 body0 -> m (T time1 body1)
-mapM f g = liftM (Disp.mapM f g)
+mapM f g =
+   unwrapMonad . traverse (WrapMonad . f) (WrapMonad . g)
 
 mapM_ :: Monad m =>
    (time -> m ()) -> (body -> m ()) ->
    T time body -> m ()
-mapM_ f g = Disp.mapM_ f g . decons
+mapM_ f g =
+   unwrapMonad . traverse_ (WrapMonad . f) (WrapMonad . g)
 
 
 mapBodyM :: Monad m =>
    (body0 -> m body1) -> T time body0 -> m (T time body1)
-mapBodyM f = liftM (Disp.mapSecondM f)
+mapBodyM f = unwrapMonad . traverseBody (WrapMonad . f)
 
 mapTimeM :: Monad m =>
    (time0 -> m time1) -> T time0 body -> m (T time1 body)
-mapTimeM f = liftM (Disp.mapFirstM f)
+mapTimeM f = unwrapMonad . traverseTime (WrapMonad . f)
 
 
 
diff --git a/src/Data/EventList/Relative/TimeBodyPrivate.hs b/src/Data/EventList/Relative/TimeBodyPrivate.hs
--- a/src/Data/EventList/Relative/TimeBodyPrivate.hs
+++ b/src/Data/EventList/Relative/TimeBodyPrivate.hs
@@ -1,5 +1,5 @@
 {- |
-Copyright   :  (c) Henning Thielemann 2007
+Copyright   :  (c) Henning Thielemann 2007-2009
 
 Maintainer  :  haskell@henning-thielemann.de
 Stability   :  stable
@@ -15,7 +15,10 @@
 import qualified Data.AlternatingList.List.Mixed as Mixed
 
 import qualified Control.Monad as Monad
+import qualified Control.Applicative as Applicative
 
+import Control.Applicative (Applicative, )
+
 import Data.Tuple.HT (mapSnd, )
 
 import Test.QuickCheck (Arbitrary(..))
@@ -46,6 +49,11 @@
    (Disp.T time0 body0 -> Disp.T time1 body1) ->
    (T time0 body0 -> T time1 body1)
 lift f = Cons . f . decons
+
+liftA :: Applicative m =>
+   (Disp.T time0 body0 -> m (Disp.T time1 body1)) ->
+   (T time0 body0 -> m (T time1 body1))
+liftA f = Applicative.liftA Cons . f . decons
 
 liftM :: Monad m =>
    (Disp.T time0 body0 -> m (Disp.T time1 body1)) ->
diff --git a/src/Data/EventList/Relative/TimeTime.hs b/src/Data/EventList/Relative/TimeTime.hs
--- a/src/Data/EventList/Relative/TimeTime.hs
+++ b/src/Data/EventList/Relative/TimeTime.hs
@@ -1,5 +1,5 @@
 {- |
-Copyright   :  (c) Henning Thielemann 2007
+Copyright   :  (c) Henning Thielemann 2007-2009
 
 Maintainer  :  haskell@henning-thielemann.de
 Stability   :  stable
@@ -10,7 +10,9 @@
 module Data.EventList.Relative.TimeTime
    (T,
     mapBody, mapTime,
+    zipWithBody, zipWithTime,
     concatMapMonoid,
+    traverse, traverse_, traverseBody, traverseTime,
     mapM, mapM_, mapBodyM, mapTimeM,
     getTimes, getBodies, duration,
     merge, mergeBy, insert, {- insertBy, -} pad,
@@ -52,7 +54,9 @@
 import Data.List.HT (isAscending, )
 import Data.EventList.Utility (floorDiff, )
 import Control.Monad.Trans.State (evalState, modify, get, gets, put, )
+
 import Control.Monad (liftM2, )
+import Control.Applicative (Applicative, WrappedMonad(WrapMonad, unwrapMonad), )
 
 import Prelude hiding
    (null, foldr, map, filter, concat, cycle, sequence, sequence_, mapM, mapM_)
@@ -116,30 +120,63 @@
 mapTime = lift . Uniform.mapSecond
 
 
+zipWithBody ::
+   (body0 -> body1 -> body2) ->
+   [body0] -> T time body1 -> T time body2
+zipWithBody f = lift . Uniform.zipWithFirst f
 
+zipWithTime ::
+   (time0 -> time1 -> time2) ->
+   (time0, [time0]) -> T time1 body -> T time2 body
+zipWithTime f = lift . Uniform.zipWithSecond f
+
+
+
 concatMapMonoid :: Monoid m =>
    (time -> m) -> (body -> m) ->
    T time body -> m
 concatMapMonoid f g = Uniform.concatMapMonoid g f . decons
 
+traverse :: Applicative m =>
+   (time0 -> m time1) -> (body0 -> m body1) ->
+   T time0 body0 -> m (T time1 body1)
+traverse f g = liftA (Uniform.traverse g f)
+
+traverse_ :: Applicative m =>
+   (time -> m ()) -> (body -> m ()) ->
+   T time body -> m ()
+traverse_ f g = Uniform.traverse_ g f . decons
+
+
+traverseBody :: Applicative m =>
+   (body0 -> m body1) -> T time body0 -> m (T time body1)
+traverseBody f = liftA (Uniform.traverseFirst f)
+
+traverseTime :: Applicative m =>
+   (time0 -> m time1) -> T time0 body -> m (T time1 body)
+traverseTime f = liftA (Uniform.traverseSecond f)
+
+
 mapM :: Monad m =>
    (time0 -> m time1) -> (body0 -> m body1) ->
    T time0 body0 -> m (T time1 body1)
-mapM f g = liftM (Uniform.mapM g f)
+mapM f g =
+   unwrapMonad . traverse (WrapMonad . f) (WrapMonad . g)
 
 mapM_ :: Monad m =>
    (time -> m ()) -> (body -> m ()) ->
    T time body -> m ()
-mapM_ f g = Uniform.mapM_ g f . decons
+mapM_ f g =
+   unwrapMonad . traverse_ (WrapMonad . f) (WrapMonad . g)
 
 
 mapBodyM :: Monad m =>
    (body0 -> m body1) -> T time body0 -> m (T time body1)
-mapBodyM = liftM . Uniform.mapFirstM
+mapBodyM f = unwrapMonad . traverseBody (WrapMonad . f)
 
 mapTimeM :: Monad m =>
    (time0 -> m time1) -> T time0 body -> m (T time1 body)
-mapTimeM = liftM . Uniform.mapSecondM
+mapTimeM f = unwrapMonad . traverseTime (WrapMonad . f)
 
 
 
diff --git a/src/Data/EventList/Relative/TimeTimePrivate.hs b/src/Data/EventList/Relative/TimeTimePrivate.hs
--- a/src/Data/EventList/Relative/TimeTimePrivate.hs
+++ b/src/Data/EventList/Relative/TimeTimePrivate.hs
@@ -1,5 +1,5 @@
 {- |
-Copyright   :  (c) Henning Thielemann 2007
+Copyright   :  (c) Henning Thielemann 2007-2009
 
 Maintainer  :  haskell@henning-thielemann.de
 Stability   :  stable
@@ -20,7 +20,10 @@
 import Data.Tuple.HT (mapFst, mapSnd, )
 
 import qualified Control.Monad as Monad
+import qualified Control.Applicative as Applicative
 
+import Control.Applicative (Applicative, )
+
 import Test.QuickCheck (Arbitrary(..))
 
 
@@ -48,6 +51,11 @@
    (Uniform.T body0 time0 -> Uniform.T body1 time1) ->
    (T time0 body0 -> T time1 body1)
 lift f = Cons . f . decons
+
+liftA :: Applicative m =>
+   (Uniform.T body0 time0 -> m (Uniform.T body1 time1)) ->
+   (T time0 body0 -> m (T time1 body1))
+liftA f = Applicative.liftA Cons . f . decons
 
 liftM :: Monad m =>
    (Uniform.T body0 time0 -> m (Uniform.T body1 time1)) ->
