diff --git a/avers-api.cabal b/avers-api.cabal
--- a/avers-api.cabal
+++ b/avers-api.cabal
@@ -1,42 +1,41 @@
-name:                avers-api
-version:             0.0.5
-synopsis:            Types describing the core and extended Avers APIs
-description:         See README
-homepage:            http://github.com/wereHamster/avers-api
-license:             MIT
-license-file:        LICENSE
-author:              Tomas Carnecky
-maintainer:          tomas.carnecky@gmail.com
-copyright:           2016 Tomas Carnecky
-category:            Avers
-build-type:          Simple
-cabal-version:       >=1.10
+name: avers-api
+version: 0.0.17.0
+cabal-version: >=1.10
+build-type: Simple
+license: MIT
+license-file: LICENSE
+copyright: 2016 Tomas Carnecky
+maintainer: tomas.carnecky@gmail.com
+homepage: http://github.com/wereHamster/avers-api
+synopsis: Types describing the core and extended Avers APIs
+description:
+    See README
+category: Avers
+author: Tomas Carnecky
 
 source-repository head
-  type:     git
-  location: https://github.com/wereHamster/avers-api
+    type: git
+    location: https://github.com/wereHamster/avers-api
 
 library
-  default-language:    Haskell2010
-  hs-source-dirs:      src
-  ghc-options:         -Wall
-
-  exposed-modules:
-     Avers.API
-
-  other-modules:
-     Avers.API.Types
-   , Avers.API.Instances
-   , Avers.API.Credentials
+    exposed-modules:
+        Avers.API
+    build-depends:
+        base >=4.7 && <5,
+        aeson >=1.0.2.0 && <1.1,
+        avers -any,
+        bytestring >=0.10.8.1 && <0.11,
+        cookie >=0.4.2.1 && <0.5,
+        http-api-data >=0.3.2 && <0.4,
+        servant >=0.9.0.1 && <0.10,
+        text >=1.2.2.1 && <1.3,
+        time >=1.6.0.1 && <1.7,
+        vector >=0.11.0.0 && <0.12
+    default-language: Haskell2010
+    hs-source-dirs: src
+    other-modules:
+        Avers.API.Types
+        Avers.API.Instances
+        Avers.API.Credentials
+    ghc-options: -Wall
 
