diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,30 @@
+### [v0.6.0](https://github.com/kaoskorobase/hsc3-server/tree/v0.6.0)
+
+* Add `Control.Failure.Failure` instance to `Sound.SC3.Server.State.Monad.Server`
+* Add `hostname` parameter to `Sound.SC3.Server.State.Monad.Process.withTransport`
+
+### [v0.5.0](https://github.com/kaoskorobase/hsc3-server/tree/v0.5.0)
+
+* Use distinct types for audio and control buses and IDs
+* Factor monad type classes into `Sound.SC3.Server.Monad.Class`
+* Remove `Sound.SC3.Server.Monad.capture` combinator
+* Upgrade to `hosc` 0.13 and `hsc3` 0.13
+* Move `Sound.SC3.Server.Monad` hierarchy to `Sound.SC3.Server.State.Monad` to avoid a clash with `hsc3`
+* Rename `Sound.SC3.Server.Monad.Send` to `Sound.SC3.Server.State.Monad.Request` and refactor interface and semantics
+* Export `withTransport` from `Sound.SC3.Server.State.Monad.Process`
+
+### v0.4.0
+
+* Move allocation interface to `Sound.SC3.Server.Monad` and add monad control
+  instances: Remove allocation interface from `Sound.SC3.Server.Connection` and
+  move it to `Sound.SC3.Server.Monad`.
+* Remove `data-accessor` dependency.
+* Add instances for `MonadBase`, `MonadBaseControl` and `MonadTransControl`,
+  allowing to lift control operations from the base monad into ServerT.
+* Implement `Sound.SC3.Server.Monad.fork` in terms of
+  `Control.Concurrent.Lifted.fork`. `fork` may be removed from the interface in
+  future versions.
+
+### [v0.3.0](https://github.com/kaoskorobase/hsc3-server/tree/v0.3.0)
+
+* Add new modules `Sound.SC3.Server.Monad.Send` and `Sound.SC3.Server.Monad.Command` providing abstractions for synchronous and asynchronous commands and completion messages
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,23 @@
+# hsc3-server [![Hackage version](https://img.shields.io/hackage/v/hsc3-server.svg?style=flat)](http://hackage.haskell.org/package/hsc3-server) [![Build Status](https://img.shields.io/travis/kaoskorobase/hsc3-server.svg?style=flat&branch=develop)](https://travis-ci.org/kaoskorobase/hsc3-server)
+
+**hsc3-server** is a Haskell library for managing [SuperCollider](http://supercollider.sourceforge.net) server resources such as node, buffer and bus ids. It also provides synchronization primitives.
+
+### Installation
+
+    cabal install hsc3-server
+
+### Documentation
+
+* [Change log](https://github.com/kaoskorobase/hsc3-server/blob/master/ChangeLog.md)
+* [API documentation](http://hackage.haskell.org/package/hsc3-server)
+* [Example scripts](https://github.com/kaoskorobase/hsc3-server/tree/master/examples)
+
+### Reporting bugs
+
+Please report bugs in our [issue tracker](https://github.com/kaoskorobase/hsc3-server/issues).
+
+### Development
+
+**hsc3-server**'s source code is hosted at [github](https://github.com/kaoskorobase/hsc3-server). You can check out a copy of the repository with the following command:
+
+    git clone git://github.com/kaoskorobase/hsc3-server.git
diff --git a/Sound/SC3/Server/Allocator/Range.hs b/Sound/SC3/Server/Allocator/Range.hs
--- a/Sound/SC3/Server/Allocator/Range.hs
+++ b/Sound/SC3/Server/Allocator/Range.hs
@@ -19,7 +19,7 @@
   , join
 ) where
 
-import Prelude hiding (last, null)
+import Prelude hiding (join, last, null)
 
 -- $setup
 -- >>> import Control.Applicative ((<$>), (<*>))
diff --git a/Sound/SC3/Server/State/Monad.hs b/Sound/SC3/Server/State/Monad.hs
--- a/Sound/SC3/Server/State/Monad.hs
+++ b/Sound/SC3/Server/State/Monad.hs
@@ -49,7 +49,7 @@
 import           Sound.OSC (Bundle(..), Datum(Int32), Message(..), Packet(..), immediately)
 import           Sound.OSC.Transport.Monad (DuplexOSC, RecvOSC(..), SendOSC(..), Transport)
 import qualified Sound.SC3.Server.Allocator as A
-import           Sound.SC3.Server.Command.Core (notify)
+import           Sound.SC3.Server.Command (notify)
 import           Sound.SC3.Server.Connection (Connection)
 import qualified Sound.SC3.Server.Connection as C
 import qualified Sound.SC3.Server.Notification as N
diff --git a/Sound/SC3/Server/State/Monad/Command.hs b/Sound/SC3/Server/State/Monad/Command.hs
--- a/Sound/SC3/Server/State/Monad/Command.hs
+++ b/Sound/SC3/Server/State/Monad/Command.hs
@@ -128,11 +128,9 @@
 import qualified Sound.SC3.Server.Allocator.Range as Range
 import qualified Sound.SC3.Server.Synthdef as Synthdef
 import           Sound.SC3.Server.Allocator (AllocFailure(..))
-import           Sound.SC3.Server.Enum (AddAction(..), ErrorScope(..), ErrorMode(..), PrintLevel(..))
-import qualified Sound.SC3.Server.Command.Core as C
-import qualified Sound.SC3.Server.Command.Completion as C
-import qualified Sound.SC3.Server.Command.Double as C
-import qualified Sound.SC3.Server.Command.Int as C
+import           Sound.SC3.Server.Enum (AddAction(..), B_Gen, ErrorScope(..), ErrorMode(..), PrintLevel(..))
+import qualified Sound.SC3.Server.Command as C
+import qualified Sound.SC3.Server.Command.Completion as CC
 import           Sound.SC3.Server.Enum (SoundFileFormat(..), SampleFormat(..))
 import qualified Sound.SC3.Server.Notification as N
 import           Sound.SC3.Server.Process.Options (ServerOptions(..))
@@ -142,7 +140,6 @@
 import           Sound.SC3.Server.State.Monad.Class (MonadIdAllocator, MonadServer, RequestOSC, serverOption)
 import           Sound.SC3.Server.State.Monad.Request (Request, Result, after_, finally, mkAsync, mkAsync_, mkSync, waitFor)
 import qualified Sound.SC3.Server.State.Monad.Request as R
-import           Sound.SC3.UGen.Enum (B_Gen)
 
 -- ====================================================================
 -- Utils
@@ -219,15 +216,15 @@
     | length name < 255 = mkAsync $ return (SynthDef name, f)
     | otherwise = error "d_recv: name too long, resulting string exceeds 255 characters"
     where
-        f osc = (mkC C.d_recv C.d_recv' osc) (Synthdef.synthdef name ugen)
+        f osc = (mkC C.d_recv CC.d_recv' osc) (Synthdef.synthdef name ugen)
 
 -- | Load a synth definition from a named file. (Asynchronous)
 d_load :: Monad m => FilePath -> Request m ()
-d_load fp = mkAsync_ $ \osc -> mkC C.d_load C.d_load' osc $ fp
+d_load fp = mkAsync_ $ \osc -> mkC C.d_load CC.d_load' osc $ fp
 
 -- | Load a directory of synth definition files. (Asynchronous)
 d_loadDir :: Monad m => FilePath -> Request m ()
-d_loadDir fp = mkAsync_ $ \osc -> mkC C.d_loadDir C.d_loadDir' osc $ fp
+d_loadDir fp = mkAsync_ $ \osc -> mkC C.d_loadDir CC.d_loadDir' osc $ fp
 
 -- | Remove definition once all nodes using it have ended.
 d_free :: Monad m => SynthDef -> Request m ()
@@ -456,14 +453,14 @@
 b_alloc :: MonadIdAllocator m => Int -> Int -> Request m Buffer
 b_alloc n c = mkAsync $ do
     bid <- M.alloc M.bufferIdAllocator
-    let f osc = (mkC C.b_alloc C.b_alloc' osc) (fromIntegral bid) n c
+    let f osc = (mkC C.b_alloc CC.b_alloc' osc) (fromIntegral bid) n c
     return (Buffer bid, f)
 
 -- | Allocate buffer space and read a sound file. (Asynchronous)
 b_allocRead :: MonadIdAllocator m => FilePath -> Maybe Int -> Maybe Int -> Request m Buffer
 b_allocRead path fileOffset numFrames = mkAsync $ do
   bid <- M.alloc M.bufferIdAllocator
-  let f osc = (mkC C.b_allocRead C.b_allocRead' osc)
+  let f osc = (mkC C.b_allocRead CC.b_allocRead' osc)
                 (fromIntegral bid) path
                 (maybe 0 id fileOffset)
                 (maybe (-1) id numFrames)
@@ -473,7 +470,7 @@
 b_allocReadChannel :: MonadIdAllocator m => FilePath -> Maybe Int -> Maybe Int -> [Int] -> Request m Buffer
 b_allocReadChannel path fileOffset numFrames channels = mkAsync $ do
   bid <- M.alloc M.bufferIdAllocator
-  let f osc = (mkC C.b_allocReadChannel C.b_allocReadChannel' osc)
+  let f osc = (mkC C.b_allocReadChannel CC.b_allocReadChannel' osc)
                 (fromIntegral bid) path
                 (maybe 0 id fileOffset)
                 (maybe (-1) id numFrames)
@@ -490,7 +487,7 @@
  -> Bool
  -> Request m ()
 b_read (Buffer bid) path fileOffset numFrames bufferOffset leaveOpen =
-  mkAsync_ $ \osc -> (mkC C.b_read C.b_read' osc)
+  mkAsync_ $ \osc -> (mkC C.b_read CC.b_read' osc)
                       (fromIntegral bid) path
                       (maybe 0 id fileOffset)
                       (maybe (-1) id numFrames)
@@ -508,7 +505,7 @@
  -> [Int]
  -> Request m ()
 b_readChannel (Buffer bid) path fileOffset numFrames bufferOffset leaveOpen channels =
-  mkAsync_ $ \osc -> (mkC C.b_readChannel C.b_readChannel' osc)
+  mkAsync_ $ \osc -> (mkC C.b_readChannel CC.b_readChannel' osc)
                       (fromIntegral bid) path
                       (maybe 0 id fileOffset)
                       (maybe (-1) id numFrames)
@@ -531,7 +528,7 @@
         fileOffset numFrames
         leaveOpen = mkAsync_ f
     where
-        f osc = (mkC C.b_write C.b_write' osc)
+        f osc = (mkC C.b_write CC.b_write' osc)
                     (fromIntegral bid) path
                     soundFileFormat
                     sampleFormat
@@ -544,13 +541,13 @@
 b_free b = mkAsync $ do
     let bid = bufferId b
     M.free M.bufferIdAllocator bid
-    let f osc = (mkC C.b_free C.b_free' osc) (fromIntegral bid)
+    let f osc = (mkC C.b_free CC.b_free' osc) (fromIntegral bid)
     return ((), f)
 
 -- | Zero sample data. (Asynchronous)
 b_zero :: MonadIO m => Buffer -> Request m ()
 b_zero buffer = mkAsync_ $ \osc ->
-  (mkC C.b_zero C.b_zero' osc)
+  (mkC C.b_zero CC.b_zero' osc)
     (fromIntegral (bufferId buffer))
 
 -- | Set sample values.
@@ -605,7 +602,8 @@
 
 -- | Close attached soundfile and write header information. (Asynchronous)
 b_close :: Monad m => Buffer -> Request m ()
-b_close buffer = mkAsync_ $ \osc -> mkC C.b_close C.b_close' osc $ fromIntegral (bufferId buffer)
+b_close buffer = mkAsync_ $ \osc ->
+  mkC C.b_close CC.b_close' osc $ fromIntegral (bufferId buffer)
 
 -- | Request 'BufferInfo'.
 b_query :: MonadIO m => Buffer -> Request m (Result N.BufferInfo)
diff --git a/hsc3-server.cabal b/hsc3-server.cabal
--- a/hsc3-server.cabal
+++ b/hsc3-server.cabal
@@ -1,5 +1,5 @@
 Name:               hsc3-server
-Version:            0.8.0
+Version:            0.9.1
 Synopsis:           SuperCollider server resource management and synchronization.
 Description:
     This library provides abstractions for managing SuperCollider server
@@ -11,14 +11,19 @@
 License:            GPL
 License-File:       LICENSE
 Category:           Sound
-Copyright:          Copyright (c) Stefan Kersten 2008-2013
+Copyright:          Copyright (c) Stefan Kersten 2008-2014
 Author:             Stefan Kersten
 Maintainer:         kaoskorobase@gmail.com
 Homepage:           https://github.com/kaoskorobase/hsc3-server
+Bug-Reports:        https://github.com/kaoskorobase/hsc3-server/issues
 Tested-With:        GHC == 7.4
 Build-Type:         Simple
 Cabal-Version:      >= 1.9.2
 
+Extra-Source-Files:
+  CHANGELOG.md
+  README.md
+
 Flag build-examples
     Description:    Build example programs
     Default:        False
@@ -50,7 +55,7 @@
       , failure >= 0.2
       , hashtables >= 1.0
       , hosc >= 0.14
-      , hsc3 >= 0.14
+      , hsc3 >= 0.15
       , hsc3-process == 0.10.*
       , lifted-base >= 0.1
       , ListZipper
diff --git a/tests/Sound/SC3/Server/Allocator/Range/Test.hs b/tests/Sound/SC3/Server/Allocator/Range/Test.hs
--- a/tests/Sound/SC3/Server/Allocator/Range/Test.hs
+++ b/tests/Sound/SC3/Server/Allocator/Range/Test.hs
@@ -10,7 +10,7 @@
 import Control.Applicative ((<$>), (<*>))
 import Test.Framework (Test, testGroup)
 import Test.Framework.Providers.QuickCheck2 (testProperty)
-import Test.QuickCheck (Arbitrary(..), NonNegative)
+import Test.QuickCheck (Arbitrary(..), NonNegative, getNonNegative)
 
 instance (Integral i, Arbitrary i) => Arbitrary (Range i) where
     arbitrary = sized <$> ((`mod`10000) <$> arbitrary) <*> arbitrary
@@ -20,11 +20,12 @@
     [ testGroup "Sound.SC3.Server.Allocator.Range"
         [ testProperty "bounds" $ \(r :: Range Int) -> begin r <= end r
         , testProperty "split" $ \(n :: NonNegative Int) (r :: Range Int) ->
-            let n' = fromIntegral n
+            let n' = getNonNegative n
                 (r1, r2) = split n' r in
             if n' > size r
                 then r1 == r && null r2
                 else size r1 == n' && size r2 == (size r - n')
-        , testProperty "split/join" $ \(n :: Int) (r :: Range Int) -> uncurry join (split n r) == r
+        , testProperty "split/join" $ \(n :: Int) (r :: Range Int) ->
+            uncurry join (split n r) == r
         ]
     ]
