diff --git a/CHANGELOG b/CHANGELOG
new file mode 100644
--- /dev/null
+++ b/CHANGELOG
@@ -0,0 +1,73 @@
+2022-04-21 Ivan Perez <ivan.perez@keera.co.uk>
+        * dunai.cabal: Version bump (0.8.2) (#280), syntax rules (#271),
+          declare CHANGELOG (#273), declare subdir of source-repository (#272).
+        * src/: Fix haddock syntax error in documentation of switch (#274),
+          introduce new dSwitch function (#275), syntax rules (#277), remove
+          unused module Ultrametric (#278), remove unused module
+          CausalCommutative (#279).
+
+2021-10-21 Ivan Perez <ivan.perez@keera.co.uk>
+        * src:/: Code cleaning.
+        * dunai.cabal: Version bump (0.8.1).
+        * README.md: update example to new API, fix broken link, update badge,
+          fix typo.
+        * Thanks: @DireWolf707.
+
+2021-09-06 Ivan Perez <ivan.perez@keera.co.uk>
+        * src:/: Code cleaning.
+        * dunai.cabal: Version bump (0.8.0).
+        * README.md: support for GHC 8.10.
+        * Thanks: @walseb, @turion, @bgluzman, @mezzomondo.
+
+2020-04-18 Ivan Perez <ivan.perez@keera.co.uk>
+        * src:/: Add new utilities. Fix behaviour of listToMaybeS.
+        * dunai.cabal: Version bump (0.7.0).
+        * README.md: support for GHC 8.8.
+        * Cleaning and hlinting changes.
+        * Thanks: @turion, @Linearity.
+
+2020-01-25 Ivan Perez <ivan.perez@keera.co.uk>
+        * src:/: Remove Data.VectorSpace.
+        * src:/: Fix error in documentation of embed.
+        * dunai.cabal: use simple-affine-space. Version bump (0.6.0).
+        * README.md: support for GHC 8.6. Add links to videos. Fix typos.
+        * Thanks: @chriz-keera, @turion, @Rizary, @dynomite567,
+          @alexmarginean16.
+
+2019-09-29 Ivan Perez <ivan.perez@keera.co.uk>
+        * src:/: Fixes error in List on older versions of GHC.
+        * dunai.cabal: exposes List support. Version bump (0.5.2.1).
+
+2019-09-29 Ivan Perez <ivan.perez@keera.co.uk>
+        * src:/: Fixes error in List support implementation.
+        * dunai.cabal: exposes List support. Version bump (0.5.2).
+
+2018-11-03 Ivan Perez <ivan.perez@keera.co.uk>
+        * src:/: Fixes failed patterns in do notation.
+        * dunai.cabal: Version bump (0.5.1).
+        * Thanks: @turion, @ggreif.
+
+2018-11-03 Ivan Perez <ivan.perez@keera.co.uk>
+        * src:/ Renames lifting functions, moves definitions around.
+        * dunai.cabal: Version bump (0.5).
+        * Thanks: @turion.
+
+2017-12-05 Ivan Perez <ivan.perez@keera.co.uk>
+        * Adds support for random numbers using MonadRandom
+          (thanks Jonathan Thaler -- @thalerjonathan).
+        * Removes MSF constructor from many definitions
+          (by Manuel Bärenz -- @turion).
+        * Adds support for older GHC versions.
+        * Moves some definitions/modules around.
+        * dunai.cabal: Version bump (0.4).
+        * examples/: Changes licenses, updates examples to use new API.
+
+2017-10-31 Ivan Perez <ivan.perez@keera.co.uk>
+        * src/: Re-structure modules, completes documentation.
+        * stack.yaml: New stack configuration.
+        * Fixes compilation errors with older versions of GHC.
+        * dunai.cabal: Version bump (0.3), adds repo URL, documentation.
+        * examples/: Updates examples to use new API.
+
+Copyright (c) 2016, Ivan Perez and Manuel Bärenz.
+All rights reserved.
diff --git a/dunai.cabal b/dunai.cabal
--- a/dunai.cabal
+++ b/dunai.cabal
@@ -1,14 +1,53 @@
-name:                dunai
-version:             0.8.1
-synopsis:            Generalised reactive framework supporting classic, arrowized and monadic FRP.
-homepage:            https://github.com/ivanperez-keera/dunai
+-- Copyright (c) 2016 - Ivan Perez and Manuel Bärenz - All rights reserved
+--
+-- Redistribution and use in source and binary forms, with or without
+-- modification, are permitted provided that the following conditions are met:
+--
+--     * Redistributions of source code must retain the above copyright
+--       notice, this list of conditions and the following disclaimer.
+--
+--     * Redistributions in binary form must reproduce the above
+--       copyright notice, this list of conditions and the following
+--       disclaimer in the documentation and/or other materials provided
+--       with the distribution.
+--
+--     * Neither the name of Ivan Perez and Manuel Bärenz nor the names of
+--       other contributors may be used to endorse or promote products derived
+--       from this software without specific prior written permission.
+--
+-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+-- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+-- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+-- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+-- OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+-- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+-- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+-- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+-- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+-- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+-- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+cabal-version: >= 1.10
+build-type:    Simple
+
+name:          dunai
+version:       0.8.2
+author:        Ivan Perez, Manuel Bärenz
+maintainer:    ivan.perez@keera.co.uk
+homepage:      https://github.com/ivanperez-keera/dunai
+license:       BSD3
+license-file:  LICENSE
+copyright:     Copyright (c) 2016 - Ivan Perez and Manuel Bärenz
+category:      Reactivity, FRP
+synopsis:
+  Generalised reactive framework supporting classic, arrowized and monadic FRP.
 description:
   Dunai is a DSL for strongly-typed CPS-based composable transformations.
   .
   Dunai is based on a concept of Monadic Stream Functions (MSFs). MSFs are
-  transformations defined by a function @unMSF :: MSF m a b -> a -> m (b, MSF m a b)@
-  that executes one step of a simulation, and produces an output in a monadic
-  context, and a continuation to be used for future steps.
+  transformations defined by a function
+  @unMSF :: MSF m a b -> a -> m (b, MSF m a b)@ that executes one step of a
+  simulation, and produces an output in a monadic context, and a continuation
+  to be used for future steps.
   .
   MSFs are a generalisation of the implementation mechanism used by Yampa,
   Wormholes and other FRP and reactive implementations.
@@ -25,115 +64,155 @@
   with @ListT@ gives rise to parallelism with broadcasting.
   .
   MSFs can be used to implement many FRP variants, including Arrowized FRP,
-  Classic FRP, and plain reactive programming. Arrowized and applicative
-  syntax are both supported.
+  Classic FRP, and plain reactive programming. Arrowized and applicative syntax
+  are both supported.
   .
   For a very detailed introduction to MSFs, see:
   <http://dl.acm.org/citation.cfm?id=2976010>
   (mirror: <http://www.cs.nott.ac.uk/~psxip1/#FRPRefactored>).
-license:             BSD3
-license-file:        LICENSE
-author:              Ivan Perez, Manuel Bärenz
-maintainer:          ivan.perez@keera.co.uk
--- copyright:
-category:            Reactivity, FRP
-build-type:          Simple
--- extra-source-files:
-cabal-version:       >=1.10
 
+
+extra-source-files:
+  CHANGELOG
+
+
+source-repository head
+  type:     git
+  location: git@github.com:ivanperez-keera/dunai.git
+  subdir:   dunai
+
+
 -- You can disable the hlint test suite with -f-test-hlint
 flag test-hlint
   description: Enable hlint test suite
-  default: False
-  manual: True
+  default:     False
+  manual:      True
 
 -- You can disable the haddock coverage test suite with -f-test-doc-coverage
 flag test-doc-coverage
   description: Enable haddock coverage test suite
-  default: False
-  manual: True
+  default:     False
+  manual:      True
 
+
 library
-  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
-                     Control.Monad.Trans.MSF.State
-                     Control.Monad.Trans.MSF.Writer
-                     Data.MonadicStreamFunction
-                     Data.MonadicStreamFunction.Core
-                     Data.MonadicStreamFunction.Async
-                     Data.MonadicStreamFunction.Instances.ArrowChoice
-                     Data.MonadicStreamFunction.Instances.ArrowLoop
-                     Data.MonadicStreamFunction.Instances.ArrowPlus
-                     Data.MonadicStreamFunction.Instances.Num
-                     Data.MonadicStreamFunction.Instances.VectorSpace
-                     Data.MonadicStreamFunction.InternalCore
-                     Data.MonadicStreamFunction.Parallel
-                     Data.MonadicStreamFunction.ReactHandle
-                     Data.MonadicStreamFunction.Util
+  exposed-modules:
+    Control.Monad.Trans.MSF
+    Control.Monad.Trans.MSF.Except
+    Control.Monad.Trans.MSF.List
+    Control.Monad.Trans.MSF.Maybe
+    Control.Monad.Trans.MSF.Random
+    Control.Monad.Trans.MSF.Reader
+    Control.Monad.Trans.MSF.RWS
+    Control.Monad.Trans.MSF.State
+    Control.Monad.Trans.MSF.Writer
+    Data.MonadicStreamFunction
+    Data.MonadicStreamFunction.Async
+    Data.MonadicStreamFunction.Core
+    Data.MonadicStreamFunction.Instances.ArrowChoice
+    Data.MonadicStreamFunction.Instances.ArrowLoop
+    Data.MonadicStreamFunction.Instances.ArrowPlus
+    Data.MonadicStreamFunction.Instances.Num
+    Data.MonadicStreamFunction.Instances.VectorSpace
+    Data.MonadicStreamFunction.InternalCore
+    Data.MonadicStreamFunction.Parallel
+    Data.MonadicStreamFunction.ReactHandle
+    Data.MonadicStreamFunction.Util
 
-  other-modules:     Control.Arrow.Util
+  other-modules:
+    Control.Arrow.Util
 
-  build-depends:     base >=4.6 && < 5,
-                     transformers,
-                     transformers-base,
-                     MonadRandom,
-                     simple-affine-space
+  build-depends:
+      base >= 4.6 && < 5
+    , MonadRandom
+    , simple-affine-space
+    , transformers
+    , transformers-base
 
-  hs-source-dirs:    src
-  default-language:  Haskell2010
-  ghc-options:       -Wall -fno-warn-unused-do-bind
+  default-language:
+    Haskell2010
 
+  hs-source-dirs:
+    src
+
+  ghc-options:
+    -Wall -fno-warn-unused-do-bind
+
   if impl(ghc <= 7.8.4)
-    build-depends: transformers-compat
+    build-depends:
+      transformers-compat
 
+
 test-suite hlint
-  type: exitcode-stdio-1.0
-  main-is: HLintMain.hs
-  hs-source-dirs: tests
-  default-language:  Haskell2010
+  type:
+    exitcode-stdio-1.0
+
+  main-is:
+    HLintMain.hs
+
+  default-language:
+    Haskell2010
+
+  hs-source-dirs:
+    tests
+
   if !flag(test-hlint)
-    buildable: False
+    buildable:
+      False
   else
     build-depends:
-      base,
-      hlint >= 1.7
+        base
+      , hlint >= 1.7
 
 -- Verify that the code is thoroughly documented
 test-suite haddock-coverage
-  type: exitcode-stdio-1.0
-  main-is: HaddockCoverage.hs
-  ghc-options: -Wall
-  hs-source-dirs: tests
-  default-language:  Haskell2010
+  type:
+    exitcode-stdio-1.0
 
+  main-is:
+    HaddockCoverage.hs
+
+  default-language:
+    Haskell2010
+
+  hs-source-dirs:
+    tests
+
+  ghc-options:
+    -Wall
+
   if !flag(test-doc-coverage)
-    buildable: False
+    buildable:
+      False
   else
     build-depends:
-      base >= 4 && < 5,
-      directory,
-      filepath,
-      process,
-      regex-posix
+        base >= 4 && < 5
+      , directory
+      , filepath
+      , process
+      , regex-posix
 
-source-repository head
-  type:     git
-  location: git@github.com:ivanperez-keera/dunai.git
 
 test-suite regression-tests
-  type: exitcode-stdio-1.0
-  main-is: RegressionTests.hs
-  ghc-options: -Wall
-  hs-source-dirs: tests
-  default-language:  Haskell2010
+  type:
+    exitcode-stdio-1.0
+
+  main-is:
+    RegressionTests.hs
+
+  default-language:
+    Haskell2010
+
+  hs-source-dirs:
+    tests
+
+  ghc-options:
+    -Wall
+
   build-depends:
-    base >=4 && <5,
-    transformers,
-    dunai,
-    tasty,
-    tasty-hunit
+      base >= 4 && <5
+    , transformers
+    , tasty
+    , tasty-hunit
+
+    , dunai
diff --git a/src/Control/Arrow/Util.hs b/src/Control/Arrow/Util.hs
--- a/src/Control/Arrow/Util.hs
+++ b/src/Control/Arrow/Util.hs
@@ -1,4 +1,9 @@
--- | Utility functions to work with 'Arrow's.
+-- |
+-- Copyright  : (c) Ivan Perez and Manuel Baerenz, 2016
+-- License    : BSD3
+-- Maintainer : ivan.perez@keera.co.uk
+--
+-- Utility functions to work with 'Arrow's.
 module Control.Arrow.Util where
 
 import Control.Arrow
diff --git a/src/Control/Monad/Trans/MSF.hs b/src/Control/Monad/Trans/MSF.hs
--- a/src/Control/Monad/Trans/MSF.hs
+++ b/src/Control/Monad/Trans/MSF.hs
@@ -1,6 +1,10 @@
 {-# LANGUAGE Rank2Types #-}
-
--- | This module reexports nearly all submodules. RWS is not exported since
+-- |
+-- Copyright  : (c) Ivan Perez and Manuel Baerenz, 2016
+-- License    : BSD3
+-- Maintainer : ivan.perez@keera.co.uk
+--
+-- This module reexports nearly all submodules. RWS is not exported since
 -- names collide with Reader, State and Writer.
 module Control.Monad.Trans.MSF
     ( module Control.Monad.Trans.MSF.Except
diff --git a/src/Control/Monad/Trans/MSF/Except.hs b/src/Control/Monad/Trans/MSF/Except.hs
--- a/src/Control/Monad/Trans/MSF/Except.hs
+++ b/src/Control/Monad/Trans/MSF/Except.hs
@@ -1,24 +1,28 @@
-{-# LANGUAGE Arrows              #-}
-{-# LANGUAGE CPP                 #-}
-{-# LANGUAGE Rank2Types          #-}
-{-# LANGUAGE TupleSections       #-}
--- | 'MSF's in the 'ExceptT' monad are monadic stream functions
---   that can throw exceptions,
---   i.e. return an exception value instead of a continuation.
---   This module gives ways to throw exceptions in various ways,
---   and to handle them through a monadic interface.
+{-# LANGUAGE Arrows        #-}
+{-# LANGUAGE CPP           #-}
+{-# LANGUAGE Rank2Types    #-}
+{-# LANGUAGE TupleSections #-}
+-- |
+-- Copyright  : (c) Ivan Perez and Manuel Baerenz, 2016
+-- License    : BSD3
+-- Maintainer : ivan.perez@keera.co.uk
+--
+-- 'MSF's in the 'ExceptT' monad are monadic stream functions that can throw
+-- exceptions, i.e. return an exception value instead of a continuation. This
+-- module gives ways to throw exceptions in various ways, and to handle them
+-- through a monadic interface.
 module Control.Monad.Trans.MSF.Except
   ( module Control.Monad.Trans.MSF.Except
   , module Control.Monad.Trans.Except
   ) where
 
 -- External
-
 import           Control.Applicative
 import qualified Control.Category           as Category
-import           Control.Monad              (liftM, ap)
+import           Control.Monad              (ap, liftM)
 import           Control.Monad.Trans.Class
-import           Control.Monad.Trans.Except hiding (liftCallCC, liftListen, liftPass) -- Avoid conflicting exports
+import           Control.Monad.Trans.Except hiding (liftCallCC, liftListen,
+                                             liftPass)
 import           Control.Monad.Trans.Maybe
 
 -- Internal
@@ -177,6 +181,8 @@
   return = pure
   MSFExcept msf >>= f = MSFExcept $ handleExceptT msf $ runMSFExcept . f
 
+-- | Execute an MSF and, if it throws an exception, recover by switing to a
+-- second MSF.
 handleExceptT
   :: Monad m
   => MSF (ExceptT e1 m) a b
@@ -265,7 +271,11 @@
 reactimateB :: Monad m => MSF m () Bool -> m ()
 reactimateB sf = reactimateExcept $ try $ liftTransS sf >>> throwOn ()
 
--- * Analog to Yampa's switch, with Maybe instead of Event
+-- | Run first MSF until the second value in the output tuple is @Just c@ (for
+-- some @c@), then start the second MSF.
+--
+-- Analog to Yampa's [@switch@](https://hackage.haskell.org/package/Yampa/docs/FRP-Yampa-Switches.html#v:switch),
+-- with 'Maybe' instead of @Event@.
 switch :: Monad m => MSF m a (b, Maybe c) -> (c -> MSF m a b) -> MSF m a b
 switch sf f = catchS ef  f
   where
@@ -273,6 +283,18 @@
            (b,me)  <- liftTransS sf -< a
            inExceptT -< ExceptT $ return $ maybe (Right b) Left me
 
+-- | Run first MSF until the second value in the output tuple is @Just c@ (for
+-- some @c@), then start the second MSF.
+--
+-- Analog to Yampa's [@dswitch@](https://hackage.haskell.org/package/Yampa/docs/FRP-Yampa-Switches.html#v:dSwitch),
+-- with 'Maybe' instead of @Event@.
+dSwitch :: Monad m => MSF m a (b, Maybe c) -> (c -> MSF m a b) -> MSF m a b
+dSwitch sf f = catchS ef f
+  where
+    ef = feedback Nothing $ proc (a, me) -> do
+           throwMaybe    -< me
+           liftTransS sf -< a
+
 -- | More general lifting combinator that enables recovery. Note that, unlike a
 -- polymorphic lifting function @forall a . m a -> m1 a@, this auxiliary
 -- function needs to be a bit more structured, and produces a Maybe value. The
@@ -289,6 +311,7 @@
                  Just msf'' -> return (b2, transG transformInput transformOutput msf'')
                  Nothing    -> return (b2, go)
 
+-- | Use a generic handler to handle exceptions in MSF processing actions.
 handleGen :: (a -> m1 (b1, MSF m1 a b1) -> m2 (b2, MSF m2 a b2))
           -> MSF m1 a b1
           -> MSF m2 a b2
diff --git a/src/Control/Monad/Trans/MSF/List.hs b/src/Control/Monad/Trans/MSF/List.hs
--- a/src/Control/Monad/Trans/MSF/List.hs
+++ b/src/Control/Monad/Trans/MSF/List.hs
@@ -1,17 +1,20 @@
 {-# LANGUAGE CPP #-}
+-- |
+-- Copyright  : (c) Ivan Perez and Manuel Baerenz, 2016
+-- License    : BSD3
+-- Maintainer : ivan.perez@keera.co.uk
 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
-
 #if !MIN_VERSION_base(4,8,0)
 import Control.Applicative ((<$>))
 #endif
 
+import Control.Monad.Trans.List hiding (liftCallCC, liftCatch)
+
 -- Internal
 import Data.MonadicStreamFunction
 import Data.MonadicStreamFunction.InternalCore (MSF (MSF, unMSF))
@@ -45,4 +48,3 @@
       (b, sf')   <- unMSF sf a
       (bs, sf'') <- consume sf' as
       b `seq` return (b:bs, sf'')
-
diff --git a/src/Control/Monad/Trans/MSF/Maybe.hs b/src/Control/Monad/Trans/MSF/Maybe.hs
--- a/src/Control/Monad/Trans/MSF/Maybe.hs
+++ b/src/Control/Monad/Trans/MSF/Maybe.hs
@@ -1,10 +1,13 @@
-{-# LANGUAGE Arrows              #-}
-{-# LANGUAGE Rank2Types          #-}
-{- |
-The 'Maybe' monad is very versatile. It can stand for default arguments,
-for absent values, and for (nondescript) exceptions.
-The latter viewpoint is most natural in the context of 'MSF's.
--}
+{-# LANGUAGE Arrows     #-}
+{-# LANGUAGE Rank2Types #-}
+-- |
+-- Copyright  : (c) Ivan Perez and Manuel Baerenz, 2016
+-- License    : BSD3
+-- Maintainer : ivan.perez@keera.co.uk
+--
+-- The 'Maybe' monad is very versatile. It can stand for default arguments,
+-- for absent values, and for (nondescript) exceptions. The latter viewpoint
+-- is most natural in the context of 'MSF's.
 module Control.Monad.Trans.MSF.Maybe
   ( module Control.Monad.Trans.MSF.Maybe
   , module Control.Monad.Trans.Maybe
@@ -12,8 +15,8 @@
   ) where
 
 -- External
-import Control.Monad.Trans.Maybe
-  hiding (liftCallCC, liftCatch, liftListen, liftPass) -- Avoid conflicting exports
+import Control.Monad.Trans.Maybe hiding (liftCallCC, liftCatch, liftListen,
+                                  liftPass)
 
 -- Internal
 import Control.Monad.Trans.MSF.Except
diff --git a/src/Control/Monad/Trans/MSF/RWS.hs b/src/Control/Monad/Trans/MSF/RWS.hs
--- a/src/Control/Monad/Trans/MSF/RWS.hs
+++ b/src/Control/Monad/Trans/MSF/RWS.hs
@@ -1,20 +1,24 @@
--- | This module combines the wrapping and running functions
---   for the 'Reader', 'Writer' and 'State' monad layers in a single layer.
+-- |
+-- Copyright  : (c) Ivan Perez and Manuel Baerenz, 2016
+-- License    : BSD3
+-- Maintainer : ivan.perez@keera.co.uk
 --
+-- This module combines the wrapping and running functions for the 'Reader',
+-- 'Writer' and 'State' monad layers in a single layer.
+--
 -- It is based on the _strict_ 'RWS' monad 'Control.Monad.Trans.RWS.Strict',
--- so when combining it with other modules such as @mtl@'s,
--- the strict version has to be included, i.e. 'Control.Monad.RWS.Strict'
--- instead of 'Control.Monad.RWS' or 'Control.Monad.RWS.Lazy'.
+-- so when combining it with other modules such as @mtl@'s, the strict version
+-- has to be included, i.e. 'Control.Monad.RWS.Strict' instead of
+-- 'Control.Monad.RWS' or 'Control.Monad.RWS.Lazy'.
 module Control.Monad.Trans.MSF.RWS
   ( module Control.Monad.Trans.MSF.RWS
   , module Control.Monad.Trans.RWS.Strict
   ) where
 
 -- External
-import Control.Monad.Trans.RWS.Strict
-  hiding (liftCallCC, liftCatch) -- Avoid conflicting exports
+import Control.Monad.Trans.RWS.Strict hiding (liftCallCC, liftCatch)
+import Data.Functor                   ((<$>))
 import Data.Monoid
-import Data.Functor ((<$>))
 
 -- Internal
 import Data.MonadicStreamFunction
diff --git a/src/Control/Monad/Trans/MSF/Random.hs b/src/Control/Monad/Trans/MSF/Random.hs
--- a/src/Control/Monad/Trans/MSF/Random.hs
+++ b/src/Control/Monad/Trans/MSF/Random.hs
@@ -1,12 +1,15 @@
--- | In this module, 'MSF's in a monad supporting random number generation
---   (i.e. having the 'RandT' layer in its stack) can be run.
---   Running means supplying an initial random number generator,
---   where the update of the generator at every random number generation
---   is already taken care of.
+-- |
+-- Copyright  : (c) Ivan Perez and Manuel Baerenz, 2016
+-- License    : BSD3
+-- Maintainer : ivan.perez@keera.co.uk
 --
---   Under the hood, 'RandT' is basically just 'StateT',
---   with the current random number generator as mutable state.
-
+-- In this module, 'MSF's in a monad supporting random number generation (i.e.
+-- having the 'RandT' layer in its stack) can be run. Running means supplying
+-- an initial random number generator, where the update of the generator at
+-- every random number generation is already taken care of.
+--
+-- Under the hood, 'RandT' is basically just 'StateT', with the current random
+-- number generator as mutable state.
 module Control.Monad.Trans.MSF.Random
   (
     runRandS
@@ -24,8 +27,8 @@
 import Control.Monad.Random
 
 -- Internal
-import Data.MonadicStreamFunction
 import Control.Monad.Trans.MSF.State
+import Data.MonadicStreamFunction
 
 -- | Run an 'MSF' in the 'RandT' random number monad transformer
 --   by supplying an initial random generator.
diff --git a/src/Control/Monad/Trans/MSF/Reader.hs b/src/Control/Monad/Trans/MSF/Reader.hs
--- a/src/Control/Monad/Trans/MSF/Reader.hs
+++ b/src/Control/Monad/Trans/MSF/Reader.hs
@@ -1,7 +1,11 @@
-{-# LANGUAGE Rank2Types          #-}
-
--- | 'MSF's with a 'Reader' monadic layer.
+{-# LANGUAGE Rank2Types #-}
+-- |
+-- Copyright  : (c) Ivan Perez and Manuel Baerenz, 2016
+-- License    : BSD3
+-- Maintainer : ivan.perez@keera.co.uk
 --
+-- 'MSF's with a 'Reader' monadic layer.
+--
 -- This module contains functions to work with 'MSF's that include a 'Reader'
 -- monadic layer. This includes functions to create new 'MSF's that include an
 -- additional layer, and functions to flatten that layer out of the 'MSF`'s
@@ -15,8 +19,7 @@
   ) where
 
 -- External
-import Control.Monad.Trans.Reader
-  hiding (liftCallCC, liftCatch) -- Avoid conflicting exports
+import Control.Monad.Trans.Reader hiding (liftCallCC, liftCatch)
 
 -- Internal
 import Data.MonadicStreamFunction
diff --git a/src/Control/Monad/Trans/MSF/State.hs b/src/Control/Monad/Trans/MSF/State.hs
--- a/src/Control/Monad/Trans/MSF/State.hs
+++ b/src/Control/Monad/Trans/MSF/State.hs
@@ -1,6 +1,11 @@
 {-# LANGUAGE Rank2Types #-}
--- | 'MSF's with a 'State' monadic layer.
+-- |
+-- Copyright  : (c) Ivan Perez and Manuel Baerenz, 2016
+-- License    : BSD3
+-- Maintainer : ivan.perez@keera.co.uk
 --
+-- 'MSF's with a 'State' monadic layer.
+--
 -- This module contains functions to work with 'MSF's that include a 'State'
 -- monadic layer. This includes functions to create new 'MSF's that include an
 -- additional layer, and functions to flatten that layer out of the 'MSF`'s
@@ -21,9 +26,9 @@
 
 -- External
 import Control.Applicative
-import Control.Monad.Trans.State.Strict
-  hiding (liftCallCC, liftCatch, liftListen, liftPass) -- Avoid conflicting exports
-import Data.Tuple (swap)
+import Control.Monad.Trans.State.Strict hiding (liftCallCC, liftCatch,
+                                         liftListen, liftPass)
+import Data.Tuple                       (swap)
 
 -- Internal
 import Data.MonadicStreamFunction.Core
diff --git a/src/Control/Monad/Trans/MSF/Writer.hs b/src/Control/Monad/Trans/MSF/Writer.hs
--- a/src/Control/Monad/Trans/MSF/Writer.hs
+++ b/src/Control/Monad/Trans/MSF/Writer.hs
@@ -1,5 +1,10 @@
--- | 'MSF's with a 'Writer' monadic layer.
+-- |
+-- Copyright  : (c) Ivan Perez and Manuel Baerenz, 2016
+-- License    : BSD3
+-- Maintainer : ivan.perez@keera.co.uk
 --
+-- 'MSF's with a 'Writer' monadic layer.
+--
 -- This module contains functions to work with 'MSF's that include a 'Writer'
 -- monadic layer. This includes functions to create new 'MSF's that include an
 -- additional layer, and functions to flatten that layer out of the 'MSF`'s
@@ -17,9 +22,8 @@
   ) where
 
 -- External
-import Control.Monad.Trans.Writer.Strict
-  hiding (liftCallCC, liftCatch, pass) -- Avoid conflicting exports
-import Data.Functor ((<$>))
+import Control.Monad.Trans.Writer.Strict hiding (liftCallCC, liftCatch, pass)
+import Data.Functor                      ((<$>))
 import Data.Monoid
 
 -- Internal
diff --git a/src/Data/MonadicStreamFunction.hs b/src/Data/MonadicStreamFunction.hs
--- a/src/Data/MonadicStreamFunction.hs
+++ b/src/Data/MonadicStreamFunction.hs
@@ -1,41 +1,45 @@
--- | Monadic Stream Functions are synchronized stream functions
---   with side effects.
+-- |
+-- Copyright  : (c) Ivan Perez and Manuel Baerenz, 2016
+-- License    : BSD3
+-- Maintainer : ivan.perez@keera.co.uk
 --
---   'MSF's are defined by a function
---   @unMSF :: MSF m a b -> a -> m (b, MSF m a b)@
---   that executes one step of a simulation, and produces an output in a
---   monadic context, and a continuation to be used for future steps.
+-- Monadic Stream Functions are synchronized stream functions with side
+-- effects.
 --
---   See the module "Data.MonadicStreamFunction.Core" for details.
+-- 'MSF's are defined by a function
+-- @unMSF :: MSF m a b -> a -> m (b, MSF m a b)@
+-- that executes one step of a simulation, and produces an output in a monadic
+-- context, and a continuation to be used for future steps.
 --
---   'MSF's are a generalisation of the implementation mechanism used by Yampa,
---   Wormholes and other FRP and reactive implementations.
+-- See the module "Data.MonadicStreamFunction.Core" for details.
 --
---   When combined with different monads, they produce interesting effects. For
---   example, when combined with the 'Maybe' monad, they become transformations
---   that may stop producing outputs (and continuations). The 'Either' monad
---   gives rise to 'MSF's that end with a result (akin to Tasks in Yampa, and
---   Monadic FRP).
+-- 'MSF's are a generalisation of the implementation mechanism used by Yampa,
+-- Wormholes and other FRP and reactive implementations.
 --
---   Flattening, that is, going from some structure @MSF (t m) a b@ to @MSF m a b@
---   for a specific transformer @t@ often gives rise to known FRP constructs.
---   For instance, flattening with 'EitherT' gives rise to switching, and
---   flattening with 'ListT' gives rise to parallelism with broadcasting.
+-- When combined with different monads, they produce interesting effects. For
+-- example, when combined with the 'Maybe' monad, they become transformations
+-- that may stop producing outputs (and continuations). The 'Either' monad
+-- gives rise to 'MSF's that end with a result (akin to Tasks in Yampa, and
+-- Monadic FRP).
 --
---   'MSF's can be used to implement many FRP variants, including Arrowized FRP,
---   Classic FRP, and plain reactive programming. Arrowized and applicative
---   syntax are both supported.
+-- Flattening, that is, going from some structure @MSF (t m) a b@ to @MSF m a
+-- b@ for a specific transformer @t@ often gives rise to known FRP constructs.
+-- For instance, flattening with 'EitherT' gives rise to switching, and
+-- flattening with 'ListT' gives rise to parallelism with broadcasting.
 --
---   For a very detailed introduction to 'MSF's, see:
---   <http://dl.acm.org/citation.cfm?id=2976010>
---   (mirror: <http://www.cs.nott.ac.uk/~psxip1/#FRPRefactored>).
+-- 'MSF's can be used to implement many FRP variants, including Arrowized FRP,
+-- Classic FRP, and plain reactive programming. Arrowized and applicative
+-- syntax are both supported.
 --
---   Apart from the modules exported, this module exports instances from:
+-- For a very detailed introduction to 'MSF's, see:
+-- <http://dl.acm.org/citation.cfm?id=2976010>
+-- (mirror: <http://www.cs.nott.ac.uk/~psxip1/#FRPRefactored>).
 --
---   - "Data.MonadicStreamFunction.Instances.ArrowChoice"
---   - "Data.MonadicStreamFunction.Instances.ArrowLoop"
---   - "Data.MonadicStreamFunction.Instances.ArrowPlus"
-
+-- Apart from the modules exported, this module exports instances from:
+--
+-- - "Data.MonadicStreamFunction.Instances.ArrowChoice"
+-- - "Data.MonadicStreamFunction.Instances.ArrowLoop"
+-- - "Data.MonadicStreamFunction.Instances.ArrowPlus"
 module Data.MonadicStreamFunction
   ( module Control.Arrow
   , module Data.MonadicStreamFunction.Core
@@ -44,16 +48,13 @@
  where
 
 -- External
-
 import Control.Arrow
 
 -- Internal
-
 import Data.MonadicStreamFunction.Core
 import Data.MonadicStreamFunction.Util
 
 -- Internal (Instances)
-
 import Data.MonadicStreamFunction.Instances.ArrowChoice ()
 import Data.MonadicStreamFunction.Instances.ArrowLoop   ()
 import Data.MonadicStreamFunction.Instances.ArrowPlus   ()
diff --git a/src/Data/MonadicStreamFunction/Async.hs b/src/Data/MonadicStreamFunction/Async.hs
--- a/src/Data/MonadicStreamFunction/Async.hs
+++ b/src/Data/MonadicStreamFunction/Async.hs
@@ -1,59 +1,62 @@
--- | This module contains operations on monadic streams that are asynchronous,
---   i.e. that change the speed at which data enters or leaves the 'MSF'.
-
+-- |
+-- Copyright  : (c) Ivan Perez and Manuel Baerenz, 2016
+-- License    : BSD3
+-- Maintainer : ivan.perez@keera.co.uk
+--
+-- This module contains operations on monadic streams that are asynchronous,
+-- i.e. that change the speed at which data enters or leaves the 'MSF'.
 module Data.MonadicStreamFunction.Async where
 
 -- Internal
 import Data.MonadicStreamFunction.Core
 import Data.MonadicStreamFunction.InternalCore
-import Data.MonadicStreamFunction.Util (MStream)
-
-{- |
-Concatenates a monadic stream of lists to a monadic stream.
-The stream of lists will be called exactly when new data is needed.
-
-Example:
-
->>> let intstream = constS $ putStrLn "Enter a list of Ints:" >> readLn :: MStream IO [Int]
->>> reactimate $ concatS intstream >>> arrM print
-Enter a list of Ints:
-[1,2,33]
-1
-2
-33
-Enter a list of Ints:
-[]
-Enter a list of Ints:
-[]
-Enter a list of Ints:
-[1,2]
-1
-2
-Enter a list of Ints:
-...
-
-Beware that @concatS msf@ becomes unproductive when @msf@ starts outputting empty lists forever.
-This is ok:
-
->>> let boolToList b = if b then ["Yes"] else []
->>> let everyOddEmpty = count >>> arr (even >>> boolToList)
->>> reactimate $ concatS everyOddEmpty >>> arrM print
-"Yes"
-"Yes"
-"Yes"
-"Yes"
-"Yes"
-...
-
-But this will be caught in a loop:
+import Data.MonadicStreamFunction.Util         (MStream)
 
->>> let after3Empty = count >>> arr ((<= 3) >>> boolToList)
->>> reactimate $ concatS after3Empty  >>> arrM print
-"Yes"
-"Yes"
-"Yes"
-^CInterrupted.
--}
+-- |
+-- Concatenates a monadic stream of lists to a monadic stream.
+-- The stream of lists will be called exactly when new data is needed.
+--
+-- Example:
+--
+-- >>> let intstream = constS $ putStrLn "Enter a list of Ints:" >> readLn :: MStream IO [Int]
+-- >>> reactimate $ concatS intstream >>> arrM print
+-- Enter a list of Ints:
+-- [1,2,33]
+-- 1
+-- 2
+-- 33
+-- Enter a list of Ints:
+-- []
+-- Enter a list of Ints:
+-- []
+-- Enter a list of Ints:
+-- [1,2]
+-- 1
+-- 2
+-- Enter a list of Ints:
+-- ...
+--
+-- Beware that @concatS msf@ becomes unproductive when @msf@ starts outputting empty lists forever.
+-- This is ok:
+--
+-- >>> let boolToList b = if b then ["Yes"] else []
+-- >>> let everyOddEmpty = count >>> arr (even >>> boolToList)
+-- >>> reactimate $ concatS everyOddEmpty >>> arrM print
+-- "Yes"
+-- "Yes"
+-- "Yes"
+-- "Yes"
+-- "Yes"
+-- ...
+--
+-- But this will be caught in a loop:
+--
+-- >>> let after3Empty = count >>> arr ((<= 3) >>> boolToList)
+-- >>> reactimate $ concatS after3Empty  >>> arrM print
+-- "Yes"
+-- "Yes"
+-- "Yes"
+-- ^CInterrupted.
 concatS :: Monad m => MStream m [b] -> MStream m b
 concatS msf = MSF $ \_ -> tick msf []
   where
diff --git a/src/Data/MonadicStreamFunction/Core.hs b/src/Data/MonadicStreamFunction/Core.hs
--- a/src/Data/MonadicStreamFunction/Core.hs
+++ b/src/Data/MonadicStreamFunction/Core.hs
@@ -1,33 +1,38 @@
 {-# LANGUAGE Rank2Types #-}
--- | Monadic Stream Functions are synchronized stream functions
---   with side effects.
+-- |
+-- Copyright  : (c) Ivan Perez and Manuel Baerenz, 2016
+-- License    : BSD3
+-- Maintainer : ivan.perez@keera.co.uk
 --
---   'MSF's are defined by a function
---   @unMSF :: MSF m a b -> a -> m (b, MSF m a b)@
---   that executes one step of a simulation, and produces an output in a
---   monadic context, and a continuation to be used for future steps.
+-- Monadic Stream Functions are synchronized stream functions with side
+-- effects.
 --
---   'MSF's are a generalisation of the implementation mechanism used by Yampa,
---   Wormholes and other FRP and reactive implementations.
+-- 'MSF's are defined by a function
+-- @unMSF :: MSF m a b -> a -> m (b, MSF m a b)@
+-- that executes one step of a simulation, and produces an output in a monadic
+-- context, and a continuation to be used for future steps.
 --
---   When combined with different monads, they produce interesting effects. For
---   example, when combined with the 'Maybe' monad, they become transformations
---   that may stop producing outputs (and continuations). The 'Either' monad
---   gives rise to 'MSF's that end with a result (akin to Tasks in Yampa, and
---   Monadic FRP).
+-- 'MSF's are a generalisation of the implementation mechanism used by Yampa,
+-- Wormholes and other FRP and reactive implementations.
 --
---   Flattening, that is, going from some structure @MSF (t m) a b@ to @MSF m a b@
---   for a specific transformer @t@ often gives rise to known FRP constructs.
---   For instance, flattening with 'EitherT' gives rise to switching, and
---   flattening with 'ListT' gives rise to parallelism with broadcasting.
+-- When combined with different monads, they produce interesting effects. For
+-- example, when combined with the 'Maybe' monad, they become transformations
+-- that may stop producing outputs (and continuations). The 'Either' monad
+-- gives rise to 'MSF's that end with a result (akin to Tasks in Yampa, and
+-- Monadic FRP).
 --
---   'MSF's can be used to implement many FRP variants, including Arrowized FRP,
---   Classic FRP, and plain reactive programming. Arrowized and applicative
---   syntax are both supported.
+-- Flattening, that is, going from some structure @MSF (t m) a b@ to @MSF m a b@
+-- for a specific transformer @t@ often gives rise to known FRP constructs.
+-- For instance, flattening with 'EitherT' gives rise to switching, and
+-- flattening with 'ListT' gives rise to parallelism with broadcasting.
 --
---   For a very detailed introduction to 'MSF's, see:
---   <http://dl.acm.org/citation.cfm?id=2976010>
---   (mirror: <http://www.cs.nott.ac.uk/~psxip1/#FRPRefactored>).
+-- 'MSF's can be used to implement many FRP variants, including Arrowized FRP,
+-- Classic FRP, and plain reactive programming. Arrowized and applicative
+-- syntax are both supported.
+--
+-- For a very detailed introduction to 'MSF's, see:
+-- <http://dl.acm.org/citation.cfm?id=2976010>
+-- (mirror: <http://www.cs.nott.ac.uk/~psxip1/#FRPRefactored>).
 module Data.MonadicStreamFunction.Core
   ( -- * Types
     MSF
@@ -57,13 +62,13 @@
 
 import Control.Applicative
 import Control.Arrow
-import Control.Category as C
+import Control.Category          as C
 import Control.Monad.Base
 import Control.Monad.Trans.Class
-import Data.Tuple (swap)
-import Prelude hiding ((.), id, sum)
+import Data.Tuple                (swap)
+import Prelude                   hiding (id, sum, (.))
 
-import Data.MonadicStreamFunction.InternalCore (MSF, morphGS, feedback, reactimate, embed)
+import Data.MonadicStreamFunction.InternalCore (MSF, embed, feedback, morphGS, reactimate)
 
 -- * Definitions
 
diff --git a/src/Data/MonadicStreamFunction/Instances/ArrowChoice.hs b/src/Data/MonadicStreamFunction/Instances/ArrowChoice.hs
--- a/src/Data/MonadicStreamFunction/Instances/ArrowChoice.hs
+++ b/src/Data/MonadicStreamFunction/Instances/ArrowChoice.hs
@@ -1,8 +1,13 @@
-{-# LANGUAGE InstanceSigs         #-}
+{-# LANGUAGE InstanceSigs #-}
 {-# OPTIONS_GHC -fno-warn-orphans #-}
--- | Instance of 'ArrowChoice' for Monadic Stream Functions ('MSF').
+-- |
+-- Copyright  : (c) Ivan Perez and Manuel Baerenz, 2016
+-- License    : BSD3
+-- Maintainer : ivan.perez@keera.co.uk
 --
---   Import this module to include that (orphan) instance.
+-- Instance of 'ArrowChoice' for Monadic Stream Functions ('MSF').
+--
+-- Import this module to include that (orphan) instance.
 module Data.MonadicStreamFunction.Instances.ArrowChoice where
 
 import Control.Arrow
diff --git a/src/Data/MonadicStreamFunction/Instances/ArrowLoop.hs b/src/Data/MonadicStreamFunction/Instances/ArrowLoop.hs
--- a/src/Data/MonadicStreamFunction/Instances/ArrowLoop.hs
+++ b/src/Data/MonadicStreamFunction/Instances/ArrowLoop.hs
@@ -1,19 +1,24 @@
-{-# LANGUAGE InstanceSigs         #-}
-{-# LANGUAGE RecursiveDo          #-}
+{-# LANGUAGE InstanceSigs #-}
+{-# LANGUAGE RecursiveDo  #-}
 {-# OPTIONS_GHC -fno-warn-orphans #-}
--- | Instance of 'ArrowLoop' for Monadic Stream Functions ('MSF').
+-- |
+-- Copyright  : (c) Ivan Perez and Manuel Baerenz, 2016
+-- License    : BSD3
+-- Maintainer : ivan.perez@keera.co.uk
 --
---   Import this module to include that (orphan) instance.
+-- Instance of 'ArrowLoop' for Monadic Stream Functions ('MSF').
 --
---   This is only defined for monads that are instances of 'MonadFix'.
+-- Import this module to include that (orphan) instance.
+--
+-- This is only defined for monads that are instances of 'MonadFix'.
 module Data.MonadicStreamFunction.Instances.ArrowLoop where
 
-import Data.MonadicStreamFunction.Core
-import Data.MonadicStreamFunction.InternalCore
-
 -- External
 import Control.Arrow
 import Control.Monad.Fix
+
+import Data.MonadicStreamFunction.Core
+import Data.MonadicStreamFunction.InternalCore
 
 -- | 'ArrowLoop' instance for MSFs. The monad must be an instance of
 -- 'MonadFix'.
diff --git a/src/Data/MonadicStreamFunction/Instances/ArrowPlus.hs b/src/Data/MonadicStreamFunction/Instances/ArrowPlus.hs
--- a/src/Data/MonadicStreamFunction/Instances/ArrowPlus.hs
+++ b/src/Data/MonadicStreamFunction/Instances/ArrowPlus.hs
@@ -1,15 +1,20 @@
 {-# OPTIONS_GHC -fno-warn-orphans #-}
--- | Instance of 'ArrowPlus' for Monadic Stream Functions ('MSF').
+-- |
+-- Copyright  : (c) Ivan Perez and Manuel Baerenz, 2016
+-- License    : BSD3
+-- Maintainer : ivan.perez@keera.co.uk
 --
---   Import this module to include that (orphan) instance.
+-- Instance of 'ArrowPlus' for Monadic Stream Functions ('MSF').
 --
---   This is only defined for monads that are instances of 'MonadPlus'.
+-- Import this module to include that (orphan) instance.
+--
+-- This is only defined for monads that are instances of 'MonadPlus'.
 module Data.MonadicStreamFunction.Instances.ArrowPlus where
 
 -- base
+import Control.Applicative
 import Control.Arrow
 import Control.Monad
-import Control.Applicative
 
 -- dunai
 import Data.MonadicStreamFunction.Core
diff --git a/src/Data/MonadicStreamFunction/Instances/Num.hs b/src/Data/MonadicStreamFunction/Instances/Num.hs
--- a/src/Data/MonadicStreamFunction/Instances/Num.hs
+++ b/src/Data/MonadicStreamFunction/Instances/Num.hs
@@ -1,10 +1,14 @@
-{-# LANGUAGE TypeFamilies         #-}
+{-# LANGUAGE TypeFamilies #-}
 {-# OPTIONS_GHC -fno-warn-orphans #-}
-
--- | Number instances for 'MSF's that produce numbers. This allows you to use
---   numeric operators with 'MSF's that output numbers, for example,
---   you can write:
+-- |
+-- Copyright  : (c) Ivan Perez and Manuel Baerenz, 2016
+-- License    : BSD3
+-- Maintainer : ivan.perez@keera.co.uk
 --
+-- Number instances for 'MSF's that produce numbers. This allows you to use
+-- numeric operators with 'MSF's that output numbers, for example, you can
+-- write:
+--
 -- @
 -- msf1 :: MSF Input Double -- defined however you want
 -- msf2 :: MSF Input Double -- defined however you want
@@ -20,7 +24,6 @@
 --
 -- Instances are provided for the type classes 'Num', 'Fractional'
 -- and 'Floating'.
-
 module Data.MonadicStreamFunction.Instances.Num where
 
 import Control.Arrow.Util
diff --git a/src/Data/MonadicStreamFunction/Instances/VectorSpace.hs b/src/Data/MonadicStreamFunction/Instances/VectorSpace.hs
--- a/src/Data/MonadicStreamFunction/Instances/VectorSpace.hs
+++ b/src/Data/MonadicStreamFunction/Instances/VectorSpace.hs
@@ -2,8 +2,13 @@
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE TypeFamilies          #-}
 {-# LANGUAGE UndecidableInstances  #-}
-{-# OPTIONS_GHC -fno-warn-orphans  #-}
--- | 'VectorSpace' instances for 'MSF's that produce vector spaces. This allows
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+-- |
+-- Copyright  : (c) Ivan Perez and Manuel Baerenz, 2016
+-- License    : BSD3
+-- Maintainer : ivan.perez@keera.co.uk
+--
+-- 'VectorSpace' instances for 'MSF's that produce vector spaces. This allows
 -- you to use vector operators with 'MSF's that output vectors, for example, you
 -- can write:
 --
@@ -31,9 +36,11 @@
 module Data.MonadicStreamFunction.Instances.VectorSpace where
 
 import Control.Arrow
+import Data.VectorSpace
+
 import Control.Arrow.Util
+
 import Data.MonadicStreamFunction.Core
-import Data.VectorSpace
 
 -- | Vector-space instance for 'MSF's.
 instance (Monad m, VectorSpace v s) => VectorSpace (MSF m a v) s where
diff --git a/src/Data/MonadicStreamFunction/InternalCore.hs b/src/Data/MonadicStreamFunction/InternalCore.hs
--- a/src/Data/MonadicStreamFunction/InternalCore.hs
+++ b/src/Data/MonadicStreamFunction/InternalCore.hs
@@ -1,19 +1,24 @@
 {-# LANGUAGE ExplicitForAll #-}
 {-# LANGUAGE Rank2Types     #-}
--- | Monadic Stream Functions are synchronized stream functions
---   with side effects.
+-- |
+-- Copyright  : (c) Ivan Perez and Manuel Baerenz, 2016
+-- License    : BSD3
+-- Maintainer : ivan.perez@keera.co.uk
 --
---   'MSF's are defined by a function
---   @unMSF :: MSF m a b -> a -> m (b, MSF m a b)@
---   that executes one step of a simulation, and produces an output in a
---   monadic context, and a continuation to be used for future steps.
+-- Monadic Stream Functions are synchronized stream functions with side
+-- effects.
 --
---   'MSF's are a generalisation of the implementation mechanism used by Yampa,
---   Wormholes and other FRP and reactive implementations.
+-- 'MSF's are defined by a function
+-- @unMSF :: MSF m a b -> a -> m (b, MSF m a b)@
+-- that executes one step of a simulation, and produces an output in a monadic
+-- context, and a continuation to be used for future steps.
 --
---   This modules defines only the minimal core. Hopefully, other functions can be
---   defined in terms of the functions in this module without accessing the
---   MSF constuctor.
+-- 'MSF's are a generalisation of the implementation mechanism used by Yampa,
+-- Wormholes and other FRP and reactive implementations.
+--
+-- This modules defines only the minimal core. Hopefully, other functions can
+-- be defined in terms of the functions in this module without accessing the
+-- MSF constuctor.
 
 
 -- NOTE TO IMPLEMENTORS:
@@ -36,17 +41,16 @@
 -- having orphan instances'), the main module Data.MonadicStreamFunction
 -- exports everything. Users should *never* import this module here
 -- individually, but the main module instead.
-
 module Data.MonadicStreamFunction.InternalCore where
 
 -- External
-import Control.Arrow
 import Control.Applicative
-import Control.Category (Category(..))
+import Control.Arrow
+import Control.Category          (Category (..))
 import Control.Monad
 import Control.Monad.Base
 import Control.Monad.Trans.Class
-import Prelude hiding ((.), id, sum)
+import Prelude                   hiding (id, sum, (.))
 
 -- * Definitions
 
diff --git a/src/Data/MonadicStreamFunction/Parallel.hs b/src/Data/MonadicStreamFunction/Parallel.hs
--- a/src/Data/MonadicStreamFunction/Parallel.hs
+++ b/src/Data/MonadicStreamFunction/Parallel.hs
@@ -1,4 +1,9 @@
--- | Versions of arrow combinators that run things in parallel using 'par', if
+-- |
+-- Copyright  : (c) Ivan Perez and Manuel Baerenz, 2016
+-- License    : BSD3
+-- Maintainer : ivan.perez@keera.co.uk
+--
+-- Versions of arrow combinators that run things in parallel using 'par', if
 -- possible.
 module Data.MonadicStreamFunction.Parallel where
 
diff --git a/src/Data/MonadicStreamFunction/ReactHandle.hs b/src/Data/MonadicStreamFunction/ReactHandle.hs
--- a/src/Data/MonadicStreamFunction/ReactHandle.hs
+++ b/src/Data/MonadicStreamFunction/ReactHandle.hs
@@ -1,9 +1,13 @@
--- | 'ReactHandle's.
+-- |
+-- Copyright  : (c) Ivan Perez and Manuel Baerenz, 2016
+-- License    : BSD3
+-- Maintainer : ivan.perez@keera.co.uk
 --
+-- 'ReactHandle's.
+--
 -- Sometimes it is beneficial to give control to an external main loop,
 -- for example OpenGL or a hardware-clocked audio server like JACK.
 -- This module makes Dunai compatible with external main loops.
-
 module Data.MonadicStreamFunction.ReactHandle where
 
 -- External
@@ -13,7 +17,6 @@
 -- Internal
 import Data.MonadicStreamFunction
 import Data.MonadicStreamFunction.InternalCore
-
 
 -- | A storage for the current state of an 'MSF'.
 -- The 'MSF' may not require input or produce output data,
diff --git a/src/Data/MonadicStreamFunction/Util.hs b/src/Data/MonadicStreamFunction/Util.hs
--- a/src/Data/MonadicStreamFunction/Util.hs
+++ b/src/Data/MonadicStreamFunction/Util.hs
@@ -1,6 +1,11 @@
 {-# LANGUAGE Arrows     #-}
 {-# LANGUAGE Rank2Types #-}
--- | Useful auxiliary functions and definitions.
+-- |
+-- Copyright  : (c) Ivan Perez and Manuel Baerenz, 2016
+-- License    : BSD3
+-- Maintainer : ivan.perez@keera.co.uk
+--
+-- Useful auxiliary functions and definitions.
 module Data.MonadicStreamFunction.Util where
 
 -- External
@@ -9,14 +14,13 @@
 import Control.Monad
 import Control.Monad.Base
 import Data.Monoid
+import Data.VectorSpace
+import Prelude            hiding (id, (.))
 
 -- Internal
+import Control.Monad.Trans.MSF.State
 import Data.MonadicStreamFunction.Core
 import Data.MonadicStreamFunction.Instances.ArrowChoice ()
-import Data.VectorSpace
-import Prelude hiding (id, (.))
-
-import Control.Monad.Trans.MSF.State
 
 -- * Streams and sinks
 