-  build-depends:
-     base >= 4.7 && < 5
-   , aeson
-   , avers
-   , bytestring
-   , cookie
-   , http-api-data
-   , servant
-   , text
-   , time
-   , vector
diff --git a/src/Avers/API.hs b/src/Avers/API.hs
--- a/src/Avers/API.hs
+++ b/src/Avers/API.hs
@@ -4,8 +4,27 @@
 {-# LANGUAGE TypeOperators #-}
 
 module Avers.API
-    ( AversCoreAPI, AversSessionAPI, AversBlobAPI, AversAccountAPI
+    ( AversAPI
 
+    , CreateObject
+    , LookupObject
+    , PatchObject
+    , DeleteObject
+    , LookupPatch
+    , ObjectChanges
+    , CreateRelease
+    , LookupRelease
+    , LookupLatestRelease
+    , Feed
+    , ChangeSecret
+    , CreateSession
+    , LookupSession
+    , DeleteSession
+    , UploadBlob
+    , LookupBlob
+    , LookupBlobContent
+    , Signup
+
     , CacheValidationToken, Cacheable
 
     , module Avers.API.Types
@@ -14,7 +33,6 @@
 
 
 import Data.Text            (Text)
-import Data.ByteString      (ByteString)
 
 import Avers.Types          (ObjId, RevId, BlobId, SessionId)
 
@@ -38,6 +56,7 @@
 --
 --  <path> including any captured components
 --  <credentials>
+--  <headers>
 --  <cache validation token>
 --  <request body>
 --  <method and response>
@@ -57,150 +76,133 @@
 
 
 --------------------------------------------------------------------------------
--- | The Core API to manipulate objects, patches, releases etc.
+-- | The complete Avers API
 
-type AversCoreAPI
 
-  ------------------------------------------------------------------------------
-  -- CreateObject
-  = "objects"
+type CreateObject
+    = "objects"
     :> Credentials
     :> ReqBody '[JSON] CreateObjectBody
     :> Post '[JSON] CreateObjectResponse
 
-  ------------------------------------------------------------------------------
-  -- LookupObject
-  :<|> "objects" :> Capture "objId" ObjId
+type LookupObject
+    = "objects" :> Capture "objId" ObjId
     :> Credentials
     :> CacheValidationToken
     :> Get '[JSON] (Cacheable LookupObjectResponse)
 
-  ------------------------------------------------------------------------------
-  -- PatchObject
-  :<|> "objects" :> Capture "objId" ObjId
+type PatchObject
+    = "objects" :> Capture "objId" ObjId
     :> Credentials
     :> ReqBody '[JSON] PatchObjectBody
     :> Patch '[JSON] PatchObjectResponse
 
-  ------------------------------------------------------------------------------
-  -- DeleteObject
-  :<|> "objects" :> Capture "objId" ObjId
+type DeleteObject
+    = "objects" :> Capture "objId" ObjId
     :> Credentials
     :> Delete '[JSON] ()
 
-  ------------------------------------------------------------------------------
-  -- LookupPatch
-  :<|> "objects" :> Capture "objId" ObjId :> "patches" :> Capture "revId" RevId
+type LookupPatch
+    = "objects" :> Capture "objId" ObjId :> "patches" :> Capture "revId" RevId
     :> Credentials
     :> CacheValidationToken
     :> Get '[JSON] (Cacheable LookupPatchResponse)
 
-  ------------------------------------------------------------------------------
-  -- ObjectChanges
-  :<|> "objects" :> Capture "objId" ObjId :> "changes"
+type ObjectChanges
+    = "objects" :> Capture "objId" ObjId :> "changes"
     :> Credentials
     :> Raw -- WebSocket, stream of ObjectChangeNotification
 
-  ------------------------------------------------------------------------------
-  -- CreateRelease
-  :<|> "objects" :> Capture "objId" ObjId :> "releases"
+type CreateRelease
+    = "objects" :> Capture "objId" ObjId :> "releases"
     :> Credentials
     :> ReqBody '[JSON] CreateReleaseBody
     :> Post '[JSON] CreateReleaseResponse
 
-  ------------------------------------------------------------------------------
-  -- LookupRelease
-  :<|> "objects" :> Capture "objId" ObjId :> "releases" :> Capture "revId" RevId
+type LookupRelease
+    = "objects" :> Capture "objId" ObjId :> "releases" :> Capture "revId" RevId
     :> Credentials
     :> CacheValidationToken
     :> Get '[JSON] (Cacheable LookupReleaseResponse)
 
-  ------------------------------------------------------------------------------
-  -- LookupLatestRelease
-  :<|> "objects" :> Capture "objId" ObjId :> "releases" :> "_latest"
+type LookupLatestRelease
+    = "objects" :> Capture "objId" ObjId :> "releases" :> "_latest"
     :> Credentials
     :> CacheValidationToken
     :> Get '[JSON] (Cacheable LookupLatestReleaseResponse)
 
-  ------------------------------------------------------------------------------
-  -- Feed
-  :<|> "feed"
+type Feed
+    = "feed"
     :> Credentials
     :> Raw -- WebSocket, stream of 'Change' objects
 
-  ------------------------------------------------------------------------------
-  -- ChangeSecret
-  :<|> "secret"
+type ChangeSecret
+    = "secret"
     :> Credentials
     :> ReqBody '[JSON] ChangeSecretBody
-    :> Post '[] ()
-
-
-
---------------------------------------------------------------------------------
--- | API to create and maintain sessions. Also contains API to
--- change the secret, which is part of the session code.
-
-type AversSessionAPI
+    :> Post '[JSON] ()
 
-  ------------------------------------------------------------------------------
-  -- CreateSession
-  = "session"
+type CreateSession
+    = "session"
     :> ReqBody '[JSON] CreateSessionBody
     :> Post '[JSON] (Headers '[Header "Set-Cookie" SetCookie] CreateSessionResponse)
 
-  ------------------------------------------------------------------------------
-  -- LookupSession
-  :<|> "session"
+type LookupSession
+    = "session"
     :> SessionId
     :> Get '[JSON] (Headers '[Header "Set-Cookie" SetCookie] LookupSessionResponse)
 
-  ------------------------------------------------------------------------------
-  -- DeleteSession
-  :<|> "session"
+type DeleteSession
+    = "session"
     :> SessionId
     :> Delete '[JSON] (Headers '[Header "Set-Cookie" SetCookie] ())
 
-
-
---------------------------------------------------------------------------------
--- | API to manange blobs
-
-type AversBlobAPI
-
-  ------------------------------------------------------------------------------
-  -- UploadBlob
-  = "blobs"
+type UploadBlob
+    = "blobs"
+    :> Credentials
     :> Header "Content-Type" Text
