diff --git a/mediabus.cabal b/mediabus.cabal
--- a/mediabus.cabal
+++ b/mediabus.cabal
@@ -1,5 +1,5 @@
 name: mediabus
-version: 0.3.3.0
+version: 0.4.0.0
 cabal-version: >=1.10
 build-type: Simple
 license: BSD3
@@ -38,7 +38,7 @@
         Data.MediaBus.Conduit.Reorder
         Data.MediaBus.Conduit.Segment
         Data.MediaBus.Conduit.Stream
-        Data.MediaBus.Conduit.Timing
+        Data.MediaBus.Conduit.SyncStream
         Data.MediaBus.Conduit.Trace
         Data.MediaBus.Conduit.TypeAnnotations
         Data.MediaBus.Media.Audio
@@ -117,7 +117,7 @@
         conduit <1.3,
         conduit-combinators <1.2,
         conduit-extra <1.2,
-        mediabus <0.4,
+        mediabus <0.5,
         containers <0.6,
         data-default <0.8,
         deepseq <1.5,
diff --git a/specs/Data/MediaBus/Conduit/Audio/Raw/ResampleSpec.hs b/specs/Data/MediaBus/Conduit/Audio/Raw/ResampleSpec.hs
--- a/specs/Data/MediaBus/Conduit/Audio/Raw/ResampleSpec.hs
+++ b/specs/Data/MediaBus/Conduit/Audio/Raw/ResampleSpec.hs
@@ -51,7 +51,7 @@
   mapOutput
     (MkStream . Next)
     (mapOutput (MkFrame () def) (yield (pcmMediaBuffer # mediaBufferFromList x)) .|
-     deriveFrameTimestamp 0)
+     setTimestampFromDurationsC 0)
 
 framesFromLists
   :: Monad m
@@ -61,4 +61,4 @@
   mapOutput
     (MkStream . Next)
     (mapOutput (MkFrame () def) (mapM_ (yield . view (from pcmMediaBuffer) . mediaBufferFromList) xs) .|
-     deriveFrameTimestamp 0)
+     setTimestampFromDurationsC 0)
diff --git a/specs/Data/MediaBus/Media/SyncStreamSpec.hs b/specs/Data/MediaBus/Media/SyncStreamSpec.hs
--- a/specs/Data/MediaBus/Media/SyncStreamSpec.hs
+++ b/specs/Data/MediaBus/Media/SyncStreamSpec.hs
@@ -19,7 +19,7 @@
 
 spec :: Spec
 spec =
-  describe "setSequenceNumbersAndTimestamps" $ do
+  describe "setSequenceNumberAndTimestamp" $ do
     it "increases the sequence number by one (only) for each frame" $
       let prop :: (NonEmptyList (SyncStream () () FakePayload)) -> Bool
           prop (NonEmpty inStr) =
@@ -33,7 +33,7 @@
                             z = (0, 0)
                         in evalState
                              (mapM
-                                (state . setSequenceNumbersAndTimestamps)
+                                (state . setSequenceNumberAndTimestamp)
                                 inStr)
                              z
                   in case last outStr of
@@ -53,7 +53,7 @@
                                   z = (0, 0)
                               in evalState
                                    (mapM
-                                      (state . setSequenceNumbersAndTimestamps)
+                                      (state . setSequenceNumberAndTimestamp)
                                       inStr)
                                    z
                         in filter isNext outStr
@@ -72,7 +72,7 @@
                             z = (0, MkTicks 0)
                         in evalState
                              (mapM
-                                (state . setSequenceNumbersAndTimestamps)
+                                (state . setSequenceNumberAndTimestamp)
                                 inStr)
                              z
                   in filter isNext outStr
diff --git a/src/Data/MediaBus.hs b/src/Data/MediaBus.hs
--- a/src/Data/MediaBus.hs
+++ b/src/Data/MediaBus.hs
@@ -22,7 +22,7 @@
 import Data.MediaBus.Conduit.Reorder as X
 import Data.MediaBus.Conduit.Segment as X
 import Data.MediaBus.Conduit.Stream as X
-import Data.MediaBus.Conduit.Timing as X
+import Data.MediaBus.Conduit.SyncStream as X
 import Data.MediaBus.Conduit.Trace as X
 import Data.MediaBus.Conduit.TypeAnnotations as X
 import Data.MediaBus.Media.Audio as X
diff --git a/src/Data/MediaBus/Basics/Ticks.hs b/src/Data/MediaBus/Basics/Ticks.hs
--- a/src/Data/MediaBus/Basics/Ticks.hs
+++ b/src/Data/MediaBus/Basics/Ticks.hs
@@ -44,6 +44,8 @@
   , type StaticTicksTicks
   , HasDuration(..)
   , HasTimestamp(..)
+  , setTimestampFromDurations
+  , removeTimestamp
   , HasStaticDuration(..)
   , getStaticDurationTicks
   , getStaticDuration
@@ -349,6 +351,33 @@
   timestamp :: Lens t (SetTimestamp t s) (GetTimestamp t) s
   timestamp' :: Lens' t (GetTimestamp t)
   timestamp' = timestamp
+
+-- | Calculate and set a timestamp.
+--
+-- The timestamp of each element is calculated from the sum of the durations of
+-- the previous elements stored and the start time stamp @t0@.
+--
+-- The input elements must be instances of 'HasTimestamp' but with the important
+-- condition, that the input timestamp is always /unit/ i.e. @()@.
+-- This prevents /meaningful/ timestamps from being overwritten.
+--
+-- Use 'removeTimestamp' to explicitly remove a timestamp.
+setTimestampFromDurations
+  :: forall r t a.
+     ( CanBeTicks r t
+     , HasDuration a
+     , HasTimestamp a
+     , GetTimestamp a ~ ()
+     )
+  => a -> Ticks r t -> (SetTimestamp a (Ticks r t), Ticks r t)
+setTimestampFromDurations !sb !t =
+   (sb & timestamp .~ t, t + (nominalDiffTime # getDuration sb))
+
+-- | Explicitly remove a timestamp, by setting the timestamp to @()@.
+removeTimestamp
+  :: (HasTimestamp a)
+  => a -> (SetTimestamp a ())
+removeTimestamp = timestamp .~ ()
 
 -- ** Known at compile time durations
 -- *** Static ticks TODO rename static -> known
diff --git a/src/Data/MediaBus/Conduit/Stream.hs b/src/Data/MediaBus/Conduit/Stream.hs
--- a/src/Data/MediaBus/Conduit/Stream.hs
+++ b/src/Data/MediaBus/Conduit/Stream.hs
@@ -11,8 +11,8 @@
   , mapFramesC
   , mapFramesC'
   , mapSeqNumC
-  , mapTicksC
-  , mapTicksC'
+  , mapTimestampC
+  , mapTimestampC'
   , mapFrameContentMC
   , mapFrameContentMC'
   , mapFrameContentC'
@@ -117,16 +117,16 @@
 
 -- | A conduit that applies the given function to every time stamp of a
 -- 'Stream', in 'Frame's as well as 'FrameCtx's.
-mapTicksC
+mapTimestampC
   :: Monad m
   => (t -> t') -> Conduit (Stream i s t p c) m (Stream i s t' p c)
-mapTicksC = mapC . over timestamp
+mapTimestampC = mapC . over timestamp
 
--- | A strict version of 'mapTicksC'.
-mapTicksC'
+-- | A strict version of 'mapTimestampC'.
+mapTimestampC'
   :: (NFData t, Monad m)
   => (t -> t') -> Conduit (Stream i s t p c) m (Stream i s t' p c)
-mapTicksC' = mapC . withStrategy rdeepseq . over timestamp
+mapTimestampC' = mapC . withStrategy rdeepseq . over timestamp
 
 -- | A conduit that applies the given pure function to 'eachFrameContent' of a 'Stream'.
 mapFrameContentC'
diff --git a/src/Data/MediaBus/Conduit/SyncStream.hs b/src/Data/MediaBus/Conduit/SyncStream.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/MediaBus/Conduit/SyncStream.hs
@@ -0,0 +1,100 @@
+-- | 'Conduit's that remove or set the sequence numbers and time stamps in
+--   'Stream's. The functions in this module lift the functions in 'SyncStream's
+--   to conduits.
+module Data.MediaBus.Conduit.SyncStream
+  ( assumeSynchronizedC
+  , setSequenceNumberAndTimestampC
+  , convertTimestampC
+  , setTimestampFromDurationsC
+  , removeTimestampC
+  ) where
+
+import Control.Monad.State.Strict
+import Control.DeepSeq (NFData)
+import Data.Conduit
+import Data.Conduit.Lift
+import Data.MediaBus.Basics.Ticks
+import Data.MediaBus.Conduit.Stream
+import Data.MediaBus.Media.Stream
+import Data.MediaBus.Media.SyncStream
+
+-- * Combined Sequence number and timestamp calculation
+
+-- | Assign sequence numbers and timestamps to the 'Frame's in a 'SyncStream',
+-- starting both the sequence number and timestamp at @0@.
+-- This functions is /strict/ and uses 'setSequenceNumberAndTimestamp'
+-- under the hood.
+-- Inorder to calculate only the 'timestamp' of a stream use
+-- 'setTimestampFromDurationsC'.
+setSequenceNumberAndTimestampC
+  :: (Monad m, KnownRate r, HasDuration d, Num s, CanBeTicks r t)
+  => ConduitM (SyncStream i p d) (Stream i s (Ticks r t) p d) m ()
+setSequenceNumberAndTimestampC =
+  evalStateC
+    (0, 0)
+    (awaitForever
+       (\sIn -> do
+          sOut <- lift (state (setSequenceNumberAndTimestamp sIn))
+          yield sOut))
+
+-- | Remove the sequence numbers and time stamps from a 'Stream'.
+-- It's much more explicit to use a 'SyncStream' instead of a 'Stream'.
+-- For example, when a library function aggregates 'Frame's but doesn't regard
+-- the sequence numbers and time stamps, using 'SyncStream' indicates to users
+-- of that library, that the function does not handle any gaps and/or out of order
+-- packages or discrepancies in the time stamps and e.g. frame durations.
+--
+-- The user then knows, that she has to add functions to that conduit to accomodate
+-- for that.
+--
+-- This functions is /strict/ and uses 'assumeSynchronized'
+-- under the hood.
+assumeSynchronizedC
+  :: (Monad m, KnownRate r, HasDuration d, Num s, CanBeTicks r t)
+  => ConduitM (SyncStream i p d) (Stream i s (Ticks r t) p d) m ()
+assumeSynchronizedC =
+  evalStateC
+    (0, 0)
+    (awaitForever
+       (\sIn -> do
+          sOut <- lift (state (setSequenceNumberAndTimestamp sIn))
+          yield sOut))
+
+-- * Timestamp calculation and conversion
+
+-- | Set the timestamp of each element in the conduit.
+-- The timestamp of each element is calculated from the sum of the durations of
+-- the previous elements and the start time stamp @t0@.
+--
+-- The input elements must be instances of 'HasTimestamp' but with the important
+-- condition, that the input timestamp is always /unit/ i.e. @()@.
+-- This prevents /meaningful/ timestamps from being overwritten.
+--
+-- Use 'removeTimestampC' to explicitly remove a timestamp.
+setTimestampFromDurationsC
+  :: forall m r t a.
+     ( Monad m
+     , CanBeTicks r t
+     , HasDuration a
+     , HasTimestamp a
+     , GetTimestamp a ~ ()
+     )
+  => Ticks r t -> Conduit a m (SetTimestamp a (Ticks r t))
+setTimestampFromDurationsC t0 = evalStateC t0 (awaitForever go)
+  where
+    go !sb = lift (state (setTimestampFromDurations sb)) >>= yield
+
+-- | Explicitly remove a timestamp, by setting the timestamp to @()@.
+removeTimestampC
+  :: (Monad m, HasTimestamp a)
+  => Conduit a m (SetTimestamp a ())
+removeTimestampC = awaitForever (yield . removeTimestamp)
+
+-- | Recalculate all timestamps in a 'Stream'. This function is strict in its arguments.
+convertTimestampC
+  :: forall proxy0 proxy1 m r t r' t' i s c p.
+     (NFData t, NFData t', CanBeTicks r t, CanBeTicks r' t', Monad m, NFData t')
+  => proxy0 '( r, t)
+  -> proxy1 '( r', t')
+  -> Conduit (Stream i s (Ticks r t) p c) m (Stream i s (Ticks r' t') p c)
+convertTimestampC _ _ = mapTimestampC' convertTicks
diff --git a/src/Data/MediaBus/Conduit/Timing.hs b/src/Data/MediaBus/Conduit/Timing.hs
deleted file mode 100644
--- a/src/Data/MediaBus/Conduit/Timing.hs
+++ /dev/null
@@ -1,38 +0,0 @@
--- | Conduits to create and convert the time stamps in 'Stream's
-module Data.MediaBus.Conduit.Timing
-  ( convertTicksC'
-  , deriveFrameTimestamp
-  ) where
-
-import Conduit
-import Control.DeepSeq (NFData)
-import Control.Lens
-import Control.Monad.State.Strict
-import Data.MediaBus.Basics.Ticks
-import Data.MediaBus.Media.Stream
-import Data.MediaBus.Conduit.Stream
-
--- | Overwrite the timestamp of a stream of things that  have a time stamp field
---  (i.e. 'HasTimestamp' instances)  and also a duration, such that the
---  timestamps increment by the duration starting from 0.
-deriveFrameTimestamp
-  :: forall m r t a.
-     (Monad m, CanBeTicks r t, HasDuration a, HasTimestamp a)
-  => Ticks r t -> Conduit a m (SetTimestamp a (Ticks r t))
-deriveFrameTimestamp t0 = evalStateC t0 (awaitForever yieldSync)
-  where
-    yieldSync :: a
-              -> Conduit a (StateT (Ticks r t) m) (SetTimestamp a (Ticks r t))
-    yieldSync sb = do
-      t <- get
-      modify (+ (nominalDiffTime # getDuration sb))
-      yield (sb & timestamp .~ t)
-
--- | Recalculate all timestamps in a 'Stream'
-convertTicksC'
-  :: forall proxy0 proxy1 m r t r' t' i s c p.
-     (NFData t, NFData t', CanBeTicks r t, CanBeTicks r' t', Monad m, NFData t')
-  => proxy0 '( r, t)
-  -> proxy1 '( r', t')
-  -> Conduit (Stream i s (Ticks r t) p c) m (Stream i s (Ticks r' t') p c)
-convertTicksC' _ _ = mapTicksC' convertTicks
diff --git a/src/Data/MediaBus/Media/Audio/Raw.hs b/src/Data/MediaBus/Media/Audio/Raw.hs
--- a/src/Data/MediaBus/Media/Audio/Raw.hs
+++ b/src/Data/MediaBus/Media/Audio/Raw.hs
@@ -26,8 +26,10 @@
 -- | An indicator for uncompressed audio with a given per sample encoding type.
 data Raw encoding
 
--- | A family of multi-channel audio samples, this will be stored in a 'MediaBuffer'
--- if audio is represented by @Audio r (Pcm c t)@
+-- | A family of multi-channel audio sample value types. Values of this type are
+--   stored in 'MediaBuffer's.
+--   The 'Audio' instances with 'Raw' encodings use 'MediaBuffer's of 'Pcm'
+--   values to store (multi-channel-) samples.
 data family Pcm c t
 
 -- | Types of per channel PCM audio sample value.
diff --git a/src/Data/MediaBus/Media/Buffer.hs b/src/Data/MediaBus/Media/Buffer.hs
--- a/src/Data/MediaBus/Media/Buffer.hs
+++ b/src/Data/MediaBus/Media/Buffer.hs
@@ -55,8 +55,7 @@
 -- | Like 'HasMediaBufferL' but with the typical **simple** lens type parameters @s a@
 type HasMediaBufferL' s a = (HasMediaBuffer s s, MediaBufferFrom s ~ a, MediaBufferTo s ~ a)
 
--- | A buffer for media data. The type parameter @t@ is supposed to be an
--- instance of `IsMedia`.
+-- | A buffer for media data. This is just a newtype wrapper around 'V.Vector'.
 newtype MediaBuffer t = MkMediaBuffer
   { _mediaBufferVector :: V.Vector t
   } deriving (Generic, NFData, Monoid, Eq)
diff --git a/src/Data/MediaBus/Media/SyncStream.hs b/src/Data/MediaBus/Media/SyncStream.hs
--- a/src/Data/MediaBus/Media/SyncStream.hs
+++ b/src/Data/MediaBus/Media/SyncStream.hs
@@ -1,20 +1,30 @@
--- | Naturally ordered 'Stream's.
--- A 'Stream' without sequence numbers and timestamps has no means to represent
--- 'Frame's that have varying sequence numbers or timestamps, hence they cannot
--- be part of a stream that is not perfectly synchronized, therefore when consuming
--- such 'Stream' values, the corresponding callers must work under the assumption
--- that the frames are perfectly synchronous.
+-- | A module for removing and creating sequence numbers and time stamps for
+-- 'Stream's.
+--
+-- It's sometimes helpful to explicity use a 'SyncStream' instead of a 'Stream'.
+--
+-- For example, for a library function that consumes 'Frame's and doesn't regard
+-- the sequence numbers and time stamps, such that the function does not handle
+-- any gaps and/or out of order packages or discrepancies in the time stamps
+-- and frame durations.
+--
+-- When the library author chooses 'SyncStream', the library users then know,
+-- that the library function relies on a synchronized stream.
 module Data.MediaBus.Media.SyncStream
   ( type SyncStream
   , assumeSynchronized
-  , setSequenceNumbersAndTimestamps
+  , setSequenceNumberAndTimestamp
   ) where
 
 import Data.MediaBus.Basics.Series
 import Data.MediaBus.Basics.Ticks
 import Data.MediaBus.Media.Stream
 
--- | A 'Stream' without a meaningful sequence number or timestamp.
+-- | A 'Stream' without sequence numbers and time stamps is called a
+-- 'SyncStream', which is the abbreviation of /synchronous stream/, because
+-- when the sequence numbers and time stamps of a 'Stream', and by extension of
+-- a 'Frame' and 'FrameCtx', are always @()@, the 'Frame's of a 'Stream' can
+-- be assumed to be (perfectly) synchronous.
 type SyncStream i p c = Stream i () () p c
 
 -- | Convert a 'Stream' to a 'SyncStream' by simply /forgetting/ the sequence
@@ -32,13 +42,13 @@
 -- Start the timestamp at @0@ and add the 'Frame' duration of the 'Next'
 -- frame in the stream.
 -- This function has the signature required to turn it into a 'State' monad.
-setSequenceNumbersAndTimestamps
+setSequenceNumberAndTimestamp
   :: (Num s, CanBeTicks r t, HasDuration c)
   => SyncStream i p c
   -> (s, Ticks r t)
   -> (Stream i s (Ticks r t) p c, (s, Ticks r t))
-setSequenceNumbersAndTimestamps (MkStream (Next (MkFrame _t _s !c))) (nextS, nextT) =
+setSequenceNumberAndTimestamp (MkStream (Next (MkFrame _t _s !c))) (nextS, nextT) =
   ( MkStream (Next (MkFrame nextT nextS c))
   , (nextS + 1, nextT + getDurationTicks c))
-setSequenceNumbersAndTimestamps (MkStream (Start (MkFrameCtx i _t _s p))) (nextS, nextT) =
+setSequenceNumberAndTimestamp (MkStream (Start (MkFrameCtx i _t _s p))) (nextS, nextT) =
   ((MkStream (Start (MkFrameCtx i nextT nextS p))), (nextS, nextT))