-    :> ReqBody '[OctetStream] ByteString
+    :> ReqBody '[OctetStream] BlobContent
     :> Post '[JSON] UploadBlobResponse
 
-  ------------------------------------------------------------------------------
-  -- LookupBlob
-  :<|> "blobs" :> Capture "blobId" BlobId
+type LookupBlob
+    = "blobs" :> Capture "blobId" BlobId
+    :> Credentials
     :> Get '[JSON] LookupBlobResponse
 
-  ------------------------------------------------------------------------------
-  -- BlobContent
-  :<|> "blobs" :> Capture "blobId" BlobId :> "content"
-    :> Get '[OctetStream] (Headers '[Header "Content-Type" Text] ByteString)
+type LookupBlobContent
+    = "blobs" :> Capture "blobId" BlobId :> "content"
+    :> Credentials
+    :> Get '[OctetStream] (Headers '[Header "Content-Type" Text] BlobContent)
 
+-- | Similar to CreateObject but no authorization is required. Instead,
+-- a different mechanism is used to ensure that the client is allowed
+-- to execute the action (eg. an captcha).
+type Signup
+    = "signup"
+    :> ReqBody '[JSON] SignupBody
+    :> Post '[JSON] SignupResponse
 
 
---------------------------------------
--- | API to manage accounts. These are optional and not really part of
--- Avers, but many applications do have a concept of a user or account,
--- some person which is using the API.
 
-type AversAccountAPI
-
-  ------------------------------------------------------------------------------
-  -- Signup.
-  --
-  -- Similar to CreateObject but no authorization is required. Instead,
-  -- a different mechanism is used to ensure that the client is allowed
-  -- to execute the action (eg. an captcha).
+--------------------------------------------------------------------------------
+-- | The complete Avers API as a data type.
 
-  = "signup"
-    :> ReqBody '[JSON] SignupBody
-    :> Post '[JSON] SignupResponse
+type AversAPI
+    =    CreateObject
+    :<|> LookupObject
+    :<|> PatchObject
+    :<|> DeleteObject
+    :<|> LookupPatch
+    :<|> ObjectChanges
+    :<|> CreateRelease
+    :<|> LookupRelease
+    :<|> LookupLatestRelease
+    :<|> Feed
+    :<|> ChangeSecret
+    :<|> CreateSession
+    :<|> LookupSession
+    :<|> DeleteSession
+    :<|> UploadBlob
+    :<|> LookupBlob
+    :<|> LookupBlobContent
+    :<|> Signup
diff --git a/src/Avers/API/Types.hs b/src/Avers/API/Types.hs
--- a/src/Avers/API/Types.hs
+++ b/src/Avers/API/Types.hs
@@ -1,15 +1,20 @@
-{-# LANGUAGE DeriveGeneric     #-}
-{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE DeriveGeneric         #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings     #-}
 
+
 module Avers.API.Types where
 
 import GHC.Generics
 
+import Data.ByteString (ByteString)
+import Data.ByteString.Lazy (toStrict, fromStrict)
 import Data.Text   (Text)
 import Data.Aeson  as A
 import Data.Vector as V
 import Data.Time
 import Avers
+import Servant.API (MimeRender(..), MimeUnrender(..), OctetStream)
 
 
 
@@ -250,18 +255,44 @@
 --------------------------------------------------------------------------------
 -- UploadBlob
 
+newtype BlobContent = BlobContent ByteString
+
+instance MimeUnrender OctetStream BlobContent where
+    mimeUnrender _ bs = Right (BlobContent $ toStrict bs)
+
+instance MimeRender OctetStream BlobContent where
+    mimeRender _ (BlobContent bs) = fromStrict bs
+
 data UploadBlobResponse = UploadBlobResponse
-    {
+    { ubrId :: !BlobId
+    , ubrSize :: !Int
+    , ubrContentType :: !Text
     } deriving (Generic)
 
+instance ToJSON UploadBlobResponse where
+    toJSON x = object
+        [ "id" .= ubrId x
+        , "size" .= ubrSize x
+        , "contentType" .= ubrContentType x
+        ]
 
 
+
 --------------------------------------------------------------------------------
 -- LookupBlob
 
 data LookupBlobResponse = LookupBlobResponse
-    {
+    { lbrId :: !BlobId
+    , lbrSize :: !Int
+    , lbrContentType :: !Text
     } deriving (Generic)
+
+instance ToJSON LookupBlobResponse where
+    toJSON x = object
+        [ "id" .= lbrId x
+        , "size" .= lbrSize x
+        , "contentType" .= lbrContentType x
+        ]
 
 
 
